| Dennis Dmitriev | 6111511 | 2018-05-31 06:48:43 +0300 | [diff] [blame] | 1 | from __future__ import print_function | 
| Dmitry Tyzhnenko | 5a5d8da | 2017-12-14 14:14:42 +0200 | [diff] [blame] | 2 | import time | 
|  | 3 |  | 
|  | 4 | import jenkins | 
| Dennis Dmitriev | 6111511 | 2018-05-31 06:48:43 +0300 | [diff] [blame] | 5 | import requests | 
| Dmitry Tyzhnenko | 5a5d8da | 2017-12-14 14:14:42 +0200 | [diff] [blame] | 6 |  | 
|  | 7 | from devops.helpers import helpers | 
|  | 8 |  | 
|  | 9 |  | 
|  | 10 | class JenkinsClient(object): | 
|  | 11 |  | 
|  | 12 | def __init__(self, host=None, username=None, password=None): | 
|  | 13 | host = host or 'http://172.16.44.33:8081' | 
|  | 14 | username = username or 'admin' | 
|  | 15 | password = password or 'r00tme' | 
|  | 16 | self.__client = jenkins.Jenkins( | 
|  | 17 | host, | 
|  | 18 | username=username, | 
|  | 19 | password=password) | 
|  | 20 |  | 
|  | 21 | def jobs(self): | 
|  | 22 | return self.__client.get_jobs() | 
|  | 23 |  | 
|  | 24 | def find_jobs(self, name): | 
|  | 25 | return filter(lambda x: name in x['fullname'], self.jobs()) | 
|  | 26 |  | 
|  | 27 | def job_info(self, name): | 
|  | 28 | return self.__client.get_job_info(name) | 
|  | 29 |  | 
|  | 30 | def list_builds(self, name): | 
|  | 31 | return self.job_info(name).get('builds') | 
|  | 32 |  | 
|  | 33 | def build_info(self, name, build_id): | 
|  | 34 | return self.__client.get_build_info(name, build_id) | 
|  | 35 |  | 
|  | 36 | def job_params(self, name): | 
|  | 37 | job = self.job_info(name) | 
|  | 38 | job_params = next( | 
|  | 39 | p for p in job['property'] if | 
|  | 40 | 'hudson.model.ParametersDefinitionProperty' == p['_class']) | 
|  | 41 | job_params = job_params['parameterDefinitions'] | 
|  | 42 | return job_params | 
|  | 43 |  | 
|  | 44 | def make_defults_params(self, name): | 
|  | 45 | job_params = self.job_params(name) | 
|  | 46 | def_params = dict( | 
|  | 47 | [(j['name'], j['defaultParameterValue']['value']) | 
|  | 48 | for j in job_params]) | 
|  | 49 | return def_params | 
|  | 50 |  | 
|  | 51 | def run_build(self, name, params=None): | 
|  | 52 | params = params or self.make_defults_params(name) | 
|  | 53 | self.__client.build_job(name, params) | 
|  | 54 | time.sleep(10)  # wait while jobs started: | 
|  | 55 | build_id = self.job_info(name)['lastBuild']['number'] | 
|  | 56 | return name, build_id | 
|  | 57 |  | 
| Dennis Dmitriev | 6111511 | 2018-05-31 06:48:43 +0300 | [diff] [blame] | 58 | def wait_end_of_build(self, name, build_id, timeout=600, | 
|  | 59 | print_job_output=False): | 
|  | 60 | start = [0] | 
| Dmitry Tyzhnenko | 5a5d8da | 2017-12-14 14:14:42 +0200 | [diff] [blame] | 61 |  | 
|  | 62 | def building(): | 
| Dennis Dmitriev | 6111511 | 2018-05-31 06:48:43 +0300 | [diff] [blame] | 63 | status = not self.build_info(name, build_id)['building'] | 
|  | 64 | if print_job_output: | 
|  | 65 | res = self.get_progressive_build_output(name, | 
|  | 66 | build_id, | 
|  | 67 | start=start[0]) | 
|  | 68 | if 'X-Text-Size' in res.headers: | 
|  | 69 | text_size = int(res.headers['X-Text-Size']) | 
|  | 70 | if start[0] < text_size: | 
|  | 71 | print(res.content, end='') | 
|  | 72 | start[0] = text_size | 
|  | 73 | return status | 
| Dmitry Tyzhnenko | 5a5d8da | 2017-12-14 14:14:42 +0200 | [diff] [blame] | 74 |  | 
|  | 75 | helpers.wait( | 
|  | 76 | building, | 
|  | 77 | timeout=timeout, | 
|  | 78 | timeout_msg='Timeout waiting, job {0} are not finished "{1}" build' | 
|  | 79 | ' still'.format(name, build_id)) | 
| Dmitry Tyzhnenko | b610afd | 2018-02-19 15:43:45 +0200 | [diff] [blame] | 80 |  | 
|  | 81 | def get_build_output(self, name, build_id): | 
|  | 82 | return self.__client.get_build_console_output(name, build_id) | 
| Dennis Dmitriev | 6111511 | 2018-05-31 06:48:43 +0300 | [diff] [blame] | 83 |  | 
|  | 84 | def get_progressive_build_output(self, name, build_id, start=0, | 
|  | 85 | raise_on_err=False): | 
|  | 86 | '''Get build console text. | 
|  | 87 |  | 
|  | 88 | :param name: Job name, ``str`` | 
|  | 89 | :param name: Build id, ``int`` | 
|  | 90 | :param name: Start offset, ``int`` | 
|  | 91 | :returns: requests object with headers and console output,  ``obj`` | 
|  | 92 | ''' | 
|  | 93 | folder_url, short_name = self.__client._get_job_folder(name) | 
|  | 94 |  | 
|  | 95 | PROGRESSIVE_CONSOLE_OUTPUT = ( | 
|  | 96 | '%(folder_url)sjob/%(short_name)s/%(build_id)d/' | 
|  | 97 | 'logText/progressiveHtml?start=%(start)d') | 
|  | 98 | url = self.__client._build_url(PROGRESSIVE_CONSOLE_OUTPUT, locals()) | 
|  | 99 | return(requests.get(url)) |