blob: 5d06b6363b9a3d1363524f3b3bffe276a0dcafd7 [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 Arhipova745fdbb2020-03-30 14:40:44 +0300111
112
Hanna Arhipova97fac6e2020-12-03 13:10:56 +0200113@pytest.fixture
114def wa_for_alerta_password_prod35958(reclass_actions,
115 salt_actions):
116 reclass_actions.add_key(
117 "parameters._param.alerta_admin_api_key_generated",
118 "a"*32,
119 "cluster/*/infra/secrets.yml")
120 salt_actions.run_state(
121 "I@prometheus:alerta or I@prometheus:alertmanager",
122 "saltutil.refresh_pillar")
123 salt_actions.enforce_state(
124 "I@prometheus:alerta", "prometheus.alerta")
125 salt_actions.enforce_state(
126 "I@prometheus:alertmanager", "prometheus.alertmanager")
127 salt_actions.enforce_state(
128 "I@prometheus:alerta or I@prometheus:alertmanager",
129 "docker.client")
130
131
Hanna Arhipova19429962019-10-17 15:16:49 +0300132@pytest.fixture(scope='class')
133def enable_openstack_update(reclass_actions, salt_actions):
134 param = "parameters._param.openstack_upgrade_enabled"
135 context_file = "cluster/*/infra/init.yml"
136
137 LOG.info("Enable openstack_upgrade_enabled in reclass")
138 reclass_actions.add_bool_key(param, "True", context_file)
139 salt_actions.run_state("*", "saltutil.refresh_pillar")
140 yield True
141 LOG.info("Disable openstack_upgrade_enabled in reclass")
142 reclass_actions.add_bool_key(param, "False", context_file)
143 salt_actions.run_state("*", "saltutil.refresh_pillar")
144
145
Hanna Arhipova745fdbb2020-03-30 14:40:44 +0300146@pytest.mark.usefixtures("switch_to_proposed_pipelines",
Hanna Arhipova97fac6e2020-12-03 13:10:56 +0200147 "wa_for_galera_clustercheck_password_prod35705",
148 "wa_for_alerta_password_prod35958")
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300149class TestUpdateMcpCluster(object):
150 """
151 Following the steps in
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300152 https://docs.mirantis.com/mcp/master/mcp-operations-guide/update-upgrade/minor-update.html#minor-update
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300153 """
154
155 @pytest.mark.grab_versions
156 @pytest.mark.parametrize("_", [settings.ENV_NAME])
157 @pytest.mark.run_mcp_update
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300158 def test_update_drivetrain(self, salt_actions, drivetrain_actions,
Hanna Arhipova19429962019-10-17 15:16:49 +0300159 show_step, _):
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300160 """Updating DriveTrain component to release/proposed/2019.2.0 version
161
162 Scenario:
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300163 1. Add workaround for PROD-32751
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300164 2. Run job git-mirror-downstream-mk-pipelines
165 3. Run job git-mirror-downstream-pipeline-library
166 4. If jobs are passed then start 'Deploy - upgrade MCP Drivetrain'
167
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300168 Duration: ~70 min
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300169 """
170 salt = salt_actions
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300171 dt = drivetrain_actions
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300172
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300173 # #################### Add workaround for PROD-32751 #################
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300174 show_step(1)
175
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300176 # FIXME: workaround for PROD-32751
177 salt.cmd_run("cfg01*", "cd /srv/salt/reclass; git add -u && \
178 git commit --allow-empty -m 'Cluster model update'")
179
180 # ################### Downstream mk-pipelines #########################
181 show_step(2)
182 job_name = 'git-mirror-downstream-mk-pipelines'
183 job_parameters = {
184 'BRANCHES': 'release/proposed/2019.2.0'
185 }
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200186 update_pipelines = dt.start_job_on_jenkins(
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300187 job_name=job_name,
Hanna Arhipovac3c59292020-04-23 16:29:09 +0300188 job_parameters=job_parameters,
189 verbose=True)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300190
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300191 assert update_pipelines == 'SUCCESS'
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300192
193 # ################### Downstream pipeline-library ####################
194 show_step(3)
195 job_name = 'git-mirror-downstream-pipeline-library'
196 job_parameters = {
197 'BRANCHES': 'release/proposed/2019.2.0'
198 }
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200199 update_pipeline_library = dt.start_job_on_jenkins(
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300200 job_name=job_name,
Hanna Arhipovac3c59292020-04-23 16:29:09 +0300201 job_parameters=job_parameters,
202 verbose=True)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300203
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300204 assert update_pipeline_library == 'SUCCESS'
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300205
206 # ################### Start 'Deploy - upgrade MCP Drivetrain' job #####
207 show_step(4)
208
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300209 job_name = 'upgrade-mcp-release'
210 job_parameters = {
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300211 'GIT_REFSPEC': 'release/proposed/2019.2.0',
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300212 'MK_PIPELINES_REFSPEC': 'release/proposed/2019.2.0',
213 'TARGET_MCP_VERSION': '2019.2.0'
214 }
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200215 update_drivetrain = dt.start_job_on_jenkins(
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300216 job_name=job_name,
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300217 job_parameters=job_parameters,
Hanna Arhipovac3c59292020-04-23 16:29:09 +0300218 verbose=True,
Hanna Arhipova85db4952020-03-31 20:20:06 +0300219 build_timeout=3 * 60 * 60)
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300220
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300221 assert update_drivetrain == 'SUCCESS'
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300222
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300223 @pytest.mark.grab_versions
224 @pytest.mark.parametrize("_", [settings.ENV_NAME])
Hanna Arhipova71ecc272019-08-20 14:54:22 +0300225 @pytest.mark.run_mcp_update
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300226 def test_update_glusterfs(self, salt_actions, reclass_actions,
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300227 drivetrain_actions, show_step, _):
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300228 """ Upgrade GlusterFS
229 Scenario:
230 1. In infra/init.yml in Reclass, add the glusterfs_version parameter
231 2. Start linux.system.repo state
232 3. Start "update-glusterfs" job
233 4. Check version for GlusterFS servers
234 5. Check version for GlusterFS clients
235
236 """
237 salt = salt_actions
238 reclass = reclass_actions
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300239 dt = drivetrain_actions
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300240
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300241 # ############## Change reclass ######################################
242 show_step(1)
243 reclass.add_key(
244 "parameters._param.linux_system_repo_mcp_glusterfs_version_number",
245 "5",
246 "cluster/*/infra/init.yml"
247 )
248 # ################# Run linux.system state ###########################
249 show_step(2)
250 salt.enforce_state("*", "linux.system.repo")
251
252 # ############## Start deploy-upgrade-galera job #####################
253 show_step(3)
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300254 job_name = 'update-glusterfs'
255
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200256 update_glusterfs = dt.start_job_on_jenkins(
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300257 job_name=job_name,
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300258 build_timeout=40 * 60)
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300259
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300260 assert update_glusterfs == 'SUCCESS'
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300261
262 # ################ Check GlusterFS version for servers ##############
263 show_step(4)
264 gluster_server_versions_by_nodes = salt.cmd_run(
265 "I@glusterfs:server",
266 "glusterd --version|head -n1")[0]
267
Hanna Arhipova19429962019-10-17 15:16:49 +0300268 assert has_only_similar(gluster_server_versions_by_nodes), \
Hanna Arhipovacc3759b2019-08-28 16:01:11 +0300269 gluster_server_versions_by_nodes
270
271 # ################ Check GlusterFS version for clients ##############
272 show_step(5)
273 gluster_client_versions_by_nodes = salt.cmd_run(
274 "I@glusterfs:client",
275 "glusterfs --version|head -n1")[0]
276
277 assert has_only_similar(gluster_client_versions_by_nodes), \
278 gluster_client_versions_by_nodes
279
280 @pytest.mark.grab_versions
281 @pytest.mark.parametrize("_", [settings.ENV_NAME])
282 @pytest.mark.run_mcp_update
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300283 def test_update_galera(self, salt_actions, reclass_actions,
284 drivetrain_actions, show_step, _):
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300285 """ Upgrade Galera automatically
286
287 Scenario:
288 1. Include the Galera upgrade pipeline job to DriveTrain
289 2. Apply the jenkins.client state on the Jenkins nodes
290 3. set the openstack_upgrade_enabled parameter to true
291 4. Refresh pillars
292 5. Add repositories with new Galera packages
293 6. Start job from Jenkins
294 """
295 salt = salt_actions
296 reclass = reclass_actions
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300297 dt = drivetrain_actions
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300298 # ################### Enable pipeline #################################
299 show_step(1)
300 reclass.add_class(
301 "system.jenkins.client.job.deploy.update.upgrade_galera",
302 "cluster/*/cicd/control/leader.yml")
303 show_step(2)
304 salt.enforce_state("I@jenkins:client", "jenkins.client")
305
306 # ############### Enable automatic upgrade ############################
307 show_step(3)
308 reclass.add_bool_key("parameters._param.openstack_upgrade_enabled",
309 "True",
310 "cluster/*/infra/init.yml")
311
312 show_step(4)
Hanna Arhipova7cfeb072019-10-11 15:04:10 +0300313 salt.run_state("dbs*", "saltutil.refresh_pillar")
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300314
315 # ############# Add repositories with new Galera packages #######
316 show_step(5)
317 salt.enforce_state("dbs*", "linux.system.repo")
318 salt.enforce_state("cfg*", "salt.master")
319
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300320 # #################### Login Jenkins on cid01 node ###################
321 show_step(6)
322
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300323 job_name = 'deploy-upgrade-galera'
324 job_parameters = {
325 'INTERACTIVE': 'false'
326 }
327
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200328 update_galera = dt.start_job_on_jenkins(
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300329 job_name=job_name,
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300330 job_parameters=job_parameters,
331 build_timeout=40 * 60)
Hanna Arhipova94a8abe2019-08-22 14:11:46 +0300332
Hanna Arhipova17b2c102019-09-06 16:44:17 +0300333 assert update_galera == 'SUCCESS'
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300334
335 @pytest.fixture
336 def disable_automatic_failover_neutron_for_test(self, salt_actions):
337 """
338 On each OpenStack controller node, modify the neutron.conf file
339 Restart the neutron-server service
340 """
Hanna Arhipova19429962019-10-17 15:16:49 +0300341
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300342 def comment_line(node, file_name, word):
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300343 """
344 Adds '#' before the specific line in specific file
345
346 :param node: string, salt target of node where the file locates
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300347 :param file_name: string, full path to the file
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300348 :param word: string, the begin of line which should be commented
349 :return: None
350 """
351 salt_actions.cmd_run(node,
352 "sed -i 's/^{word}/#{word}/' {file}".
353 format(word=word,
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300354 file=file_name))
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300355
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300356 def add_line(node, file_name, line):
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300357 """
358 Appends line to the end of file
359
360 :param node: string, salt target of node where the file locates
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300361 :param file_name: string, full path to the file
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300362 :param line: string, line that should be added
363 :return: None
364 """
365 salt_actions.cmd_run(node, "echo {line} >> {file}".format(
Hanna Arhipova19429962019-10-17 15:16:49 +0300366 line=line,
367 file=file_name))
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300368
369 neutron_conf = '/etc/neutron/neutron.conf'
370 neutron_server = "I@neutron:server"
371 # ######## Create backup for config file #######################
372 salt_actions.cmd_run(
373 neutron_server,
374 "cp -p {file} {file}.backup".format(file=neutron_conf))
375
376 # ## Change parameters in neutron.conf'
377 comment_line(neutron_server, neutron_conf,
Hanna Arhipova19429962019-10-17 15:16:49 +0300378 "allow_automatic_l3agent_failover", )
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300379 comment_line(neutron_server, neutron_conf,
380 "allow_automatic_dhcp_failover")
381 add_line(neutron_server, neutron_conf,
382 "allow_automatic_dhcp_failover = false")
383 add_line(neutron_server, neutron_conf,
384 "allow_automatic_l3agent_failover = false")
385
386 # ## Apply changed config to the neutron-server service
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300387 result = salt_actions.cmd_run(neutron_server,
388 "service neutron-server restart")
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300389 # TODO: add check that neutron-server is up and running
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300390 yield result
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300391 # ## Revert file changes
392 salt_actions.cmd_run(
393 neutron_server,
394 "cp -p {file}.backup {file}".format(file=neutron_conf))
395 salt_actions.cmd_run(neutron_server,
396 "service neutron-server restart")
397
398 @pytest.fixture
399 def disable_neutron_agents_for_test(self, salt_actions):
400 """
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300401 Disable the neutron services before the test and
402 enable it after test
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300403 """
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300404 result = salt_actions.cmd_run("I@neutron:server", """
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300405 service neutron-dhcp-agent stop && \
406 service neutron-l3-agent stop && \
407 service neutron-metadata-agent stop && \
408 service neutron-openvswitch-agent stop
409 """)
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300410 yield result
411 #
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300412 salt_actions.cmd_run("I@neutron:server", """
413 service neutron-dhcp-agent start && \
414 service neutron-l3-agent start && \
415 service neutron-metadata-agent start && \
416 service neutron-openvswitch-agent start
417 """)
418 # TODO: add check that all services are UP and running
419
420 @pytest.mark.grab_versions
421 @pytest.mark.parametrize("_", [settings.ENV_NAME])
422 @pytest.mark.run_mcp_update
423 def test_update_rabbit(self, salt_actions, reclass_actions,
424 drivetrain_actions, show_step, _,
425 disable_automatic_failover_neutron_for_test,
426 disable_neutron_agents_for_test):
427 """ Updates RabbitMQ
428 Scenario:
429 1. Include the RabbitMQ upgrade pipeline job to DriveTrain
430 2. Add repositories with new RabbitMQ packages
431 3. Start Deploy - upgrade RabbitMQ pipeline
432
433 Updating RabbitMq should be completed before the OpenStack updating
434 process starts
435 """
436 salt = salt_actions
437 reclass = reclass_actions
438 dt = drivetrain_actions
439
440 # ####### Include the RabbitMQ upgrade pipeline job to DriveTrain ####
441 show_step(1)
442 reclass.add_class(
443 "system.jenkins.client.job.deploy.update.upgrade_rabbitmq",
444 "cluster/*/cicd/control/leader.yml")
445 salt.enforce_state("I@jenkins:client", "jenkins.client")
446
447 reclass.add_bool_key("parameters._param.openstack_upgrade_enabled",
448 "True",
449 "cluster/*/infra/init.yml")
450 salt.run_state("I@rabbitmq:server", "saltutil.refresh_pillar")
451
452 # ########### Add repositories with new RabbitMQ packages ############
453 show_step(2)
454 salt.enforce_state("I@rabbitmq:server", "linux.system.repo")
455
456 # ########### Start Deploy - upgrade RabbitMQ pipeline ############
457 show_step(3)
458 job_parameters = {
459 'INTERACTIVE': 'false'
460 }
461
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200462 update_rabbit = dt.start_job_on_jenkins(
Hanna Arhipova1fcaf442019-09-06 15:30:45 +0300463 job_name='deploy-upgrade-rabbitmq',
464 job_parameters=job_parameters,
465 build_timeout=40 * 60
466 )
467 assert update_rabbit == 'SUCCESS'
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300468
469 @pytest.mark.grab_versions
470 @pytest.mark.parametrize("_", [settings.ENV_NAME])
471 @pytest.mark.run_mcp_update
472 def test_update_ceph(self, salt_actions, drivetrain_actions, show_step, _):
473 """ Updates Ceph to the latest minor version
474
475 Scenario:
476 1. Add workaround for unhealth Ceph
477 2. Start ceph-upgrade job with default parameters
478 3. Check Ceph version for all nodes
479
480 https://docs.mirantis.com/mcp/master/mcp-operations-guide/update-upgrade/minor-update/ceph-update.html
481 """
482 salt = salt_actions
483 dt = drivetrain_actions
484
485 # ###################### Add workaround for unhealth Ceph ############
486 show_step(1)
487 salt.cmd_run("I@ceph:radosgw",
488 "ceph config set 'mon pg warn max object skew' 20")
489 # ###################### Start ceph-upgrade pipeline #################
490 show_step(2)
491 job_parameters = {}
492
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200493 update_ceph = dt.start_job_on_jenkins(
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300494 job_name='ceph-update',
495 job_parameters=job_parameters)
496
497 assert update_ceph == 'SUCCESS'
498
499 # ########## Verify Ceph version #####################################
500 show_step(3)
501
502 ceph_version_by_nodes = salt.cmd_run(
Hanna Arhipova19429962019-10-17 15:16:49 +0300503 "I@ceph:* and not I@ceph:monitoring and not I@ceph:backup:server",
504 "ceph version")[0]
Hanna Arhipovad35a29b2019-09-04 13:24:06 +0300505
506 assert has_only_similar(ceph_version_by_nodes), ceph_version_by_nodes
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300507
Hanna Arhipovaac008562019-10-17 11:54:23 +0300508 @pytest.mark.grab_versions
509 @pytest.mark.parametrize("_", [settings.ENV_NAME])
510 @pytest.mark.run_mcp_update
511 def test_update_stacklight(self, _, drivetrain_actions):
512 """ Update packages for Stacklight
513 Scenario:
514 1. Start Deploy - upgrade Stacklight job
515 """
516 drivetrain = drivetrain_actions
517
518 job_parameters = {
519 "STAGE_UPGRADE_DOCKER_COMPONENTS": True,
520 "STAGE_UPGRADE_ES_KIBANA": True,
521 "STAGE_UPGRADE_SYSTEM_PART": True
522 }
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200523 upgrade_control_pipeline = drivetrain.start_job_on_jenkins(
Hanna Arhipovaac008562019-10-17 11:54:23 +0300524 job_name="stacklight-upgrade",
525 job_parameters=job_parameters)
526
527 assert upgrade_control_pipeline == 'SUCCESS'
528
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300529
Hanna Arhipova19429962019-10-17 15:16:49 +0300530@pytest.mark.usefixtures("switch_to_proposed_pipelines",
531 "enable_openstack_update")
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300532class TestOpenstackUpdate(object):
533
534 @pytest.mark.grab_versions
535 @pytest.mark.run_mcp_update
536 def test__pre_update__enable_pipeline_job(self,
537 reclass_actions, salt_actions,
538 show_step):
539 """ Enable pipeline in the Drivetrain
540
541 Scenario:
542 1. Add deploy.update.* classes to the reclass
543 2. Start jenkins.client salt state
544
545 """
546 salt = salt_actions
547 reclass = reclass_actions
548 show_step(1)
549 reclass.add_class("system.jenkins.client.job.deploy.update.upgrade",
550 "cluster/*/cicd/control/leader.yml")
551
552 reclass.add_class(
553 "system.jenkins.client.job.deploy.update.upgrade_ovs_gateway",
554 "cluster/*/cicd/control/leader.yml")
555
556 reclass.add_class(
557 "system.jenkins.client.job.deploy.update.upgrade_compute",
558 "cluster/*/cicd/control/leader.yml")
559
560 show_step(2)
561 r, errors = salt.enforce_state("I@jenkins:client", "jenkins.client")
562 assert errors is None
563
564 @pytest.mark.grab_versions
565 @pytest.mark.parametrize('target', get_control_plane_targets())
566 @pytest.mark.run_mcp_update
Hanna Arhipova19429962019-10-17 15:16:49 +0300567 def test__update__control_plane(self, drivetrain_actions, target):
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300568 """Start 'Deploy - upgrade control VMs' for specific node
569 """
570 job_parameters = {
571 "TARGET_SERVERS": target,
Hanna Arhipova606d5182019-12-13 13:23:55 +0200572 "OS_DIST_UPGRADE": True,
PGlazoved19b352020-05-21 16:42:27 +0400573 "UPGRADE_SALTSTACK": False,
Hanna Arhipova606d5182019-12-13 13:23:55 +0200574 "OS_UPGRADE": True,
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300575 "INTERACTIVE": False}
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200576 upgrade_control_pipeline = drivetrain_actions.start_job_on_jenkins(
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300577 job_name="deploy-upgrade-control",
578 job_parameters=job_parameters)
579
580 assert upgrade_control_pipeline == 'SUCCESS'
581
582 @pytest.mark.grab_versions
583 @pytest.mark.run_mcp_update
Hanna Arhipova606d5182019-12-13 13:23:55 +0200584 def test__update__data_plane(self, drivetrain_actions, salt_actions):
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300585 """Start 'Deploy - upgrade OVS gateway'
586 """
Hanna Arhipova606d5182019-12-13 13:23:55 +0200587 if not salt_actions.cmd_run("gtw*", "test.ping")[0].keys():
588 pytest.skip("This deployment doesn't have gtw* nodes")
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300589 job_parameters = {
Hanna Arhipova606d5182019-12-13 13:23:55 +0200590 "OS_DIST_UPGRADE": True,
591 "OS_UPGRADE": True,
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300592 "INTERACTIVE": False}
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200593 upgrade_data_pipeline = drivetrain_actions.start_job_on_jenkins(
Hanna Arhipovaeb3a2112019-09-13 18:45:21 +0300594 job_name="deploy-upgrade-ovs-gateway",
595 job_parameters=job_parameters)
596
597 assert upgrade_data_pipeline == 'SUCCESS'
Hanna Arhipova19429962019-10-17 15:16:49 +0300598
599 @pytest.mark.grab_versions
600 @pytest.mark.run_mcp_update
601 def test__update__computes(self, drivetrain_actions):
602 """Start 'Deploy - upgrade computes'
603 """
604 job_parameters = {
Hanna Arhipova606d5182019-12-13 13:23:55 +0200605 "OS_DIST_UPGRADE": True,
606 "OS_UPGRADE": True,
Hanna Arhipova19429962019-10-17 15:16:49 +0300607 "INTERACTIVE": False}
Hanna Arhipovaa85bfa62020-01-03 18:49:15 +0200608 upgrade_compute_pipeline = drivetrain_actions.start_job_on_jenkins(
Hanna Arhipova19429962019-10-17 15:16:49 +0300609 job_name="deploy-upgrade-compute",
610 job_parameters=job_parameters)
611
612 assert upgrade_compute_pipeline == 'SUCCESS'