build-nodes-json - use ports by default, mac is deprecated
The mac field in TripleO nodes JSON has been deprecated since Rocky. Let's switch to use the 'ports' field by default. Add the argument '--use-mac' to allow the user to choose to use the legacy "mac" field. Change-Id: I3728bb8589a82fea71f54505c6f7c17e79d8378e
This commit is contained in:
parent
a3b959f150
commit
23914fab1a
|
@ -67,6 +67,10 @@ def _parse_args():
|
|||
action='store_true',
|
||||
help='Set the physical network attribute of baremetal '
|
||||
'ports. (Requires Rocky or later Ironic)')
|
||||
parser.add_argument('--use-mac',
|
||||
action='store_true',
|
||||
help='Use the deprecated "mac" field in nodes JSON '
|
||||
'instead of the "ports" field.')
|
||||
parser.add_argument('--id',
|
||||
help='Identifier to remove from network resource '
|
||||
'names when setting physical network attribute '
|
||||
|
@ -126,7 +130,6 @@ def _build_nodes(nova, glance, bmc_ports, bm_ports, provision_net_map,
|
|||
baremetal_base, undercloud_name, args):
|
||||
node_template = {
|
||||
'pm_type': args.driver,
|
||||
'mac': '',
|
||||
'cpu': '',
|
||||
'memory': '',
|
||||
'disk': '',
|
||||
|
@ -137,8 +140,6 @@ def _build_nodes(nova, glance, bmc_ports, bm_ports, provision_net_map,
|
|||
'capabilities': 'boot_option:local',
|
||||
'name': '',
|
||||
}
|
||||
if args.physical_network:
|
||||
node_template.pop('mac')
|
||||
nodes = []
|
||||
cache = {}
|
||||
network_details = {}
|
||||
|
@ -151,16 +152,16 @@ def _build_nodes(nova, glance, bmc_ports, bm_ports, provision_net_map,
|
|||
node['pm_addr'] = bmc_port['fixed_ips'][0]['ip_address']
|
||||
provision_net = provision_net_map.get(baremetal_port['id'])
|
||||
mac = baremetal.addresses[provision_net][0]['OS-EXT-IPS-MAC:mac_addr']
|
||||
if args.physical_network:
|
||||
if args.id:
|
||||
physical_network = re.sub('-' + args.id + '$', '',
|
||||
provision_net)
|
||||
else:
|
||||
physical_network = provision_net
|
||||
node.update({'ports': [{'address': mac,
|
||||
'physical_network': physical_network}]})
|
||||
else:
|
||||
if args.use_mac:
|
||||
node['mac'] = [mac]
|
||||
else:
|
||||
port = node.setdefault('ports', [{'address': mac}])[0]
|
||||
if args.physical_network:
|
||||
if args.id:
|
||||
port['physical_network'] = re.sub('-' + args.id + '$', '',
|
||||
provision_net)
|
||||
else:
|
||||
port['physical_network'] = provision_net
|
||||
if not cache.get(baremetal.flavor['id']):
|
||||
cache[baremetal.flavor['id']] = nova.flavors.get(
|
||||
baremetal.flavor['id'])
|
||||
|
|
|
@ -27,7 +27,7 @@ TEST_NODES = [{'arch': 'x86_64',
|
|||
'capabilities': 'boot_option:local',
|
||||
'cpu': 128,
|
||||
'disk': 1024,
|
||||
'mac': ['aa:aa:aa:aa:aa:aa'],
|
||||
'ports': [{'address': 'aa:aa:aa:aa:aa:aa'}],
|
||||
'memory': 145055,
|
||||
'name': 'bm-0',
|
||||
'pm_addr': '1.1.1.1',
|
||||
|
@ -38,7 +38,7 @@ TEST_NODES = [{'arch': 'x86_64',
|
|||
'capabilities': 'boot_option:local',
|
||||
'cpu': 128,
|
||||
'disk': 1024,
|
||||
'mac': ['aa:aa:aa:aa:aa:ab'],
|
||||
'ports': [{'address': 'aa:aa:aa:aa:aa:ab'}],
|
||||
'memory': 145055,
|
||||
'name': 'bm-1',
|
||||
'pm_addr': '1.1.1.2',
|
||||
|
@ -53,7 +53,7 @@ class TestBuildNodesJson(testtools.TestCase):
|
|||
'bmc-foo', '--baremetal_prefix', 'baremetal-foo',
|
||||
'--provision_net', 'provision-foo', '--nodes_json',
|
||||
'nodes-foo.json', '--driver', 'ipmi',
|
||||
'--physical_network',
|
||||
'--physical_network', '--use-mac'
|
||||
]
|
||||
with mock.patch.object(sys, 'argv', mock_argv):
|
||||
args = build_nodes_json._parse_args()
|
||||
|
@ -64,6 +64,7 @@ class TestBuildNodesJson(testtools.TestCase):
|
|||
self.assertEqual('nodes-foo.json', args.nodes_json)
|
||||
self.assertEqual('ipmi', args.driver)
|
||||
self.assertTrue(args.physical_network)
|
||||
self.assertTrue(args.use_mac)
|
||||
|
||||
def test_get_names_no_env(self):
|
||||
args = mock.Mock()
|
||||
|
@ -282,6 +283,7 @@ class TestBuildNodesJson(testtools.TestCase):
|
|||
def test_build_nodes(self, mock_make_client):
|
||||
args = mock.Mock()
|
||||
args.physical_network = False
|
||||
args.use_mac = False
|
||||
args.driver = 'pxe_ipmitool'
|
||||
args.id = False
|
||||
bmc_ports = [{'fixed_ips': [{'ip_address': '1.1.1.1'}]},
|
||||
|
@ -334,6 +336,7 @@ class TestBuildNodesJson(testtools.TestCase):
|
|||
def test_build_nodes_with_driver(self, mock_make_client):
|
||||
args = mock.Mock()
|
||||
args.physical_network = False
|
||||
args.use_mac = False
|
||||
args.driver = 'ipmi'
|
||||
args.id = False
|
||||
bmc_ports = [{'fixed_ips': [{'ip_address': '1.1.1.1'}]},
|
||||
|
@ -387,6 +390,7 @@ class TestBuildNodesJson(testtools.TestCase):
|
|||
def test_build_nodes_role_uefi(self):
|
||||
args = mock.Mock()
|
||||
args.physical_network = False
|
||||
args.use_mac = False
|
||||
args.driver = 'pxe_ipmitool'
|
||||
args.id = False
|
||||
|
||||
|
@ -426,9 +430,10 @@ class TestBuildNodesJson(testtools.TestCase):
|
|||
self.assertEqual(expected_nodes, nodes)
|
||||
|
||||
@mock.patch('os_client_config.make_client')
|
||||
def test_build_nodes_with_physnet(self, mock_make_client):
|
||||
def test_build_nodes_use_mac(self, mock_make_client):
|
||||
args = mock.Mock()
|
||||
args.physical_network = True
|
||||
args.physical_network = False
|
||||
args.use_mac = True
|
||||
args.driver = 'pxe_ipmitool'
|
||||
args.id = False
|
||||
bmc_ports = [{'fixed_ips': [{'ip_address': '1.1.1.1'}]},
|
||||
|
@ -469,12 +474,65 @@ class TestBuildNodesJson(testtools.TestCase):
|
|||
'undercloud', args)
|
||||
expected_nodes = copy.deepcopy(TEST_NODES)
|
||||
expected_nodes[1]['disk'] = 100
|
||||
node0_mac = expected_nodes[0].pop('mac')
|
||||
node1_mac = expected_nodes[1].pop('mac')
|
||||
expected_nodes[0]['ports'] = [{'address': node0_mac[0],
|
||||
'physical_network': 'provision'}]
|
||||
expected_nodes[1]['ports'] = [{'address': node1_mac[0],
|
||||
'physical_network': 'provision'}]
|
||||
del expected_nodes[0]['ports']
|
||||
del expected_nodes[1]['ports']
|
||||
expected_nodes[0]['mac'] = [TEST_NODES[0]['ports'][0]['address']]
|
||||
expected_nodes[1]['mac'] = [TEST_NODES[1]['ports'][0]['address']]
|
||||
self.assertEqual(expected_nodes, nodes)
|
||||
self.assertEqual(1, len(extra_nodes))
|
||||
self.assertEqual('undercloud', extra_nodes[0]['name'])
|
||||
self.assertEqual(
|
||||
'2.1.1.1', network_details['bm_0']['ips']['provision'][0]['addr'])
|
||||
self.assertEqual(
|
||||
'2.1.1.2', network_details['bm_1']['ips']['provision'][0]['addr'])
|
||||
|
||||
@mock.patch('os_client_config.make_client')
|
||||
def test_build_nodes_with_physnet(self, mock_make_client):
|
||||
args = mock.Mock()
|
||||
args.physical_network = True
|
||||
args.use_mac = False
|
||||
args.driver = 'pxe_ipmitool'
|
||||
args.id = False
|
||||
bmc_ports = [{'fixed_ips': [{'ip_address': '1.1.1.1'}]},
|
||||
{'fixed_ips': [{'ip_address': '1.1.1.2'}]}
|
||||
]
|
||||
bm_ports = [{'device_id': '1', 'id': 'port_id_server1'},
|
||||
{'device_id': '2', 'id': 'port_id_server2'}]
|
||||
provision_net_map = {'port_id_server1': 'provision',
|
||||
'port_id_server2': 'provision',
|
||||
'port_id_server3': 'provision', }
|
||||
nova = mock.Mock()
|
||||
servers = [mock.Mock(), mock.Mock(), mock.Mock()]
|
||||
self._create_build_nodes_mocks(nova, servers)
|
||||
servers[1].image = None
|
||||
mock_to_dict = {'os-extended-volumes:volumes_attached':
|
||||
[{'id': 'v0lume'}]}
|
||||
servers[1].to_dict.return_value = mock_to_dict
|
||||
mock_cinder = mock.Mock()
|
||||
mock_make_client.return_value = mock_cinder
|
||||
mock_vol = mock.Mock()
|
||||
mock_vol.size = 100
|
||||
mock_cinder.volumes.get.return_value = mock_vol
|
||||
servers[2].name = 'undercloud'
|
||||
servers[2].flavor = {'id': '1'}
|
||||
servers[2].addresses = {'provision': [{'OS-EXT-IPS-MAC:mac_addr':
|
||||
'aa:aa:aa:aa:aa:ac'}]}
|
||||
servers[2].image = {'id': 'f00'}
|
||||
nova.servers.list.return_value = [servers[2]]
|
||||
ips_return_val = 'ips call value'
|
||||
nova.servers.ips.return_value = ips_return_val
|
||||
|
||||
glance = mock.Mock()
|
||||
|
||||
(nodes,
|
||||
extra_nodes,
|
||||
network_details) = build_nodes_json._build_nodes(
|
||||
nova, glance, bmc_ports, bm_ports, provision_net_map, 'bm',
|
||||
'undercloud', args)
|
||||
expected_nodes = copy.deepcopy(TEST_NODES)
|
||||
expected_nodes[1]['disk'] = 100
|
||||
expected_nodes[0]['ports'][0]['physical_network'] = 'provision'
|
||||
expected_nodes[1]['ports'][0]['physical_network'] = 'provision'
|
||||
self.assertEqual(expected_nodes, nodes)
|
||||
self.assertEqual(1, len(extra_nodes))
|
||||
self.assertEqual('undercloud', extra_nodes[0]['name'])
|
||||
|
@ -487,6 +545,7 @@ class TestBuildNodesJson(testtools.TestCase):
|
|||
def test_build_nodes_with_physnet_strip_id(self, mock_make_client):
|
||||
args = mock.Mock()
|
||||
args.physical_network = True
|
||||
args.use_mac = False
|
||||
args.driver = 'pxe_ipmitool'
|
||||
args.id = '123'
|
||||
bmc_ports = [{'fixed_ips': [{'ip_address': '1.1.1.1'}]},
|
||||
|
@ -528,12 +587,8 @@ class TestBuildNodesJson(testtools.TestCase):
|
|||
'undercloud', args)
|
||||
expected_nodes = copy.deepcopy(TEST_NODES)
|
||||
expected_nodes[1]['disk'] = 100
|
||||
node0_mac = expected_nodes[0].pop('mac')
|
||||
node1_mac = expected_nodes[1].pop('mac')
|
||||
expected_nodes[0]['ports'] = [{'address': node0_mac[0],
|
||||
'physical_network': 'ctlplane'}]
|
||||
expected_nodes[1]['ports'] = [{'address': node1_mac[0],
|
||||
'physical_network': 'ctlplane'}]
|
||||
expected_nodes[0]['ports'][0]['physical_network'] = 'ctlplane'
|
||||
expected_nodes[1]['ports'][0]['physical_network'] = 'ctlplane'
|
||||
self.assertEqual(expected_nodes, nodes)
|
||||
self.assertEqual(1, len(extra_nodes))
|
||||
self.assertEqual('undercloud', extra_nodes[0]['name'])
|
||||
|
|
Loading…
Reference in New Issue