blob: 5ec2627fcb232b8050a153a55e9202cf3fe8caf8 [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
Pavel Glazov69e20e72022-07-01 08:06:58 +04007from retrying import retry
Hanna Arhipova71ecc272019-08-20 14:54:22 +03008
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +03009sys.path.append(os.getcwd())
10try:
11 from tcp_tests.fixtures import config_fixtures
12 from tcp_tests.managers import underlay_ssh_manager
13 from tcp_tests.managers import saltmanager as salt_manager
14except ImportError:
15 print("ImportError: Run the application from the tcp-qa directory or "
16 "set the PYTHONPATH environment variable to directory which contains"
17 " ./tcp_tests")
18 sys.exit(1)
Hanna Arhipova71ecc272019-08-20 14:54:22 +030019LOG = logger.logger
20
21
Hanna Arhipovad35a29b2019-09-04 13:24:06 +030022def has_only_similar(values_by_nodes):
23 """
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +030024 :param values_by_nodes: dict
Hanna Arhipovad35a29b2019-09-04 13:24:06 +030025 :return: bool, True if all items in the dict have similar values
26 """
27 values = list(values_by_nodes.values())
28 return all(value == values[0] for value in values)
29
30
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +030031def get_control_plane_targets():
32 config = config_fixtures.config()
33 underlay = underlay_ssh_manager.UnderlaySSHManager(config)
34 saltmanager = salt_manager.SaltManager(config, underlay)
Hanna Arhipovafbcea852019-10-03 13:24:53 +030035 targets = list()
Hanna Arhipova52bb17d2019-10-28 19:15:17 +020036 telemetry_exists = False
37 barbican_exists = False
Hanna Arhipovafbcea852019-10-03 13:24:53 +030038 try:
39 targets += saltmanager.run_state(
40 "I@keystone:server", 'test.ping')[0]['return'][0].keys()
41 targets += saltmanager.run_state(
42 "I@nginx:server and not I@salt:master",
43 "test.ping")[0]['return'][0].keys()
Hanna Arhipova4462dd02019-10-28 19:05:08 +020044 telemetry_exists = saltmanager.get_single_pillar(
45 "I@salt:master",
46 "_param:openstack_telemetry_hostname")
47 barbican_exists = saltmanager.get_single_pillar(
48 "I@salt:master",
49 "_param:barbican_enabled")
Hanna Arhipovafbcea852019-10-03 13:24:53 +030050 except BaseException as err:
51 LOG.warning("Can't retrieve data from Salt. \
52 Maybe cluster is not deployed completely.\
53 Err: {}".format(err))
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +030054
Hanna Arhipova75f21bb2019-10-07 19:22:15 +030055 # check for Manila existence
56 # if saltmanager.get_single_pillar("I@salt:master",
57 # "_param:manila_service_protocol"):
58 # targets.append('share*')
59
60 # check for Tenant Telemetry existence
Hanna Arhipova4462dd02019-10-28 19:05:08 +020061 if telemetry_exists:
Hanna Arhipova75f21bb2019-10-07 19:22:15 +030062 targets.append('mdb*')
63
64 # check for Barbican existence
Hanna Arhipova4462dd02019-10-28 19:05:08 +020065 if barbican_exists:
Hanna Arhipova75f21bb2019-10-07 19:22:15 +030066 targets.append('kmn*')
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +030067 return targets
68
69
Hanna Arhipova19429962019-10-17 15:16:49 +030070@pytest.fixture(scope='class')
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +030071def update_to_tag(request):
72 return request.config.getoption("--update-to-tag")
Hanna Arhipova672efc62021-03-15 09:55:14 +020073
74
75@pytest.fixture(scope='class')
PGlazov7efe3b22022-02-16 17:29:05 +040076def update_mysql_to_version(request):
77 return request.config.getoption("--update-mysql-version")
78
79
80@pytest.fixture(scope='class')
Hanna Arhipova672efc62021-03-15 09:55:14 +020081def switch_to_proposed_pipelines(reclass_actions, salt_actions,
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +030082 update_to_tag):
83 if update_to_tag:
Hanna Arhipova672efc62021-03-15 09:55:14 +020084 return True
85
Hanna Arhipova19429962019-10-17 15:16:49 +030086 reclass = reclass_actions
87 proposed_repo = "http://mirror.mirantis.com/update/proposed/"
88 repo_param = "parameters._param.linux_system_repo_update_url"
Hanna Arhipova7cfeb072019-10-11 15:04:10 +030089
Hanna Arhipova19429962019-10-17 15:16:49 +030090 proposed_pipeline_branch = "release/proposed/2019.2.0"
91 pipeline_branch_param = "parameters._param.jenkins_pipelines_branch"
92 infra_yml = "cluster/*/infra/init.yml"
93
94 LOG.info("Check reclass has release/proposed/2019.2.0 branches")
95 if reclass.get_key(pipeline_branch_param,
96 infra_yml) == proposed_pipeline_branch \
97 and reclass.get_key(repo_param, infra_yml) == proposed_repo:
98 return True
99
100 LOG.info("Switch to release/proposed/2019.2.0 branches")
101 reclass.add_key(pipeline_branch_param, proposed_pipeline_branch, infra_yml)
102
103 reclass.add_key(repo_param, proposed_repo, infra_yml)
104 reclass.add_key(repo_param, proposed_repo, "cluster/*/openstack/init.yml")
105 reclass.add_key(repo_param, proposed_repo, "cluster/*/stacklight/init.yml")
106 reclass.add_key(repo_param, proposed_repo, "cluster/*/ceph/init.yml")
Hanna Arhipova7cfeb072019-10-11 15:04:10 +0300107
108 salt_actions.run_state("*", "saltutil.refresh_pillar")
Hanna Arhipova9ee75902019-10-29 16:33:26 +0200109 salt_actions.enforce_state("*", "salt.minion")
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300110 salt_actions.enforce_state("I@jenkins:client", "jenkins.client")
111
112
Hanna Arhipova745fdbb2020-03-30 14:40:44 +0300113@pytest.fixture
Hanna Arhipovaec201e72020-10-26 17:14:25 +0200114def wa_for_galera_clustercheck_password_prod35705(reclass_actions,
115 salt_actions):
Hanna Arhipova0e816d22021-01-29 00:17:44 +0200116 tgt = "I@galera:master or I@galera:slave"
117 if not salt_actions.get_pillar(tgt,
118 "_param:galera_clustercheck_password")[0]:
119 reclass_actions.add_key(
120 "parameters._param.galera_clustercheck_password",
121 "a"*32,
122 "cluster/*/infra/secrets.yml")
123 salt_actions.run_state(tgt, "saltutil.refresh_pillar")
124 salt_actions.enforce_state(tgt, "galera")
125 salt_actions.enforce_state(tgt, "haproxy")
126 reclass_actions.commit(
127 "[from TCP-QA] Add galera_clustercheck_password")
128 else:
Hanna Arhipova672efc62021-03-15 09:55:14 +0200129
Hanna Arhipova0e816d22021-01-29 00:17:44 +0200130 LOG.info("Skipping WA for Galera Clustercheck Password")
Hanna Arhipova745fdbb2020-03-30 14:40:44 +0300131
132
Hanna Arhipova97fac6e2020-12-03 13:10:56 +0200133@pytest.fixture
PGlazovf5977292021-11-25 19:38:27 +0400134def wa_cve_2021_20288_global_id_reclaim(reclass_actions,
135 salt_actions):
136 tgt = "I@ceph:common"
137 context_file = "cluster/*/ceph/common.yml"
138 if not reclass_actions.check_existence(
Pavel Glazov6ed8d442022-09-20 12:50:18 +0400139 'parameters.ceph.common.config.mon.' +
140 'auth_allow_insecure_global_id_reclaim'):
PGlazov4b013962022-01-31 14:01:42 +0400141 if salt_actions.get_single_pillar(
142 "I@ceph:mgr and *01.*",
143 "_param.ceph_version") == 'luminous':
144 LOG.info('Skip reclaim set')
145 return
PGlazovf5977292021-11-25 19:38:27 +0400146 reclass_actions.add_bool_key(
Pavel Glazov6ed8d442022-09-20 12:50:18 +0400147 'parameters.ceph.common.config.mon.' +
148 'auth_allow_insecure_global_id_reclaim', "False", context_file)
PGlazovf5977292021-11-25 19:38:27 +0400149 salt_actions.run_state(tgt, "state.apply", "ceph.common")
150 salt_actions.cmd_run(tgt, "systemctl restart ceph-mon.target")
151 else:
152 LOG.info("Skipping WA ceph set auth_allow_insecure_global_id_reclaim")
153
154
155@pytest.fixture
Hanna Arhipova97fac6e2020-12-03 13:10:56 +0200156def wa_for_alerta_password_prod35958(reclass_actions,
157 salt_actions):
Pavel Glazovea439c42021-07-25 00:20:20 +0000158
Hanna Arhipova0e816d22021-01-29 00:17:44 +0200159 if not salt_actions.get_pillar("I@prometheus:alerta",
160 "_param:alerta_admin_api_key_generated")[0]:
161 reclass_actions.add_key(
162 "parameters._param.alerta_admin_api_key_generated",
163 "a"*32,
164 "cluster/*/infra/secrets.yml")
165 reclass_actions.add_key(
166 "parameters._param.alerta_admin_key",
167 "${_param:alerta_admin_api_key_generated}",
168 "cluster/*/stacklight/init.yml")
169 reclass_actions.commit("[from TCP-QA] Add alerta_admin_key")
170 salt_actions.run_state(
171 "I@prometheus:alerta or I@prometheus:alertmanager",
172 "saltutil.refresh_pillar")
173 salt_actions.enforce_state(
174 "I@prometheus:alerta", "prometheus.alerta")
175 salt_actions.enforce_state(
176 "I@prometheus:alertmanager", "prometheus.alertmanager")
177 salt_actions.enforce_state(
178 "I@prometheus:alerta or I@prometheus:alertmanager",
179 "docker.client")
180 else:
181 LOG.info("Skipping WA for Alerta API key")
Hanna Arhipova97fac6e2020-12-03 13:10:56 +0200182
183
Vladimir Khlyunev5fe0aaa2022-08-16 23:13:22 +0400184@pytest.fixture
185def wa_redis_server_version_3_prod36960(reclass_actions, salt_actions):
186 version_pillar = "redis:server:version"
187 tgt = "I@{}".format(version_pillar)
188 pillar_file = "cluster/*/openstack/telemetry.yml"
189 redis_target_version = "5.0"
190
191 msg_nodes = salt_actions.get_minions_by_target(tgt)
192 if not msg_nodes:
193 LOG.info("dbs* nodes not found, skipping")
194 return
195 else:
196 msg_node = msg_nodes[0]
197
198 if str(salt_actions.get_single_pillar(
199 msg_node,
200 version_pillar)) == redis_target_version:
201 LOG.info("Redis-server is already '{}', skipping".format(
202 redis_target_version))
203 return
204
205 LOG.info("Setting redis-server version to '{}'".format(
206 redis_target_version))
207 reclass_actions.add_key(
208 "parameters.{}".format(version_pillar.replace(":", ".")),
209 redis_target_version,
210 pillar_file)
211 salt_actions.run_state(" or ".join(msg_nodes),
212 "saltutil.refresh_pillar")
213
214
Hanna Arhipova19429962019-10-17 15:16:49 +0300215@pytest.fixture(scope='class')
216def enable_openstack_update(reclass_actions, salt_actions):
217 param = "parameters._param.openstack_upgrade_enabled"
218 context_file = "cluster/*/infra/init.yml"
219
220 LOG.info("Enable openstack_upgrade_enabled in reclass")
221 reclass_actions.add_bool_key(param, "True", context_file)
222 salt_actions.run_state("*", "saltutil.refresh_pillar")
223 yield True
224 LOG.info("Disable openstack_upgrade_enabled in reclass")
225 reclass_actions.add_bool_key(param, "False", context_file)
226 salt_actions.run_state("*", "saltutil.refresh_pillar")
227
228
Vladimir Khlyunev0ca3ba82022-10-31 12:12:30 +0400229@pytest.fixture(scope='class')
230def switch_to_staging_updates_mirantis_repo(reclass_actions, salt_actions):
231 version_param = "parameters._param.updates_mirantis_version"
232 infra_yml = "cluster/*/infra/init.yml"
233
234 current_version = reclass_actions.get_key(version_param, infra_yml)
235 if current_version == 'staging':
236 LOG.info("updates.mirantis.com already set to 'staging', skipping")
237 return
238 if current_version is None:
239 LOG.info("updates.mirantis.com is not enabled, "
240 "skipping /staging repo pillar")
241 return
242
243 LOG.info("Switch to updates.mirantis.com/staging repo")
244 reclass_actions.add_key(version_param, 'staging', infra_yml)
245
246 salt_actions.run_state("*", "saltutil.refresh_pillar")
247
248
Hanna Arhipova745fdbb2020-03-30 14:40:44 +0300249@pytest.mark.usefixtures("switch_to_proposed_pipelines",
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +0300250 "update_to_tag",
Hanna Arhipova97fac6e2020-12-03 13:10:56 +0200251 "wa_for_galera_clustercheck_password_prod35705",
Vladimir Khlyunev5fe0aaa2022-08-16 23:13:22 +0400252 "wa_for_alerta_password_prod35958",
Vladimir Khlyunev0ca3ba82022-10-31 12:12:30 +0400253 "wa_redis_server_version_3_prod36960",
254 "switch_to_staging_updates_mirantis_repo")
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300255class TestUpdateMcpCluster(object):
256 """
257 Following the steps in
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300258 https://docs.mirantis.com/mcp/master/mcp-operations-guide/update-upgrade/minor-update.html#minor-update
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300259 """
260
261 @pytest.mark.grab_versions
262 @pytest.mark.parametrize("_", [settings.ENV_NAME])
263 @pytest.mark.run_mcp_update
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300264 def test_update_drivetrain(self, salt_actions, drivetrain_actions,
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +0300265 show_step, update_to_tag, _):
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300266 """Updating DriveTrain component to release/proposed/2019.2.0 version
267
268 Scenario:
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300269 1. Add workaround for PROD-32751
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300270 2. Run job git-mirror-downstream-mk-pipelines
271 3. Run job git-mirror-downstream-pipeline-library
dtsapikovcbff2332022-01-19 19:32:22 +0400272 4. Run job pre-upgrade-verify
273 5. If jobs are passed then start 'Deploy - upgrade MCP Drivetrain'
274 6. Wait till salt-master completes all async jobs
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300275
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300276 Duration: ~70 min
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300277 """
278 salt = salt_actions
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300279 dt = drivetrain_actions
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300280
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300281 # #################### Add workaround for PROD-32751 #################
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300282 show_step(1)
283
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300284 # FIXME: workaround for PROD-32751
285 salt.cmd_run("cfg01*", "cd /srv/salt/reclass; git add -u && \
286 git commit --allow-empty -m 'Cluster model update'")
287
288 # ################### Downstream mk-pipelines #########################
289 show_step(2)
290 job_name = 'git-mirror-downstream-mk-pipelines'
291 job_parameters = {
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +0300292 'BRANCHES': '*' or
293 'release/proposed/2019.2.0'
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300294 }
Hanna Arhipova508f6532021-01-27 15:52:45 +0200295 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300296 job_name=job_name,
Hanna Arhipovac3c59292020-04-23 16:29:09 +0300297 job_parameters=job_parameters,
298 verbose=True)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300299
Hanna Arhipova508f6532021-01-27 15:52:45 +0200300 assert job_result == 'SUCCESS', job_description
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300301
302 # ################### Downstream pipeline-library ####################
303 show_step(3)
304 job_name = 'git-mirror-downstream-pipeline-library'
305 job_parameters = {
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +0300306 'BRANCHES': '*' or
307 'release/proposed/2019.2.0'
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300308 }
Hanna Arhipova508f6532021-01-27 15:52:45 +0200309 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300310 job_name=job_name,
Hanna Arhipovac3c59292020-04-23 16:29:09 +0300311 job_parameters=job_parameters,
312 verbose=True)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300313
Hanna Arhipova508f6532021-01-27 15:52:45 +0200314 assert job_result == 'SUCCESS', job_description
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300315
dtsapikovcbff2332022-01-19 19:32:22 +0400316 # ############### Start 'Pre-upgrade verify' job (since 2019.2.17)#####
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300317 show_step(4)
dtsapikovcbff2332022-01-19 19:32:22 +0400318 job_name = 'pre-upgrade-verify'
319 job_parameters = {}
320
Pavel Glazov794b1a92022-10-03 16:33:04 +0400321 if (dt.check_job_exists_on_jenkins(job_name)):
dtsapikovcbff2332022-01-19 19:32:22 +0400322 LOG.info("Pre-upgrade verify job exists on Jenkins!")
323 job_result, job_description = dt.start_job_on_jenkins(
324 job_name=job_name,
325 job_parameters=job_parameters,
326 verbose=True,
327 build_timeout=4 * 60 * 60)
328
329 assert job_result == 'SUCCESS', job_description
330
331 # ################### Start 'Deploy - upgrade MCP Drivetrain' job #####
332 show_step(5)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300333
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300334 job_name = 'upgrade-mcp-release'
335 job_parameters = {
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +0300336 'GIT_REFSPEC': update_to_tag or 'release/proposed/2019.2.0',
PGlazov1df9e542021-11-16 02:31:49 +0400337 'MK_PIPELINES_REFSPEC':
338 update_to_tag or 'release/proposed/2019.2.0',
Hanna Arhipovae1dd27a2021-07-28 12:40:40 +0300339 'TARGET_MCP_VERSION': update_to_tag or '2019.2.0',
Hanna Arhipova874c68f2021-03-29 15:57:19 +0300340 "DRIVE_TRAIN_PARAMS": {
341 "OS_DIST_UPGRADE": True,
342 "OS_UPGRADE": True,
343 "BATCH_SIZE": 10
344 }
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300345 }
Hanna Arhipova508f6532021-01-27 15:52:45 +0200346 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300347 job_name=job_name,
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300348 job_parameters=job_parameters,
Hanna Arhipovac3c59292020-04-23 16:29:09 +0300349 verbose=True,
Hanna Arhipovae7f2e322021-02-25 13:53:18 +0200350 build_timeout=4 * 60 * 60)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300351
Hanna Arhipova508f6532021-01-27 15:52:45 +0200352 assert job_result == 'SUCCESS', job_description
Hanna Arhipova7a593da2021-06-25 11:16:09 +0300353 # ############### Wait till salt-master completes all async jobs #####
354 show_step(5)
355 salt.wait_jobs_completed(timeout=20*60)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300356
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300357 @pytest.mark.grab_versions
358 @pytest.mark.parametrize("_", [settings.ENV_NAME])
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300359 @pytest.mark.run_mcp_update
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300360 def test_update_glusterfs(self, salt_actions, reclass_actions,
PGlazov7efe3b22022-02-16 17:29:05 +0400361 drivetrain_actions, show_step,
362 update_mysql_to_version, _):
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300363 """ Upgrade GlusterFS
364 Scenario:
365 1. In infra/init.yml in Reclass, add the glusterfs_version parameter
366 2. Start linux.system.repo state
367 3. Start "update-glusterfs" job
368 4. Check version for GlusterFS servers
369 5. Check version for GlusterFS clients
370
371 """
PGlazov7efe3b22022-02-16 17:29:05 +0400372
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300373 salt = salt_actions
374 reclass = reclass_actions
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300375 dt = drivetrain_actions
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300376
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300377 # ############## Change reclass ######################################
378 show_step(1)
379 reclass.add_key(
380 "parameters._param.linux_system_repo_mcp_glusterfs_version_number",
381 "5",
382 "cluster/*/infra/init.yml"
383 )
384 # ################# Run linux.system state ###########################
385 show_step(2)
386 salt.enforce_state("*", "linux.system.repo")
387
388 # ############## Start deploy-upgrade-galera job #####################
389 show_step(3)
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300390 job_name = 'update-glusterfs'
391
Hanna Arhipova508f6532021-01-27 15:52:45 +0200392 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300393 job_name=job_name,
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300394 build_timeout=40 * 60)
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300395
Hanna Arhipova508f6532021-01-27 15:52:45 +0200396 assert job_result == 'SUCCESS', job_description
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300397
398 # ################ Check GlusterFS version for servers ##############
399 show_step(4)
400 gluster_server_versions_by_nodes = salt.cmd_run(
401 "I@glusterfs:server",
402 "glusterd --version|head -n1")[0]
403
Hanna Arhipova19429962019-10-17 15:16:49 +0300404 assert has_only_similar(gluster_server_versions_by_nodes), \
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300405 gluster_server_versions_by_nodes
406
407 # ################ Check GlusterFS version for clients ##############
408 show_step(5)
409 gluster_client_versions_by_nodes = salt.cmd_run(
410 "I@glusterfs:client",
411 "glusterfs --version|head -n1")[0]
412
413 assert has_only_similar(gluster_client_versions_by_nodes), \
414 gluster_client_versions_by_nodes
415
416 @pytest.mark.grab_versions
417 @pytest.mark.parametrize("_", [settings.ENV_NAME])
418 @pytest.mark.run_mcp_update
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300419 def test_update_galera(self, salt_actions, reclass_actions,
PGlazov7efe3b22022-02-16 17:29:05 +0400420 drivetrain_actions, show_step,
421 update_mysql_to_version, _):
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300422 """ Upgrade Galera automatically
423
424 Scenario:
425 1. Include the Galera upgrade pipeline job to DriveTrain
PGlazov7efe3b22022-02-16 17:29:05 +0400426 2. Add fix for mysql 5.7
427 3. Apply the jenkins.client state on the Jenkins nodes
428 4. set the openstack_upgrade_enabled parameter to true
429 5. Refresh pillars
430 6. Add repositories with new Galera packages
431 7. Start job from Jenkins
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300432 """
433 salt = salt_actions
434 reclass = reclass_actions
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300435 dt = drivetrain_actions
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300436 # ################### Enable pipeline #################################
437 show_step(1)
438 reclass.add_class(
439 "system.jenkins.client.job.deploy.update.upgrade_galera",
440 "cluster/*/cicd/control/leader.yml")
PGlazov7efe3b22022-02-16 17:29:05 +0400441 # ################### Fix for Mysql 5.7 ##############################
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300442 show_step(2)
PGlazov7efe3b22022-02-16 17:29:05 +0400443 if (update_mysql_to_version == '5.7'):
PGlazov7efe3b22022-02-16 17:29:05 +0400444 mysql_class = "cluster.{env_name}.openstack." \
445 "database.mysql_version"\
446 .format(env_name=settings.ENV_NAME)
447 reclass.add_class(
448 mysql_class,
449 "cluster/*/openstack/database/master.yml")
450 reclass.add_class(
451 mysql_class,
452 "cluster/*/openstack/database/slave.yml")
453 mysql_path = "cluster/{env_name}" \
454 "/openstack/database/mysql_version.yml"\
455 .format(env_name=settings.ENV_NAME)
456 galera_mysql_version = '5.7'
457 if update_mysql_to_version != '5.7':
458 galera_mysql_version = update_mysql_to_version
459 mysql_version = "parameters:\n" \
460 " _param:\n" \
461 " galera_mysql_version: {}"\
462 .format(galera_mysql_version)
463 if not os.path.isfile("/srv/salt/reclass/classes/{path}".format(
464 path=mysql_path)):
465 reclass.create_yaml_with_context(mysql_version,
466 mysql_path)
467 else:
468 reclass.merge_context(mysql_version,
469 mysql_path)
470 reclass_actions.commit(
471 "[from TCP-QA] Change for mysql new version")
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300472
PGlazov7efe3b22022-02-16 17:29:05 +0400473 show_step(3)
Vladimir Khlyunev17468272022-06-29 16:19:36 +0400474 salt.run_state("I@jenkins:client and not I@salt:master",
475 "saltutil.refresh_pillar")
476 salt.enforce_state("I@jenkins:client and not I@salt:master",
477 "jenkins.client.job")
PGlazov7efe3b22022-02-16 17:29:05 +0400478 else:
479 LOG.info("Skip mysql upgrade fix")
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300480 # ############### Enable automatic upgrade ############################
PGlazov7efe3b22022-02-16 17:29:05 +0400481 show_step(4)
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300482 reclass.add_bool_key("parameters._param.openstack_upgrade_enabled",
483 "True",
484 "cluster/*/infra/init.yml")
485
PGlazov7efe3b22022-02-16 17:29:05 +0400486 show_step(5)
Hanna Arhipova7cfeb072019-10-11 15:04:10 +0300487 salt.run_state("dbs*", "saltutil.refresh_pillar")
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300488
489 # ############# Add repositories with new Galera packages #######
PGlazov7efe3b22022-02-16 17:29:05 +0400490 show_step(6)
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300491 salt.enforce_state("dbs*", "linux.system.repo")
492 salt.enforce_state("cfg*", "salt.master")
493
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300494 # #################### Login Jenkins on cid01 node ###################
PGlazov7efe3b22022-02-16 17:29:05 +0400495 show_step(7)
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300496
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300497 job_name = 'deploy-upgrade-galera'
498 job_parameters = {
Hanna Arhipova874c68f2021-03-29 15:57:19 +0300499 'INTERACTIVE': 'false',
500 'OS_DIST_UPGRADE': 'true',
PGlazov7efe3b22022-02-16 17:29:05 +0400501 'OS_UPGRADE': 'true',
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300502 }
PGlazov554c4fd2022-03-23 14:31:41 +0400503 if (update_mysql_to_version == '5.7'):
PGlazov7efe3b22022-02-16 17:29:05 +0400504 job_parameters.update({'UPDATE_TO_MYSQL57': 'true'})
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300505
Hanna Arhipova508f6532021-01-27 15:52:45 +0200506 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300507 job_name=job_name,
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300508 job_parameters=job_parameters,
509 build_timeout=40 * 60)
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300510
Hanna Arhipova508f6532021-01-27 15:52:45 +0200511 assert job_result == 'SUCCESS', job_description
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300512
513 @pytest.fixture
514 def disable_automatic_failover_neutron_for_test(self, salt_actions):
515 """
516 On each OpenStack controller node, modify the neutron.conf file
517 Restart the neutron-server service
518 """
Hanna Arhipova19429962019-10-17 15:16:49 +0300519
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300520 def comment_line(node, file_name, word):
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300521 """
522 Adds '#' before the specific line in specific file
523
524 :param node: string, salt target of node where the file locates
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300525 :param file_name: string, full path to the file
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300526 :param word: string, the begin of line which should be commented
527 :return: None
528 """
529 salt_actions.cmd_run(node,
530 "sed -i 's/^{word}/#{word}/' {file}".
531 format(word=word,
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300532 file=file_name))
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300533
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300534 def add_line(node, file_name, line):
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300535 """
536 Appends line to the end of file
537
538 :param node: string, salt target of node where the file locates
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300539 :param file_name: string, full path to the file
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300540 :param line: string, line that should be added
541 :return: None
542 """
543 salt_actions.cmd_run(node, "echo {line} >> {file}".format(
Hanna Arhipova19429962019-10-17 15:16:49 +0300544 line=line,
545 file=file_name))
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300546
547 neutron_conf = '/etc/neutron/neutron.conf'
548 neutron_server = "I@neutron:server"
549 # ######## Create backup for config file #######################
550 salt_actions.cmd_run(
551 neutron_server,
552 "cp -p {file} {file}.backup".format(file=neutron_conf))
553
554 # ## Change parameters in neutron.conf'
555 comment_line(neutron_server, neutron_conf,
Hanna Arhipova19429962019-10-17 15:16:49 +0300556 "allow_automatic_l3agent_failover", )
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300557 comment_line(neutron_server, neutron_conf,
558 "allow_automatic_dhcp_failover")
559 add_line(neutron_server, neutron_conf,
560 "allow_automatic_dhcp_failover = false")
561 add_line(neutron_server, neutron_conf,
562 "allow_automatic_l3agent_failover = false")
563
564 # ## Apply changed config to the neutron-server service
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300565 result = salt_actions.cmd_run(neutron_server,
566 "service neutron-server restart")
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300567 # TODO: add check that neutron-server is up and running
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300568 yield result
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300569 # ## Revert file changes
570 salt_actions.cmd_run(
571 neutron_server,
572 "cp -p {file}.backup {file}".format(file=neutron_conf))
573 salt_actions.cmd_run(neutron_server,
574 "service neutron-server restart")
575
576 @pytest.fixture
577 def disable_neutron_agents_for_test(self, salt_actions):
578 """
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300579 Disable the neutron services before the test and
580 enable it after test
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300581 """
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300582 result = salt_actions.cmd_run("I@neutron:server", """
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300583 service neutron-dhcp-agent stop && \
584 service neutron-l3-agent stop && \
585 service neutron-metadata-agent stop && \
586 service neutron-openvswitch-agent stop
587 """)
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300588 yield result
589 #
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300590 salt_actions.cmd_run("I@neutron:server", """
591 service neutron-dhcp-agent start && \
592 service neutron-l3-agent start && \
593 service neutron-metadata-agent start && \
594 service neutron-openvswitch-agent start
595 """)
596 # TODO: add check that all services are UP and running
597
598 @pytest.mark.grab_versions
599 @pytest.mark.parametrize("_", [settings.ENV_NAME])
600 @pytest.mark.run_mcp_update
601 def test_update_rabbit(self, salt_actions, reclass_actions,
602 drivetrain_actions, show_step, _,
603 disable_automatic_failover_neutron_for_test,
604 disable_neutron_agents_for_test):
605 """ Updates RabbitMQ
606 Scenario:
607 1. Include the RabbitMQ upgrade pipeline job to DriveTrain
608 2. Add repositories with new RabbitMQ packages
609 3. Start Deploy - upgrade RabbitMQ pipeline
610
611 Updating RabbitMq should be completed before the OpenStack updating
612 process starts
613 """
614 salt = salt_actions
615 reclass = reclass_actions
616 dt = drivetrain_actions
617
618 # ####### Include the RabbitMQ upgrade pipeline job to DriveTrain ####
619 show_step(1)
620 reclass.add_class(
621 "system.jenkins.client.job.deploy.update.upgrade_rabbitmq",
622 "cluster/*/cicd/control/leader.yml")
623 salt.enforce_state("I@jenkins:client", "jenkins.client")
624
625 reclass.add_bool_key("parameters._param.openstack_upgrade_enabled",
626 "True",
627 "cluster/*/infra/init.yml")
628 salt.run_state("I@rabbitmq:server", "saltutil.refresh_pillar")
629
630 # ########### Add repositories with new RabbitMQ packages ############
631 show_step(2)
632 salt.enforce_state("I@rabbitmq:server", "linux.system.repo")
633
634 # ########### Start Deploy - upgrade RabbitMQ pipeline ############
635 show_step(3)
636 job_parameters = {
Hanna Arhipova874c68f2021-03-29 15:57:19 +0300637 'INTERACTIVE': 'false',
638 'OS_DIST_UPGRADE': 'true',
639 'OS_UPGRADE': 'true'
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300640 }
641
Hanna Arhipova508f6532021-01-27 15:52:45 +0200642 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300643 job_name='deploy-upgrade-rabbitmq',
644 job_parameters=job_parameters,
PGlazov99364cb2021-09-20 12:36:18 +0400645 build_timeout=50 * 60
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300646 )
Hanna Arhipova508f6532021-01-27 15:52:45 +0200647 assert job_result == 'SUCCESS', job_description
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300648
649 @pytest.mark.grab_versions
650 @pytest.mark.parametrize("_", [settings.ENV_NAME])
651 @pytest.mark.run_mcp_update
PGlazov215a4572022-03-05 05:09:04 +0400652 def test_update_ceph(self, salt_actions, drivetrain_actions,
653 reclass_actions, show_step, _):
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300654 """ Updates Ceph to the latest minor version
655
656 Scenario:
657 1. Add workaround for unhealth Ceph
658 2. Start ceph-upgrade job with default parameters
659 3. Check Ceph version for all nodes
PGlazov215a4572022-03-05 05:09:04 +0400660 4. WA id_reclaim only for nautilus
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300661
662 https://docs.mirantis.com/mcp/master/mcp-operations-guide/update-upgrade/minor-update/ceph-update.html
663 """
664 salt = salt_actions
PGlazov215a4572022-03-05 05:09:04 +0400665 reclass = reclass_actions
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300666 dt = drivetrain_actions
667
668 # ###################### Add workaround for unhealth Ceph ############
669 show_step(1)
670 salt.cmd_run("I@ceph:radosgw",
671 "ceph config set 'mon pg warn max object skew' 20")
672 # ###################### Start ceph-upgrade pipeline #################
673 show_step(2)
674 job_parameters = {}
675
Hanna Arhipova508f6532021-01-27 15:52:45 +0200676 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300677 job_name='ceph-update',
678 job_parameters=job_parameters)
679
Hanna Arhipova508f6532021-01-27 15:52:45 +0200680 assert job_result == 'SUCCESS', job_description
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300681
682 # ########## Verify Ceph version #####################################
683 show_step(3)
684
685 ceph_version_by_nodes = salt.cmd_run(
Hanna Arhipova19429962019-10-17 15:16:49 +0300686 "I@ceph:* and not I@ceph:monitoring and not I@ceph:backup:server",
687 "ceph version")[0]
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300688
689 assert has_only_similar(ceph_version_by_nodes), ceph_version_by_nodes
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300690
PGlazov215a4572022-03-05 05:09:04 +0400691 # ########## WA id_reclaim only for nautilus #########################
692 show_step(4)
693
694 ceph_version = salt_actions.get_single_pillar(
695 "I@salt:master",
696 "_param:_param:ceph_version")
697 if ceph_version == "nautilus":
698 wa_cve_2021_20288_global_id_reclaim(reclass, salt)
699 else:
700 LOG.info("Skip WA for luminous")
701
Hanna Arhipovaac008562019-10-17 11:54:23 +0300702 @pytest.mark.grab_versions
703 @pytest.mark.parametrize("_", [settings.ENV_NAME])
704 @pytest.mark.run_mcp_update
705 def test_update_stacklight(self, _, drivetrain_actions):
706 """ Update packages for Stacklight
707 Scenario:
708 1. Start Deploy - upgrade Stacklight job
709 """
710 drivetrain = drivetrain_actions
711
712 job_parameters = {
713 "STAGE_UPGRADE_DOCKER_COMPONENTS": True,
714 "STAGE_UPGRADE_ES_KIBANA": True,
Hanna Arhipova874c68f2021-03-29 15:57:19 +0300715 "STAGE_UPGRADE_SYSTEM_PART": True,
716 'OS_DIST_UPGRADE': 'true',
717 'OS_UPGRADE': 'true'
Hanna Arhipovaac008562019-10-17 11:54:23 +0300718 }
Hanna Arhipova508f6532021-01-27 15:52:45 +0200719 job_result, job_description = drivetrain.start_job_on_jenkins(
Hanna Arhipovaac008562019-10-17 11:54:23 +0300720 job_name="stacklight-upgrade",
721 job_parameters=job_parameters)
722
Hanna Arhipova508f6532021-01-27 15:52:45 +0200723 assert job_result == 'SUCCESS', job_description
Hanna Arhipovaac008562019-10-17 11:54:23 +0300724
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300725
Hanna Arhipova19429962019-10-17 15:16:49 +0300726@pytest.mark.usefixtures("switch_to_proposed_pipelines",
727 "enable_openstack_update")
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300728class TestOpenstackUpdate(object):
729
730 @pytest.mark.grab_versions
731 @pytest.mark.run_mcp_update
732 def test__pre_update__enable_pipeline_job(self,
733 reclass_actions, salt_actions,
734 show_step):
735 """ Enable pipeline in the Drivetrain
736
737 Scenario:
738 1. Add deploy.update.* classes to the reclass
739 2. Start jenkins.client salt state
740
741 """
742 salt = salt_actions
743 reclass = reclass_actions
744 show_step(1)
745 reclass.add_class("system.jenkins.client.job.deploy.update.upgrade",
746 "cluster/*/cicd/control/leader.yml")
747
748 reclass.add_class(
749 "system.jenkins.client.job.deploy.update.upgrade_ovs_gateway",
750 "cluster/*/cicd/control/leader.yml")
751
752 reclass.add_class(
753 "system.jenkins.client.job.deploy.update.upgrade_compute",
754 "cluster/*/cicd/control/leader.yml")
755
756 show_step(2)
757 r, errors = salt.enforce_state("I@jenkins:client", "jenkins.client")
758 assert errors is None
759
Pavel Glazov69e20e72022-07-01 08:06:58 +0400760 @retry(AssertionError, stop_max_attempt_number=2, wait_fixed=5000)
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300761 @pytest.mark.grab_versions
762 @pytest.mark.parametrize('target', get_control_plane_targets())
763 @pytest.mark.run_mcp_update
Hanna Arhipova19429962019-10-17 15:16:49 +0300764 def test__update__control_plane(self, drivetrain_actions, target):
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300765 """Start 'Deploy - upgrade control VMs' for specific node
766 """
767 job_parameters = {
768 "TARGET_SERVERS": target,
Hanna Arhipova606d5182019-12-13 13:23:55 +0200769 "OS_DIST_UPGRADE": True,
PGlazova5039252021-10-06 21:40:01 +0400770 "UPGRADE_SALTSTACK": True,
Hanna Arhipova606d5182019-12-13 13:23:55 +0200771 "OS_UPGRADE": True,
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300772 "INTERACTIVE": False}
Hanna Arhipova508f6532021-01-27 15:52:45 +0200773 job_result, job_description = drivetrain_actions.start_job_on_jenkins(
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300774 job_name="deploy-upgrade-control",
775 job_parameters=job_parameters)
776
Hanna Arhipova508f6532021-01-27 15:52:45 +0200777 assert job_result == 'SUCCESS', job_description
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300778
Pavel Glazov69e20e72022-07-01 08:06:58 +0400779 @retry(AssertionError, stop_max_attempt_number=2, wait_fixed=5000)
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300780 @pytest.mark.grab_versions
781 @pytest.mark.run_mcp_update
Hanna Arhipova606d5182019-12-13 13:23:55 +0200782 def test__update__data_plane(self, drivetrain_actions, salt_actions):
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300783 """Start 'Deploy - upgrade OVS gateway'
784 """
Hanna Arhipova606d5182019-12-13 13:23:55 +0200785 if not salt_actions.cmd_run("gtw*", "test.ping")[0].keys():
786 pytest.skip("This deployment doesn't have gtw* nodes")
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300787 job_parameters = {
Hanna Arhipova606d5182019-12-13 13:23:55 +0200788 "OS_DIST_UPGRADE": True,
789 "OS_UPGRADE": True,
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300790 "INTERACTIVE": False}
Hanna Arhipova508f6532021-01-27 15:52:45 +0200791 job_result, job_description = drivetrain_actions.start_job_on_jenkins(
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300792 job_name="deploy-upgrade-ovs-gateway",
793 job_parameters=job_parameters)
794
Hanna Arhipova508f6532021-01-27 15:52:45 +0200795 assert job_result == 'SUCCESS', job_description
Hanna Arhipova19429962019-10-17 15:16:49 +0300796
Pavel Glazov69e20e72022-07-01 08:06:58 +0400797 @retry(AssertionError, stop_max_attempt_number=2, wait_fixed=5000)
Hanna Arhipova19429962019-10-17 15:16:49 +0300798 @pytest.mark.grab_versions
799 @pytest.mark.run_mcp_update
800 def test__update__computes(self, drivetrain_actions):
801 """Start 'Deploy - upgrade computes'
802 """
803 job_parameters = {
Hanna Arhipova606d5182019-12-13 13:23:55 +0200804 "OS_DIST_UPGRADE": True,
805 "OS_UPGRADE": True,
Hanna Arhipova19429962019-10-17 15:16:49 +0300806 "INTERACTIVE": False}
Hanna Arhipova508f6532021-01-27 15:52:45 +0200807 job_result, job_description = drivetrain_actions.start_job_on_jenkins(
Hanna Arhipova19429962019-10-17 15:16:49 +0300808 job_name="deploy-upgrade-compute",
809 job_parameters=job_parameters)
810
Hanna Arhipova508f6532021-01-27 15:52:45 +0200811 assert job_result == 'SUCCESS', job_description