blob: b617528dc8781f723b72792b0a7b131d2905bf1b [file] [log] [blame]
Hanna Arhipova71ecc272019-08-20 14:54:22 +03001import pytest
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +03002import sys
3import os
Hanna Arhipova71ecc272019-08-20 14:54:22 +03004
5from tcp_tests import logger
6from tcp_tests import settings
Hanna Arhipova71ecc272019-08-20 14:54:22 +03007
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +03008sys.path.append(os.getcwd())
9try:
10 from tcp_tests.fixtures import config_fixtures
11 from tcp_tests.managers import underlay_ssh_manager
12 from tcp_tests.managers import saltmanager as salt_manager
13except ImportError:
14 print("ImportError: Run the application from the tcp-qa directory or "
15 "set the PYTHONPATH environment variable to directory which contains"
16 " ./tcp_tests")
17 sys.exit(1)
Hanna Arhipova71ecc272019-08-20 14:54:22 +030018LOG = logger.logger
19
20
Hanna Arhipovad35a29b2019-09-04 13:24:06 +030021def has_only_similar(values_by_nodes):
22 """
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +030023 :param values_by_nodes: dict
Hanna Arhipovad35a29b2019-09-04 13:24:06 +030024 :return: bool, True if all items in the dict have similar values
25 """
26 values = list(values_by_nodes.values())
27 return all(value == values[0] for value in values)
28
29
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +030030def get_control_plane_targets():
31 config = config_fixtures.config()
32 underlay = underlay_ssh_manager.UnderlaySSHManager(config)
33 saltmanager = salt_manager.SaltManager(config, underlay)
Hanna Arhipovafbcea852019-10-03 13:24:53 +030034 targets = list()
Hanna Arhipova52bb17d2019-10-28 19:15:17 +020035 telemetry_exists = False
36 barbican_exists = False
Hanna Arhipovafbcea852019-10-03 13:24:53 +030037 try:
38 targets += saltmanager.run_state(
39 "I@keystone:server", 'test.ping')[0]['return'][0].keys()
40 targets += saltmanager.run_state(
41 "I@nginx:server and not I@salt:master",
42 "test.ping")[0]['return'][0].keys()
Hanna Arhipova4462dd02019-10-28 19:05:08 +020043 telemetry_exists = saltmanager.get_single_pillar(
44 "I@salt:master",
45 "_param:openstack_telemetry_hostname")
46 barbican_exists = saltmanager.get_single_pillar(
47 "I@salt:master",
48 "_param:barbican_enabled")
Hanna Arhipovafbcea852019-10-03 13:24:53 +030049 except BaseException as err:
50 LOG.warning("Can't retrieve data from Salt. \
51 Maybe cluster is not deployed completely.\
52 Err: {}".format(err))
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +030053
Hanna Arhipova75f21bb2019-10-07 19:22:15 +030054 # check for Manila existence
55 # if saltmanager.get_single_pillar("I@salt:master",
56 # "_param:manila_service_protocol"):
57 # targets.append('share*')
58
59 # check for Tenant Telemetry existence
Hanna Arhipova4462dd02019-10-28 19:05:08 +020060 if telemetry_exists:
Hanna Arhipova75f21bb2019-10-07 19:22:15 +030061 targets.append('mdb*')
62
63 # check for Barbican existence
Hanna Arhipova4462dd02019-10-28 19:05:08 +020064 if barbican_exists:
Hanna Arhipova75f21bb2019-10-07 19:22:15 +030065 targets.append('kmn*')
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +030066 return targets
67
68
Hanna Arhipova19429962019-10-17 15:16:49 +030069@pytest.fixture(scope='class')
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +030070def update_to_tag(request):
71 return request.config.getoption("--update-to-tag")
Hanna Arhipova672efc62021-03-15 09:55:14 +020072
73
74@pytest.fixture(scope='class')
75def switch_to_proposed_pipelines(reclass_actions, salt_actions,
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +030076 update_to_tag):
77 if update_to_tag:
Hanna Arhipova672efc62021-03-15 09:55:14 +020078 return True
79
Hanna Arhipova19429962019-10-17 15:16:49 +030080 reclass = reclass_actions
81 proposed_repo = "http://mirror.mirantis.com/update/proposed/"
82 repo_param = "parameters._param.linux_system_repo_update_url"
Hanna Arhipova7cfeb072019-10-11 15:04:10 +030083
Hanna Arhipova19429962019-10-17 15:16:49 +030084 proposed_pipeline_branch = "release/proposed/2019.2.0"
85 pipeline_branch_param = "parameters._param.jenkins_pipelines_branch"
86 infra_yml = "cluster/*/infra/init.yml"
87
88 LOG.info("Check reclass has release/proposed/2019.2.0 branches")
89 if reclass.get_key(pipeline_branch_param,
90 infra_yml) == proposed_pipeline_branch \
91 and reclass.get_key(repo_param, infra_yml) == proposed_repo:
92 return True
93
94 LOG.info("Switch to release/proposed/2019.2.0 branches")
95 reclass.add_key(pipeline_branch_param, proposed_pipeline_branch, infra_yml)
96
97 reclass.add_key(repo_param, proposed_repo, infra_yml)
98 reclass.add_key(repo_param, proposed_repo, "cluster/*/openstack/init.yml")
99 reclass.add_key(repo_param, proposed_repo, "cluster/*/stacklight/init.yml")
100 reclass.add_key(repo_param, proposed_repo, "cluster/*/ceph/init.yml")
Hanna Arhipova7cfeb072019-10-11 15:04:10 +0300101
102 salt_actions.run_state("*", "saltutil.refresh_pillar")
Hanna Arhipova9ee75902019-10-29 16:33:26 +0200103 salt_actions.enforce_state("*", "salt.minion")
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300104 salt_actions.enforce_state("I@jenkins:client", "jenkins.client")
105
106
Hanna Arhipova745fdbb2020-03-30 14:40:44 +0300107@pytest.fixture
Hanna Arhipovaec201e72020-10-26 17:14:25 +0200108def wa_for_galera_clustercheck_password_prod35705(reclass_actions,
109 salt_actions):
Hanna Arhipova0e816d22021-01-29 00:17:44 +0200110 tgt = "I@galera:master or I@galera:slave"
111 if not salt_actions.get_pillar(tgt,
112 "_param:galera_clustercheck_password")[0]:
113 reclass_actions.add_key(
114 "parameters._param.galera_clustercheck_password",
115 "a"*32,
116 "cluster/*/infra/secrets.yml")
117 salt_actions.run_state(tgt, "saltutil.refresh_pillar")
118 salt_actions.enforce_state(tgt, "galera")
119 salt_actions.enforce_state(tgt, "haproxy")
120 reclass_actions.commit(
121 "[from TCP-QA] Add galera_clustercheck_password")
122 else:
Hanna Arhipova672efc62021-03-15 09:55:14 +0200123
Hanna Arhipova0e816d22021-01-29 00:17:44 +0200124 LOG.info("Skipping WA for Galera Clustercheck Password")
Hanna Arhipova745fdbb2020-03-30 14:40:44 +0300125
126
Hanna Arhipova97fac6e2020-12-03 13:10:56 +0200127@pytest.fixture
PGlazovf5977292021-11-25 19:38:27 +0400128def wa_cve_2021_20288_global_id_reclaim(reclass_actions,
129 salt_actions):
130 tgt = "I@ceph:common"
131 context_file = "cluster/*/ceph/common.yml"
132 if not reclass_actions.check_existence(
133 'parameters.ceph.common.config.mon.'
134 + 'auth_allow_insecure_global_id_reclaim'):
PGlazov4b013962022-01-31 14:01:42 +0400135 if salt_actions.get_single_pillar(
136 "I@ceph:mgr and *01.*",
137 "_param.ceph_version") == 'luminous':
138 LOG.info('Skip reclaim set')
139 return
PGlazovf5977292021-11-25 19:38:27 +0400140 reclass_actions.add_bool_key(
141 'parameters.ceph.common.config.mon.'
142 + 'auth_allow_insecure_global_id_reclaim', "False", context_file)
143 salt_actions.run_state(tgt, "state.apply", "ceph.common")
144 salt_actions.cmd_run(tgt, "systemctl restart ceph-mon.target")
145 else:
146 LOG.info("Skipping WA ceph set auth_allow_insecure_global_id_reclaim")
147
148
149@pytest.fixture
Hanna Arhipova97fac6e2020-12-03 13:10:56 +0200150def wa_for_alerta_password_prod35958(reclass_actions,
151 salt_actions):
Pavel Glazovea439c42021-07-25 00:20:20 +0000152
Hanna Arhipova0e816d22021-01-29 00:17:44 +0200153 if not salt_actions.get_pillar("I@prometheus:alerta",
154 "_param:alerta_admin_api_key_generated")[0]:
155 reclass_actions.add_key(
156 "parameters._param.alerta_admin_api_key_generated",
157 "a"*32,
158 "cluster/*/infra/secrets.yml")
159 reclass_actions.add_key(
160 "parameters._param.alerta_admin_key",
161 "${_param:alerta_admin_api_key_generated}",
162 "cluster/*/stacklight/init.yml")
163 reclass_actions.commit("[from TCP-QA] Add alerta_admin_key")
164 salt_actions.run_state(
165 "I@prometheus:alerta or I@prometheus:alertmanager",
166 "saltutil.refresh_pillar")
167 salt_actions.enforce_state(
168 "I@prometheus:alerta", "prometheus.alerta")
169 salt_actions.enforce_state(
170 "I@prometheus:alertmanager", "prometheus.alertmanager")
171 salt_actions.enforce_state(
172 "I@prometheus:alerta or I@prometheus:alertmanager",
173 "docker.client")
174 else:
175 LOG.info("Skipping WA for Alerta API key")
Hanna Arhipova97fac6e2020-12-03 13:10:56 +0200176
177
Hanna Arhipova19429962019-10-17 15:16:49 +0300178@pytest.fixture(scope='class')
179def enable_openstack_update(reclass_actions, salt_actions):
180 param = "parameters._param.openstack_upgrade_enabled"
181 context_file = "cluster/*/infra/init.yml"
182
183 LOG.info("Enable openstack_upgrade_enabled in reclass")
184 reclass_actions.add_bool_key(param, "True", context_file)
185 salt_actions.run_state("*", "saltutil.refresh_pillar")
186 yield True
187 LOG.info("Disable openstack_upgrade_enabled in reclass")
188 reclass_actions.add_bool_key(param, "False", context_file)
189 salt_actions.run_state("*", "saltutil.refresh_pillar")
190
191
Hanna Arhipova745fdbb2020-03-30 14:40:44 +0300192@pytest.mark.usefixtures("switch_to_proposed_pipelines",
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +0300193 "update_to_tag",
Hanna Arhipova97fac6e2020-12-03 13:10:56 +0200194 "wa_for_galera_clustercheck_password_prod35705",
PGlazovf5977292021-11-25 19:38:27 +0400195 "wa_for_alerta_password_prod35958",
196 "wa_cve_2021_20288_global_id_reclaim")
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300197class TestUpdateMcpCluster(object):
198 """
199 Following the steps in
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300200 https://docs.mirantis.com/mcp/master/mcp-operations-guide/update-upgrade/minor-update.html#minor-update
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300201 """
202
203 @pytest.mark.grab_versions
204 @pytest.mark.parametrize("_", [settings.ENV_NAME])
205 @pytest.mark.run_mcp_update
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300206 def test_update_drivetrain(self, salt_actions, drivetrain_actions,
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +0300207 show_step, update_to_tag, _):
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300208 """Updating DriveTrain component to release/proposed/2019.2.0 version
209
210 Scenario:
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300211 1. Add workaround for PROD-32751
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300212 2. Run job git-mirror-downstream-mk-pipelines
213 3. Run job git-mirror-downstream-pipeline-library
dtsapikovcbff2332022-01-19 19:32:22 +0400214 4. Run job pre-upgrade-verify
215 5. If jobs are passed then start 'Deploy - upgrade MCP Drivetrain'
216 6. Wait till salt-master completes all async jobs
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300217
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300218 Duration: ~70 min
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300219 """
220 salt = salt_actions
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300221 dt = drivetrain_actions
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300222
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300223 # #################### Add workaround for PROD-32751 #################
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300224 show_step(1)
225
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300226 # FIXME: workaround for PROD-32751
227 salt.cmd_run("cfg01*", "cd /srv/salt/reclass; git add -u && \
228 git commit --allow-empty -m 'Cluster model update'")
229
230 # ################### Downstream mk-pipelines #########################
231 show_step(2)
232 job_name = 'git-mirror-downstream-mk-pipelines'
233 job_parameters = {
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +0300234 'BRANCHES': '*' or
235 'release/proposed/2019.2.0'
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300236 }
Hanna Arhipova508f6532021-01-27 15:52:45 +0200237 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300238 job_name=job_name,
Hanna Arhipovac3c59292020-04-23 16:29:09 +0300239 job_parameters=job_parameters,
240 verbose=True)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300241
Hanna Arhipova508f6532021-01-27 15:52:45 +0200242 assert job_result == 'SUCCESS', job_description
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300243
244 # ################### Downstream pipeline-library ####################
245 show_step(3)
246 job_name = 'git-mirror-downstream-pipeline-library'
247 job_parameters = {
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +0300248 'BRANCHES': '*' or
249 'release/proposed/2019.2.0'
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300250 }
Hanna Arhipova508f6532021-01-27 15:52:45 +0200251 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300252 job_name=job_name,
Hanna Arhipovac3c59292020-04-23 16:29:09 +0300253 job_parameters=job_parameters,
254 verbose=True)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300255
Hanna Arhipova508f6532021-01-27 15:52:45 +0200256 assert job_result == 'SUCCESS', job_description
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300257
dtsapikovcbff2332022-01-19 19:32:22 +0400258 # ############### Start 'Pre-upgrade verify' job (since 2019.2.17)#####
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300259 show_step(4)
dtsapikovcbff2332022-01-19 19:32:22 +0400260 job_name = 'pre-upgrade-verify'
261 job_parameters = {}
262
263 if(dt.check_job_exists_on_jenkins(job_name)):
264 LOG.info("Pre-upgrade verify job exists on Jenkins!")
265 job_result, job_description = dt.start_job_on_jenkins(
266 job_name=job_name,
267 job_parameters=job_parameters,
268 verbose=True,
269 build_timeout=4 * 60 * 60)
270
271 assert job_result == 'SUCCESS', job_description
272
273 # ################### Start 'Deploy - upgrade MCP Drivetrain' job #####
274 show_step(5)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300275
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300276 job_name = 'upgrade-mcp-release'
277 job_parameters = {
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +0300278 'GIT_REFSPEC': update_to_tag or 'release/proposed/2019.2.0',
PGlazov1df9e542021-11-16 02:31:49 +0400279 'MK_PIPELINES_REFSPEC':
280 update_to_tag or 'release/proposed/2019.2.0',
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +0300281 'TARGET_MCP_VERSION': update_to_tag or '2019.2.0',
Hanna Arhipova874c68f2021-03-29 15:57:19 +0300282 "DRIVE_TRAIN_PARAMS": {
283 "OS_DIST_UPGRADE": True,
284 "OS_UPGRADE": True,
285 "BATCH_SIZE": 10
286 }
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300287 }
Hanna Arhipova508f6532021-01-27 15:52:45 +0200288 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300289 job_name=job_name,
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300290 job_parameters=job_parameters,
Hanna Arhipovac3c59292020-04-23 16:29:09 +0300291 verbose=True,
Hanna Arhipovae7f2e322021-02-25 13:53:18 +0200292 build_timeout=4 * 60 * 60)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300293
Hanna Arhipova508f6532021-01-27 15:52:45 +0200294 assert job_result == 'SUCCESS', job_description
Hanna Arhipova7a593da2021-06-25 11:16:09 +0300295 # ############### Wait till salt-master completes all async jobs #####
296 show_step(5)
297 salt.wait_jobs_completed(timeout=20*60)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300298
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300299 @pytest.mark.grab_versions
300 @pytest.mark.parametrize("_", [settings.ENV_NAME])
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300301 @pytest.mark.run_mcp_update
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300302 def test_update_glusterfs(self, salt_actions, reclass_actions,
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300303 drivetrain_actions, show_step, _):
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300304 """ Upgrade GlusterFS
305 Scenario:
306 1. In infra/init.yml in Reclass, add the glusterfs_version parameter
307 2. Start linux.system.repo state
308 3. Start "update-glusterfs" job
309 4. Check version for GlusterFS servers
310 5. Check version for GlusterFS clients
311
312 """
313 salt = salt_actions
314 reclass = reclass_actions
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300315 dt = drivetrain_actions
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300316
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300317 # ############## Change reclass ######################################
318 show_step(1)
319 reclass.add_key(
320 "parameters._param.linux_system_repo_mcp_glusterfs_version_number",
321 "5",
322 "cluster/*/infra/init.yml"
323 )
324 # ################# Run linux.system state ###########################
325 show_step(2)
326 salt.enforce_state("*", "linux.system.repo")
327
328 # ############## Start deploy-upgrade-galera job #####################
329 show_step(3)
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300330 job_name = 'update-glusterfs'
331
Hanna Arhipova508f6532021-01-27 15:52:45 +0200332 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300333 job_name=job_name,
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300334 build_timeout=40 * 60)
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300335
Hanna Arhipova508f6532021-01-27 15:52:45 +0200336 assert job_result == 'SUCCESS', job_description
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300337
338 # ################ Check GlusterFS version for servers ##############
339 show_step(4)
340 gluster_server_versions_by_nodes = salt.cmd_run(
341 "I@glusterfs:server",
342 "glusterd --version|head -n1")[0]
343
Hanna Arhipova19429962019-10-17 15:16:49 +0300344 assert has_only_similar(gluster_server_versions_by_nodes), \
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300345 gluster_server_versions_by_nodes
346
347 # ################ Check GlusterFS version for clients ##############
348 show_step(5)
349 gluster_client_versions_by_nodes = salt.cmd_run(
350 "I@glusterfs:client",
351 "glusterfs --version|head -n1")[0]
352
353 assert has_only_similar(gluster_client_versions_by_nodes), \
354 gluster_client_versions_by_nodes
355
356 @pytest.mark.grab_versions
357 @pytest.mark.parametrize("_", [settings.ENV_NAME])
358 @pytest.mark.run_mcp_update
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300359 def test_update_galera(self, salt_actions, reclass_actions,
360 drivetrain_actions, show_step, _):
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300361 """ Upgrade Galera automatically
362
363 Scenario:
364 1. Include the Galera upgrade pipeline job to DriveTrain
365 2. Apply the jenkins.client state on the Jenkins nodes
366 3. set the openstack_upgrade_enabled parameter to true
367 4. Refresh pillars
368 5. Add repositories with new Galera packages
369 6. Start job from Jenkins
370 """
371 salt = salt_actions
372 reclass = reclass_actions
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300373 dt = drivetrain_actions
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300374 # ################### Enable pipeline #################################
375 show_step(1)
376 reclass.add_class(
377 "system.jenkins.client.job.deploy.update.upgrade_galera",
378 "cluster/*/cicd/control/leader.yml")
379 show_step(2)
380 salt.enforce_state("I@jenkins:client", "jenkins.client")
381
382 # ############### Enable automatic upgrade ############################
383 show_step(3)
384 reclass.add_bool_key("parameters._param.openstack_upgrade_enabled",
385 "True",
386 "cluster/*/infra/init.yml")
387
388 show_step(4)
Hanna Arhipova7cfeb072019-10-11 15:04:10 +0300389 salt.run_state("dbs*", "saltutil.refresh_pillar")
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300390
391 # ############# Add repositories with new Galera packages #######
392 show_step(5)
393 salt.enforce_state("dbs*", "linux.system.repo")
394 salt.enforce_state("cfg*", "salt.master")
395
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300396 # #################### Login Jenkins on cid01 node ###################
397 show_step(6)
398
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300399 job_name = 'deploy-upgrade-galera'
400 job_parameters = {
Hanna Arhipova874c68f2021-03-29 15:57:19 +0300401 'INTERACTIVE': 'false',
402 'OS_DIST_UPGRADE': 'true',
403 'OS_UPGRADE': 'true'
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300404 }
405
Hanna Arhipova508f6532021-01-27 15:52:45 +0200406 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300407 job_name=job_name,
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300408 job_parameters=job_parameters,
409 build_timeout=40 * 60)
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300410
Hanna Arhipova508f6532021-01-27 15:52:45 +0200411 assert job_result == 'SUCCESS', job_description
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300412
413 @pytest.fixture
414 def disable_automatic_failover_neutron_for_test(self, salt_actions):
415 """
416 On each OpenStack controller node, modify the neutron.conf file
417 Restart the neutron-server service
418 """
Hanna Arhipova19429962019-10-17 15:16:49 +0300419
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300420 def comment_line(node, file_name, word):
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300421 """
422 Adds '#' before the specific line in specific file
423
424 :param node: string, salt target of node where the file locates
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300425 :param file_name: string, full path to the file
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300426 :param word: string, the begin of line which should be commented
427 :return: None
428 """
429 salt_actions.cmd_run(node,
430 "sed -i 's/^{word}/#{word}/' {file}".
431 format(word=word,
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300432 file=file_name))
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300433
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300434 def add_line(node, file_name, line):
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300435 """
436 Appends line to the end of file
437
438 :param node: string, salt target of node where the file locates
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300439 :param file_name: string, full path to the file
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300440 :param line: string, line that should be added
441 :return: None
442 """
443 salt_actions.cmd_run(node, "echo {line} >> {file}".format(
Hanna Arhipova19429962019-10-17 15:16:49 +0300444 line=line,
445 file=file_name))
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300446
447 neutron_conf = '/etc/neutron/neutron.conf'
448 neutron_server = "I@neutron:server"
449 # ######## Create backup for config file #######################
450 salt_actions.cmd_run(
451 neutron_server,
452 "cp -p {file} {file}.backup".format(file=neutron_conf))
453
454 # ## Change parameters in neutron.conf'
455 comment_line(neutron_server, neutron_conf,
Hanna Arhipova19429962019-10-17 15:16:49 +0300456 "allow_automatic_l3agent_failover", )
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300457 comment_line(neutron_server, neutron_conf,
458 "allow_automatic_dhcp_failover")
459 add_line(neutron_server, neutron_conf,
460 "allow_automatic_dhcp_failover = false")
461 add_line(neutron_server, neutron_conf,
462 "allow_automatic_l3agent_failover = false")
463
464 # ## Apply changed config to the neutron-server service
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300465 result = salt_actions.cmd_run(neutron_server,
466 "service neutron-server restart")
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300467 # TODO: add check that neutron-server is up and running
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300468 yield result
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300469 # ## Revert file changes
470 salt_actions.cmd_run(
471 neutron_server,
472 "cp -p {file}.backup {file}".format(file=neutron_conf))
473 salt_actions.cmd_run(neutron_server,
474 "service neutron-server restart")
475
476 @pytest.fixture
477 def disable_neutron_agents_for_test(self, salt_actions):
478 """
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300479 Disable the neutron services before the test and
480 enable it after test
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300481 """
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300482 result = salt_actions.cmd_run("I@neutron:server", """
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300483 service neutron-dhcp-agent stop && \
484 service neutron-l3-agent stop && \
485 service neutron-metadata-agent stop && \
486 service neutron-openvswitch-agent stop
487 """)
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300488 yield result
489 #
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300490 salt_actions.cmd_run("I@neutron:server", """
491 service neutron-dhcp-agent start && \
492 service neutron-l3-agent start && \
493 service neutron-metadata-agent start && \
494 service neutron-openvswitch-agent start
495 """)
496 # TODO: add check that all services are UP and running
497
498 @pytest.mark.grab_versions
499 @pytest.mark.parametrize("_", [settings.ENV_NAME])
500 @pytest.mark.run_mcp_update
501 def test_update_rabbit(self, salt_actions, reclass_actions,
502 drivetrain_actions, show_step, _,
503 disable_automatic_failover_neutron_for_test,
504 disable_neutron_agents_for_test):
505 """ Updates RabbitMQ
506 Scenario:
507 1. Include the RabbitMQ upgrade pipeline job to DriveTrain
508 2. Add repositories with new RabbitMQ packages
509 3. Start Deploy - upgrade RabbitMQ pipeline
510
511 Updating RabbitMq should be completed before the OpenStack updating
512 process starts
513 """
514 salt = salt_actions
515 reclass = reclass_actions
516 dt = drivetrain_actions
517
518 # ####### Include the RabbitMQ upgrade pipeline job to DriveTrain ####
519 show_step(1)
520 reclass.add_class(
521 "system.jenkins.client.job.deploy.update.upgrade_rabbitmq",
522 "cluster/*/cicd/control/leader.yml")
523 salt.enforce_state("I@jenkins:client", "jenkins.client")
524
525 reclass.add_bool_key("parameters._param.openstack_upgrade_enabled",
526 "True",
527 "cluster/*/infra/init.yml")
528 salt.run_state("I@rabbitmq:server", "saltutil.refresh_pillar")
529
530 # ########### Add repositories with new RabbitMQ packages ############
531 show_step(2)
532 salt.enforce_state("I@rabbitmq:server", "linux.system.repo")
533
534 # ########### Start Deploy - upgrade RabbitMQ pipeline ############
535 show_step(3)
536 job_parameters = {
Hanna Arhipova874c68f2021-03-29 15:57:19 +0300537 'INTERACTIVE': 'false',
538 'OS_DIST_UPGRADE': 'true',
539 'OS_UPGRADE': 'true'
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300540 }
541
Hanna Arhipova508f6532021-01-27 15:52:45 +0200542 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300543 job_name='deploy-upgrade-rabbitmq',
544 job_parameters=job_parameters,
PGlazov99364cb2021-09-20 12:36:18 +0400545 build_timeout=50 * 60
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300546 )
Hanna Arhipova508f6532021-01-27 15:52:45 +0200547 assert job_result == 'SUCCESS', job_description
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300548
549 @pytest.mark.grab_versions
550 @pytest.mark.parametrize("_", [settings.ENV_NAME])
551 @pytest.mark.run_mcp_update
552 def test_update_ceph(self, salt_actions, drivetrain_actions, show_step, _):
553 """ Updates Ceph to the latest minor version
554
555 Scenario:
556 1. Add workaround for unhealth Ceph
557 2. Start ceph-upgrade job with default parameters
558 3. Check Ceph version for all nodes
559
560 https://docs.mirantis.com/mcp/master/mcp-operations-guide/update-upgrade/minor-update/ceph-update.html
561 """
562 salt = salt_actions
563 dt = drivetrain_actions
564
565 # ###################### Add workaround for unhealth Ceph ############
566 show_step(1)
567 salt.cmd_run("I@ceph:radosgw",
568 "ceph config set 'mon pg warn max object skew' 20")
569 # ###################### Start ceph-upgrade pipeline #################
570 show_step(2)
571 job_parameters = {}
572
Hanna Arhipova508f6532021-01-27 15:52:45 +0200573 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300574 job_name='ceph-update',
575 job_parameters=job_parameters)
576
Hanna Arhipova508f6532021-01-27 15:52:45 +0200577 assert job_result == 'SUCCESS', job_description
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300578
579 # ########## Verify Ceph version #####################################
580 show_step(3)
581
582 ceph_version_by_nodes = salt.cmd_run(
Hanna Arhipova19429962019-10-17 15:16:49 +0300583 "I@ceph:* and not I@ceph:monitoring and not I@ceph:backup:server",
584 "ceph version")[0]
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300585
586 assert has_only_similar(ceph_version_by_nodes), ceph_version_by_nodes
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300587
Hanna Arhipovaac008562019-10-17 11:54:23 +0300588 @pytest.mark.grab_versions
589 @pytest.mark.parametrize("_", [settings.ENV_NAME])
590 @pytest.mark.run_mcp_update
591 def test_update_stacklight(self, _, drivetrain_actions):
592 """ Update packages for Stacklight
593 Scenario:
594 1. Start Deploy - upgrade Stacklight job
595 """
596 drivetrain = drivetrain_actions
597
598 job_parameters = {
599 "STAGE_UPGRADE_DOCKER_COMPONENTS": True,
600 "STAGE_UPGRADE_ES_KIBANA": True,
Hanna Arhipova874c68f2021-03-29 15:57:19 +0300601 "STAGE_UPGRADE_SYSTEM_PART": True,
602 'OS_DIST_UPGRADE': 'true',
603 'OS_UPGRADE': 'true'
Hanna Arhipovaac008562019-10-17 11:54:23 +0300604 }
Hanna Arhipova508f6532021-01-27 15:52:45 +0200605 job_result, job_description = drivetrain.start_job_on_jenkins(
Hanna Arhipovaac008562019-10-17 11:54:23 +0300606 job_name="stacklight-upgrade",
607 job_parameters=job_parameters)
608
Hanna Arhipova508f6532021-01-27 15:52:45 +0200609 assert job_result == 'SUCCESS', job_description
Hanna Arhipovaac008562019-10-17 11:54:23 +0300610
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300611
Hanna Arhipova19429962019-10-17 15:16:49 +0300612@pytest.mark.usefixtures("switch_to_proposed_pipelines",
613 "enable_openstack_update")
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300614class TestOpenstackUpdate(object):
615
616 @pytest.mark.grab_versions
617 @pytest.mark.run_mcp_update
618 def test__pre_update__enable_pipeline_job(self,
619 reclass_actions, salt_actions,
620 show_step):
621 """ Enable pipeline in the Drivetrain
622
623 Scenario:
624 1. Add deploy.update.* classes to the reclass
625 2. Start jenkins.client salt state
626
627 """
628 salt = salt_actions
629 reclass = reclass_actions
630 show_step(1)
631 reclass.add_class("system.jenkins.client.job.deploy.update.upgrade",
632 "cluster/*/cicd/control/leader.yml")
633
634 reclass.add_class(
635 "system.jenkins.client.job.deploy.update.upgrade_ovs_gateway",
636 "cluster/*/cicd/control/leader.yml")
637
638 reclass.add_class(
639 "system.jenkins.client.job.deploy.update.upgrade_compute",
640 "cluster/*/cicd/control/leader.yml")
641
642 show_step(2)
643 r, errors = salt.enforce_state("I@jenkins:client", "jenkins.client")
644 assert errors is None
645
646 @pytest.mark.grab_versions
647 @pytest.mark.parametrize('target', get_control_plane_targets())
648 @pytest.mark.run_mcp_update
Hanna Arhipova19429962019-10-17 15:16:49 +0300649 def test__update__control_plane(self, drivetrain_actions, target):
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300650 """Start 'Deploy - upgrade control VMs' for specific node
651 """
652 job_parameters = {
653 "TARGET_SERVERS": target,
Hanna Arhipova606d5182019-12-13 13:23:55 +0200654 "OS_DIST_UPGRADE": True,
PGlazova5039252021-10-06 21:40:01 +0400655 "UPGRADE_SALTSTACK": True,
Hanna Arhipova606d5182019-12-13 13:23:55 +0200656 "OS_UPGRADE": True,
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300657 "INTERACTIVE": False}
Hanna Arhipova508f6532021-01-27 15:52:45 +0200658 job_result, job_description = drivetrain_actions.start_job_on_jenkins(
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300659 job_name="deploy-upgrade-control",
660 job_parameters=job_parameters)
661
Hanna Arhipova508f6532021-01-27 15:52:45 +0200662 assert job_result == 'SUCCESS', job_description
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300663
664 @pytest.mark.grab_versions
665 @pytest.mark.run_mcp_update
Hanna Arhipova606d5182019-12-13 13:23:55 +0200666 def test__update__data_plane(self, drivetrain_actions, salt_actions):
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300667 """Start 'Deploy - upgrade OVS gateway'
668 """
Hanna Arhipova606d5182019-12-13 13:23:55 +0200669 if not salt_actions.cmd_run("gtw*", "test.ping")[0].keys():
670 pytest.skip("This deployment doesn't have gtw* nodes")
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300671 job_parameters = {
Hanna Arhipova606d5182019-12-13 13:23:55 +0200672 "OS_DIST_UPGRADE": True,
673 "OS_UPGRADE": True,
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300674 "INTERACTIVE": False}
Hanna Arhipova508f6532021-01-27 15:52:45 +0200675 job_result, job_description = drivetrain_actions.start_job_on_jenkins(
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300676 job_name="deploy-upgrade-ovs-gateway",
677 job_parameters=job_parameters)
678
Hanna Arhipova508f6532021-01-27 15:52:45 +0200679 assert job_result == 'SUCCESS', job_description
Hanna Arhipova19429962019-10-17 15:16:49 +0300680
681 @pytest.mark.grab_versions
682 @pytest.mark.run_mcp_update
683 def test__update__computes(self, drivetrain_actions):
684 """Start 'Deploy - upgrade computes'
685 """
686 job_parameters = {
Hanna Arhipova606d5182019-12-13 13:23:55 +0200687 "OS_DIST_UPGRADE": True,
688 "OS_UPGRADE": True,
Hanna Arhipova19429962019-10-17 15:16:49 +0300689 "INTERACTIVE": False}
Hanna Arhipova508f6532021-01-27 15:52:45 +0200690 job_result, job_description = drivetrain_actions.start_job_on_jenkins(
Hanna Arhipova19429962019-10-17 15:16:49 +0300691 job_name="deploy-upgrade-compute",
692 job_parameters=job_parameters)
693
Hanna Arhipova508f6532021-01-27 15:52:45 +0200694 assert job_result == 'SUCCESS', job_description