diff --git a/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py b/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py index f277cde12..902672683 100644 --- a/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py +++ b/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py @@ -1247,3 +1247,133 @@ class TestExtractProvisionedNode(test_utils.TestCommand): self.cmd.take_action(parsed_args) result = self.cmd.app.stdout.make_string() self.assertIsNone(yaml.safe_load(result)) + + @mock.patch('tripleoclient.utils.run_command_and_log', autospec=True) + def test_extract_no_network_isolation(self, mock_run_cmd): + controller_ips = ['192.168.25.21', '192.168.25.25', '192.168.25.28'] + compute_ips = ['192.168.26.11'] + roles_data = [ + {'name': 'Controller', + 'default_route_networks': ['External'], + 'networks_skip_config': ['Tenant']}, + {'name': 'Compute'} + ] + networks_data = [] + stack_dict = { + 'parameters': { + 'ComputeHostnameFormat': '%stackname%-novacompute-%index%', + 'ControllerHostnameFormat': '%stackname%-controller-%index%', + }, + 'outputs': [{ + 'output_key': 'TripleoHeatTemplatesJinja2RenderingDataSources', + 'output_value': { + 'roles_data': roles_data, + 'networks_data': networks_data, + } + }, { + 'output_key': 'AnsibleHostVarsMap', + 'output_value': { + 'Compute': [ + 'overcloud-novacompute-0' + ], + 'Controller': [ + 'overcloud-controller-0', + 'overcloud-controller-1', + 'overcloud-controller-2' + ], + } + }, { + 'output_key': 'RoleNetIpMap', + 'output_value': { + 'Compute': { + 'ctlplane': compute_ips, + 'internal_api': compute_ips, + }, + 'Controller': { + 'ctlplane': controller_ips, + 'external': controller_ips, + 'internal_api': controller_ips, + } + } + }] + } + + stack = mock.Mock() + stack.stack_name = 'overcloud' + stack.to_dict.return_value = stack_dict + stack.environment.return_value = {} + self.orchestration.stacks.get.return_value = stack + self.baremetal.node.list.return_value = self.nodes + self.network.find_network.side_effect = [ + self.ctlplane_net, None, + # controller-0 + self.ctlplane_net, None, None, + # controller-1 + self.ctlplane_net, None, None, + # controller-2 + self.ctlplane_net, None, None, + ] + self.network.get_subnet.side_effect = [ + # compute-0 + self.ctlplane_a, self.ctlplane_b, + # controller-0 + self.ctlplane_a, + # controller-1 + self.ctlplane_a, + # controller-2 + self.ctlplane_a, + ] + mock_run_cmd.return_value = 0 + + argslist = ['--output', self.extract_file.name, + '--yes'] + self.app.command_options = argslist + verifylist = [('output', self.extract_file.name), + ('yes', True)] + parsed_args = self.check_parser(self.cmd, + argslist, verifylist) + self.cmd.take_action(parsed_args) + + result = self.cmd.app.stdout.make_string() + self.assertEqual([{ + 'name': 'Compute', + 'count': 1, + 'hostname_format': '%stackname%-novacompute-%index%', + 'defaults': { + 'network_config': {'network_config_update': False, + 'physical_bridge_name': 'br-ex', + 'public_interface_name': 'nic1', + 'template': None}, + 'networks': [{'network': 'ctlplane', 'vif': True}] + }, + 'instances': [{ + 'hostname': 'overcloud-novacompute-0', + 'name': 'bm-3-uuid', + 'resource_class': 'compute', + }], + }, { + 'name': 'Controller', + 'count': 3, + 'hostname_format': '%stackname%-controller-%index%', + 'defaults': { + 'network_config': {'default_route_network': ['External'], + 'network_config_update': False, + 'networks_skip_config': ['Tenant'], + 'physical_bridge_name': 'br-ex', + 'public_interface_name': 'nic1', + 'template': None}, + 'networks': [{'network': 'ctlplane', 'vif': True}], + }, + 'instances': [{ + 'hostname': 'overcloud-controller-0', + 'name': 'bm-0-uuid', + 'resource_class': 'controller', + }, { + 'hostname': 'overcloud-controller-1', + 'name': 'bm-1-uuid', + 'resource_class': 'controller', + }, { + 'hostname': 'overcloud-controller-2', + 'name': 'bm-2-uuid', + }], + }], yaml.safe_load(result)) diff --git a/tripleoclient/v1/overcloud_node.py b/tripleoclient/v1/overcloud_node.py index 55d038111..9b3f83b23 100644 --- a/tripleoclient/v1/overcloud_node.py +++ b/tripleoclient/v1/overcloud_node.py @@ -508,7 +508,7 @@ class ExtractProvisionedNode(command.Command): '"$HOME/overcloud-deploy/"')) return parser - def _get_subnet_from_net_name_and_ip(self, net_name, ip_addr): + def _get_network_from_net_name(self, net_name): try: network = self.network_client.find_network(net_name) except openstack_exc.DuplicateResource: @@ -516,10 +516,9 @@ class ExtractProvisionedNode(command.Command): "Unable to extract role networks. Duplicate network resources " "with name %s detected." % net_name) - if network is None: - raise oscexc.CommandError("Unable to extract role networks. " - "Network %s not found." % net_name) + return network + def _get_subnet_from_ip(self, network, ip_addr): for subnet_id in network.subnet_ids: subnet = self.network_client.get_subnet(subnet_id) if (ipaddress.ip_address(ip_addr) @@ -530,7 +529,7 @@ class ExtractProvisionedNode(command.Command): raise oscexc.CommandError("Unable to extract role networks. Could not " "find subnet for IP address %(ip)s on " "network %(net)s." % {'ip': ip_addr, - 'net': net_name}) + 'net': network.name}) def _convert_heat_nic_conf_to_j2(self, stack, role_name, network_data, resource_registry, parsed_args): @@ -676,8 +675,14 @@ class ExtractProvisionedNode(command.Command): # Add networks to the role default section role_networks = defaults['networks'] = [] for net_name, ips in role_net_ip_map[role_name].items(): - subnet_name = self._get_subnet_from_net_name_and_ip(net_name, - ips[0]) + network = self._get_network_from_net_name(net_name) + # NOTE(hjensas): If network is not found (None) + # network-isolation is not enabled i.e ignore default + # network-data networks when not enabled. + if network is None: + continue + + subnet_name = self._get_subnet_from_ip(network, ips[0]) if net_name == constants.CTLPLANE_NET_NAME: role_networks.append({'network': net_name, 'vif': True})