Add --physical_network option to build-nodes-json

This will be needed for routed networks support.
This commit is contained in:
Ben Nemec 2018-07-27 19:16:43 +00:00
parent 6d23f5906e
commit c61719f8c4
2 changed files with 27 additions and 10 deletions

View File

@ -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)

View File

@ -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)