Minor updates to info file
[pharos.git] / tools / pharos-dashboard / jenkins / adapter.py
1 import logging
2
3 import re
4 import requests
5 from django.core.cache import cache
6
7 logger = logging.getLogger(__name__)
8
9
10 # TODO: implement caching decorator, cache get_* functions
11 def get_json(url):
12     if cache.get(url) is None:
13         try:
14             response = requests.get(url)
15             json = response.json()
16             cache.set(url, json, 180)  # cache result for 180 seconds
17             return response.json()
18         except requests.exceptions.RequestException as e:
19             logger.exception(e)
20         except ValueError as e:
21             logger.exception(e)
22     else:
23         return cache.get(url)
24
25
26 def get_all_slaves():
27     url = "https://build.opnfv.org/ci/computer/api/json?tree=computer[displayName,offline,idle]"
28     json = get_json(url)
29     if json is not None:
30         return json['computer']  # return list of dictionaries
31     return []
32
33
34 def get_slave(slavename):
35     slaves = get_all_slaves()
36     for slave in slaves:
37         if slave['displayName'] == slavename:
38             return slave
39     return {}
40
41
42 def get_ci_slaves():
43     url = "https://build.opnfv.org/ci/label/ci-pod/api/json?tree=nodes[nodeName,offline,idle]"
44     json = get_json(url)
45     if json is not None:
46         return json['nodes']
47     return []
48
49
50 def get_all_jobs():
51     url = "https://build.opnfv.org/ci/api/json?tree=jobs[displayName,url,lastBuild[fullDisplayName,building,builtOn,timestamp,result]]"
52     json = get_json(url)
53     if json is not None:
54         return json['jobs']  # return list of dictionaries
55     return []
56
57
58 def get_jenkins_job(slavename):
59     jobs = get_all_jobs()
60     max_time = 0
61     last_job = None
62     for job in jobs:
63         if job['lastBuild'] is not None:
64             if job['lastBuild']['builtOn'] == slavename:
65                 if job['lastBuild']['building'] is True:
66                     return job  # return active build
67                 if job['lastBuild']['timestamp'] > max_time:
68                     last_job = job
69                     max_time = job['lastBuild']['timestamp']
70     return last_job
71
72
73 def is_ci_slave(slavename):
74     ci_slaves = get_ci_slaves()
75     for ci_slave in ci_slaves:
76         if ci_slave['nodeName'] == slavename:
77             return True
78     return False
79
80
81 def is_dev_pod(slavename):
82     if is_ci_slave(slavename):
83         return False
84     if slavename.find('pod') != -1:
85         return True
86     return False
87
88 def parse_slave_data(slave_dict, slave):
89     slave_dict['status'] = get_slave_status(slave)
90     slave_dict['status_color'] = get_status_color(slave)
91     slave_dict['slaveurl'] = get_slave_url(slave)
92     job = get_jenkins_job(slave['displayName'])
93     if job is not None:
94         slave_dict['last_job'] = parse_job(job)
95
96
97 def parse_job(job):
98     result = parse_job_string(job['lastBuild']['fullDisplayName'])
99     result['url'] = job['url']
100     result['color'] = get_job_color(job)
101     if job['lastBuild']['building']:
102         result['blink'] = 'class=blink_me'
103     return result
104
105
106 def parse_job_string(full_displayname):
107     job = {}
108     tokens = re.split(r'[ -]', full_displayname)
109     for i in range(len(tokens)):
110         if tokens[i] == 'os':
111             job['scenario'] = '-'.join(tokens[i: i + 4])
112         elif tokens[i] in ['fuel', 'joid', 'apex', 'compass']:
113             job['installer'] = tokens[i]
114         elif tokens[i] in ['master', 'arno', 'brahmaputra', 'colorado']:
115             job['branch'] = tokens[i]
116
117     tokens = full_displayname.split(' ')
118     job['name'] = tokens[0]
119     return job
120
121
122 # TODO: use css
123 def get_job_color(job):
124     if job['lastBuild']['building'] is True:
125         return '#646F73'
126     result = job['lastBuild']['result']
127     if result == 'SUCCESS':
128         return '#5cb85c'
129     if result == 'FAILURE':
130         return '#d9534f'
131     if result == 'UNSTABLE':
132         return '#EDD62B'
133
134
135 # TODO: use css
136 def get_status_color(slave):
137     if not slave['offline'] and slave['idle']:
138         return '#5bc0de'
139     if not slave['offline']:
140         return '#5cb85c'
141     return '#d9534f'
142
143
144 def get_slave_url(slave):
145     return 'https://build.opnfv.org/ci/computer/' + slave['displayName']
146
147
148 def get_slave_status(slave):
149     if not slave['offline'] and slave['idle']:
150         return 'online / idle'
151     if not slave['offline']:
152         return 'online'
153     return 'offline'