blob: 362486a08b1db3e345799cef7e959cccc5f6bf03 [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 Arhipovaeb3a2112019-09-13 18:45:21 +030070def switch_to_proposed_pipelines(reclass_actions, salt_actions):
Hanna Arhipova19429962019-10-17 15:16:49 +030071 reclass = reclass_actions
72 proposed_repo = "http://mirror.mirantis.com/update/proposed/"
73 repo_param = "parameters._param.linux_system_repo_update_url"
Hanna Arhipova7cfeb072019-10-11 15:04:10 +030074
Hanna Arhipova19429962019-10-17 15:16:49 +030075 proposed_pipeline_branch = "release/proposed/2019.2.0"
76 pipeline_branch_param = "parameters._param.jenkins_pipelines_branch"
77 infra_yml = "cluster/*/infra/init.yml"
78
79 LOG.info("Check reclass has release/proposed/2019.2.0 branches")
80 if reclass.get_key(pipeline_branch_param,
81 infra_yml) == proposed_pipeline_branch \
82 and reclass.get_key(repo_param, infra_yml) == proposed_repo:
83 return True
84
85 LOG.info("Switch to release/proposed/2019.2.0 branches")
86 reclass.add_key(pipeline_branch_param, proposed_pipeline_branch, infra_yml)
87
88 reclass.add_key(repo_param, proposed_repo, infra_yml)
89 reclass.add_key(repo_param, proposed_repo, "cluster/*/openstack/init.yml")
90 reclass.add_key(repo_param, proposed_repo, "cluster/*/stacklight/init.yml")
91 reclass.add_key(repo_param, proposed_repo, "cluster/*/ceph/init.yml")
Hanna Arhipova7cfeb072019-10-11 15:04:10 +030092
93 salt_actions.run_state("*", "saltutil.refresh_pillar")
Hanna Arhipova9ee75902019-10-29 16:33:26 +020094 salt_actions.enforce_state("*", "salt.minion")
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +030095 salt_actions.enforce_state("I@jenkins:client", "jenkins.client")
96
97
Hanna Arhipova745fdbb2020-03-30 14:40:44 +030098@pytest.fixture
Hanna Arhipovaec201e72020-10-26 17:14:25 +020099def wa_for_galera_clustercheck_password_prod35705(reclass_actions,
100 salt_actions):
Hanna Arhipova745fdbb2020-03-30 14:40:44 +0300101 reclass_actions.add_key(
Hanna Arhipovaec201e72020-10-26 17:14:25 +0200102 "parameters._param.galera_clustercheck_password",
Hanna Arhipova745fdbb2020-03-30 14:40:44 +0300103 "a"*32,
104 "cluster/*/infra/secrets.yml")
Hanna Arhipovaec201e72020-10-26 17:14:25 +0200105 salt_actions.run_state(
106 "I@galera:master or I@galera:slave", "saltutil.refresh_pillar")
107 salt_actions.enforce_state(
108 "I@galera:master or I@galera:slave", "galera")
109 salt_actions.enforce_state(
110 "I@galera:master or I@galera:slave", "haproxy")
Hanna Arhipovab7a80bb2020-12-04 15:36:36 +0200111 reclass_actions.commit("[from TCP-QA] Add galera_clustercheck_password")
Hanna Arhipova745fdbb2020-03-30 14:40:44 +0300112
113
Hanna Arhipova97fac6e2020-12-03 13:10:56 +0200114@pytest.fixture
115def wa_for_alerta_password_prod35958(reclass_actions,
116 salt_actions):
117 reclass_actions.add_key(
Hanna Arhipovab7a80bb2020-12-04 15:36:36 +0200118 "parameters._param.alerta_admin_key",
Hanna Arhipova97fac6e2020-12-03 13:10:56 +0200119 "a"*32,
Hanna Arhipovab7a80bb2020-12-04 15:36:36 +0200120 "cluster/*/stacklight/init.yml")
121 reclass_actions.commit("[from TCP-QA] Add alerta_admin_key")
Hanna Arhipova97fac6e2020-12-03 13:10:56 +0200122 salt_actions.run_state(
123 "I@prometheus:alerta or I@prometheus:alertmanager",
124 "saltutil.refresh_pillar")
125 salt_actions.enforce_state(
126 "I@prometheus:alerta", "prometheus.alerta")
127 salt_actions.enforce_state(
128 "I@prometheus:alertmanager", "prometheus.alertmanager")
129 salt_actions.enforce_state(
130 "I@prometheus:alerta or I@prometheus:alertmanager",
131 "docker.client")
132
133
Hanna Arhipova19429962019-10-17 15:16:49 +0300134@pytest.fixture(scope='class')
135def enable_openstack_update(reclass_actions, salt_actions):
136 param = "parameters._param.openstack_upgrade_enabled"
137 context_file = "cluster/*/infra/init.yml"
138
139 LOG.info("Enable openstack_upgrade_enabled in reclass")
140 reclass_actions.add_bool_key(param, "True", context_file)
141 salt_actions.run_state("*", "saltutil.refresh_pillar")
142 yield True
143 LOG.info("Disable openstack_upgrade_enabled in reclass")
144 reclass_actions.add_bool_key(param, "False", context_file)
145 salt_actions.run_state("*", "saltutil.refresh_pillar")
146
147
Hanna Arhipova745fdbb2020-03-30 14:40:44 +0300148@pytest.mark.usefixtures("switch_to_proposed_pipelines",
Hanna Arhipova97fac6e2020-12-03 13:10:56 +0200149 "wa_for_galera_clustercheck_password_prod35705",
150 "wa_for_alerta_password_prod35958")
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300151class TestUpdateMcpCluster(object):
152 """
153 Following the steps in
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300154 https://docs.mirantis.com/mcp/master/mcp-operations-guide/update-upgrade/minor-update.html#minor-update
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300155 """
156
157 @pytest.mark.grab_versions
158 @pytest.mark.parametrize("_", [settings.ENV_NAME])
159 @pytest.mark.run_mcp_update
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300160 def test_update_drivetrain(self, salt_actions, drivetrain_actions,
Hanna Arhipova19429962019-10-17 15:16:49 +0300161 show_step, _):
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300162 """Updating DriveTrain component to release/proposed/2019.2.0 version
163
164 Scenario:
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300165 1. Add workaround for PROD-32751
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300166 2. Run job git-mirror-downstream-mk-pipelines
167 3. Run job git-mirror-downstream-pipeline-library
168 4. If jobs are passed then start 'Deploy - upgrade MCP Drivetrain'
169
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300170 Duration: ~70 min
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300171 """
172 salt = salt_actions
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300173 dt = drivetrain_actions
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300174
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300175 # #################### Add workaround for PROD-32751 #################
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300176 show_step(1)
177
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300178 # FIXME: workaround for PROD-32751
179 salt.cmd_run("cfg01*", "cd /srv/salt/reclass; git add -u && \
180 git commit --allow-empty -m 'Cluster model update'")
181
182 # ################### Downstream mk-pipelines #########################
183 show_step(2)
184 job_name = 'git-mirror-downstream-mk-pipelines'
185 job_parameters = {
186 'BRANCHES': 'release/proposed/2019.2.0'
187 }
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200188 update_pipelines = dt.start_job_on_jenkins(
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300189 job_name=job_name,
Hanna Arhipovac3c59292020-04-23 16:29:09 +0300190 job_parameters=job_parameters,
191 verbose=True)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300192
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300193 assert update_pipelines == 'SUCCESS'
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300194
195 # ################### Downstream pipeline-library ####################
196 show_step(3)
197 job_name = 'git-mirror-downstream-pipeline-library'
198 job_parameters = {
199 'BRANCHES': 'release/proposed/2019.2.0'
200 }
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200201 update_pipeline_library = dt.start_job_on_jenkins(
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300202 job_name=job_name,
Hanna Arhipovac3c59292020-04-23 16:29:09 +0300203 job_parameters=job_parameters,
204 verbose=True)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300205
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300206 assert update_pipeline_library == 'SUCCESS'
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300207
208 # ################### Start 'Deploy - upgrade MCP Drivetrain' job #####
209 show_step(4)
210
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300211 job_name = 'upgrade-mcp-release'
212 job_parameters = {
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300213 'GIT_REFSPEC': 'release/proposed/2019.2.0',
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300214 'MK_PIPELINES_REFSPEC': 'release/proposed/2019.2.0',
215 'TARGET_MCP_VERSION': '2019.2.0'
216 }
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200217 update_drivetrain = dt.start_job_on_jenkins(
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300218 job_name=job_name,
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300219 job_parameters=job_parameters,
Hanna Arhipovac3c59292020-04-23 16:29:09 +0300220 verbose=True,
Hanna Arhipova85db4952020-03-31 20:20:06 +0300221 build_timeout=3 * 60 * 60)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300222
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300223 assert update_drivetrain == 'SUCCESS'
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300224
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300225 @pytest.mark.grab_versions
226 @pytest.mark.parametrize("_", [settings.ENV_NAME])
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300227 @pytest.mark.run_mcp_update
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300228 def test_update_glusterfs(self, salt_actions, reclass_actions,
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300229 drivetrain_actions, show_step, _):
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300230 """ Upgrade GlusterFS
231 Scenario:
232 1. In infra/init.yml in Reclass, add the glusterfs_version parameter
233 2. Start linux.system.repo state
234 3. Start "update-glusterfs" job
235 4. Check version for GlusterFS servers
236 5. Check version for GlusterFS clients
237
238 """
239 salt = salt_actions
240 reclass = reclass_actions
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300241 dt = drivetrain_actions
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300242
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300243 # ############## Change reclass ######################################
244 show_step(1)
245 reclass.add_key(
246 "parameters._param.linux_system_repo_mcp_glusterfs_version_number",
247 "5",
248 "cluster/*/infra/init.yml"
249 )
250 # ################# Run linux.system state ###########################
251 show_step(2)
252 salt.enforce_state("*", "linux.system.repo")
253
254 # ############## Start deploy-upgrade-galera job #####################
255 show_step(3)
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300256 job_name = 'update-glusterfs'
257
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200258 update_glusterfs = dt.start_job_on_jenkins(
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300259 job_name=job_name,
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300260 build_timeout=40 * 60)
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300261
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300262 assert update_glusterfs == 'SUCCESS'
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300263
264 # ################ Check GlusterFS version for servers ##############
265 show_step(4)
266 gluster_server_versions_by_nodes = salt.cmd_run(
267 "I@glusterfs:server",
268 "glusterd --version|head -n1")[0]
269
Hanna Arhipova19429962019-10-17 15:16:49 +0300270 assert has_only_similar(gluster_server_versions_by_nodes), \
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300271 gluster_server_versions_by_nodes
272
273 # ################ Check GlusterFS version for clients ##############
274 show_step(5)
275 gluster_client_versions_by_nodes = salt.cmd_run(
276 "I@glusterfs:client",
277 "glusterfs --version|head -n1")[0]
278
279 assert has_only_similar(gluster_client_versions_by_nodes), \
280 gluster_client_versions_by_nodes
281
282 @pytest.mark.grab_versions
283 @pytest.mark.parametrize("_", [settings.ENV_NAME])
284 @pytest.mark.run_mcp_update
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300285 def test_update_galera(self, salt_actions, reclass_actions,
286 drivetrain_actions, show_step, _):
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300287 """ Upgrade Galera automatically
288
289 Scenario:
290 1. Include the Galera upgrade pipeline job to DriveTrain
291 2. Apply the jenkins.client state on the Jenkins nodes
292 3. set the openstack_upgrade_enabled parameter to true
293 4. Refresh pillars
294 5. Add repositories with new Galera packages
295 6. Start job from Jenkins
296 """
297 salt = salt_actions
298 reclass = reclass_actions
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300299 dt = drivetrain_actions
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300300 # ################### Enable pipeline #################################
301 show_step(1)
302 reclass.add_class(
303 "system.jenkins.client.job.deploy.update.upgrade_galera",
304 "cluster/*/cicd/control/leader.yml")
305 show_step(2)
306 salt.enforce_state("I@jenkins:client", "jenkins.client")
307
308 # ############### Enable automatic upgrade ############################
309 show_step(3)
310 reclass.add_bool_key("parameters._param.openstack_upgrade_enabled",
311 "True",
312 "cluster/*/infra/init.yml")
313
314 show_step(4)
Hanna Arhipova7cfeb072019-10-11 15:04:10 +0300315 salt.run_state("dbs*", "saltutil.refresh_pillar")
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300316
317 # ############# Add repositories with new Galera packages #######
318 show_step(5)
319 salt.enforce_state("dbs*", "linux.system.repo")
320 salt.enforce_state("cfg*", "salt.master")
321
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300322 # #################### Login Jenkins on cid01 node ###################
323 show_step(6)
324
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300325 job_name = 'deploy-upgrade-galera'
326 job_parameters = {
327 'INTERACTIVE': 'false'
328 }
329
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200330 update_galera = dt.start_job_on_jenkins(
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300331 job_name=job_name,
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300332 job_parameters=job_parameters,
333 build_timeout=40 * 60)
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300334
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300335 assert update_galera == 'SUCCESS'
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300336
337 @pytest.fixture
338 def disable_automatic_failover_neutron_for_test(self, salt_actions):
339 """
340 On each OpenStack controller node, modify the neutron.conf file
341 Restart the neutron-server service
342 """
Hanna Arhipova19429962019-10-17 15:16:49 +0300343
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300344 def comment_line(node, file_name, word):
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300345 """
346 Adds '#' before the specific line in specific file
347
348 :param node: string, salt target of node where the file locates
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300349 :param file_name: string, full path to the file
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300350 :param word: string, the begin of line which should be commented
351 :return: None
352 """
353 salt_actions.cmd_run(node,
354 "sed -i 's/^{word}/#{word}/' {file}".
355 format(word=word,
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300356 file=file_name))
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300357
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300358 def add_line(node, file_name, line):
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300359 """
360 Appends line to the end of file
361
362 :param node: string, salt target of node where the file locates
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300363 :param file_name: string, full path to the file
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300364 :param line: string, line that should be added
365 :return: None
366 """
367 salt_actions.cmd_run(node, "echo {line} >> {file}".format(
Hanna Arhipova19429962019-10-17 15:16:49 +0300368 line=line,
369 file=file_name))
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300370
371 neutron_conf = '/etc/neutron/neutron.conf'
372 neutron_server = "I@neutron:server"
373 # ######## Create backup for config file #######################
374 salt_actions.cmd_run(
375 neutron_server,
376 "cp -p {file} {file}.backup".format(file=neutron_conf))
377
378 # ## Change parameters in neutron.conf'
379 comment_line(neutron_server, neutron_conf,
Hanna Arhipova19429962019-10-17 15:16:49 +0300380 "allow_automatic_l3agent_failover", )
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300381 comment_line(neutron_server, neutron_conf,
382 "allow_automatic_dhcp_failover")
383 add_line(neutron_server, neutron_conf,
384 "allow_automatic_dhcp_failover = false")
385 add_line(neutron_server, neutron_conf,
386 "allow_automatic_l3agent_failover = false")
387
388 # ## Apply changed config to the neutron-server service
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300389 result = salt_actions.cmd_run(neutron_server,
390 "service neutron-server restart")
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300391 # TODO: add check that neutron-server is up and running
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300392 yield result
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300393 # ## Revert file changes
394 salt_actions.cmd_run(
395 neutron_server,
396 "cp -p {file}.backup {file}".format(file=neutron_conf))
397 salt_actions.cmd_run(neutron_server,
398 "service neutron-server restart")
399
400 @pytest.fixture
401 def disable_neutron_agents_for_test(self, salt_actions):
402 """
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300403 Disable the neutron services before the test and
404 enable it after test
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300405 """
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300406 result = salt_actions.cmd_run("I@neutron:server", """
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300407 service neutron-dhcp-agent stop && \
408 service neutron-l3-agent stop && \
409 service neutron-metadata-agent stop && \
410 service neutron-openvswitch-agent stop
411 """)
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300412 yield result
413 #
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300414 salt_actions.cmd_run("I@neutron:server", """
415 service neutron-dhcp-agent start && \
416 service neutron-l3-agent start && \
417 service neutron-metadata-agent start && \
418 service neutron-openvswitch-agent start
419 """)
420 # TODO: add check that all services are UP and running
421
422 @pytest.mark.grab_versions
423 @pytest.mark.parametrize("_", [settings.ENV_NAME])
424 @pytest.mark.run_mcp_update
425 def test_update_rabbit(self, salt_actions, reclass_actions,
426 drivetrain_actions, show_step, _,
427 disable_automatic_failover_neutron_for_test,
428 disable_neutron_agents_for_test):
429 """ Updates RabbitMQ
430 Scenario:
431 1. Include the RabbitMQ upgrade pipeline job to DriveTrain
432 2. Add repositories with new RabbitMQ packages
433 3. Start Deploy - upgrade RabbitMQ pipeline
434
435 Updating RabbitMq should be completed before the OpenStack updating
436 process starts
437 """
438 salt = salt_actions
439 reclass = reclass_actions
440 dt = drivetrain_actions
441
442 # ####### Include the RabbitMQ upgrade pipeline job to DriveTrain ####
443 show_step(1)
444 reclass.add_class(
445 "system.jenkins.client.job.deploy.update.upgrade_rabbitmq",
446 "cluster/*/cicd/control/leader.yml")
447 salt.enforce_state("I@jenkins:client", "jenkins.client")
448
449 reclass.add_bool_key("parameters._param.openstack_upgrade_enabled",
450 "True",
451 "cluster/*/infra/init.yml")
452 salt.run_state("I@rabbitmq:server", "saltutil.refresh_pillar")
453
454 # ########### Add repositories with new RabbitMQ packages ############
455 show_step(2)
456 salt.enforce_state("I@rabbitmq:server", "linux.system.repo")
457
458 # ########### Start Deploy - upgrade RabbitMQ pipeline ############
459 show_step(3)
460 job_parameters = {
461 'INTERACTIVE': 'false'
462 }
463
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200464 update_rabbit = dt.start_job_on_jenkins(
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300465 job_name='deploy-upgrade-rabbitmq',
466 job_parameters=job_parameters,
467 build_timeout=40 * 60
468 )
469 assert update_rabbit == 'SUCCESS'
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300470
471 @pytest.mark.grab_versions
472 @pytest.mark.parametrize("_", [settings.ENV_NAME])
473 @pytest.mark.run_mcp_update
474 def test_update_ceph(self, salt_actions, drivetrain_actions, show_step, _):
475 """ Updates Ceph to the latest minor version
476
477 Scenario:
478 1. Add workaround for unhealth Ceph
479 2. Start ceph-upgrade job with default parameters
480 3. Check Ceph version for all nodes
481
482 https://docs.mirantis.com/mcp/master/mcp-operations-guide/update-upgrade/minor-update/ceph-update.html
483 """
484 salt = salt_actions
485 dt = drivetrain_actions
486
487 # ###################### Add workaround for unhealth Ceph ############
488 show_step(1)
489 salt.cmd_run("I@ceph:radosgw",
490 "ceph config set 'mon pg warn max object skew' 20")
491 # ###################### Start ceph-upgrade pipeline #################
492 show_step(2)
493 job_parameters = {}
494
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200495 update_ceph = dt.start_job_on_jenkins(
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300496 job_name='ceph-update',
497 job_parameters=job_parameters)
498
499 assert update_ceph == 'SUCCESS'
500
501 # ########## Verify Ceph version #####################################
502 show_step(3)
503
504 ceph_version_by_nodes = salt.cmd_run(
Hanna Arhipova19429962019-10-17 15:16:49 +0300505 "I@ceph:* and not I@ceph:monitoring and not I@ceph:backup:server",
506 "ceph version")[0]
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300507
508 assert has_only_similar(ceph_version_by_nodes), ceph_version_by_nodes
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300509
Hanna Arhipovaac008562019-10-17 11:54:23 +0300510 @pytest.mark.grab_versions
511 @pytest.mark.parametrize("_", [settings.ENV_NAME])
512 @pytest.mark.run_mcp_update
513 def test_update_stacklight(self, _, drivetrain_actions):
514 """ Update packages for Stacklight
515 Scenario:
516 1. Start Deploy - upgrade Stacklight job
517 """
518 drivetrain = drivetrain_actions
519
520 job_parameters = {
521 "STAGE_UPGRADE_DOCKER_COMPONENTS": True,
522 "STAGE_UPGRADE_ES_KIBANA": True,
523 "STAGE_UPGRADE_SYSTEM_PART": True
524 }
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200525 upgrade_control_pipeline = drivetrain.start_job_on_jenkins(
Hanna Arhipovaac008562019-10-17 11:54:23 +0300526 job_name="stacklight-upgrade",
527 job_parameters=job_parameters)
528
529 assert upgrade_control_pipeline == 'SUCCESS'
530
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300531
Hanna Arhipova19429962019-10-17 15:16:49 +0300532@pytest.mark.usefixtures("switch_to_proposed_pipelines",
533 "enable_openstack_update")
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300534class TestOpenstackUpdate(object):
535
536 @pytest.mark.grab_versions
537 @pytest.mark.run_mcp_update
538 def test__pre_update__enable_pipeline_job(self,
539 reclass_actions, salt_actions,
540 show_step):
541 """ Enable pipeline in the Drivetrain
542
543 Scenario:
544 1. Add deploy.update.* classes to the reclass
545 2. Start jenkins.client salt state
546
547 """
548 salt = salt_actions
549 reclass = reclass_actions
550 show_step(1)
551 reclass.add_class("system.jenkins.client.job.deploy.update.upgrade",
552 "cluster/*/cicd/control/leader.yml")
553
554 reclass.add_class(
555 "system.jenkins.client.job.deploy.update.upgrade_ovs_gateway",
556 "cluster/*/cicd/control/leader.yml")
557
558 reclass.add_class(
559 "system.jenkins.client.job.deploy.update.upgrade_compute",
560 "cluster/*/cicd/control/leader.yml")
561
562 show_step(2)
563 r, errors = salt.enforce_state("I@jenkins:client", "jenkins.client")
564 assert errors is None
565
566 @pytest.mark.grab_versions
567 @pytest.mark.parametrize('target', get_control_plane_targets())
568 @pytest.mark.run_mcp_update
Hanna Arhipova19429962019-10-17 15:16:49 +0300569 def test__update__control_plane(self, drivetrain_actions, target):
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300570 """Start 'Deploy - upgrade control VMs' for specific node
571 """
572 job_parameters = {
573 "TARGET_SERVERS": target,
Hanna Arhipova606d5182019-12-13 13:23:55 +0200574 "OS_DIST_UPGRADE": True,
PGlazoved19b352020-05-21 16:42:27 +0400575 "UPGRADE_SALTSTACK": False,
Hanna Arhipova606d5182019-12-13 13:23:55 +0200576 "OS_UPGRADE": True,
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300577 "INTERACTIVE": False}
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200578 upgrade_control_pipeline = drivetrain_actions.start_job_on_jenkins(
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300579 job_name="deploy-upgrade-control",
580 job_parameters=job_parameters)
581
582 assert upgrade_control_pipeline == 'SUCCESS'
583
584 @pytest.mark.grab_versions
585 @pytest.mark.run_mcp_update
Hanna Arhipova606d5182019-12-13 13:23:55 +0200586 def test__update__data_plane(self, drivetrain_actions, salt_actions):
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300587 """Start 'Deploy - upgrade OVS gateway'
588 """
Hanna Arhipova606d5182019-12-13 13:23:55 +0200589 if not salt_actions.cmd_run("gtw*", "test.ping")[0].keys():
590 pytest.skip("This deployment doesn't have gtw* nodes")
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300591 job_parameters = {
Hanna Arhipova606d5182019-12-13 13:23:55 +0200592 "OS_DIST_UPGRADE": True,
593 "OS_UPGRADE": True,
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300594 "INTERACTIVE": False}
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200595 upgrade_data_pipeline = drivetrain_actions.start_job_on_jenkins(
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300596 job_name="deploy-upgrade-ovs-gateway",
597 job_parameters=job_parameters)
598
599 assert upgrade_data_pipeline == 'SUCCESS'
Hanna Arhipova19429962019-10-17 15:16:49 +0300600
601 @pytest.mark.grab_versions
602 @pytest.mark.run_mcp_update
603 def test__update__computes(self, drivetrain_actions):
604 """Start 'Deploy - upgrade computes'
605 """
606 job_parameters = {
Hanna Arhipova606d5182019-12-13 13:23:55 +0200607 "OS_DIST_UPGRADE": True,
608 "OS_UPGRADE": True,
Hanna Arhipova19429962019-10-17 15:16:49 +0300609 "INTERACTIVE": False}
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200610 upgrade_compute_pipeline = drivetrain_actions.start_job_on_jenkins(
Hanna Arhipova19429962019-10-17 15:16:49 +0300611 job_name="deploy-upgrade-compute",
612 job_parameters=job_parameters)
613
614 assert upgrade_compute_pipeline == 'SUCCESS'