Support setting any interface in build-nodes-json

build-nodes-json now has an --interface argument which allows setting
any of the supported ironic node interfaces. For example, the
following will result in "boot_interface": "pxe" being set for every
node entry:

--interface boot=pxe

Change-Id: I209456464e5e605f777b02869e3aae4c9c192fe5
This commit is contained in:
Steve Baker 2022-07-14 11:01:45 +12:00
parent 6caa316959
commit ae8499e00d
2 changed files with 40 additions and 0 deletions

View File

@ -21,6 +21,11 @@ import yaml
import os_client_config
_KNOWN_INTERFACE_NAMES = ('boot', 'console', 'deploy',
'inspect', 'management', 'network',
'power', 'raid', 'rescue', 'storage',
'vendor')
def _parse_args():
parser = argparse.ArgumentParser(
@ -63,6 +68,11 @@ def _parse_args():
'in a network_details key')
parser.add_argument('--driver', default='ipmi',
help='Bare metal driver to use')
parser.add_argument('--interface',
dest='interfaces',
action='append',
help='Interface driver to set, can be specified '
'multiple times. For example boot=pxe')
parser.add_argument('--physical_network',
action='store_true',
help='Set the physical network attribute of baremetal '
@ -174,6 +184,27 @@ def _build_network_details(nova, bm_ports, undercloud_name):
return extra_nodes, network_details
def _parse_interfaces(interface_args):
if not interface_args:
return {}
interfaces = {}
for i_arg in interface_args:
try:
(i, v) = i_arg.split(('='), 1)
except ValueError:
raise RuntimeError('Malformed interface "%s". Use the key=value '
'format.' % i_arg)
if i not in _KNOWN_INTERFACE_NAMES:
raise RuntimeError('Unknown interface "%s". Supported interfaces: '
'%s' % (i, ', '.join(_KNOWN_INTERFACE_NAMES)))
interfaces['%s_interface' % i] = v
return interfaces
def _build_nodes(nova, glance, bmc_bm_port_pairs, provision_net_map,
baremetal_base, args):
node_template = {
@ -190,6 +221,7 @@ def _build_nodes(nova, glance, bmc_bm_port_pairs, provision_net_map,
}
nodes = []
cache = {}
node_template.update(_parse_interfaces(args.interfaces))
for bmc_port, baremetal_port in bmc_bm_port_pairs:
baremetal = nova.servers.get(baremetal_port['device_id'])
node = dict(node_template)

View File

@ -329,6 +329,7 @@ class TestBuildNodesJson(testtools.TestCase):
args.use_mac = False
args.driver = 'pxe_ipmitool'
args.id = False
args.interfaces = []
bmc_ports = [{'fixed_ips': [{'ip_address': '1.1.1.1'}]},
{'fixed_ips': [{'ip_address': '1.1.1.2'}]}
]
@ -374,6 +375,7 @@ class TestBuildNodesJson(testtools.TestCase):
args.use_mac = False
args.driver = 'ipmi'
args.id = False
args.interfaces = ['boot=pxe']
bmc_ports = [{'fixed_ips': [{'ip_address': '1.1.1.1'}]},
{'fixed_ips': [{'ip_address': '1.1.1.2'}]}
]
@ -410,6 +412,8 @@ class TestBuildNodesJson(testtools.TestCase):
args)
expected_nodes = copy.deepcopy(TEST_NODES)
expected_nodes[1]['disk'] = 100
expected_nodes[0]['boot_interface'] = 'pxe'
expected_nodes[1]['boot_interface'] = 'pxe'
for node in expected_nodes:
node['pm_type'] = 'ipmi'
self.assertEqual(expected_nodes, nodes)
@ -420,6 +424,7 @@ class TestBuildNodesJson(testtools.TestCase):
args.use_mac = False
args.driver = 'pxe_ipmitool'
args.id = False
args.interfaces = []
bmc_ports = [{'fixed_ips': [{'ip_address': '1.1.1.1'}]},
{'fixed_ips': [{'ip_address': '1.1.1.2'}]}
@ -463,6 +468,7 @@ class TestBuildNodesJson(testtools.TestCase):
args.use_mac = True
args.driver = 'pxe_ipmitool'
args.id = False
args.interfaces = []
bmc_ports = [{'fixed_ips': [{'ip_address': '1.1.1.1'}]},
{'fixed_ips': [{'ip_address': '1.1.1.2'}]}
]
@ -512,6 +518,7 @@ class TestBuildNodesJson(testtools.TestCase):
args.use_mac = False
args.driver = 'pxe_ipmitool'
args.id = False
args.interfaces = []
bmc_ports = [{'fixed_ips': [{'ip_address': '1.1.1.1'}]},
{'fixed_ips': [{'ip_address': '1.1.1.2'}]}
]
@ -559,6 +566,7 @@ class TestBuildNodesJson(testtools.TestCase):
args.use_mac = False
args.driver = 'pxe_ipmitool'
args.id = '123'
args.interfaces = []
bmc_ports = [{'fixed_ips': [{'ip_address': '1.1.1.1'}]},
{'fixed_ips': [{'ip_address': '1.1.1.2'}]}
]