blob: 55791ca9f52e6312e369747a8ec3ba6627fec613 [file] [log] [blame]
Hanna Arhipovac2cb6a52021-10-20 14:30:05 +03001import time
2
Hanna Arhipova54fec802020-10-30 12:45:46 +02003import pytest
4
5from tcp_tests import logger
Hanna Arhipova5b0caa52021-07-09 20:23:28 +03006from string import Template
Hanna Arhipova54fec802020-10-30 12:45:46 +02007
8LOG = logger.logger
9
10
Hanna Arhipovae92b66b2021-04-15 19:56:30 +030011@pytest.fixture(scope='session')
Hanna Arhipovad60430e2021-02-12 18:23:47 +020012def add_xtra_node_to_salt(salt_actions, underlay_actions,
13 config, reclass_actions):
Hanna Arhipova54fec802020-10-30 12:45:46 +020014 """
15
16 :return:
17 """
18 LOG.info("Executing pytest SETUP from add_xtra_node_to_salt fixture")
19 xtra_node = [node['node_name'] for node in config.underlay.ssh
20 if 'xtra' in node.get('node_name')][0]
21
22 cfg_node = [node['node_name'] for node in config.underlay.ssh
23 if 'salt_master' in node.get('roles')][0]
24
Hanna Arhipova5b0caa52021-07-09 20:23:28 +030025 # salt_actions.enforce_state("I@salt:master", "reclass")
Hanna Arhipovae92b66b2021-04-15 19:56:30 +030026
Hanna Arhipova54fec802020-10-30 12:45:46 +020027 underlay_actions.check_call(
28 "salt-key -a {node} --include-all -y".format(node=xtra_node),
29 node_name=cfg_node,
30 raise_on_err=False)
31 # Need to restart salt-minion service after accepting it in Salt Master
Hanna Arhipovac2cb6a52021-10-20 14:30:05 +030032 underlay_actions.check_call(
33 "systemctl restart salt-minion",
34 node_name=xtra_node,
35 raise_on_err=False)
36 time.sleep(15)
Hanna Arhipova5b0caa52021-07-09 20:23:28 +030037 # salt_actions.enforce_state("xtra*", "linux")
38 # salt_actions.enforce_state("xtra*", "openssh")
Hanna Arhipovad60430e2021-02-12 18:23:47 +020039
Hanna Arhipova54fec802020-10-30 12:45:46 +020040 yield
41
42 # LOG.info("Executing pytest TEARDOWN from add_xtra_node_to_salt fixture")
43 # underlay_actions.check_call(
44 # "salt-key -r {node} --include-all -y".format(node=node),
45 # node_name=cfg_node,
46 # raise_on_err=False)
47
48
Hanna Arhipovae92b66b2021-04-15 19:56:30 +030049@pytest.fixture(scope='session')
50def wa_prod36167(reclass_actions):
51 reclass_actions.delete_class("system.salt.control.virt",
Hanna Arhipova3ea92b22021-07-01 15:44:15 +030052 "cluster/*/infra/kvm.yml")
Hanna Arhipovae92b66b2021-04-15 19:56:30 +030053
54
PGlazovf9d5d232021-07-02 12:34:18 +040055@pytest.mark.usefixtures("add_xtra_node_to_salt",
56 "wa_prod36167")
Hanna Arhipova54fec802020-10-30 12:45:46 +020057class TestCephOsd(object):
58
Hanna Arhipova5b0caa52021-07-09 20:23:28 +030059 add_osd_ceph_init_yml = """
60 parameters:
61 _param:
62 ceph_osd_node04_hostname: xtra
63 ceph_osd_node04_address: 10.6.0.205
64 ceph_osd_system_codename: xenial
65 linux:
66 network:
67 host:
68 xtra:
69 address: ${_param:ceph_osd_node04_address}
70 names:
71 - ${_param:ceph_osd_node04_hostname}
72 - ${_param:ceph_osd_node04_hostname}.${_param:cluster_domain}
73 """
74
75 add_osd_config_init_yml = """
76 parameters:
77 reclass:
78 storage:
79 node:
80 ceph_osd_node04:
81 name: ${_param:ceph_osd_node04_hostname}
82 domain: ${_param:cluster_domain}
83 classes:
84 - cluster.${_param:cluster_name}.ceph.osd
85 - environment.heat-cicd-queens-dvr-sl.linux_network_interface
86 - environment.heat-cicd-queens-dvr-sl.overrides
87 params:
88 salt_master_host: ${_param:reclass_config_master}
89 linux_system_codename: ${_param:ceph_osd_system_codename}
90 single_address: ${_param:ceph_osd_node04_address}
91 ceph_crush_parent: rack02
92 linux_network_interfaces:
93 br_ctl:
94 address: ${_param:ceph_osd_node04_address}
95 enabled: True
96 name_servers:
97 - ${_param:dns_server01}
98 - ${_param:dns_server02}
99 netmask: ${_param:control_network_netmask}
100 proto: static
101 require_interfaces: ['ens4']
102 type: bridge
103 use_interfaces: ['ens4']
104 ens3:
105 enabled: True
106 name: ens3
107 proto: dhcp
108 type: eth
109 ens4:
110 enabled: True
111 ipflush_onchange: True
112 name: ens4
113 proto: manual
114 type: eth
115 """
116
Hanna Arhipova54fec802020-10-30 12:45:46 +0200117 @pytest.fixture
118 def describe_node_in_reclass(self,
Hanna Arhipovad33353e2021-02-15 23:14:51 +0200119 reclass_actions,
120 salt_actions):
Hanna Arhipova54fec802020-10-30 12:45:46 +0200121 LOG.info("Executing pytest SETUP "
122 "from describe_node_in_reclass fixture")
123 reclass = reclass_actions
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300124
Hanna Arhipova54fec802020-10-30 12:45:46 +0200125 # ---- cluster/*/ceph/init.yml ---------------
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300126 reclass.merge_context(yaml_context=self.add_osd_ceph_init_yml,
Hanna Arhipovad33353e2021-02-15 23:14:51 +0200127 short_path="cluster/*/ceph/init.yml")
Hanna Arhipova54fec802020-10-30 12:45:46 +0200128
129 # ------- cluster/infra/config/init.yml -----------
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300130 reclass.merge_context(yaml_context=build_node_config('osd'),
131 short_path="cluster/*/infra/config/nodes.yml")
132
133 # salt_actions.run_state("*", "saltutil.refresh_pillar")
134 # salt_actions.enforce_state("I@salt:master", "reclass")
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200135
136 @pytest.fixture
137 def remove_node_from_reclass(self,
138 reclass_actions):
139 reclass = reclass_actions
140
141 reclass.delete_key(
142 key="parameters.reclass.storage.node.ceph_osd_node04",
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300143 short_path="cluster/*/infra/config/nodes.yml"
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200144 )
145 reclass.delete_key(
146 key="parameters.linux.network.host.xtra",
147 short_path="cluster/*/ceph/init.yml"
148 )
Hanna Arhipova54fec802020-10-30 12:45:46 +0200149
150 def test_add_node_process(self, describe_node_in_reclass,
151 drivetrain_actions):
152 """
153 https://docs.mirantis.com/mcp/q4-18/mcp-operations-guide/openstack-operations/ceph-operations/manage-nodes/add-osd-nodes.html
154 :param describe_node_in_reclass:
155 :param drivetrain_actions:
156 :return:
157 test took about 20 min
158 """
159 dt = drivetrain_actions
PGlazov89ba9182021-02-19 13:36:46 +0400160 # Workaround for PROD-36132
161 job_name = "ceph-add-node"
Hanna Arhipova54fec802020-10-30 12:45:46 +0200162 job_parameters = {
163 'HOST': 'xtra*',
PGlazov89ba9182021-02-19 13:36:46 +0400164 'OSD_ONLY': False
Hanna Arhipova54fec802020-10-30 12:45:46 +0200165 }
Hanna Arhipova508f6532021-01-27 15:52:45 +0200166 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipova54fec802020-10-30 12:45:46 +0200167 job_name=job_name,
168 job_parameters=job_parameters,
169 verbose=True)
Hanna Arhipova508f6532021-01-27 15:52:45 +0200170 assert job_result == 'SUCCESS', job_description
Hanna Arhipova54fec802020-10-30 12:45:46 +0200171
172 def test_added_node(self):
173 # root@osd001:~# ceph osd tree in
174 # ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
175 # -1 0.18585 root default
176 # -3 0.04646 host osd001
177 # 0 hdd 0.01549 osd.0 up 1.00000 1.00000
178 # 1 hdd 0.01549 osd.1 up 1.00000 1.00000
179 # 2 hdd 0.01549 osd.2 up 1.00000 1.00000
180 # -5 0.04646 host osd002
181 # 3 hdd 0.01549 osd.3 up 1.00000 1.00000
182 # 5 hdd 0.01549 osd.5 up 1.00000 1.00000
183 # 6 hdd 0.01549 osd.6 up 1.00000 1.00000
184 # -7 0.04646 host osd003
185 # 4 hdd 0.01549 osd.4 up 1.00000 1.00000
186 # 7 hdd 0.01549 osd.7 up 1.00000 1.00000
187 # 8 hdd 0.01549 osd.8 up 1.00000 1.00000
188 # -9 0.04646 host xtra
189 # 9 hdd 0.01549 osd.9 up 1.00000 1.00000
190 # 10 hdd 0.01549 osd.10 up 1.00000 1.00000
191 # 11 hdd 0.01549 osd.11 up 1.00000 1.00000
192 pass
193
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200194 def test_delete_node_process(self,
195 remove_node_from_reclass,
196 drivetrain_actions):
Hanna Arhipova54fec802020-10-30 12:45:46 +0200197 dt = drivetrain_actions
198
199 job_name = "ceph-remove-node"
200 job_parameters = {
201 'HOST': 'xtra*',
PGlazov89ba9182021-02-19 13:36:46 +0400202 'OSD': '*'
Hanna Arhipova54fec802020-10-30 12:45:46 +0200203 }
Hanna Arhipova508f6532021-01-27 15:52:45 +0200204 job_result, job_description = dt.start_job_on_jenkins(
Hanna Arhipova54fec802020-10-30 12:45:46 +0200205 job_name=job_name,
206 job_parameters=job_parameters,
207 verbose=True)
Hanna Arhipova508f6532021-01-27 15:52:45 +0200208 assert job_result == 'SUCCESS', job_description
Hanna Arhipova54fec802020-10-30 12:45:46 +0200209
210
PGlazovf9d5d232021-07-02 12:34:18 +0400211@pytest.mark.usefixtures("add_xtra_node_to_salt",
212 "wa_prod36167")
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200213class TestCephMon(object):
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300214 add_mon_ceph_init_yml = """
215 parameters:
216 _param:
217 ceph_mon_node04_hostname: xtra
218 ceph_mon_node04_address: 10.6.0.205
219 ceph_mon_node04_ceph_public_address: 10.166.49.209
220 ceph_mon_node04_ceph_backup_hour: 4
221 ceph_mon_node04_ceph_backup_minute: 0
222 linux:
223 network:
224 host:
225 xtra:
226 address: ${_param:ceph_mon_node04_address}
227 names:
228 - ${_param:ceph_mon_node04_hostname}
229 - ${_param:ceph_mon_node04_hostname}.${_param:cluster_domain}
230 """
231
232 add_mon_ceph_common_yml = """
233 parameters:
234 ceph:
235 common:
236 members:
237 - name: ${_param:ceph_mon_node04_hostname}
238 host: ${_param:ceph_mon_node04_address}
239 """
240
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200241 @pytest.fixture
242 def describe_node_in_reclass(self,
243 reclass_actions, salt_actions):
244 LOG.info("Executing pytest SETUP "
245 "from describe_node_in_reclass fixture")
246 reclass = reclass_actions
247 # ---- cluster/*/ceph/init.yml --------------
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300248 reclass.merge_context(yaml_context=self.add_mon_ceph_init_yml,
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200249 short_path="cluster/*/ceph/init.yml")
250
251 # ------- cluster/infra/config/init.yml -----------
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300252 reclass.merge_context(yaml_context=self.add_mon_ceph_common_yml,
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200253 short_path="cluster/*/ceph/common.yml")
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300254 reclass.merge_context(yaml_context=build_node_config('mon'),
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200255 short_path="cluster/*/infra/config/nodes.yml")
256
257 # ------- define settings for new mon node in KVM cluster -----------
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300258 # Commented because we don't add VM machine, we add already
259 # deployed node
260 # reclass.merge_context(yaml_context=add_mon_infra_kvm_yml,
261 # short_path="cluster/*/infra/kvm.yml")
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200262
263 salt_actions.run_state("*", "saltutil.refresh_pillar")
264
265 @pytest.fixture
266 def remove_node_from_reclass(self,
267 reclass_actions, salt_actions):
268 LOG.info("Executing pytest SETUP "
269 "from remove_node_from_reclass fixture")
270 reclass = reclass_actions
271 reclass.delete_key(
272 key="parameters.reclass.storage.node.ceph_mon_node04",
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300273 short_path="cluster/*/infra/config/nodes.yml")
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200274 reclass.delete_key(
275 key="parameters.salt.control.cluster.internal.node.cmn04",
276 short_path="cluster/*/infra/kvm.yml"
277 )
278 reclass.delete_key(
279 key="parameters.linux.network.host.xtra",
280 short_path="cluster/*/ceph/init.yml"
281 )
282
283 def test_add_node_process(self,
284 drivetrain_actions,
285 describe_node_in_reclass):
Hanna Arhipovae92b66b2021-04-15 19:56:30 +0300286 """
287 https://docs.mirantis.com/mcp/q4-18/mcp-operations-guide/openstack-operations/ceph-operations/manage-nodes/add-mon-nodes.html
288 :param drivetrain_actions:
289 :param describe_node_in_reclass:
290 :return:
291 """
Hanna Arhipovad60430e2021-02-12 18:23:47 +0200292 dt = drivetrain_actions
293
294 job_name = "ceph-add-node"
295 job_parameters = {
296 'HOST': 'xtra*',
297 'USE_UPMAP': True
298 }
299 job_result, job_description = dt.start_job_on_jenkins(
300 job_name=job_name,
301 job_parameters=job_parameters,
302 verbose=True)
303 assert job_result == 'SUCCESS', job_description
304
305 def test_delete_node_process(self,
306 remove_node_from_reclass,
307 drivetrain_actions):
308 dt = drivetrain_actions
309
310 job_name = "ceph-remove-node"
311 job_parameters = {
312 'HOST': 'xtra*',
313 'USE_UPMAP': True
314 }
315 job_result, job_description = dt.start_job_on_jenkins(
316 job_name=job_name,
317 job_parameters=job_parameters,
318 verbose=True)
319 assert job_result == 'SUCCESS', job_description
Hanna Arhipova54fec802020-10-30 12:45:46 +0200320
321
PGlazovf9d5d232021-07-02 12:34:18 +0400322@pytest.mark.usefixtures("add_xtra_node_to_salt",
323 "wa_prod36167")
Hanna Arhipovae92b66b2021-04-15 19:56:30 +0300324class TestCephRgw(object):
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300325 add_rgw_ceph_init_yml = """
326 parameters:
327 _param:
328 ceph_rgw_node04_hostname: xtra
329 ceph_rgw_node04_address: 10.6.0.205
330 ceph_rgw_node04_ceph_public_address: 10.166.49.209
331 linux:
332 network:
333 host:
334 rgw04:
335 address: ${_param:ceph_rgw_node04_address}
336 names:
337 - ${_param:ceph_rgw_node04_hostname}
338 - ${_param:ceph_rgw_node04_hostname}.${_param:cluster_domain}
339 """ # noqa: E501
340
341 add_rgw_ceph_rgw_yml = """
342 parameters:
343 _param:
344 cluster_node04_hostname: ${_param:ceph_rgw_node04_hostname}
345 cluster_node04_address: ${_param:ceph_rgw_node04_address}
346 ceph:
347 common:
348 keyring:
349 rgw.xtra:
350 caps:
351 mon: "allow rw"
352 osd: "allow rwx"
353 haproxy:
354 proxy:
355 listen:
356 radosgw:
357 servers:
358 - name: ${_param:cluster_node04_hostname}
359 host: ${_param:cluster_node04_address}
360 port: ${_param:haproxy_radosgw_source_port}
361 params: check
362 """
363
Hanna Arhipovae92b66b2021-04-15 19:56:30 +0300364 @pytest.fixture
365 def describe_node_in_reclass(self,
366 reclass_actions, salt_actions):
367 LOG.info("Executing pytest SETUP "
368 "from describe_node_in_reclass fixture")
369 reclass = reclass_actions
370 # ---- cluster/*/ceph/init.yml --------------
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300371 reclass.merge_context(yaml_context=self.add_rgw_ceph_init_yml,
Hanna Arhipovae92b66b2021-04-15 19:56:30 +0300372 short_path="cluster/*/ceph/init.yml")
373
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300374 reclass.merge_context(yaml_context=self.add_rgw_ceph_rgw_yml,
Hanna Arhipovae92b66b2021-04-15 19:56:30 +0300375 short_path="cluster/*/ceph/rgw.yml")
376
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300377 reclass.merge_context(yaml_context=build_node_config('rgw'),
378 short_path="cluster/*/infra/config/nodes.yml")
Hanna Arhipovae92b66b2021-04-15 19:56:30 +0300379
380 salt_actions.run_state("*", "saltutil.refresh_pillar")
381
382 @pytest.fixture
383 def remove_node_from_reclass(self,
384 reclass_actions, salt_actions):
385 LOG.info("Executing pytest SETUP "
386 "from remove_node_from_reclass fixture")
387 # reclass = reclass_actions
388 # reclass.delete_key(
389 # key="parameters.reclass.storage.node.ceph_rgw_node04",
390 # short_path="cluster/*/infra/config/init.yml")
391 # reclass.delete_key(
392 # key="parameters.linux.network.host.xtra",
393 # short_path="cluster/*/ceph/init.yml"
394 # )
395
396 def test_add_node_process(self,
397 drivetrain_actions,
398 describe_node_in_reclass):
399 """
400 https://docs.mirantis.com/mcp/q4-18/mcp-operations-guide/openstack-operations/ceph-operations/manage-nodes/add-rgw-nodes.html
401 :param drivetrain_actions:
402 :param describe_node_in_reclass:
403 :return:
404 """
405 dt = drivetrain_actions
406
407 job_name = "ceph-add-node"
408 job_parameters = {
409 'HOST': 'xtra*',
410 'USE_UPMAP': True
411 }
412 job_result, job_description = dt.start_job_on_jenkins(
413 job_name=job_name,
414 job_parameters=job_parameters,
415 verbose=True)
416 assert job_result == 'SUCCESS', job_description
417
418 def test_delete_node_process(self,
419 remove_node_from_reclass,
420 drivetrain_actions):
421 dt = drivetrain_actions
422
423 job_name = "ceph-remove-node"
424 job_parameters = {
425 'HOST': 'xtra*',
426 'USE_UPMAP': True
427 }
428 job_result, job_description = dt.start_job_on_jenkins(
429 job_name=job_name,
430 job_parameters=job_parameters,
431 verbose=True)
432 assert job_result == 'SUCCESS', job_description
433
434
PGlazovf9d5d232021-07-02 12:34:18 +0400435@pytest.mark.usefixtures("add_xtra_node_to_salt",
436 "wa_prod36167")
Hanna Arhipova54fec802020-10-30 12:45:46 +0200437class TestCephMgr(object):
438 def test_add_node(self):
439 pass
440
441 def test_delete_node(self):
442 pass
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300443
444
445def build_node_config(node=''):
446 """
447
448 :param node: [osd, mon, rgw, mgr]
449 :return: string in yaml format
450 """
451
452 class _Template(Template):
453 delimiter = "#"
454 idpattern = '[A-Z]*'
455
456 template = _Template("""
457 parameters:
458 reclass:
459 storage:
460 node:
461 ceph_#NODE_node04:
462 name: ${_param:ceph_#NODE_node04_hostname}
463 domain: ${_param:cluster_domain}
464 classes:
465 - cluster.${_param:cluster_name}.ceph.#NODE
466 - environment.${_param:cluster_name}.linux_network_interface
467 - environment.${_param:cluster_name}.overrides
468 params:
469 salt_master_host: ${_param:reclass_config_master}
470 linux_system_codename: ${_param:ceph_#NODE_system_codename}
471 single_address: ${_param:ceph_#NODE_node04_address}
472 #OSDSETTINGS
473 #MONSETTINGS
474 #RGWSETTINGS
Hanna Arhipovac2cb6a52021-10-20 14:30:05 +0300475 #MGRSETTINGS
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300476 linux_network_interfaces:
477 br_ctl:
478 address: ${_param:ceph_#NODE_node04_address}
479 enabled: True
480 name_servers:
481 - ${_param:dns_server01}
482 - ${_param:dns_server02}
483 netmask: ${_param:control_network_netmask}
484 proto: static
485 require_interfaces: ['ens4']
486 type: bridge
487 use_interfaces: ['ens4']
488 ens3:
489 enabled: True
490 name: ens3
491 proto: dhcp
492 type: eth
493 ens4:
494 enabled: True
495 ipflush_onchange: True
496 name: ens4
497 proto: manual
498 type: eth
499 """)
500
501 data = {
502 'NODE': node,
503 'OSDSETTINGS': '',
504 'MONSETTINGS': '',
505 'RGWSETTINGS': '',
Hanna Arhipovac2cb6a52021-10-20 14:30:05 +0300506 'MGRSETTINGS': '',
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300507
508 }
509 # # ------------------OSD specific settings ----------
510 if node == 'osd':
511 data['OSDSETTINGS'] = """
512 ceph_crush_parent: rack02
513 """
514 # # ------------------MON specific settings ----------
515 if node == 'mon':
516 data['MONSETTINGS'] = """
517 ceph_backup_time_hour: ${_param:ceph_mon_node04_ceph_backup_hour}
518 ceph_backup_time_minute: ${_param:ceph_mon_node04_ceph_backup_minute}
PGlazov59319492021-07-21 15:28:49 +0400519 ceph_public_address: ${_param:ceph_mon_node04_ceph_public_address}
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300520 keepalived_vip_priority: 104
521 """ # noqa: E501
522 # # ------------------RGW specific settings -----------
523 if node == 'rgw':
524 data['RGWSETTINGS'] = """
PGlazov76ea9192021-07-15 15:11:29 +0400525 ceph_public_address: ${_param:ceph_rgw_node04_ceph_public_address}
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300526 keepalived_vip_priority: 104
527 """ # noqa: E501
528
Hanna Arhipovac2cb6a52021-10-20 14:30:05 +0300529 # # ------------------MGR specific settings -----------
530 if node == 'mgr':
531 data['MGRSETTINGS'] = ""
532
Hanna Arhipova5b0caa52021-07-09 20:23:28 +0300533 yaml_config = template.substitute(data)
534
535 return yaml_config