From ae410f64de02100eb56d85e0a876b21e1bef7f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20Jens=C3=A5s?= Date: Fri, 21 Jan 2022 22:41:45 +0100 Subject: [PATCH] node export provisioned - get role_data from stack Since change: I1efecdcd7afa6af3e6b4b26f4435198836db535f we store the THT Jinja2 input files in the stack output. Make the --roles-file option optional for overcloud node export provisioned commend. Use the value from the stack if --roles-file not provided by the user. Change-Id: I9e2a6d6d45b86da333658a73179607b2623b5cc7 (cherry picked from commit e3c66d6a2065a0be973dd014973717524bb1e456) --- .../v1/overcloud_node/test_overcloud_node.py | 25 ++++++++++------- tripleoclient/v1/overcloud_node.py | 27 ++++++++++++++----- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py b/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py index ab3ab85d7..4ff4e2f2a 100644 --- a/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py +++ b/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py @@ -747,6 +747,13 @@ class TestExtractProvisionedNode(test_utils.TestCommand): self.cmd = overcloud_node.ExtractProvisionedNode(self.app, None) + roles_data = [ + {'name': 'Controller', + 'default_route_networks': ['External'], + 'networks_skip_config': ['Tenant']}, + {'name': 'Compute'} + ] + self.stack_dict = { 'parameters': { 'ComputeHostnameFormat': '%stackname%-novacompute-%index%', @@ -755,6 +762,12 @@ class TestExtractProvisionedNode(test_utils.TestCommand): 'ControllerNetworkConfigTemplate': 'templates/controller.j2' }, 'outputs': [{ + 'output_key': 'TripleoHeatTemplatesJinja2RenderingDataSources', + 'output_value': { + 'roles_data': roles_data, + 'networks_data': {} + } + }, { 'output_key': 'AnsibleHostVarsMap', 'output_value': { 'Compute': [ @@ -885,12 +898,6 @@ class TestExtractProvisionedNode(test_utils.TestCommand): mode='w', delete=False, suffix='.yaml') self.extract_file.close() - roles_data = [ - {'name': 'Controller', - 'default_route_networks': ['External'], - 'networks_skip_config': ['Tenant']}, - {'name': 'Compute'} - ] self.roles_file = tempfile.NamedTemporaryFile( mode='w', delete=False, suffix='.yaml') self.roles_file.write(yaml.safe_dump(roles_data)) @@ -906,12 +913,10 @@ class TestExtractProvisionedNode(test_utils.TestCommand): self.baremetal.node.list.return_value = self.nodes - argslist = ['--roles-file', self.roles_file.name, - '--output', self.extract_file.name, + argslist = ['--output', self.extract_file.name, '--yes'] self.app.command_options = argslist - verifylist = [('roles_file', self.roles_file.name), - ('output', self.extract_file.name), + verifylist = [('output', self.extract_file.name), ('yes', True)] parsed_args = self.check_parser(self.cmd, diff --git a/tripleoclient/v1/overcloud_node.py b/tripleoclient/v1/overcloud_node.py index b55a84296..5078d7f1f 100644 --- a/tripleoclient/v1/overcloud_node.py +++ b/tripleoclient/v1/overcloud_node.py @@ -494,7 +494,7 @@ class ExtractProvisionedNode(command.Command): help=_('Skip yes/no prompt for existing files ' '(assume yes).')) parser.add_argument('--roles-file', '-r', dest='roles_file', - required=True, + required=False, help=_('Role data definition file')) return parser @@ -525,15 +525,28 @@ class ExtractProvisionedNode(command.Command): def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) - roles_file = os.path.abspath(parsed_args.roles_file) - with open(roles_file, 'r') as fd: - role_data = yaml.safe_load(fd.read()) - # Convert role_data to a dict - role_data = {x['name']: x for x in role_data} - self._setup_clients() stack = oooutils.get_stack(self.orchestration_client, parsed_args.stack) + tht_j2_sources = oooutils.get_stack_output_item( + stack, 'TripleoHeatTemplatesJinja2RenderingDataSources') or {} + + if parsed_args.roles_file: + roles_file = os.path.abspath(parsed_args.roles_file) + with open(roles_file, 'r') as fd: + role_data = yaml.safe_load(fd.read()) + else: + role_data = tht_j2_sources.get('roles_data') + if role_data is None: + raise oscexc.CommandError( + "Unable to extract. Role data not available in {} stack " + "output. Please provide the roles data for the deployed " + "stack by setting the --roles-data argument.".format( + parsed_args.stack)) + + # Convert role_data to a dict + role_data = {x['name']: x for x in role_data} + host_vars = oooutils.get_stack_output_item( stack, 'AnsibleHostVarsMap') or {} role_net_ip_map = oooutils.get_stack_output_item(