Use Jira Oauth for user authentication
[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 # TODO: implement caching decorator, cache get_* functions
10 def get_json(url):
11     if cache.get(url) is None:
12         try:
13             response = requests.get(url)
14             json = response.json()
15             cache.set(url, json, 180)  # cache result for 180 seconds
16             return json
17         except requests.exceptions.RequestException as e:
18             logger.exception(e)
19         except ValueError as e:
20             logger.exception(e)
21     else:
22         return cache.get(url)
23
24
25 def get_all_slaves():
26     url = "https://build.opnfv.org/ci/computer/api/json?tree=computer[displayName,offline,idle]"
27     json = get_json(url)
28     if json is not None:
29         return json['computer']  # return list of dictionaries
30     return []
31
32
33 def get_slave(slavename):
34     slaves = get_all_slaves()
35     for slave in slaves:
36         if slave['displayName'] == slavename:
37             return slave
38     return {}
39
40
41 def get_ci_slaves():
42     url = "https://build.opnfv.org/ci/label/ci-pod/api/json?tree=nodes[nodeName,offline,idle]"
43     json = get_json(url)
44     if json is not None:
45         return json['nodes']
46     return []
47
48
49 def get_all_jobs():
50     url = "https://build.opnfv.org/ci/api/json?tree=jobs[displayName,url,lastBuild[fullDisplayName,building,builtOn,timestamp,result]]"
51     json = get_json(url)
52     if json is not None:
53         return json['jobs']  # return list of dictionaries
54     return []
55
56
57 def get_jenkins_job(slavename):
58     jobs = get_all_jobs()
59     max_time = 0
60     last_job = None
61     for job in jobs:
62         if job['lastBuild'] is not None:
63             if job['lastBuild']['builtOn'] == slavename:
64                 if job['lastBuild']['building'] is True:
65                     return job  # return active build
66                 if job['lastBuild']['timestamp'] > max_time:
67                     last_job = job
68                     max_time = job['lastBuild']['timestamp']
69     return last_job
70
71
72 def is_ci_slave(slavename):
73     ci_slaves = get_ci_slaves()
74     for ci_slave in ci_slaves:
75         if ci_slave['nodeName'] == slavename:
76             return True
77     return False
78
79
80 def is_dev_pod(slavename):
81     if is_ci_slave(slavename):
82         return False
83     if slavename.find('pod') != -1:
84         return True
85     return False
86
87
88 def parse_job(job):
89     result = parse_job_string(job['lastBuild']['fullDisplayName'])
90     result['building'] = job['lastBuild']['building']
91     result['result'] = ''
92     if not job['lastBuild']['building']:
93         result['result'] = job['lastBuild']['result']
94     result['url'] = job['url']
95     return result
96
97
98 def parse_job_string(full_displayname):
99     job = {}
100     job['scenario'] = ''
101     job['installer'] = ''
102     job['branch'] = ''
103     tokens = re.split(r'[ -]', full_displayname)
104     for i in range(len(tokens)):
105         if tokens[i] == 'os':
106             job['scenario'] = '-'.join(tokens[i: i + 4])
107         elif tokens[i] in ['fuel', 'joid', 'apex', 'compass']:
108             job['installer'] = tokens[i]
109         elif tokens[i] in ['master', 'arno', 'brahmaputra', 'colorado']:
110             job['branch'] = tokens[i]
111     tokens = full_displayname.split(' ')
112     job['name'] = tokens[0]
113     return job
114
115 def get_slave_url(slave):
116     return 'https://build.opnfv.org/ci/computer/' + slave['displayName']
117
118
119 def get_slave_status(slave):
120     if not slave['offline'] and slave['idle']:
121         return 'online / idle'
122     if not slave['offline']:
123         return 'online'
124     return 'offline'