blob: ef23b67decd0229db4ea0d25bcdfdd1a7a811252 [file] [log] [blame]
Hanna Arhipova54fec802020-10-30 12:45:46 +02001import pytest
2
3from tcp_tests import logger
Hanna Arhipova5b0caa52021-07-09 20:23:28 +03004from string import Template
Hanna Arhipova54fec802020-10-30 12:45:46 +02005
6LOG = logger.logger
7
8
Hanna Arhipovae92b66b2021-04-15 19:56:30 +03009@pytest.fixture(scope='session')
Hanna Arhipovad60430e2021-02-12 18:23:47 +020010def add_xtra_node_to_salt(salt_actions, underlay_actions,
11 config, reclass_actions):
Hanna Arhipova54fec802020-10-30 12:45:46 +020012 """
13
14 :return:
15 """
16 LOG.info("Executing pytest SETUP from add_xtra_node_to_salt fixture")
17 xtra_node = [node['node_name'] for node in config.underlay.ssh
18 if 'xtra' in node.get('node_name')][0]
19
20 cfg_node = [node['node_name'] for node in config.underlay.ssh
21 if 'salt_master' in node.get('roles')][0]
22
Hanna Arhipova5b0caa52021-07-09 20:23:28 +030023 # salt_actions.enforce_state("I@salt:master", "reclass")
Hanna Arhipovae92b66b2021-04-15 19:56:30 +030024
Hanna Arhipova54fec802020-10-30 12:45:46 +020025 underlay_actions.check_call(
26 "salt-key -a {node} --include-all -y".format(node=xtra_node),
27 node_name=cfg_node,
28 raise_on_err=False)
29 # Need to restart salt-minion service after accepting it in Salt Master
Hanna Arhipova5b0caa52021-07-09 20:23:28 +030030 # underlay_actions.check_call(
31 # "systemctl restart salt-minion",
32 # node_name=xtra_node,
33 # raise_on_err=False)
34 # salt_actions.enforce_state("xtra*", "linux")
35 # salt_actions.enforce_state("xtra*", "openssh")
Hanna Arhipovad60430e2021-02-12 18:23:47 +020036
Hanna Arhipova54fec802020-10-30 12:45:46 +020037 yield
38
39 # LOG.info("Executing pytest TEARDOWN from add_xtra_node_to_salt fixture")
40 # underlay_actions.check_call(
41 # "salt-key -r {node} --include-all -y".format(node=node),
42 # node_name=cfg_node,
43 # raise_on_err=False)
44
45
Hanna Arhipovae92b66b2021-04-15 19:56:30 +030046@pytest.fixture(scope='session')
47def wa_prod36167(reclass_actions):
48 reclass_actions.delete_class("system.salt.control.virt",
Hanna Arhipova3ea92b22021-07-01 15:44:15 +030049 "cluster/*/infra/kvm.yml")
Hanna Arhipovae92b66b2021-04-15 19:56:30 +030050
51
PGlazovf9d5d232021-07-02 12:34:18 +040052@pytest.mark.usefixtures("add_xtra_node_to_salt",
53 "wa_prod36167")
Hanna Arhipova54fec802020-10-30 12:45:46 +020054class TestCephOsd(object):
55
Hanna Arhipova5b0caa52021-07-09 20:23:28 +030056 add_osd_ceph_init_yml = """
57 parameters:
58 _param:
59 ceph_osd_node04_hostname: xtra
60 ceph_osd_node04_address: 10.6.0.205
61 ceph_osd_system_codename: xenial
62 linux:
63 network:
64 host:
65 xtra:
66 address: ${_param:ceph_osd_node04_address}
67 names:
68 - ${_param:ceph_osd_node04_hostname}
69 - ${_param:ceph_osd_node04_hostname}.${_param:cluster_domain}
70 """
71
72 add_osd_config_init_yml = """
73 parameters:
74 reclass:
75 storage:
76 node:
77 ceph_osd_node04:
78 name: ${_param:ceph_osd_node04_hostname}
79 domain: ${_param:cluster_domain}
80 classes:
81 - cluster.${_param:cluster_name}.ceph.osd
82 - environment.heat-cicd-queens-dvr-sl.linux_network_interface
83 - environment.heat-cicd-queens-dvr-sl.overrides
84 params:
85 salt_master_host: ${_param:reclass_config_master}
86 linux_system_codename: ${_param:ceph_osd_system_codename}
87 single_address: ${_param:ceph_osd_node04_address}
88 ceph_crush_parent: rack02
89 linux_network_interfaces:
90 br_ctl:
91 address: ${_param:ceph_osd_node04_address}
92 enabled: True
93 name_servers:
94 - ${_param:dns_server01}
95 - ${_param:dns_server02}
96 netmask: ${_param:control_network_netmask}
97 proto: static
98 require_interfaces: ['ens4']
99 type: bridge
100 use_interfaces: ['ens4']
101 ens3:
102 enabled: True
103 name: ens3
104 proto: dhcp
105 type: eth
106 ens4:
107 enabled: True
108 ipflush_onchange: True
109 name: ens4
110 proto: manual
111 type: eth
112 """
113
Hanna Arhipova54fec802020-10-30 12:45:46 +0200114 @pytest.fixture
115 def describe_node_in_reclass(self,
Hanna Arhipovad33353e2021-02-15 23:14:51 +0200116 reclass_actions,
117 salt_actions):
Hanna Arhipova54fec802020-10-30 12:45:46 +0200118 LOG.info("Executing pytest SETUP "
119 "from describe_node_in_reclass fixture")
120 reclass = reclass_actions
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300121
Hanna Arhipova54fec802020-10-30 12:45:46 +0200122 # ---- cluster/*/ceph/init.yml ---------------
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300123 reclass.merge_context(yaml_context=self.add_osd_ceph_init_yml,
Hanna Arhipovad33353e2021-02-15 23:14:51 +0200124 short_path="cluster/*/ceph/init.yml")
Hanna Arhipova54fec802020-10-30 12:45:46 +0200125
126 # ------- cluster/infra/config/init.yml -----------
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300127 reclass.merge_context(yaml_context=build_node_config('osd'),
128 short_path="cluster/*/infra/config/nodes.yml")
129
130 # salt_actions.run_state("*", "saltutil.refresh_pillar")
131 # salt_actions.enforce_state("I@salt:master", "reclass")
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200132
133 @pytest.fixture
134 def remove_node_from_reclass(self,
135 reclass_actions):
136 reclass = reclass_actions
137
138 reclass.delete_key(
139 key="parameters.reclass.storage.node.ceph_osd_node04",
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300140 short_path="cluster/*/infra/config/nodes.yml"
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200141 )
142 reclass.delete_key(
143 key="parameters.linux.network.host.xtra",
144 short_path="cluster/*/ceph/init.yml"
145 )
Hanna Arhipova54fec802020-10-30 12:45:46 +0200146
147 def test_add_node_process(self, describe_node_in_reclass,
148 drivetrain_actions):
149 """
150 https://docs.mirantis.com/mcp/q4-18/mcp-operations-guide/openstack-operations/ceph-operations/manage-nodes/add-osd-nodes.html
151 :param describe_node_in_reclass:
152 :param drivetrain_actions:
153 :return:
154 test took about 20 min
155 """
156 dt = drivetrain_actions
PGlazov89ba9182021-02-19 13:36:46 +0400157 # Workaround for PROD-36132
158 job_name = "ceph-add-node"
Hanna Arhipova54fec802020-10-30 12:45:46 +0200159 job_parameters = {
160 'HOST': 'xtra*',
PGlazov89ba9182021-02-19 13:36:46 +0400161 'OSD_ONLY': False
Hanna Arhipova54fec802020-10-30 12:45:46 +0200162 }
Hanna Arhipova508f6532021-01-27 15:52:45 +0200163 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipova54fec802020-10-30 12:45:46 +0200164 job_name=job_name,
165 job_parameters=job_parameters,
166 verbose=True)
Hanna Arhipova508f6532021-01-27 15:52:45 +0200167 assert job_result == 'SUCCESS', job_description
Hanna Arhipova54fec802020-10-30 12:45:46 +0200168
169 def test_added_node(self):
170 # root@osd001:~# ceph osd tree in
171 # ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
172 # -1 0.18585 root default
173 # -3 0.04646 host osd001
174 # 0 hdd 0.01549 osd.0 up 1.00000 1.00000
175 # 1 hdd 0.01549 osd.1 up 1.00000 1.00000
176 # 2 hdd 0.01549 osd.2 up 1.00000 1.00000
177 # -5 0.04646 host osd002
178 # 3 hdd 0.01549 osd.3 up 1.00000 1.00000
179 # 5 hdd 0.01549 osd.5 up 1.00000 1.00000
180 # 6 hdd 0.01549 osd.6 up 1.00000 1.00000
181 # -7 0.04646 host osd003
182 # 4 hdd 0.01549 osd.4 up 1.00000 1.00000
183 # 7 hdd 0.01549 osd.7 up 1.00000 1.00000
184 # 8 hdd 0.01549 osd.8 up 1.00000 1.00000
185 # -9 0.04646 host xtra
186 # 9 hdd 0.01549 osd.9 up 1.00000 1.00000
187 # 10 hdd 0.01549 osd.10 up 1.00000 1.00000
188 # 11 hdd 0.01549 osd.11 up 1.00000 1.00000
189 pass
190
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200191 def test_delete_node_process(self,
192 remove_node_from_reclass,
193 drivetrain_actions):
Hanna Arhipova54fec802020-10-30 12:45:46 +0200194 dt = drivetrain_actions
195
196 job_name = "ceph-remove-node"
197 job_parameters = {
198 'HOST': 'xtra*',
PGlazov89ba9182021-02-19 13:36:46 +0400199 'OSD': '*'
Hanna Arhipova54fec802020-10-30 12:45:46 +0200200 }
Hanna Arhipova508f6532021-01-27 15:52:45 +0200201 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipova54fec802020-10-30 12:45:46 +0200202 job_name=job_name,
203 job_parameters=job_parameters,
204 verbose=True)
Hanna Arhipova508f6532021-01-27 15:52:45 +0200205 assert job_result == 'SUCCESS', job_description
Hanna Arhipova54fec802020-10-30 12:45:46 +0200206
207
PGlazovf9d5d232021-07-02 12:34:18 +0400208@pytest.mark.usefixtures("add_xtra_node_to_salt",
209 "wa_prod36167")
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200210class TestCephMon(object):
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300211 add_mon_ceph_init_yml = """
212 parameters:
213 _param:
214 ceph_mon_node04_hostname: xtra
215 ceph_mon_node04_address: 10.6.0.205
216 ceph_mon_node04_ceph_public_address: 10.166.49.209
217 ceph_mon_node04_ceph_backup_hour: 4
218 ceph_mon_node04_ceph_backup_minute: 0
219 linux:
220 network:
221 host:
222 xtra:
223 address: ${_param:ceph_mon_node04_address}
224 names:
225 - ${_param:ceph_mon_node04_hostname}
226 - ${_param:ceph_mon_node04_hostname}.${_param:cluster_domain}
227 """
228
229 add_mon_ceph_common_yml = """
230 parameters:
231 ceph:
232 common:
233 members:
234 - name: ${_param:ceph_mon_node04_hostname}
235 host: ${_param:ceph_mon_node04_address}
236 """
237
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200238 @pytest.fixture
239 def describe_node_in_reclass(self,
240 reclass_actions, salt_actions):
241 LOG.info("Executing pytest SETUP "
242 "from describe_node_in_reclass fixture")
243 reclass = reclass_actions
244 # ---- cluster/*/ceph/init.yml --------------
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300245 reclass.merge_context(yaml_context=self.add_mon_ceph_init_yml,
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200246 short_path="cluster/*/ceph/init.yml")
247
248 # ------- cluster/infra/config/init.yml -----------
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300249 reclass.merge_context(yaml_context=self.add_mon_ceph_common_yml,
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200250 short_path="cluster/*/ceph/common.yml")
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300251 reclass.merge_context(yaml_context=build_node_config('mon'),
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200252 short_path="cluster/*/infra/config/nodes.yml")
253
254 # ------- define settings for new mon node in KVM cluster -----------
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300255 # Commented because we don't add VM machine, we add already
256 # deployed node
257 # reclass.merge_context(yaml_context=add_mon_infra_kvm_yml,
258 # short_path="cluster/*/infra/kvm.yml")
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200259
260 salt_actions.run_state("*", "saltutil.refresh_pillar")
261
262 @pytest.fixture
263 def remove_node_from_reclass(self,
264 reclass_actions, salt_actions):
265 LOG.info("Executing pytest SETUP "
266 "from remove_node_from_reclass fixture")
267 reclass = reclass_actions
268 reclass.delete_key(
269 key="parameters.reclass.storage.node.ceph_mon_node04",
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300270 short_path="cluster/*/infra/config/nodes.yml")
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200271 reclass.delete_key(
272 key="parameters.salt.control.cluster.internal.node.cmn04",
273 short_path="cluster/*/infra/kvm.yml"
274 )
275 reclass.delete_key(
276 key="parameters.linux.network.host.xtra",
277 short_path="cluster/*/ceph/init.yml"
278 )
279
280 def test_add_node_process(self,
281 drivetrain_actions,
282 describe_node_in_reclass):
Hanna Arhipovae92b66b2021-04-15 19:56:30 +0300283 """
284 https://docs.mirantis.com/mcp/q4-18/mcp-operations-guide/openstack-operations/ceph-operations/manage-nodes/add-mon-nodes.html
285 :param drivetrain_actions:
286 :param describe_node_in_reclass:
287 :return:
288 """
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200289 dt = drivetrain_actions
290
291 job_name = "ceph-add-node"
292 job_parameters = {
293 'HOST': 'xtra*',
294 'USE_UPMAP': True
295 }
296 job_result, job_description = dt.start_job_on_jenkins(
297 job_name=job_name,
298 job_parameters=job_parameters,
299 verbose=True)
300 assert job_result == 'SUCCESS', job_description
301
302 def test_delete_node_process(self,
303 remove_node_from_reclass,
304 drivetrain_actions):
305 dt = drivetrain_actions
306
307 job_name = "ceph-remove-node"
308 job_parameters = {
309 'HOST': 'xtra*',
310 'USE_UPMAP': True
311 }
312 job_result, job_description = dt.start_job_on_jenkins(
313 job_name=job_name,
314 job_parameters=job_parameters,
315 verbose=True)
316 assert job_result == 'SUCCESS', job_description
Hanna Arhipova54fec802020-10-30 12:45:46 +0200317
318
PGlazovf9d5d232021-07-02 12:34:18 +0400319@pytest.mark.usefixtures("add_xtra_node_to_salt",
320 "wa_prod36167")
Hanna Arhipovae92b66b2021-04-15 19:56:30 +0300321class TestCephRgw(object):
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300322 add_rgw_ceph_init_yml = """
323 parameters:
324 _param:
325 ceph_rgw_node04_hostname: xtra
326 ceph_rgw_node04_address: 10.6.0.205
327 ceph_rgw_node04_ceph_public_address: 10.166.49.209
328 linux:
329 network:
330 host:
331 rgw04:
332 address: ${_param:ceph_rgw_node04_address}
333 names:
334 - ${_param:ceph_rgw_node04_hostname}
335 - ${_param:ceph_rgw_node04_hostname}.${_param:cluster_domain}
336 """ # noqa: E501
337
338 add_rgw_ceph_rgw_yml = """
339 parameters:
340 _param:
341 cluster_node04_hostname: ${_param:ceph_rgw_node04_hostname}
342 cluster_node04_address: ${_param:ceph_rgw_node04_address}
343 ceph:
344 common:
345 keyring:
346 rgw.xtra:
347 caps:
348 mon: "allow rw"
349 osd: "allow rwx"
350 haproxy:
351 proxy:
352 listen:
353 radosgw:
354 servers:
355 - name: ${_param:cluster_node04_hostname}
356 host: ${_param:cluster_node04_address}
357 port: ${_param:haproxy_radosgw_source_port}
358 params: check
359 """
360
Hanna Arhipovae92b66b2021-04-15 19:56:30 +0300361 @pytest.fixture
362 def describe_node_in_reclass(self,
363 reclass_actions, salt_actions):
364 LOG.info("Executing pytest SETUP "
365 "from describe_node_in_reclass fixture")
366 reclass = reclass_actions
367 # ---- cluster/*/ceph/init.yml --------------
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300368 reclass.merge_context(yaml_context=self.add_rgw_ceph_init_yml,
Hanna Arhipovae92b66b2021-04-15 19:56:30 +0300369 short_path="cluster/*/ceph/init.yml")
370
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300371 reclass.merge_context(yaml_context=self.add_rgw_ceph_rgw_yml,
Hanna Arhipovae92b66b2021-04-15 19:56:30 +0300372 short_path="cluster/*/ceph/rgw.yml")
373
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300374 reclass.merge_context(yaml_context=build_node_config('rgw'),
375 short_path="cluster/*/infra/config/nodes.yml")
Hanna Arhipovae92b66b2021-04-15 19:56:30 +0300376
377 salt_actions.run_state("*", "saltutil.refresh_pillar")
378
379 @pytest.fixture
380 def remove_node_from_reclass(self,
381 reclass_actions, salt_actions):
382 LOG.info("Executing pytest SETUP "
383 "from remove_node_from_reclass fixture")
384 # reclass = reclass_actions
385 # reclass.delete_key(
386 # key="parameters.reclass.storage.node.ceph_rgw_node04",
387 # short_path="cluster/*/infra/config/init.yml")
388 # reclass.delete_key(
389 # key="parameters.linux.network.host.xtra",
390 # short_path="cluster/*/ceph/init.yml"
391 # )
392
393 def test_add_node_process(self,
394 drivetrain_actions,
395 describe_node_in_reclass):
396 """
397 https://docs.mirantis.com/mcp/q4-18/mcp-operations-guide/openstack-operations/ceph-operations/manage-nodes/add-rgw-nodes.html
398 :param drivetrain_actions:
399 :param describe_node_in_reclass:
400 :return:
401 """
402 dt = drivetrain_actions
403
404 job_name = "ceph-add-node"
405 job_parameters = {
406 'HOST': 'xtra*',
407 'USE_UPMAP': True
408 }
409 job_result, job_description = dt.start_job_on_jenkins(
410 job_name=job_name,
411 job_parameters=job_parameters,
412 verbose=True)
413 assert job_result == 'SUCCESS', job_description
414
415 def test_delete_node_process(self,
416 remove_node_from_reclass,
417 drivetrain_actions):
418 dt = drivetrain_actions
419
420 job_name = "ceph-remove-node"
421 job_parameters = {
422 'HOST': 'xtra*',
423 'USE_UPMAP': True
424 }
425 job_result, job_description = dt.start_job_on_jenkins(
426 job_name=job_name,
427 job_parameters=job_parameters,
428 verbose=True)
429 assert job_result == 'SUCCESS', job_description
430
431
PGlazovf9d5d232021-07-02 12:34:18 +0400432@pytest.mark.usefixtures("add_xtra_node_to_salt",
433 "wa_prod36167")
Hanna Arhipova54fec802020-10-30 12:45:46 +0200434class TestCephMgr(object):
435 def test_add_node(self):
436 pass
437
438 def test_delete_node(self):
439 pass
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300440
441
442def build_node_config(node=''):
443 """
444
445 :param node: [osd, mon, rgw, mgr]
446 :return: string in yaml format
447 """
448
449 class _Template(Template):
450 delimiter = "#"
451 idpattern = '[A-Z]*'
452
453 template = _Template("""
454 parameters:
455 reclass:
456 storage:
457 node:
458 ceph_#NODE_node04:
459 name: ${_param:ceph_#NODE_node04_hostname}
460 domain: ${_param:cluster_domain}
461 classes:
462 - cluster.${_param:cluster_name}.ceph.#NODE
463 - environment.${_param:cluster_name}.linux_network_interface
464 - environment.${_param:cluster_name}.overrides
465 params:
466 salt_master_host: ${_param:reclass_config_master}
467 linux_system_codename: ${_param:ceph_#NODE_system_codename}
468 single_address: ${_param:ceph_#NODE_node04_address}
469 #OSDSETTINGS
470 #MONSETTINGS
471 #RGWSETTINGS
472 linux_network_interfaces:
473 br_ctl:
474 address: ${_param:ceph_#NODE_node04_address}
475 enabled: True
476 name_servers:
477 - ${_param:dns_server01}
478 - ${_param:dns_server02}
479 netmask: ${_param:control_network_netmask}
480 proto: static
481 require_interfaces: ['ens4']
482 type: bridge
483 use_interfaces: ['ens4']
484 ens3:
485 enabled: True
486 name: ens3
487 proto: dhcp
488 type: eth
489 ens4:
490 enabled: True
491 ipflush_onchange: True
492 name: ens4
493 proto: manual
494 type: eth
495 """)
496
497 data = {
498 'NODE': node,
499 'OSDSETTINGS': '',
500 'MONSETTINGS': '',
501 'RGWSETTINGS': '',
502
503 }
504 # # ------------------OSD specific settings ----------
505 if node == 'osd':
506 data['OSDSETTINGS'] = """
507 ceph_crush_parent: rack02
508 """
509 # # ------------------MON specific settings ----------
510 if node == 'mon':
511 data['MONSETTINGS'] = """
512 ceph_backup_time_hour: ${_param:ceph_mon_node04_ceph_backup_hour}
513 ceph_backup_time_minute: ${_param:ceph_mon_node04_ceph_backup_minute}
514 ceph_public_address: ${_param:ceph_mon_node04_public_address}
515 keepalived_vip_priority: 104
516 """ # noqa: E501
517 # # ------------------RGW specific settings -----------
518 if node == 'rgw':
519 data['RGWSETTINGS'] = """
520 ceph_public_address: ${_param:ceph_rgw_node04_public_address}
521 keepalived_vip_priority: 104
522 """ # noqa: E501
523
524 yaml_config = template.substitute(data)
525
526 return yaml_config