blob: bcfdd8647f44c5c247029e8f842c32edc8ad0301 [file] [log] [blame]
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +03001import git
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +03002import jenkins
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +03003import json
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +03004import logging
5import os
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +03006import pytest
7import time
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +03008import utils
9from builtins import range
10from ldap3 import (
11 Connection,
12 Server,
13 Reader,
14 LDIF,
15 MODIFY_ADD,
16 MODIFY_DELETE,
17 SUBTREE,
18 ALL_ATTRIBUTES)
19from ldap3.core.exceptions import LDAPException
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030020from pygerrit2 import GerritRestAPI, HTTPBasicAuth
21from requests import HTTPError
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +030022from xml.dom import minidom
Ievgeniia Zadorozhna6449c0e2020-01-09 13:28:09 +020023from collections import defaultdict
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030024
Hanna Arhipovaf7c89a02020-05-15 15:22:06 +030025# ############################ FIXTURES ######################################
26user_name = 'DT_test_user'
27user_pass = 'aSecretPassw'
28
Hanna Arhipova474ba922019-07-04 12:43:16 +030029
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030030def join_to_gerrit(local_salt_client, gerrit_user, gerrit_password):
Hanna Arhipova474ba922019-07-04 12:43:16 +030031 # Workaround for issue in test_drivetrain.join_to_jenkins https://github.com/kennethreitz/requests/issues/3829
32 os.environ["PYTHONHTTPSVERIFY"] = "0"
33
34 pytest.gerrit_port = local_salt_client.pillar_get(
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030035 tgt='I@gerrit:client and not I@salt:master',
36 param='_param:haproxy_gerrit_bind_port',
37 expr_form='compound')
Hanna Arhipova474ba922019-07-04 12:43:16 +030038 pytest.gerrit_address = local_salt_client.pillar_get(
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030039 tgt='I@gerrit:client and not I@salt:master',
40 param='_param:haproxy_gerrit_bind_host',
41 expr_form='compound')
Hanna Arhipova474ba922019-07-04 12:43:16 +030042
43 pytest.gerrit_protocol = local_salt_client.pillar_get(
44 tgt='I@gerrit:client and not I@salt:master',
45 param="gerrit:client:server:protocol",
46 expr_form='compound')
47
48 gerrit_url = '{protocol}://{address}:{port}'.format(
49 protocol=pytest.gerrit_protocol,
50 address=pytest.gerrit_address,
51 port=pytest.gerrit_port)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030052 auth = HTTPBasicAuth(gerrit_user, gerrit_password)
Hanna Arhipova474ba922019-07-04 12:43:16 +030053 rest = GerritRestAPI(url=gerrit_url, auth=auth)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030054 return rest
55
56
57def join_to_jenkins(local_salt_client, jenkins_user, jenkins_password):
Hanna Arhipova474ba922019-07-04 12:43:16 +030058
59 pytest.jenkins_port = local_salt_client.pillar_get(
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030060 tgt='I@jenkins:client and not I@salt:master',
61 param='_param:haproxy_jenkins_bind_port',
62 expr_form='compound')
Hanna Arhipova474ba922019-07-04 12:43:16 +030063 pytest.jenkins_address = local_salt_client.pillar_get(
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030064 tgt='I@jenkins:client and not I@salt:master',
65 param='_param:haproxy_jenkins_bind_host',
66 expr_form='compound')
Hanna Arhipova474ba922019-07-04 12:43:16 +030067 pytest.jenkins_protocol = local_salt_client.pillar_get(
68 tgt='I@gerrit:client and not I@salt:master',
69 param="_param:jenkins_master_protocol",
70 expr_form='compound')
71
72 jenkins_url = '{protocol}://{address}:{port}'.format(
73 protocol=pytest.jenkins_protocol,
74 address=pytest.jenkins_address,
75 port=pytest.jenkins_port)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030076 server = jenkins.Jenkins(jenkins_url, username=jenkins_user, password=jenkins_password)
77 return server
78
79
80def get_password(local_salt_client,service):
81 password = local_salt_client.pillar_get(
82 tgt=service,
83 param='_param:openldap_admin_password')
84 return password
85
86
Hanna Arhipovaf7c89a02020-05-15 15:22:06 +030087@pytest.fixture(scope='module')
88def ldap_conn_from_new_admin(local_salt_client):
89 """
90 1. Create a test user 'DT_test_user' in openldap
91 2. Add the user to admin group
92
93 :return: connection to ldap with new created user
94 Finally, delete the user from admin group and openldap
95 """
96 ldap_password = get_password(local_salt_client, 'openldap:client')
97 # Check that ldap_password is exists, otherwise skip test
98 if not ldap_password:
99 pytest.skip("Openldap service or openldap:client pillar \
100 are not found on this environment.")
101 ldap_port = local_salt_client.pillar_get(
102 tgt='I@openldap:client and not I@salt:master',
103 param='_param:haproxy_openldap_bind_port',
104 expr_form='compound')
105 ldap_address = local_salt_client.pillar_get(
106 tgt='I@openldap:client and not I@salt:master',
107 param='_param:haproxy_openldap_bind_host',
108 expr_form='compound')
109 ldap_dc = local_salt_client.pillar_get(
110 tgt='openldap:client',
111 param='_param:openldap_dn')
112 ldap_admin_name = local_salt_client.pillar_get(
113 tgt='openldap:client',
114 param='openldap:client:server:auth:user')
115 ldap_admin_password = local_salt_client.pillar_get(
116 tgt='openldap:client',
117 param='openldap:client:server:auth:password')
118
119 ldap_user_name = 'cn={0},ou=people,{1}'.format(user_name, ldap_dc)
120
121 # Admins group CN
122 admin_gr_dn = 'cn=admins,ou=groups,{0}'.format(ldap_dc)
123 # List of attributes for test user
124 attrs = {
125 'cn': user_name,
126 'sn': user_name,
127 'uid': user_name,
128 'userPassword': user_pass,
129 'objectClass': ['shadowAccount', 'inetOrgPerson'],
130 'description': 'Test user for CVP DT test'
131 }
132 logging.warning("LOCALS {}".format(locals()))
133 ldap_server = Server(host=ldap_address, port=ldap_port,
134 use_ssl=False, get_info='NO_INFO')
135 admin_conn = Connection(ldap_server,
136 user=ldap_admin_name,
137 password=ldap_admin_password)
138
139 admin_conn.bind()
140 # Add new user
141 new_user = admin_conn.add(ldap_user_name, 'person', attrs)
142 assert new_user, 'new_user: {}\n error: {}'.format(new_user,
143 admin_conn.result)
144 # Add him to admins group
145 modified_user = admin_conn.modify(admin_gr_dn,
146 {'memberUid': (MODIFY_ADD, [user_name])})
147 assert modified_user, "added user to admins: {} \n error: {}".format(
148 modified_user,
149 admin_conn.result)
150
151 user_conn = Connection(ldap_server,
152 user=ldap_user_name,
153 password=user_pass)
154 user_conn.bind()
155
156 # ###########################
157 yield user_conn
158 # ###########################
159 user_conn.unbind()
160 admin_conn.modify(admin_gr_dn, {
161 'memberUid': (MODIFY_DELETE, [user_name])
162 })
163 admin_conn.delete(ldap_user_name)
164 admin_conn.unbind()
165
166# ########################### TESTS ##########################################
167
168
Oleksii Zhurba23c18332019-05-09 18:53:40 -0500169@pytest.mark.full
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300170def test_drivetrain_gerrit(local_salt_client, check_cicd):
Hanna Arhipova474ba922019-07-04 12:43:16 +0300171
172 gerrit_password = get_password(local_salt_client, 'gerrit:client')
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300173 gerrit_error = ''
174 current_date = time.strftime("%Y%m%d-%H.%M.%S", time.localtime())
175 test_proj_name = "test-dt-{0}".format(current_date)
Hanna Arhipova474ba922019-07-04 12:43:16 +0300176
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300177 try:
Hanna Arhipova474ba922019-07-04 12:43:16 +0300178 # Connecting to gerrit and check connection
179 server = join_to_gerrit(local_salt_client, 'admin', gerrit_password)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300180 gerrit_check = server.get("/changes/?q=owner:self%20status:open")
Hanna Arhipova474ba922019-07-04 12:43:16 +0300181 # Check deleteproject plugin and skip test if the plugin is not installed
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300182 gerrit_plugins = server.get("/plugins/?all")
183 if 'deleteproject' not in gerrit_plugins:
184 pytest.skip("Delete-project plugin is not installed")
Hanna Arhipova474ba922019-07-04 12:43:16 +0300185 # Create test project and add description
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300186 server.put("/projects/"+test_proj_name)
Hanna Arhipova474ba922019-07-04 12:43:16 +0300187 server.put("/projects/"+test_proj_name+"/description",
188 json={"description": "Test DriveTrain project", "commit_message": "Update the project description"})
Hanna Arhipova1eef8312019-05-06 20:14:18 +0300189 except HTTPError as e:
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300190 gerrit_error = e
191 try:
Hanna Arhipova474ba922019-07-04 12:43:16 +0300192 # Create test folder and init git
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300193 repo_dir = os.path.join(os.getcwd(),test_proj_name)
194 file_name = os.path.join(repo_dir, current_date)
195 repo = git.Repo.init(repo_dir)
Hanna Arhipova474ba922019-07-04 12:43:16 +0300196 # Add remote url for this git repo
197 origin = repo.create_remote('origin', '{http}://admin:{password}@{address}:{port}/{project}.git'.format(
198 project=test_proj_name,
199 password=gerrit_password,
200 http=pytest.gerrit_protocol,
201 address=pytest.gerrit_address,
202 port=pytest.gerrit_port))
203 # Add commit-msg hook to automatically add Change-Id to our commit
204 os.system("curl -Lo {repo}/.git/hooks/commit-msg '{http}://admin:{password}@{address}:{port}/tools/hooks/commit-msg' > /dev/null 2>&1".format(
205 repo=repo_dir,
206 password=gerrit_password,
207 address=pytest.gerrit_address,
208 http=pytest.gerrit_protocol,
209 port=pytest.gerrit_port))
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300210 os.system("chmod u+x {0}/.git/hooks/commit-msg".format(repo_dir))
Hanna Arhipova474ba922019-07-04 12:43:16 +0300211 # Create a test file
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300212 f = open(file_name, 'w+')
213 f.write("This is a test file for DriveTrain test")
214 f.close()
Hanna Arhipova474ba922019-07-04 12:43:16 +0300215 # Add file to git and commit it to Gerrit for review
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300216 repo.index.add([file_name])
217 repo.index.commit("This is a test commit for DriveTrain test")
218 repo.git.push("origin", "HEAD:refs/for/master")
Hanna Arhipova474ba922019-07-04 12:43:16 +0300219 # Get change id from Gerrit. Set Code-Review +2 and submit this change
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300220 changes = server.get("/changes/?q=project:{0}".format(test_proj_name))
221 last_change = changes[0].get('change_id')
Hanna Arhipova474ba922019-07-04 12:43:16 +0300222 server.post("/changes/{0}/revisions/1/review".format(last_change), json={"message": "All is good","labels":{"Code-Review":"+2"}})
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300223 server.post("/changes/{0}/submit".format(last_change))
Hanna Arhipova1eef8312019-05-06 20:14:18 +0300224 except HTTPError as e:
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300225 gerrit_error = e
226 finally:
Hanna Arhipova474ba922019-07-04 12:43:16 +0300227 # Delete test project
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300228 server.post("/projects/"+test_proj_name+"/deleteproject~delete")
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200229 assert gerrit_error == '', (
230 'There is an error during Gerrit operations:\n{}'.format(gerrit_error))
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300231
232
Oleksii Zhurba23c18332019-05-09 18:53:40 -0500233@pytest.mark.full
Hanna Arhipovaf7c89a02020-05-15 15:22:06 +0300234def test_openldap_new_user_can_connect_jenkins(local_salt_client,
235 check_cicd,
236 ldap_conn_from_new_admin):
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300237 """
Hanna Arhipovaf7c89a02020-05-15 15:22:06 +0300238 1. Start job in jenkins from new ldap user
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300239 """
Hanna Arhipova474ba922019-07-04 12:43:16 +0300240 # Get a test job name from config
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300241 config = utils.get_configuration()
242 jenkins_cvp_job = config['jenkins_cvp_job']
Hanna Arhipovaf7c89a02020-05-15 15:22:06 +0300243 jenkins_error = ''
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300244 try:
Hanna Arhipova474ba922019-07-04 12:43:16 +0300245 # Check connection between Jenkins and LDAP
Hanna Arhipovaf7c89a02020-05-15 15:22:06 +0300246 jenkins_server = join_to_jenkins(local_salt_client, user_name, user_pass)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300247 jenkins_version = jenkins_server.get_job_name(jenkins_cvp_job)
Hanna Arhipovaf7c89a02020-05-15 15:22:06 +0300248 except jenkins.JenkinsException as e:
249 jenkins_error = e
250 assert jenkins_error == '', (
251 "Connection to Jenkins is not established:\n{}".format(jenkins_error))
252
253
254@pytest.mark.full
255def test_openldap_new_user_can_connect_gerrit(local_salt_client, check_cicd, ldap_conn_from_new_admin):
256 """
257 1. Add the user to devops group in Gerrit
258 2. Login to Gerrit using test_user credentials.
259
260 """
261 ldap_password = get_password(local_salt_client, 'openldap:client')
262 gerrit_error = ''
263
264 try:
Hanna Arhipova474ba922019-07-04 12:43:16 +0300265 # Check connection between Gerrit and LDAP
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300266 gerrit_server = join_to_gerrit(local_salt_client, 'admin', ldap_password)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300267 gerrit_check = gerrit_server.get("/changes/?q=owner:self%20status:open")
Hanna Arhipovaf7c89a02020-05-15 15:22:06 +0300268
Hanna Arhipova474ba922019-07-04 12:43:16 +0300269 # Add test user to devops-contrib group in Gerrit and check login
Hanna Arhipovaf7c89a02020-05-15 15:22:06 +0300270 _link = "/groups/devops-contrib/members/{0}".format(user_name)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300271 gerrit_add_user = gerrit_server.put(_link)
Hanna Arhipovaf7c89a02020-05-15 15:22:06 +0300272
273 # Login to Gerrit as a user
274 gerrit_server = join_to_gerrit(local_salt_client, user_name, user_pass)
275 gerrit_result = gerrit_server.get(
276 "/changes/?q=owner:self%20status:open")
Hanna Arhipova1eef8312019-05-06 20:14:18 +0300277 except HTTPError as e:
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300278 gerrit_error = e
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300279
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200280 assert gerrit_error == '', (
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300281 "Connection to Gerrit is not established:\n{}".format(gerrit_error))
282
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300283
Oleksii Zhurba23c18332019-05-09 18:53:40 -0500284@pytest.mark.sl_dup
285#DockerService***Outage
286@pytest.mark.full
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300287def test_drivetrain_services_replicas(local_salt_client, check_cicd):
288 """
289 # Execute ` salt -C 'I@gerrit:client' cmd.run 'docker service ls'` command to get info for each docker service like that:
290 "x5nzktxsdlm6 jenkins_slave02 replicated 0/1 docker-prod-local.artifactory.mirantis.com/mirantis/cicd/jnlp-slave:2019.2.0 "
291 # Check that each service has all replicas
292 """
293 # TODO: replace with rerunfalures plugin
294 wrong_items = []
295 for _ in range(4):
296 docker_services_by_nodes = local_salt_client.cmd(
297 tgt='I@gerrit:client',
298 param='docker service ls',
299 expr_form='compound')
300 wrong_items = []
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300301 for line in docker_services_by_nodes[list(docker_services_by_nodes.keys())[0]].split('\n'):
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300302 if line[line.find('/') - 1] != line[line.find('/') + 1] \
303 and 'replicated' in line:
304 wrong_items.append(line)
305 if len(wrong_items) == 0:
306 break
307 else:
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300308 time.sleep(5)
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200309 assert len(wrong_items) == 0, (
310 "Some DriveTrain services don't have expected number of replicas:\n"
311 "{}".format(json.dumps(wrong_items, indent=4))
312 )
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300313
314
Oleksii Zhurba23c18332019-05-09 18:53:40 -0500315@pytest.mark.full
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300316def test_drivetrain_components_and_versions(local_salt_client, check_cicd):
317 """
318 1. Execute command `docker service ls --format "{{.Image}}"'` on the 'I@gerrit:client' target
319 2. Execute ` salt -C 'I@gerrit:client' pillar.get docker:client:images`
320 3. Check that list of images from step 1 is the same as a list from the step2
321 4. Check that all docker services has label that equals to mcp_version
322
323 """
Hanna Arhipovadcff7142019-06-12 13:56:36 +0300324 def get_name(long_name):
325 return long_name.rsplit(':', 1)[0]
326
327 def get_tag(long_name):
328 return long_name.rsplit(':', 1)[-1]
329
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300330 table_with_docker_services = local_salt_client.cmd(tgt='I@gerrit:client',
331 param='docker service ls --format "{{.Image}}"',
332 expr_form='compound')
Hanna Arhipova7227a952019-07-22 14:58:03 +0300333 stack_info = local_salt_client.pillar_get(tgt='gerrit:client',
334 param='docker:client:stack')
335
Ievgeniia Zadorozhna6449c0e2020-01-09 13:28:09 +0200336 expected_images_list = list()
Hanna Arhipova7227a952019-07-22 14:58:03 +0300337 # find services in list of docker clients
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300338 for key, stack in list(stack_info.items()):
Hanna Arhipova7227a952019-07-22 14:58:03 +0300339 if stack.get('service'):
Ievgeniia Zadorozhna6449c0e2020-01-09 13:28:09 +0200340 stack = [item.get('image') for _, item in
341 list(stack.get('service').items()) if item.get('image')]
342 expected_images_list += stack
343 expected_images = defaultdict(list)
Hanna Arhipova7227a952019-07-22 14:58:03 +0300344
Ievgeniia Zadorozhna6449c0e2020-01-09 13:28:09 +0200345 # collect unique tags for each image in same structure as for actual images
346 for image in expected_images_list:
347 if get_name(image) in expected_images:
348 if get_tag(image) not in expected_images[get_name(image)]:
349 expected_images[get_name(image)].append(get_tag(image))
350 else:
351 expected_images[get_name(image)].append(get_tag(image))
Hanna Arhipova7227a952019-07-22 14:58:03 +0300352
Ievgeniia Zadorozhna6449c0e2020-01-09 13:28:09 +0200353 # collect tags for each image in same structure as for expected images
354 actual_images = defaultdict(list)
355 for image in set(table_with_docker_services[
356 list(table_with_docker_services.keys())[0]].split('\n')):
357 actual_images[get_name(image)].append(get_tag(image))
358
359 # find difference between defaultdicts
360 total_diff = 0
361 for i in expected_images:
362 diff = set(expected_images[i]) - set(actual_images[i])
363 total_diff += len(diff)
364
365 assert actual_images == expected_images, (
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200366 "Some DriveTrain components do not have expected versions:\n{}".format(
Ievgeniia Zadorozhna6449c0e2020-01-09 13:28:09 +0200367 json.dumps(total_diff, indent=4))
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200368 )
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300369
370
Oleksii Zhurba23c18332019-05-09 18:53:40 -0500371@pytest.mark.full
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300372def test_jenkins_jobs_branch(local_salt_client, check_cicd):
373 """ This test compares Jenkins jobs versions
374 collected from the cloud vs collected from pillars.
375 """
Hanna Arhipova474ba922019-07-04 12:43:16 +0300376
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300377 excludes = ['upgrade-mcp-release', 'deploy-update-salt',
378 'git-mirror-downstream-mk-pipelines',
379 'git-mirror-downstream-pipeline-library']
380
381 config = utils.get_configuration()
382 drivetrain_version = config.get('drivetrain_version', '')
383 jenkins_password = get_password(local_salt_client, 'jenkins:client')
384 version_mismatch = []
385 server = join_to_jenkins(local_salt_client, 'admin', jenkins_password)
386 for job_instance in server.get_jobs():
387 job_name = job_instance.get('name')
388 if job_name in excludes:
389 continue
390
391 job_config = server.get_job_config(job_name)
392 xml_data = minidom.parseString(job_config)
393 BranchSpec = xml_data.getElementsByTagName('hudson.plugins.git.BranchSpec')
394
395 # We use master branch for pipeline-library in case of 'testing,stable,nighlty' versions
396 # Leave proposed version as is
397 # in other cases we get release/{drivetrain_version} (e.g release/2019.2.0)
398 if drivetrain_version in ['testing', 'nightly', 'stable']:
399 expected_version = 'master'
400 else:
401 expected_version = local_salt_client.pillar_get(
402 tgt='gerrit:client',
403 param='jenkins:client:job:{}:scm:branch'.format(job_name))
404
405 if not BranchSpec:
Hanna Arhipova1eef8312019-05-06 20:14:18 +0300406 logging.debug("No BranchSpec has found for {} job".format(job_name))
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300407 continue
408
409 actual_version = BranchSpec[0].getElementsByTagName('name')[0].childNodes[0].data
Oleksii Zhurbae01d5e82019-05-17 14:04:28 -0500410 if expected_version and actual_version not in expected_version:
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300411 version_mismatch.append("Job {0} has {1} branch."
412 "Expected {2}".format(job_name,
413 actual_version,
414 expected_version))
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200415 assert len(version_mismatch) == 0, (
416 "Some DriveTrain jobs have version/branch mismatch:\n{}".format(
417 json.dumps(version_mismatch, indent=4))
418 )
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300419
420
Oleksii Zhurba23c18332019-05-09 18:53:40 -0500421@pytest.mark.full
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300422def test_drivetrain_jenkins_job(local_salt_client, check_cicd):
423 """
424 # Login to Jenkins on jenkins:client
425 # Read the name of jobs from configuration 'jenkins_test_job'
426 # Start job
427 # Wait till the job completed
428 # Check that job has completed with "SUCCESS" result
429 """
430 job_result = None
431
432 jenkins_password = get_password(local_salt_client, 'jenkins:client')
433 server = join_to_jenkins(local_salt_client, 'admin', jenkins_password)
434 # Getting Jenkins test job name from configuration
435 config = utils.get_configuration()
436 jenkins_test_job = config['jenkins_test_job']
437 if not server.get_job_name(jenkins_test_job):
438 server.create_job(jenkins_test_job, jenkins.EMPTY_CONFIG_XML)
439 if server.get_job_name(jenkins_test_job):
440 next_build_num = server.get_job_info(jenkins_test_job)['nextBuildNumber']
441 # If this is first build number skip building check
442 if next_build_num != 1:
443 # Check that test job is not running at this moment,
444 # Otherwise skip the test
445 last_build_num = server.get_job_info(jenkins_test_job)['lastBuild'].get('number')
446 last_build_status = server.get_build_info(jenkins_test_job, last_build_num)['building']
447 if last_build_status:
448 pytest.skip("Test job {0} is already running").format(jenkins_test_job)
449 server.build_job(jenkins_test_job)
450 timeout = 0
451 # Use job status True by default to exclude timeout between build job and start job.
452 job_status = True
453 while job_status and (timeout < 180):
454 time.sleep(10)
455 timeout += 10
456 job_status = server.get_build_info(jenkins_test_job, next_build_num)['building']
457 job_result = server.get_build_info(jenkins_test_job, next_build_num)['result']
458 else:
459 pytest.skip("The job {0} was not found").format(jenkins_test_job)
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200460 assert job_result == 'SUCCESS', (
461 "Test job '{}' build is not successful or timeout is too "
462 "small.".format(jenkins_test_job)
463 )