Update register_machine to use the Ironic format for ports

It's confusing to use two different formats across the SDK.

Also allow a simple list of MAC addresses, since that's what most people
presumably want.

Change-Id: I47448850225f04f24fb0dfc6a1700b5e2c26a450
This commit is contained in:
Dmitry Tantsur 2022-09-08 18:30:35 +02:00
parent 41c39a4848
commit 75237720f6
2 changed files with 38 additions and 17 deletions

View File

@ -24,6 +24,25 @@ import jsonpatch
from openstack.cloud import exc
def _normalize_port_list(nics):
ports = []
for row in nics:
if isinstance(row, str):
address = row
row = {}
elif 'mac' in row:
address = row.pop('mac')
else:
try:
address = row.pop('address')
except KeyError:
raise TypeError(
"Either 'address' or 'mac' must be provided "
"for port %s" % row)
ports.append(dict(row, address=address))
return ports
class BaremetalCloudMixin:
def list_nics(self):
@ -182,10 +201,12 @@ class BaremetalCloudMixin:
Example::
[
{'mac': 'aa:bb:cc:dd:ee:01'},
{'mac': 'aa:bb:cc:dd:ee:02'}
{'address': 'aa:bb:cc:dd:ee:01'},
{'address': 'aa:bb:cc:dd:ee:02'}
]
Alternatively, you can provide an array of MAC addresses.
:param wait: Boolean value, defaulting to false, to wait for the node
to reach the available state where the node can be provisioned. It
must be noted, when set to false, the method will still wait for
@ -233,11 +254,9 @@ class BaremetalCloudMixin:
# Create NICs before trying to run cleaning
created_nics = []
try:
for row in nics:
address = row.pop('mac')
for port in _normalize_port_list(nics):
nic = self.baremetal.create_port(node_id=machine.id,
address=address,
**row)
**port)
created_nics.append(nic.id)
except Exception:
@ -295,9 +314,9 @@ class BaremetalCloudMixin:
"Error unregistering node '%s': Exception occured while"
" waiting to be able to proceed: %s" % (machine['uuid'], e))
for nic in nics:
for nic in _normalize_port_list(nics):
try:
port = next(self.baremetal.ports(address=nic['mac']))
port = next(self.baremetal.ports(address=nic['address']))
except StopIteration:
continue
self.baremetal.delete_port(port.id)

View File

@ -1063,7 +1063,7 @@ class TestBaremetalNode(base.IronicTestCase):
def test_register_machine(self):
mac_address = '00:01:02:03:04:05'
nics = [{'mac': mac_address}]
nics = [{'address': mac_address}]
node_uuid = self.fake_baremetal_node['uuid']
# TODO(TheJulia): There is a lot of duplication
# in testing creation. Surely this hsould be a helper
@ -1104,7 +1104,7 @@ class TestBaremetalNode(base.IronicTestCase):
# accounted for newer microversions.
def test_register_machine_enroll(self):
mac_address = '00:01:02:03:04:05'
nics = [{'mac': mac_address}]
nics = [{'address': mac_address, 'pxe_enabled': False}]
node_uuid = self.fake_baremetal_node['uuid']
node_to_post = {
'chassis_uuid': None,
@ -1143,7 +1143,8 @@ class TestBaremetalNode(base.IronicTestCase):
uri=self.get_mock_url(
resource='ports'),
validate=dict(json={'address': mac_address,
'node_uuid': node_uuid}),
'node_uuid': node_uuid,
'pxe_enabled': False}),
json=self.fake_baremetal_port),
dict(
method='PUT',
@ -1166,7 +1167,7 @@ class TestBaremetalNode(base.IronicTestCase):
def test_register_machine_enroll_wait(self):
mac_address = self.fake_baremetal_port
nics = [{'mac': mac_address}]
nics = [{'address': mac_address}]
node_uuid = self.fake_baremetal_node['uuid']
node_to_post = {
'chassis_uuid': None,
@ -1241,7 +1242,7 @@ class TestBaremetalNode(base.IronicTestCase):
def test_register_machine_enroll_failure(self):
mac_address = '00:01:02:03:04:05'
nics = [{'mac': mac_address}]
nics = [{'address': mac_address}]
node_uuid = self.fake_baremetal_node['uuid']
node_to_post = {
'chassis_uuid': None,
@ -1291,7 +1292,7 @@ class TestBaremetalNode(base.IronicTestCase):
def test_register_machine_enroll_timeout(self):
mac_address = '00:01:02:03:04:05'
nics = [{'mac': mac_address}]
nics = [{'address': mac_address}]
node_uuid = self.fake_baremetal_node['uuid']
node_to_post = {
'chassis_uuid': None,
@ -1345,7 +1346,7 @@ class TestBaremetalNode(base.IronicTestCase):
def test_register_machine_enroll_timeout_wait(self):
mac_address = '00:01:02:03:04:05'
nics = [{'mac': mac_address}]
nics = [{'address': mac_address}]
node_uuid = self.fake_baremetal_node['uuid']
node_to_post = {
'chassis_uuid': None,
@ -1414,7 +1415,7 @@ class TestBaremetalNode(base.IronicTestCase):
def test_register_machine_port_create_failed(self):
mac_address = '00:01:02:03:04:05'
nics = [{'mac': mac_address}]
nics = [{'address': mac_address}]
node_uuid = self.fake_baremetal_node['uuid']
node_to_post = {
'chassis_uuid': None,
@ -1455,7 +1456,8 @@ class TestBaremetalNode(base.IronicTestCase):
def test_register_machine_several_ports_create_failed(self):
mac_address = '00:01:02:03:04:05'
mac_address2 = mac_address[::-1]
nics = [{'mac': mac_address}, {'mac': mac_address2}]
# Verify a couple of ways to provide MACs
nics = [mac_address, {'mac': mac_address2}]
node_uuid = self.fake_baremetal_node['uuid']
node_to_post = {
'chassis_uuid': None,