blob: 08955564ab915c4301f1176853f5409b4efd280e [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 Arhipova474ba922019-07-04 12:43:16 +030025
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030026def join_to_gerrit(local_salt_client, gerrit_user, gerrit_password):
Hanna Arhipova474ba922019-07-04 12:43:16 +030027 # Workaround for issue in test_drivetrain.join_to_jenkins https://github.com/kennethreitz/requests/issues/3829
28 os.environ["PYTHONHTTPSVERIFY"] = "0"
29
30 pytest.gerrit_port = local_salt_client.pillar_get(
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030031 tgt='I@gerrit:client and not I@salt:master',
32 param='_param:haproxy_gerrit_bind_port',
33 expr_form='compound')
Hanna Arhipova474ba922019-07-04 12:43:16 +030034 pytest.gerrit_address = 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_host',
37 expr_form='compound')
Hanna Arhipova474ba922019-07-04 12:43:16 +030038
39 pytest.gerrit_protocol = local_salt_client.pillar_get(
40 tgt='I@gerrit:client and not I@salt:master',
41 param="gerrit:client:server:protocol",
42 expr_form='compound')
43
44 gerrit_url = '{protocol}://{address}:{port}'.format(
45 protocol=pytest.gerrit_protocol,
46 address=pytest.gerrit_address,
47 port=pytest.gerrit_port)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030048 auth = HTTPBasicAuth(gerrit_user, gerrit_password)
Hanna Arhipova474ba922019-07-04 12:43:16 +030049 rest = GerritRestAPI(url=gerrit_url, auth=auth)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030050 return rest
51
52
53def join_to_jenkins(local_salt_client, jenkins_user, jenkins_password):
Hanna Arhipova474ba922019-07-04 12:43:16 +030054
55 pytest.jenkins_port = local_salt_client.pillar_get(
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030056 tgt='I@jenkins:client and not I@salt:master',
57 param='_param:haproxy_jenkins_bind_port',
58 expr_form='compound')
Hanna Arhipova474ba922019-07-04 12:43:16 +030059 pytest.jenkins_address = 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_host',
62 expr_form='compound')
Hanna Arhipova474ba922019-07-04 12:43:16 +030063 pytest.jenkins_protocol = local_salt_client.pillar_get(
64 tgt='I@gerrit:client and not I@salt:master',
65 param="_param:jenkins_master_protocol",
66 expr_form='compound')
67
68 jenkins_url = '{protocol}://{address}:{port}'.format(
69 protocol=pytest.jenkins_protocol,
70 address=pytest.jenkins_address,
71 port=pytest.jenkins_port)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030072 server = jenkins.Jenkins(jenkins_url, username=jenkins_user, password=jenkins_password)
73 return server
74
75
76def get_password(local_salt_client,service):
77 password = local_salt_client.pillar_get(
78 tgt=service,
79 param='_param:openldap_admin_password')
80 return password
81
82
Oleksii Zhurba23c18332019-05-09 18:53:40 -050083@pytest.mark.full
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030084def test_drivetrain_gerrit(local_salt_client, check_cicd):
Hanna Arhipova474ba922019-07-04 12:43:16 +030085
86 gerrit_password = get_password(local_salt_client, 'gerrit:client')
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030087 gerrit_error = ''
88 current_date = time.strftime("%Y%m%d-%H.%M.%S", time.localtime())
89 test_proj_name = "test-dt-{0}".format(current_date)
Hanna Arhipova474ba922019-07-04 12:43:16 +030090
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030091 try:
Hanna Arhipova474ba922019-07-04 12:43:16 +030092 # Connecting to gerrit and check connection
93 server = join_to_gerrit(local_salt_client, 'admin', gerrit_password)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030094 gerrit_check = server.get("/changes/?q=owner:self%20status:open")
Hanna Arhipova474ba922019-07-04 12:43:16 +030095 # Check deleteproject plugin and skip test if the plugin is not installed
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030096 gerrit_plugins = server.get("/plugins/?all")
97 if 'deleteproject' not in gerrit_plugins:
98 pytest.skip("Delete-project plugin is not installed")
Hanna Arhipova474ba922019-07-04 12:43:16 +030099 # Create test project and add description
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300100 server.put("/projects/"+test_proj_name)
Hanna Arhipova474ba922019-07-04 12:43:16 +0300101 server.put("/projects/"+test_proj_name+"/description",
102 json={"description": "Test DriveTrain project", "commit_message": "Update the project description"})
Hanna Arhipova1eef8312019-05-06 20:14:18 +0300103 except HTTPError as e:
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300104 gerrit_error = e
105 try:
Hanna Arhipova474ba922019-07-04 12:43:16 +0300106 # Create test folder and init git
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300107 repo_dir = os.path.join(os.getcwd(),test_proj_name)
108 file_name = os.path.join(repo_dir, current_date)
109 repo = git.Repo.init(repo_dir)
Hanna Arhipova474ba922019-07-04 12:43:16 +0300110 # Add remote url for this git repo
111 origin = repo.create_remote('origin', '{http}://admin:{password}@{address}:{port}/{project}.git'.format(
112 project=test_proj_name,
113 password=gerrit_password,
114 http=pytest.gerrit_protocol,
115 address=pytest.gerrit_address,
116 port=pytest.gerrit_port))
117 # Add commit-msg hook to automatically add Change-Id to our commit
118 os.system("curl -Lo {repo}/.git/hooks/commit-msg '{http}://admin:{password}@{address}:{port}/tools/hooks/commit-msg' > /dev/null 2>&1".format(
119 repo=repo_dir,
120 password=gerrit_password,
121 address=pytest.gerrit_address,
122 http=pytest.gerrit_protocol,
123 port=pytest.gerrit_port))
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300124 os.system("chmod u+x {0}/.git/hooks/commit-msg".format(repo_dir))
Hanna Arhipova474ba922019-07-04 12:43:16 +0300125 # Create a test file
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300126 f = open(file_name, 'w+')
127 f.write("This is a test file for DriveTrain test")
128 f.close()
Hanna Arhipova474ba922019-07-04 12:43:16 +0300129 # Add file to git and commit it to Gerrit for review
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300130 repo.index.add([file_name])
131 repo.index.commit("This is a test commit for DriveTrain test")
132 repo.git.push("origin", "HEAD:refs/for/master")
Hanna Arhipova474ba922019-07-04 12:43:16 +0300133 # Get change id from Gerrit. Set Code-Review +2 and submit this change
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300134 changes = server.get("/changes/?q=project:{0}".format(test_proj_name))
135 last_change = changes[0].get('change_id')
Hanna Arhipova474ba922019-07-04 12:43:16 +0300136 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 +0300137 server.post("/changes/{0}/submit".format(last_change))
Hanna Arhipova1eef8312019-05-06 20:14:18 +0300138 except HTTPError as e:
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300139 gerrit_error = e
140 finally:
Hanna Arhipova474ba922019-07-04 12:43:16 +0300141 # Delete test project
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300142 server.post("/projects/"+test_proj_name+"/deleteproject~delete")
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200143 assert gerrit_error == '', (
144 'There is an error during Gerrit operations:\n{}'.format(gerrit_error))
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300145
146
Oleksii Zhurba23c18332019-05-09 18:53:40 -0500147@pytest.mark.full
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300148@pytest.mark.skip
149# Temporary skipped, ldap3 package add\search user is not working
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300150def test_drivetrain_openldap(local_salt_client, check_cicd):
151 """
152 1. Create a test user 'DT_test_user' in openldap
153 2. Add the user to admin group
154 3. Login using the user to Jenkins
155 4. Check that no error occurred
156 5. Add the user to devops group in Gerrit and then login to Gerrit
157 using test_user credentials.
158 6 Start job in jenkins from this user
159 7. Get info from gerrit from this user
160 6. Finally, delete the user from admin
161 group and openldap
162 """
163
164 # TODO split to several test cases. One check - per one test method. Make the login process in fixture
Hanna Arhipova474ba922019-07-04 12:43:16 +0300165 ldap_password = get_password(local_salt_client, 'openldap:client')
166 # Check that ldap_password is exists, otherwise skip test
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300167 if not ldap_password:
168 pytest.skip("Openldap service or openldap:client pillar \
169 are not found on this environment.")
170 ldap_port = local_salt_client.pillar_get(
171 tgt='I@openldap:client and not I@salt:master',
172 param='_param:haproxy_openldap_bind_port',
173 expr_form='compound')
174 ldap_address = local_salt_client.pillar_get(
175 tgt='I@openldap:client and not I@salt:master',
176 param='_param:haproxy_openldap_bind_host',
177 expr_form='compound')
178 ldap_dc = local_salt_client.pillar_get(
179 tgt='openldap:client',
180 param='_param:openldap_dn')
181 ldap_con_admin = local_salt_client.pillar_get(
182 tgt='openldap:client',
183 param='openldap:client:server:auth:user')
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300184 ldap_url = 'ldap://{0}:{1}'.format(ldap_address, ldap_port)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300185 ldap_error = ''
186 ldap_result = ''
187 gerrit_result = ''
188 gerrit_error = ''
189 jenkins_error = ''
Hanna Arhipova474ba922019-07-04 12:43:16 +0300190 # Test user's CN
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300191 test_user_name = 'DT_test_user'
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300192 test_user = 'cn={0},ou=people,{1}'.format(test_user_name, ldap_dc)
Hanna Arhipova474ba922019-07-04 12:43:16 +0300193 # Admins group CN
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300194 admin_gr_dn = 'cn=admins,ou=groups,{0}'.format(ldap_dc)
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300195 user_pass = 'aSecretPassw'
Hanna Arhipova474ba922019-07-04 12:43:16 +0300196 # List of attributes for test user
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300197 attrs = {}
198 attrs['objectclass'] = ['organizationalRole', 'simpleSecurityObject', 'shadowAccount']
199 attrs['cn'] = test_user_name
200 attrs['uid'] = test_user_name
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300201 attrs['userPassword'] = user_pass
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300202 attrs['description'] = 'Test user for CVP DT test'
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300203 # search_filter = '(cn={0})'.format(test_user_name)
204 search_filter = '(cn={})'.format(test_user_name)
Hanna Arhipova474ba922019-07-04 12:43:16 +0300205 # Get a test job name from config
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300206 config = utils.get_configuration()
207 jenkins_cvp_job = config['jenkins_cvp_job']
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300208 logging.warning('test_user: {}'.format(test_user))
209 logging.warning('ldap_address: {}'.format(ldap_address))
Hanna Arhipova474ba922019-07-04 12:43:16 +0300210 # Open connection to ldap and creating test user in admins group
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300211 try:
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300212 ldap_server = Server(host=ldap_address, port=ldap_port,
213 use_ssl=False, get_info='NO_INFO')
214 conn = Connection(ldap_server, client_strategy=LDIF)
215 conn.bind()
216 new_user = conn.add(test_user, test_user_name, attrs)
217 logging.warning('new_user: {}'.format(new_user))
218 conn.modify(admin_gr_dn,
219 {'memberUid': (MODIFY_ADD, [test_user_name])
220 })
Hanna Arhipova474ba922019-07-04 12:43:16 +0300221 # Check search test user in LDAP
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300222 conn2 = Connection(ldap_server)
223 conn2.bind()
224 ldap_result = conn2.search(search_base='dc=heat-cicd-queens-contrail41-sl,dc=local',
225 search_filter=search_filter, search_scope='SUBTREE', attributes=['cn'])
226 logging.warning('ldap_result: {}'.format(ldap_result))
227 logging.warning('conn2.entries.: {}'.format(conn2.entries))
228 except LDAPException as e:
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300229 ldap_error = e
230 try:
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300231 # Check if user is created before connect from Jenkins
232 assert ldap_result, "Test user {} is not found".format(ldap_result)
Hanna Arhipova474ba922019-07-04 12:43:16 +0300233 # Check connection between Jenkins and LDAP
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300234 jenkins_server = join_to_jenkins(local_salt_client, test_user_name, user_pass)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300235 jenkins_version = jenkins_server.get_job_name(jenkins_cvp_job)
Hanna Arhipova474ba922019-07-04 12:43:16 +0300236 # Check connection between Gerrit and LDAP
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300237 gerrit_server = join_to_gerrit(local_salt_client, 'admin', ldap_password)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300238 gerrit_check = gerrit_server.get("/changes/?q=owner:self%20status:open")
Hanna Arhipova474ba922019-07-04 12:43:16 +0300239 # Add test user to devops-contrib group in Gerrit and check login
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300240 _link = "/groups/devops-contrib/members/{0}".format(test_user_name)
241 gerrit_add_user = gerrit_server.put(_link)
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300242 gerrit_server = join_to_gerrit(local_salt_client, test_user_name, user_pass)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300243 gerrit_result = gerrit_server.get("/changes/?q=owner:self%20status:open")
Hanna Arhipova1eef8312019-05-06 20:14:18 +0300244 except HTTPError as e:
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300245 gerrit_error = e
Hanna Arhipova1eef8312019-05-06 20:14:18 +0300246 except jenkins.JenkinsException as e:
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300247 jenkins_error = e
248 finally:
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300249 conn.modify(admin_gr_dn,
250 {'memberUid': (MODIFY_DELETE, [test_user_name])
251 })
252 conn.delete(test_user)
253 conn.unbind()
254 conn2.unbind()
255
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200256 assert ldap_error == '', (
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300257 "There is an error with connection to LDAP:\n{}".format(ldap_error))
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200258 assert jenkins_error == '', (
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300259 "Connection to Jenkins is not established:\n{}".format(jenkins_error))
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200260 assert gerrit_error == '', (
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300261 "Connection to Gerrit is not established:\n{}".format(gerrit_error))
262
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300263
264
Oleksii Zhurba23c18332019-05-09 18:53:40 -0500265@pytest.mark.sl_dup
266#DockerService***Outage
267@pytest.mark.full
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300268def test_drivetrain_services_replicas(local_salt_client, check_cicd):
269 """
270 # Execute ` salt -C 'I@gerrit:client' cmd.run 'docker service ls'` command to get info for each docker service like that:
271 "x5nzktxsdlm6 jenkins_slave02 replicated 0/1 docker-prod-local.artifactory.mirantis.com/mirantis/cicd/jnlp-slave:2019.2.0 "
272 # Check that each service has all replicas
273 """
274 # TODO: replace with rerunfalures plugin
275 wrong_items = []
276 for _ in range(4):
277 docker_services_by_nodes = local_salt_client.cmd(
278 tgt='I@gerrit:client',
279 param='docker service ls',
280 expr_form='compound')
281 wrong_items = []
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300282 for line in docker_services_by_nodes[list(docker_services_by_nodes.keys())[0]].split('\n'):
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300283 if line[line.find('/') - 1] != line[line.find('/') + 1] \
284 and 'replicated' in line:
285 wrong_items.append(line)
286 if len(wrong_items) == 0:
287 break
288 else:
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300289 time.sleep(5)
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200290 assert len(wrong_items) == 0, (
291 "Some DriveTrain services don't have expected number of replicas:\n"
292 "{}".format(json.dumps(wrong_items, indent=4))
293 )
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300294
295
Oleksii Zhurba23c18332019-05-09 18:53:40 -0500296@pytest.mark.full
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300297def test_drivetrain_components_and_versions(local_salt_client, check_cicd):
298 """
299 1. Execute command `docker service ls --format "{{.Image}}"'` on the 'I@gerrit:client' target
300 2. Execute ` salt -C 'I@gerrit:client' pillar.get docker:client:images`
301 3. Check that list of images from step 1 is the same as a list from the step2
302 4. Check that all docker services has label that equals to mcp_version
303
304 """
Hanna Arhipovadcff7142019-06-12 13:56:36 +0300305 def get_name(long_name):
306 return long_name.rsplit(':', 1)[0]
307
308 def get_tag(long_name):
309 return long_name.rsplit(':', 1)[-1]
310
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300311 table_with_docker_services = local_salt_client.cmd(tgt='I@gerrit:client',
312 param='docker service ls --format "{{.Image}}"',
313 expr_form='compound')
Hanna Arhipova7227a952019-07-22 14:58:03 +0300314 stack_info = local_salt_client.pillar_get(tgt='gerrit:client',
315 param='docker:client:stack')
316
Ievgeniia Zadorozhna6449c0e2020-01-09 13:28:09 +0200317 expected_images_list = list()
Hanna Arhipova7227a952019-07-22 14:58:03 +0300318 # find services in list of docker clients
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +0300319 for key, stack in list(stack_info.items()):
Hanna Arhipova7227a952019-07-22 14:58:03 +0300320 if stack.get('service'):
Ievgeniia Zadorozhna6449c0e2020-01-09 13:28:09 +0200321 stack = [item.get('image') for _, item in
322 list(stack.get('service').items()) if item.get('image')]
323 expected_images_list += stack
324 expected_images = defaultdict(list)
Hanna Arhipova7227a952019-07-22 14:58:03 +0300325
Ievgeniia Zadorozhna6449c0e2020-01-09 13:28:09 +0200326 # collect unique tags for each image in same structure as for actual images
327 for image in expected_images_list:
328 if get_name(image) in expected_images:
329 if get_tag(image) not in expected_images[get_name(image)]:
330 expected_images[get_name(image)].append(get_tag(image))
331 else:
332 expected_images[get_name(image)].append(get_tag(image))
Hanna Arhipova7227a952019-07-22 14:58:03 +0300333
Ievgeniia Zadorozhna6449c0e2020-01-09 13:28:09 +0200334 # collect tags for each image in same structure as for expected images
335 actual_images = defaultdict(list)
336 for image in set(table_with_docker_services[
337 list(table_with_docker_services.keys())[0]].split('\n')):
338 actual_images[get_name(image)].append(get_tag(image))
339
340 # find difference between defaultdicts
341 total_diff = 0
342 for i in expected_images:
343 diff = set(expected_images[i]) - set(actual_images[i])
344 total_diff += len(diff)
345
346 assert actual_images == expected_images, (
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200347 "Some DriveTrain components do not have expected versions:\n{}".format(
Ievgeniia Zadorozhna6449c0e2020-01-09 13:28:09 +0200348 json.dumps(total_diff, indent=4))
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200349 )
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300350
351
Oleksii Zhurba23c18332019-05-09 18:53:40 -0500352@pytest.mark.full
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300353def test_jenkins_jobs_branch(local_salt_client, check_cicd):
354 """ This test compares Jenkins jobs versions
355 collected from the cloud vs collected from pillars.
356 """
Hanna Arhipova474ba922019-07-04 12:43:16 +0300357
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300358 excludes = ['upgrade-mcp-release', 'deploy-update-salt',
359 'git-mirror-downstream-mk-pipelines',
360 'git-mirror-downstream-pipeline-library']
361
362 config = utils.get_configuration()
363 drivetrain_version = config.get('drivetrain_version', '')
364 jenkins_password = get_password(local_salt_client, 'jenkins:client')
365 version_mismatch = []
366 server = join_to_jenkins(local_salt_client, 'admin', jenkins_password)
367 for job_instance in server.get_jobs():
368 job_name = job_instance.get('name')
369 if job_name in excludes:
370 continue
371
372 job_config = server.get_job_config(job_name)
373 xml_data = minidom.parseString(job_config)
374 BranchSpec = xml_data.getElementsByTagName('hudson.plugins.git.BranchSpec')
375
376 # We use master branch for pipeline-library in case of 'testing,stable,nighlty' versions
377 # Leave proposed version as is
378 # in other cases we get release/{drivetrain_version} (e.g release/2019.2.0)
379 if drivetrain_version in ['testing', 'nightly', 'stable']:
380 expected_version = 'master'
381 else:
382 expected_version = local_salt_client.pillar_get(
383 tgt='gerrit:client',
384 param='jenkins:client:job:{}:scm:branch'.format(job_name))
385
386 if not BranchSpec:
Hanna Arhipova1eef8312019-05-06 20:14:18 +0300387 logging.debug("No BranchSpec has found for {} job".format(job_name))
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300388 continue
389
390 actual_version = BranchSpec[0].getElementsByTagName('name')[0].childNodes[0].data
Oleksii Zhurbae01d5e82019-05-17 14:04:28 -0500391 if expected_version and actual_version not in expected_version:
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300392 version_mismatch.append("Job {0} has {1} branch."
393 "Expected {2}".format(job_name,
394 actual_version,
395 expected_version))
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200396 assert len(version_mismatch) == 0, (
397 "Some DriveTrain jobs have version/branch mismatch:\n{}".format(
398 json.dumps(version_mismatch, indent=4))
399 )
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300400
401
Oleksii Zhurba23c18332019-05-09 18:53:40 -0500402@pytest.mark.full
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300403def test_drivetrain_jenkins_job(local_salt_client, check_cicd):
404 """
405 # Login to Jenkins on jenkins:client
406 # Read the name of jobs from configuration 'jenkins_test_job'
407 # Start job
408 # Wait till the job completed
409 # Check that job has completed with "SUCCESS" result
410 """
411 job_result = None
412
413 jenkins_password = get_password(local_salt_client, 'jenkins:client')
414 server = join_to_jenkins(local_salt_client, 'admin', jenkins_password)
415 # Getting Jenkins test job name from configuration
416 config = utils.get_configuration()
417 jenkins_test_job = config['jenkins_test_job']
418 if not server.get_job_name(jenkins_test_job):
419 server.create_job(jenkins_test_job, jenkins.EMPTY_CONFIG_XML)
420 if server.get_job_name(jenkins_test_job):
421 next_build_num = server.get_job_info(jenkins_test_job)['nextBuildNumber']
422 # If this is first build number skip building check
423 if next_build_num != 1:
424 # Check that test job is not running at this moment,
425 # Otherwise skip the test
426 last_build_num = server.get_job_info(jenkins_test_job)['lastBuild'].get('number')
427 last_build_status = server.get_build_info(jenkins_test_job, last_build_num)['building']
428 if last_build_status:
429 pytest.skip("Test job {0} is already running").format(jenkins_test_job)
430 server.build_job(jenkins_test_job)
431 timeout = 0
432 # Use job status True by default to exclude timeout between build job and start job.
433 job_status = True
434 while job_status and (timeout < 180):
435 time.sleep(10)
436 timeout += 10
437 job_status = server.get_build_info(jenkins_test_job, next_build_num)['building']
438 job_result = server.get_build_info(jenkins_test_job, next_build_num)['result']
439 else:
440 pytest.skip("The job {0} was not found").format(jenkins_test_job)
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +0200441 assert job_result == 'SUCCESS', (
442 "Test job '{}' build is not successful or timeout is too "
443 "small.".format(jenkins_test_job)
444 )