diff options
author | maxbr <maxbr@mi.fu-berlin.de> | 2016-07-29 12:43:43 +0200 |
---|---|---|
committer | Max Breitenfeldt <max.breitenfeldt@gmail.com> | 2016-07-29 11:25:20 +0000 |
commit | 35c34c690ae9616d791c39fa218fe1621fa8d8d2 (patch) | |
tree | 6168caaeb4be9144ed6bfde0150850d6559c8b6f /tools/pharos-dashboard/dashboard/jenkins | |
parent | 7ae1f204de947a3c12804c04f32e20d45eb99eba (diff) |
import pharos dashboard code
JIRA: RELENG-12
The last commit was missing some JS/CSS dependencies of the site. This
happened because they are in folders that are named 'build' or 'dist'.
This commit adds a bower.json file, that specifies dependencies.
Dependencies can now be installed by running 'bower install' in the
dashboard/static folder.
Change-Id: I054f319c66771f767e97711cb678d79d3bd6bee4
Signed-off-by: maxbr <maxbr@mi.fu-berlin.de>
Diffstat (limited to 'tools/pharos-dashboard/dashboard/jenkins')
-rw-r--r-- | tools/pharos-dashboard/dashboard/jenkins/jenkins_adapter.py | 84 | ||||
-rw-r--r-- | tools/pharos-dashboard/dashboard/jenkins/jenkins_util.py | 70 |
2 files changed, 154 insertions, 0 deletions
diff --git a/tools/pharos-dashboard/dashboard/jenkins/jenkins_adapter.py b/tools/pharos-dashboard/dashboard/jenkins/jenkins_adapter.py new file mode 100644 index 00000000..cd848ebb --- /dev/null +++ b/tools/pharos-dashboard/dashboard/jenkins/jenkins_adapter.py @@ -0,0 +1,84 @@ +import requests +import logging +from django.core.cache import cache + +logger = logging.getLogger(__name__) + + +# TODO: implement caching decorator, cache get_* functions +def get_json(url): + if cache.get(url) is None: + try: + response = requests.get(url) + json = response.json() + cache.set(url, json, 180) # cache result for 180 seconds + return response.json() + except requests.exceptions.RequestException as e: + logger.exception(e) + except ValueError as e: + logger.exception(e) + else: + return cache.get(url) + + +def get_all_slaves(): + url = "https://build.opnfv.org/ci/computer/api/json?tree=computer[displayName,offline,idle]" + json = get_json(url) + if json is not None: + return json['computer'] # return list of dictionaries + return [] + + +def get_slave(slavename): + slaves = get_all_slaves() + for slave in slaves: + if slave['displayName'] == slavename: + return slave + return {} + + +def get_ci_slaves(): + url = "https://build.opnfv.org/ci/label/ci-pod/api/json?tree=nodes[nodeName,offline,idle]" + json = get_json(url) + if json is not None: + return json['nodes'] + return [] + + +def get_all_jobs(): + url = "https://build.opnfv.org/ci/api/json?tree=jobs[displayName,url,lastBuild[fullDisplayName,building,builtOn,timestamp,result]]" + json = get_json(url) + if json is not None: + return json['jobs'] # return list of dictionaries + return [] + + +def get_jenkins_job(slavename): + jobs = get_all_jobs() + max_time = 0 + last_job = None + for job in jobs: + if job['lastBuild'] is not None: + if job['lastBuild']['builtOn'] == slavename: + if job['lastBuild']['building'] is True: + return job # return active build + if job['lastBuild']['timestamp'] > max_time: + last_job = job + max_time = job['lastBuild']['timestamp'] + return last_job + + +def is_ci_slave(slavename): + ci_slaves = get_ci_slaves() + for ci_slave in ci_slaves: + if ci_slave['nodeName'] == slavename: + return True + return False + + +def is_dev_pod(slavename): + if is_ci_slave(slavename): + return False + if slavename.find('pod') != -1: + return True + return False diff --git a/tools/pharos-dashboard/dashboard/jenkins/jenkins_util.py b/tools/pharos-dashboard/dashboard/jenkins/jenkins_util.py new file mode 100644 index 00000000..ba945639 --- /dev/null +++ b/tools/pharos-dashboard/dashboard/jenkins/jenkins_util.py @@ -0,0 +1,70 @@ +import dashboard.jenkins.jenkins_adapter as jenkins +import re + + +def parse_slave_data(slave_dict, slave): + slave_dict['status'] = get_slave_status(slave) + slave_dict['status_color'] = get_status_color(slave) + slave_dict['slaveurl'] = get_slave_url(slave) + job = jenkins.get_jenkins_job(slave['displayName']) + if job is not None: + slave_dict['last_job'] = parse_job(job) + + +def parse_job(job): + result = parse_job_string(job['lastBuild']['fullDisplayName']) + result['url'] = job['url'] + result['color'] = get_job_color(job) + if job['lastBuild']['building']: + result['blink'] = 'class=blink_me' + return result + + +def parse_job_string(full_displayname): + job = {} + tokens = re.split(r'[ -]', full_displayname) + for i in range(len(tokens)): + if tokens[i] == 'os': + job['scenario'] = '-'.join(tokens[i: i + 4]) + elif tokens[i] in ['fuel', 'joid', 'apex', 'compass']: + job['installer'] = tokens[i] + elif tokens[i] in ['master', 'arno', 'brahmaputra', 'colorado']: + job['branch'] = tokens[i] + + tokens = full_displayname.split(' ') + job['name'] = tokens[0] + return job + + +# TODO: use css +def get_job_color(job): + if job['lastBuild']['building'] is True: + return '#646F73' + result = job['lastBuild']['result'] + if result == 'SUCCESS': + return '#33cc00' + if result == 'FAILURE': + return '#FF5555' + if result == 'UNSTABLE': + return '#EDD62B' + + +# TODO: use css +def get_status_color(slave): + if not slave['offline'] and slave['idle']: + return '#C8D6C3' + if not slave['offline']: + return '#BEFAAA' + return '#FAAAAB' + + +def get_slave_url(slave): + return 'https://build.opnfv.org/ci/computer/' + slave['displayName'] + + +def get_slave_status(slave): + if not slave['offline'] and slave['idle']: + return 'online / idle' + if not slave['offline']: + return 'online' + return 'offline' |