From ec411b93297f2c841b03f7afb55a51bf2a0f0d0e Mon Sep 17 00:00:00 2001 From: John Fulton Date: Fri, 25 Feb 2022 19:10:34 +0000 Subject: [PATCH] Build standalone ceph_spec with Ansible Instead of calling the ceph_spec library directly from the python-tripleoclient call an ansible wrapper to it instead so that the library does not need to live in tripleo-common and bug 1961325 can be avoided. Closes-Bug: 1961325 Depends-On: I90f9e16476f5a986a87c9e678e455846b1d02bf9 Change-Id: I7514c95b5c3c24a82e8703556d4205b272270511 --- tripleoclient/tests/test_utils.py | 62 ------------------------------ tripleoclient/utils.py | 55 -------------------------- tripleoclient/v2/overcloud_ceph.py | 62 +++++++++++++++--------------- 3 files changed, 32 insertions(+), 147 deletions(-) diff --git a/tripleoclient/tests/test_utils.py b/tripleoclient/tests/test_utils.py index 356b50ed1..e093c8a5e 100644 --- a/tripleoclient/tests/test_utils.py +++ b/tripleoclient/tests/test_utils.py @@ -18,7 +18,6 @@ import ansible_runner import argparse import datetime import fixtures -import io import logging import openstack import os @@ -2732,67 +2731,6 @@ class TestGetHostsFromCephSpec(TestCase): self.assertEqual(expected, hosts) -class TestCephSpecStandalone(TestCase): - - def test_ceph_spec_standalone(self): - hostname = utils.get_hostname() - expected = [] - expected.append(yaml.safe_load(''' - addr: 192.168.122.252 - hostname: %s - labels: - - mon - - _admin - - osd - - mgr - service_type: host - ''' % hostname)) - - expected.append(yaml.safe_load(''' - placement: - hosts: - - %s - service_id: mon - service_name: mon - service_type: mon - ''' % hostname)) - - expected.append(yaml.safe_load(''' - placement: - hosts: - - %s - service_id: mgr - service_name: mgr - service_type: mgr - ''' % hostname)) - - expected.append(yaml.safe_load(''' - data_devices: - all: true - placement: - hosts: - - %s - service_id: default_drive_group - service_name: osd.default_drive_group - service_type: osd - ''' % hostname)) - - expected_spec = tempfile.NamedTemporaryFile() - for spec in expected: - with open(expected_spec.name, 'a') as f: - f.write('---\n') - f.write(yaml.safe_dump(spec)) - - my_spec = tempfile.NamedTemporaryFile() - utils.ceph_spec_standalone(my_spec.name, - mon_ip='192.168.122.252') - self.assertCountEqual( - list(io.open(expected_spec.name)), - list(io.open(my_spec.name))) - expected_spec.close() - my_spec.close() - - class TestProcessCephDaemons(TestCase): def test_process_ceph_daemons(self): diff --git a/tripleoclient/utils.py b/tripleoclient/utils.py index 96fd8b104..f269e8778 100644 --- a/tripleoclient/utils.py +++ b/tripleoclient/utils.py @@ -65,7 +65,6 @@ from tenacity.wait import wait_fixed from tripleo_common.image import image_uploader from tripleo_common.image import kolla_builder -from tripleo_common.utils import ceph_spec from tripleo_common.utils import plan as plan_utils from tripleo_common.utils import heat as tc_heat_utils from tripleo_common.utils import stack as stack_utils @@ -3410,60 +3409,6 @@ def get_host_groups_from_ceph_spec(ceph_spec_path, prefix='', return hosts -def ceph_spec_standalone(ceph_spec_path, mon_ip, osd_spec_path=None): - """Write ceph_spec_path file for a standalone ceph host - :param ceph_spec_path: the path to a ceph_spec.yaml file - :param mon_ip: the ip address of the ceph monitor - :param (osd_spec_path): path to an OSD spec file - :return None (writes file) - """ - specs = [] - labels = ['osd', '_admin', 'mon', 'mgr'] - host = get_hostname() - if osd_spec_path: - with open(os.path.abspath(osd_spec_path), 'r') as f: - try: - osd_spec = yaml.safe_load(f) - except yaml.YAMLError as exc: - raise oscexc.CommandError( - "Unable to parse '%s': %s" - % (os.path.abspath(osd_spec_path), exc)) - else: - osd_spec = { - 'data_devices': { - 'all': True - } - } - placement_pattern = '' - spec_dict = {} - - # create host spec - spec = ceph_spec.CephHostSpec('host', mon_ip, host, labels) - specs.append(spec.make_daemon_spec()) - - # add mon and mgr daemon specs - for svc in ['mon', 'mgr']: - d = ceph_spec.CephDaemonSpec(svc, svc, svc, [host], - placement_pattern, None, - spec_dict, labels) - specs.append(d.make_daemon_spec()) - - # add osd daemon spec - d = ceph_spec.CephDaemonSpec('osd', 'default_drive_group', - 'osd.default_drive_group', - [host], placement_pattern, - None, spec_dict, labels, - **osd_spec) - specs.append(d.make_daemon_spec()) - - # render - open(ceph_spec_path, 'w').close() # reset file - for spec in specs: - with open(ceph_spec_path, 'a') as f: - f.write('---\n') - f.write(yaml.dump(spec)) - - def standalone_ceph_inventory(working_dir): """return an ansible inventory for deployed ceph standalone :param working_dir: directory where inventory should be written diff --git a/tripleoclient/v2/overcloud_ceph.py b/tripleoclient/v2/overcloud_ceph.py index 562b2bef5..464cad2fc 100644 --- a/tripleoclient/v2/overcloud_ceph.py +++ b/tripleoclient/v2/overcloud_ceph.py @@ -899,22 +899,24 @@ class OvercloudCephSpec(command.Command): else: overwrite = True - if not parsed_args.standalone: - if not parsed_args.working_dir: - working_dir = oooutils.get_default_working_dir( - parsed_args.stack) - else: - working_dir = os.path.abspath(parsed_args.working_dir) - oooutils.makedirs(working_dir) + if not parsed_args.working_dir: + working_dir = oooutils.get_default_working_dir( + parsed_args.stack) + else: + working_dir = os.path.abspath(parsed_args.working_dir) + oooutils.makedirs(working_dir) + if parsed_args.standalone: + inventory = oooutils.standalone_ceph_inventory(working_dir) + else: inventory = os.path.join(working_dir, constants.TRIPLEO_STATIC_INVENTORY) - if not os.path.exists(inventory): - raise oscexc.CommandError( - "Inventory file not found in working directory: " - "%s. It should have been created by " - "'openstack overcloud node provision'." - % inventory) + if not os.path.exists(inventory): + raise oscexc.CommandError( + "Inventory file not found in working directory: " + "%s. It should have been created by " + "'openstack overcloud node provision'." + % inventory) # mandatory extra_vars are now set, add others conditionally extra_vars = { @@ -979,21 +981,21 @@ class OvercloudCephSpec(command.Command): extra_vars['crush_hierarchy_path'] = \ os.path.abspath(parsed_args.crush_hierarchy) - # Call the playbook to create the spec from baremetal and roles files - if not parsed_args.standalone: - with oooutils.TempDirs() as tmp: - oooutils.run_ansible_playbook( - playbook='cli-deployed-ceph.yaml', - inventory=inventory, - workdir=tmp, - playbook_dir=constants.ANSIBLE_TRIPLEO_PLAYBOOKS, - verbosity=oooutils.playbook_verbosity(self=self), - extra_vars=extra_vars, - reproduce_command=False, - tags='ceph_spec', - ) + if parsed_args.standalone: + spec_playbook = 'cli-standalone-ceph-spec.yaml' + tags = '' else: - # Create the spec directly - oooutils.ceph_spec_standalone(ceph_spec_path=output_path, - mon_ip=parsed_args.mon_ip, - osd_spec_path=parsed_args.osd_spec) + spec_playbook = 'cli-deployed-ceph.yaml' + tags = 'ceph_spec' + + with oooutils.TempDirs() as tmp: + oooutils.run_ansible_playbook( + playbook=spec_playbook, + inventory=inventory, + workdir=tmp, + playbook_dir=constants.ANSIBLE_TRIPLEO_PLAYBOOKS, + verbosity=oooutils.playbook_verbosity(self=self), + extra_vars=extra_vars, + reproduce_command=False, + tags=tags, + )