blob: 5a1653cdb8f0c4a08ca504d4b5970f898de90326 [file] [log] [blame]
Ekaterina Chernovae32e3f92019-11-12 14:56:03 +03001import git
Mikhail Kraynove5cc81b2018-10-03 13:01:06 +04002import jenkins
Oleksii Zhurbaa25984b2018-06-15 15:30:41 -05003import json
Ekaterina Chernovae32e3f92019-11-12 14:56:03 +03004import logging
5import os
Oleksii Zhurbaa25984b2018-06-15 15:30:41 -05006import pytest
Mikhail Kraynov351e8412018-10-04 18:27:44 +04007import time
Ekaterina Chernovae32e3f92019-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
Mikhail Kraynov351e8412018-10-04 18:27:44 +040020from pygerrit2 import GerritRestAPI, HTTPBasicAuth
21from requests import HTTPError
Ekaterina Chernovae32e3f92019-11-12 14:56:03 +030022from xml.dom import minidom
Ievgeniia Zadorozhna4f470442020-01-09 13:22:14 +020023from collections import defaultdict
Hanna Arhipovae792be52019-02-13 13:28:11 +020024
Hanna Arhipova53268ce2020-05-15 15:22:06 +030025# ############################ FIXTURES ######################################
26user_name = 'DT_test_user'
27user_pass = 'aSecretPassw'
28
Hanna Arhipova91dc8152019-07-04 12:43:16 +030029
Mikhail Kraynov351e8412018-10-04 18:27:44 +040030def join_to_gerrit(local_salt_client, gerrit_user, gerrit_password):
Hanna Arhipova91dc8152019-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(
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050035 tgt='I@gerrit:client and not I@salt:master',
36 param='_param:haproxy_gerrit_bind_port',
37 expr_form='compound')
Hanna Arhipova91dc8152019-07-04 12:43:16 +030038 pytest.gerrit_address = local_salt_client.pillar_get(
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050039 tgt='I@gerrit:client and not I@salt:master',
40 param='_param:haproxy_gerrit_bind_host',
41 expr_form='compound')
Hanna Arhipova91dc8152019-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)
Mikhail Kraynov351e8412018-10-04 18:27:44 +040052 auth = HTTPBasicAuth(gerrit_user, gerrit_password)
Hanna Arhipova91dc8152019-07-04 12:43:16 +030053 rest = GerritRestAPI(url=gerrit_url, auth=auth)
Mikhail Kraynov351e8412018-10-04 18:27:44 +040054 return rest
Oleksii Zhurbaa25984b2018-06-15 15:30:41 -050055
Hanna Arhipovae792be52019-02-13 13:28:11 +020056
Mikhail Kraynove5cc81b2018-10-03 13:01:06 +040057def join_to_jenkins(local_salt_client, jenkins_user, jenkins_password):
Hanna Arhipova91dc8152019-07-04 12:43:16 +030058
59 pytest.jenkins_port = local_salt_client.pillar_get(
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050060 tgt='I@jenkins:client and not I@salt:master',
61 param='_param:haproxy_jenkins_bind_port',
62 expr_form='compound')
Hanna Arhipova91dc8152019-07-04 12:43:16 +030063 pytest.jenkins_address = local_salt_client.pillar_get(
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050064 tgt='I@jenkins:client and not I@salt:master',
65 param='_param:haproxy_jenkins_bind_host',
66 expr_form='compound')
Hanna Arhipova91dc8152019-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)
Mikhail Kraynove5cc81b2018-10-03 13:01:06 +040076 server = jenkins.Jenkins(jenkins_url, username=jenkins_user, password=jenkins_password)
77 return server
78
Hanna Arhipovae792be52019-02-13 13:28:11 +020079
Mikhail Kraynov351e8412018-10-04 18:27:44 +040080def get_password(local_salt_client,service):
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050081 password = local_salt_client.pillar_get(
82 tgt=service,
83 param='_param:openldap_admin_password')
Mikhail Kraynov351e8412018-10-04 18:27:44 +040084 return password
85
Hanna Arhipovae792be52019-02-13 13:28:11 +020086
Hanna Arhipova53268ce2020-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 Zhurba5b15b9b2019-05-09 18:53:40 -0500169@pytest.mark.full
Hanna Arhipovab7e866c2019-04-10 13:49:56 +0300170def test_drivetrain_gerrit(local_salt_client, check_cicd):
Hanna Arhipova91dc8152019-07-04 12:43:16 +0300171
172 gerrit_password = get_password(local_salt_client, 'gerrit:client')
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400173 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 Arhipova91dc8152019-07-04 12:43:16 +0300176
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400177 try:
Hanna Arhipova91dc8152019-07-04 12:43:16 +0300178 # Connecting to gerrit and check connection
179 server = join_to_gerrit(local_salt_client, 'admin', gerrit_password)
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400180 gerrit_check = server.get("/changes/?q=owner:self%20status:open")
Hanna Arhipova91dc8152019-07-04 12:43:16 +0300181 # Check deleteproject plugin and skip test if the plugin is not installed
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400182 gerrit_plugins = server.get("/plugins/?all")
183 if 'deleteproject' not in gerrit_plugins:
184 pytest.skip("Delete-project plugin is not installed")
Hanna Arhipova91dc8152019-07-04 12:43:16 +0300185 # Create test project and add description
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400186 server.put("/projects/"+test_proj_name)
Hanna Arhipova91dc8152019-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 Arhipova56eab942019-05-06 20:14:18 +0300189 except HTTPError as e:
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400190 gerrit_error = e
191 try:
Hanna Arhipova91dc8152019-07-04 12:43:16 +0300192 # Create test folder and init git
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400193 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 Arhipova91dc8152019-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))
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400210 os.system("chmod u+x {0}/.git/hooks/commit-msg".format(repo_dir))
Hanna Arhipova91dc8152019-07-04 12:43:16 +0300211 # Create a test file
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400212 f = open(file_name, 'w+')
213 f.write("This is a test file for DriveTrain test")
214 f.close()
Hanna Arhipova91dc8152019-07-04 12:43:16 +0300215 # Add file to git and commit it to Gerrit for review
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400216 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 Arhipova91dc8152019-07-04 12:43:16 +0300219 # Get change id from Gerrit. Set Code-Review +2 and submit this change
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400220 changes = server.get("/changes/?q=project:{0}".format(test_proj_name))
221 last_change = changes[0].get('change_id')
Hanna Arhipova91dc8152019-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"}})
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400223 server.post("/changes/{0}/submit".format(last_change))
Hanna Arhipova56eab942019-05-06 20:14:18 +0300224 except HTTPError as e:
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400225 gerrit_error = e
226 finally:
Hanna Arhipova91dc8152019-07-04 12:43:16 +0300227 # Delete test project
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400228 server.post("/projects/"+test_proj_name+"/deleteproject~delete")
Dmitriy Kruglova34a3042019-08-20 11:45:35 +0200229 assert gerrit_error == '', (
230 'There is an error during Gerrit operations:\n{}'.format(gerrit_error))
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400231
Hanna Arhipovae792be52019-02-13 13:28:11 +0200232
Oleksii Zhurba5b15b9b2019-05-09 18:53:40 -0500233@pytest.mark.full
Hanna Arhipova53268ce2020-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 Arhipova16a8f412019-04-08 17:10:38 +0300237 """
Hanna Arhipova53268ce2020-05-15 15:22:06 +0300238 1. Start job in jenkins from new ldap user
Hanna Arhipova16a8f412019-04-08 17:10:38 +0300239 """
Hanna Arhipova91dc8152019-07-04 12:43:16 +0300240 # Get a test job name from config
mkraynov360c30d2018-09-27 17:02:45 +0400241 config = utils.get_configuration()
mkraynov058ee122018-11-30 13:15:49 +0400242 jenkins_cvp_job = config['jenkins_cvp_job']
Hanna Arhipova53268ce2020-05-15 15:22:06 +0300243 jenkins_error = ''
mkraynov360c30d2018-09-27 17:02:45 +0400244 try:
Hanna Arhipova91dc8152019-07-04 12:43:16 +0300245 # Check connection between Jenkins and LDAP
Hanna Arhipova53268ce2020-05-15 15:22:06 +0300246 jenkins_server = join_to_jenkins(local_salt_client, user_name, user_pass)
mkraynov058ee122018-11-30 13:15:49 +0400247 jenkins_version = jenkins_server.get_job_name(jenkins_cvp_job)
Hanna Arhipova53268ce2020-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 Arhipova91dc8152019-07-04 12:43:16 +0300265 # Check connection between Gerrit and LDAP
Ekaterina Chernovae32e3f92019-11-12 14:56:03 +0300266 gerrit_server = join_to_gerrit(local_salt_client, 'admin', ldap_password)
mkraynov360c30d2018-09-27 17:02:45 +0400267 gerrit_check = gerrit_server.get("/changes/?q=owner:self%20status:open")
Hanna Arhipova53268ce2020-05-15 15:22:06 +0300268
Hanna Arhipova91dc8152019-07-04 12:43:16 +0300269 # Add test user to devops-contrib group in Gerrit and check login
Hanna Arhipova53268ce2020-05-15 15:22:06 +0300270 _link = "/groups/devops-contrib/members/{0}".format(user_name)
mkraynov360c30d2018-09-27 17:02:45 +0400271 gerrit_add_user = gerrit_server.put(_link)
Hanna Arhipova53268ce2020-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 Arhipova56eab942019-05-06 20:14:18 +0300277 except HTTPError as e:
mkraynov360c30d2018-09-27 17:02:45 +0400278 gerrit_error = e
Ekaterina Chernovae32e3f92019-11-12 14:56:03 +0300279
Dmitriy Kruglova34a3042019-08-20 11:45:35 +0200280 assert gerrit_error == '', (
Ekaterina Chernovae32e3f92019-11-12 14:56:03 +0300281 "Connection to Gerrit is not established:\n{}".format(gerrit_error))
282
Mikhail Kraynov351e8412018-10-04 18:27:44 +0400283
Oleksii Zhurba5b15b9b2019-05-09 18:53:40 -0500284@pytest.mark.sl_dup
285#DockerService***Outage
286@pytest.mark.full
Oleksii Zhurba67aaec92019-04-15 18:05:13 -0500287def test_drivetrain_services_replicas(local_salt_client, check_cicd):
Hanna Arhipova16a8f412019-04-08 17:10:38 +0300288 """
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 """
Hanna Arhipovaf2660bd2019-02-08 17:25:39 +0200293 # TODO: replace with rerunfalures plugin
Hanna Arhipova16a8f412019-04-08 17:10:38 +0300294 wrong_items = []
Hanna Arhipovaf2660bd2019-02-08 17:25:39 +0200295 for _ in range(4):
Hanna Arhipova16a8f412019-04-08 17:10:38 +0300296 docker_services_by_nodes = local_salt_client.cmd(
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -0500297 tgt='I@gerrit:client',
298 param='docker service ls',
Hanna Arhipovaf2660bd2019-02-08 17:25:39 +0200299 expr_form='compound')
300 wrong_items = []
Ekaterina Chernovae32e3f92019-11-12 14:56:03 +0300301 for line in docker_services_by_nodes[list(docker_services_by_nodes.keys())[0]].split('\n'):
Hanna Arhipovaf2660bd2019-02-08 17:25:39 +0200302 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 Arhipovaf2660bd2019-02-08 17:25:39 +0200308 time.sleep(5)
Dmitriy Kruglova34a3042019-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 )
Oleksii Zhurbaa25984b2018-06-15 15:30:41 -0500313
314
Oleksii Zhurba5b15b9b2019-05-09 18:53:40 -0500315@pytest.mark.full
Hanna Arhipovab7e866c2019-04-10 13:49:56 +0300316def test_drivetrain_components_and_versions(local_salt_client, check_cicd):
Oleksii Zhurbab91c3142019-03-26 16:49:44 -0500317 """
Hanna Arhipova16a8f412019-04-08 17:10:38 +0300318 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 Arhipova04344f12019-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
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -0500330 table_with_docker_services = local_salt_client.cmd(tgt='I@gerrit:client',
331 param='docker service ls --format "{{.Image}}"',
Hanna Arhipovae792be52019-02-13 13:28:11 +0200332 expr_form='compound')
Hanna Arhipova8cc3a982019-07-22 14:58:03 +0300333 stack_info = local_salt_client.pillar_get(tgt='gerrit:client',
334 param='docker:client:stack')
335
Ievgeniia Zadorozhna4f470442020-01-09 13:22:14 +0200336 expected_images_list = list()
Hanna Arhipova8cc3a982019-07-22 14:58:03 +0300337 # find services in list of docker clients
Ekaterina Chernovae32e3f92019-11-12 14:56:03 +0300338 for key, stack in list(stack_info.items()):
Hanna Arhipova8cc3a982019-07-22 14:58:03 +0300339 if stack.get('service'):
Ekaterina Chernovae32e3f92019-11-12 14:56:03 +0300340 stack = [item.get('image') for _,item in list(stack.get('service').items()) if item.get('image')]
Ievgeniia Zadorozhna4f470442020-01-09 13:22:14 +0200341 expected_images_list += stack
342 expected_images = defaultdict(list)
Hanna Arhipova8cc3a982019-07-22 14:58:03 +0300343
Ievgeniia Zadorozhna4f470442020-01-09 13:22:14 +0200344 # collect unique tags for each image in same structure as for actual images
345 for image in expected_images_list:
346 if get_name(image) in expected_images:
347 if get_tag(image) not in expected_images[get_name(image)]:
348 expected_images[get_name(image)].append(get_tag(image))
349 else:
350 expected_images[get_name(image)].append(get_tag(image))
351
352 # collect tags for each image in same structure as for expected images
353 actual_images = defaultdict(list)
Ekaterina Chernovae32e3f92019-11-12 14:56:03 +0300354 for image in set(table_with_docker_services[list(table_with_docker_services.keys())[0]].split('\n')):
Ievgeniia Zadorozhna4f470442020-01-09 13:22:14 +0200355 actual_images[get_name(image)].append(get_tag(image))
Hanna Arhipova8cc3a982019-07-22 14:58:03 +0300356
Ievgeniia Zadorozhna4f470442020-01-09 13:22:14 +0200357 # find difference between defaultdicts
358 total_diff = 0
359 for i in expected_images:
360 diff = set(expected_images[i]) - set(actual_images[i])
361 total_diff += len(diff)
362
363 assert actual_images == expected_images, (
Dmitriy Kruglova34a3042019-08-20 11:45:35 +0200364 "Some DriveTrain components do not have expected versions:\n{}".format(
Ievgeniia Zadorozhna4f470442020-01-09 13:22:14 +0200365 json.dumps(total_diff, indent=4))
Dmitriy Kruglova34a3042019-08-20 11:45:35 +0200366 )
Oleksii Zhurbaa25984b2018-06-15 15:30:41 -0500367
368
Oleksii Zhurba5b15b9b2019-05-09 18:53:40 -0500369@pytest.mark.full
Oleksii Zhurba67aaec92019-04-15 18:05:13 -0500370def test_jenkins_jobs_branch(local_salt_client, check_cicd):
Oleksii Zhurbad52b5fe2019-03-28 11:11:35 -0500371 """ This test compares Jenkins jobs versions
372 collected from the cloud vs collected from pillars.
373 """
Hanna Arhipova91dc8152019-07-04 12:43:16 +0300374
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -0500375 excludes = ['upgrade-mcp-release', 'deploy-update-salt',
376 'git-mirror-downstream-mk-pipelines',
377 'git-mirror-downstream-pipeline-library']
Hanna Arhipova6f34fbb2019-02-08 11:19:41 +0200378
Oleksii Zhurbaa25984b2018-06-15 15:30:41 -0500379 config = utils.get_configuration()
Hanna Arhipova6f34fbb2019-02-08 11:19:41 +0200380 drivetrain_version = config.get('drivetrain_version', '')
Hanna Arhipovae792be52019-02-13 13:28:11 +0200381 jenkins_password = get_password(local_salt_client, 'jenkins:client')
Oleksii Zhurbaa25984b2018-06-15 15:30:41 -0500382 version_mismatch = []
Hanna Arhipovae792be52019-02-13 13:28:11 +0200383 server = join_to_jenkins(local_salt_client, 'admin', jenkins_password)
Mikhail Kraynove5cc81b2018-10-03 13:01:06 +0400384 for job_instance in server.get_jobs():
385 job_name = job_instance.get('name')
Hanna Arhipova6f34fbb2019-02-08 11:19:41 +0200386 if job_name in excludes:
387 continue
388
Mikhail Kraynove5cc81b2018-10-03 13:01:06 +0400389 job_config = server.get_job_config(job_name)
Oleksii Zhurbaa25984b2018-06-15 15:30:41 -0500390 xml_data = minidom.parseString(job_config)
391 BranchSpec = xml_data.getElementsByTagName('hudson.plugins.git.BranchSpec')
Hanna Arhipova6f34fbb2019-02-08 11:19:41 +0200392
393 # We use master branch for pipeline-library in case of 'testing,stable,nighlty' versions
394 # Leave proposed version as is
395 # in other cases we get release/{drivetrain_version} (e.g release/2019.2.0)
Hanna Arhipova16a8f412019-04-08 17:10:38 +0300396 if drivetrain_version in ['testing', 'nightly', 'stable']:
Mikhail Kraynove5cc81b2018-10-03 13:01:06 +0400397 expected_version = 'master'
Hanna Arhipova6f34fbb2019-02-08 11:19:41 +0200398 else:
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -0500399 expected_version = local_salt_client.pillar_get(
400 tgt='gerrit:client',
401 param='jenkins:client:job:{}:scm:branch'.format(job_name))
Hanna Arhipova6f34fbb2019-02-08 11:19:41 +0200402
403 if not BranchSpec:
Hanna Arhipova56eab942019-05-06 20:14:18 +0300404 logging.debug("No BranchSpec has found for {} job".format(job_name))
Hanna Arhipova6f34fbb2019-02-08 11:19:41 +0200405 continue
406
407 actual_version = BranchSpec[0].getElementsByTagName('name')[0].childNodes[0].data
Oleksii Zhurba075cc7a2019-05-17 14:04:28 -0500408 if expected_version and actual_version not in expected_version:
Hanna Arhipova6f34fbb2019-02-08 11:19:41 +0200409 version_mismatch.append("Job {0} has {1} branch."
410 "Expected {2}".format(job_name,
411 actual_version,
412 expected_version))
Dmitriy Kruglova34a3042019-08-20 11:45:35 +0200413 assert len(version_mismatch) == 0, (
414 "Some DriveTrain jobs have version/branch mismatch:\n{}".format(
415 json.dumps(version_mismatch, indent=4))
416 )
Hanna Arhipova16a8f412019-04-08 17:10:38 +0300417
418
Oleksii Zhurba5b15b9b2019-05-09 18:53:40 -0500419@pytest.mark.full
Hanna Arhipovab7e866c2019-04-10 13:49:56 +0300420def test_drivetrain_jenkins_job(local_salt_client, check_cicd):
Hanna Arhipova16a8f412019-04-08 17:10:38 +0300421 """
422 # Login to Jenkins on jenkins:client
423 # Read the name of jobs from configuration 'jenkins_test_job'
424 # Start job
425 # Wait till the job completed
426 # Check that job has completed with "SUCCESS" result
427 """
428 job_result = None
429
430 jenkins_password = get_password(local_salt_client, 'jenkins:client')
431 server = join_to_jenkins(local_salt_client, 'admin', jenkins_password)
432 # Getting Jenkins test job name from configuration
433 config = utils.get_configuration()
434 jenkins_test_job = config['jenkins_test_job']
435 if not server.get_job_name(jenkins_test_job):
436 server.create_job(jenkins_test_job, jenkins.EMPTY_CONFIG_XML)
437 if server.get_job_name(jenkins_test_job):
438 next_build_num = server.get_job_info(jenkins_test_job)['nextBuildNumber']
439 # If this is first build number skip building check
440 if next_build_num != 1:
441 # Check that test job is not running at this moment,
442 # Otherwise skip the test
443 last_build_num = server.get_job_info(jenkins_test_job)['lastBuild'].get('number')
444 last_build_status = server.get_build_info(jenkins_test_job, last_build_num)['building']
445 if last_build_status:
446 pytest.skip("Test job {0} is already running").format(jenkins_test_job)
447 server.build_job(jenkins_test_job)
448 timeout = 0
449 # Use job status True by default to exclude timeout between build job and start job.
450 job_status = True
451 while job_status and (timeout < 180):
452 time.sleep(10)
453 timeout += 10
454 job_status = server.get_build_info(jenkins_test_job, next_build_num)['building']
455 job_result = server.get_build_info(jenkins_test_job, next_build_num)['result']
456 else:
457 pytest.skip("The job {0} was not found").format(jenkins_test_job)
Dmitriy Kruglova34a3042019-08-20 11:45:35 +0200458 assert job_result == 'SUCCESS', (
459 "Test job '{}' build is not successful or timeout is too "
460 "small.".format(jenkins_test_job)
461 )