From c61719f8c4428feb1c2eb359e7b1f8d91ff868fa Mon Sep 17 00:00:00 2001 From: Ben Nemec Date: Fri, 27 Jul 2018 19:16:43 +0000 Subject: [PATCH] Add --physical_network option to build-nodes-json This will be needed for routed networks support. --- .../build_nodes_json.py | 21 ++++++++++++++----- .../tests/test_build_nodes_json.py | 16 +++++++++----- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/openstack_virtual_baremetal/build_nodes_json.py b/openstack_virtual_baremetal/build_nodes_json.py index f744080..4a23458 100755 --- a/openstack_virtual_baremetal/build_nodes_json.py +++ b/openstack_virtual_baremetal/build_nodes_json.py @@ -63,6 +63,10 @@ def _parse_args(): # TODO(dtantsur): change the default to ipmi when Ocata is not supported parser.add_argument('--driver', default='pxe_ipmitool', help='Bare metal driver to use') + parser.add_argument('--physical_network', + action='store_true', + help='Set the physical network attribute of baremetal ' + 'ports. (Requires Rocky or later Ironic)') args = parser.parse_args() return args @@ -116,7 +120,7 @@ def _get_ports(neutron, bmc_base, baremetal_base): def _build_nodes(nova, glance, bmc_ports, bm_ports, provision_net, - baremetal_base, undercloud_name, driver): + baremetal_base, undercloud_name, driver, physical_network): node_template = { 'pm_type': driver, 'mac': '', @@ -130,6 +134,10 @@ def _build_nodes(nova, glance, bmc_ports, bm_ports, provision_net, 'capabilities': 'boot_option:local', 'name': '', } + if physical_network: + node_template.pop('mac') + node_template.update( + {'ports': [{'address': '', 'physical_network': provision_net}]}) nodes = [] bmc_bm_pairs = [] @@ -143,9 +151,11 @@ def _build_nodes(nova, glance, bmc_ports, bm_ports, provision_net, node = dict(node_template) node['pm_addr'] = bmc_port['fixed_ips'][0]['ip_address'] bmc_bm_pairs.append((node['pm_addr'], baremetal.name)) - node['mac'] = [ - baremetal.addresses[provision_net][0]['OS-EXT-IPS-MAC:mac_addr'] - ] + mac = baremetal.addresses[provision_net][0]['OS-EXT-IPS-MAC:mac_addr'] + if physical_network: + node['ports'][0]['address'] = mac + else: + node['mac'] = [mac] if not cache.get(baremetal.flavor['id']): cache[baremetal.flavor['id']] = nova.flavors.get( baremetal.flavor['id']) @@ -280,7 +290,8 @@ def main(): extra_nodes, network_details) = _build_nodes(nova, glance, bmc_ports, bm_ports, provision_net, baremetal_base, - undercloud_name, args.driver) + undercloud_name, args.driver, + args.physical_network) _write_nodes(nodes, extra_nodes, network_details, args) _write_role_nodes(nodes, args) _write_pairs(bmc_bm_pairs) diff --git a/openstack_virtual_baremetal/tests/test_build_nodes_json.py b/openstack_virtual_baremetal/tests/test_build_nodes_json.py index adb02ec..a2d1efe 100644 --- a/openstack_virtual_baremetal/tests/test_build_nodes_json.py +++ b/openstack_virtual_baremetal/tests/test_build_nodes_json.py @@ -52,7 +52,8 @@ class TestBuildNodesJson(testtools.TestCase): mock_argv = ['build-nodes-json', '--env', 'foo.yaml', '--bmc_prefix', 'bmc-foo', '--baremetal_prefix', 'baremetal-foo', '--provision_net', 'provision-foo', '--nodes_json', - 'nodes-foo.json', '--driver', 'ipmi' + 'nodes-foo.json', '--driver', 'ipmi', + '--physical_network', ] with mock.patch.object(sys, 'argv', mock_argv): args = build_nodes_json._parse_args() @@ -62,6 +63,7 @@ class TestBuildNodesJson(testtools.TestCase): self.assertEqual('provision-foo', args.provision_net) self.assertEqual('nodes-foo.json', args.nodes_json) self.assertEqual('ipmi', args.driver) + self.assertTrue(args.physical_network) def test_get_names_no_env(self): args = mock.Mock() @@ -274,6 +276,7 @@ class TestBuildNodesJson(testtools.TestCase): {'fixed_ips': [{'ip_address': '1.1.1.2'}]} ] bm_ports = [{'device_id': '1'}, {'device_id': '2'}] + physical_network = False nova = mock.Mock() servers = [mock.Mock(), mock.Mock(), mock.Mock()] self._create_build_nodes_mocks(nova, servers) @@ -302,7 +305,7 @@ class TestBuildNodesJson(testtools.TestCase): extra_nodes, network_details) = build_nodes_json._build_nodes( nova, glance, bmc_ports, bm_ports, 'provision', 'bm', 'undercloud', - 'pxe_ipmitool') + 'pxe_ipmitool', physical_network) expected_nodes = copy.deepcopy(TEST_NODES) expected_nodes[1]['disk'] = 100 self.assertEqual(expected_nodes, nodes) @@ -321,6 +324,7 @@ class TestBuildNodesJson(testtools.TestCase): {'fixed_ips': [{'ip_address': '1.1.1.2'}]} ] bm_ports = [{'device_id': '1'}, {'device_id': '2'}] + physical_network = False nova = mock.Mock() servers = [mock.Mock(), mock.Mock(), mock.Mock()] self._create_build_nodes_mocks(nova, servers) @@ -349,7 +353,7 @@ class TestBuildNodesJson(testtools.TestCase): extra_nodes, network_details) = build_nodes_json._build_nodes( nova, glance, bmc_ports, bm_ports, 'provision', 'bm', 'undercloud', - 'ipmi') + 'ipmi', physical_network) expected_nodes = copy.deepcopy(TEST_NODES) expected_nodes[1]['disk'] = 100 for node in expected_nodes: @@ -369,6 +373,7 @@ class TestBuildNodesJson(testtools.TestCase): {'fixed_ips': [{'ip_address': '1.1.1.2'}]} ] bm_ports = [{'device_id': '1'}, {'device_id': '2'}] + physical_network = False nova = mock.Mock() servers = [mock.Mock(), mock.Mock(), mock.Mock()] self._create_build_nodes_mocks(nova, servers) @@ -384,7 +389,7 @@ class TestBuildNodesJson(testtools.TestCase): nodes, bmc_bm_pairs, extra_nodes, _ = build_nodes_json._build_nodes( nova, glance, bmc_ports, bm_ports, 'provision', 'bm-foo', None, - 'pxe_ipmitool') + 'pxe_ipmitool', physical_network) expected_nodes = copy.deepcopy(TEST_NODES) expected_nodes[0]['name'] = 'bm-foo-control-0' expected_nodes[0]['capabilities'] = ('boot_option:local,' @@ -519,7 +524,8 @@ class TestBuildNodesJson(testtools.TestCase): bm_ports, provision_net, baremetal_base, undercloud_name, - args.driver) + args.driver, + args.physical_network) mock_write_nodes.assert_called_once_with(nodes, extra_nodes, network_details, args) mock_write_role_nodes.assert_called_once_with(nodes, args)