diff --git a/openstack/cloud/openstackcloud.py b/openstack/cloud/openstackcloud.py index 831f79a46..372255225 100755 --- a/openstack/cloud/openstackcloud.py +++ b/openstack/cloud/openstackcloud.py @@ -9433,11 +9433,8 @@ class OpenStackCloud(_normalize.Normalizer): update_coe_cluster_template = update_cluster_template def list_nics(self): - msg = "Error fetching machine port list" - data = self._baremetal_client.get("/ports", - microversion="1.6", - error_message=msg) - return data['ports'] + """Return a list of all bare metal ports.""" + return [nic._to_munch() for nic in self.baremetal.ports(details=True)] def list_nics_for_machine(self, uuid): """Returns a list of ports present on the machine node. @@ -9446,23 +9443,18 @@ class OpenStackCloud(_normalize.Normalizer): order to identify the machine. :returns: A list of ports. """ - msg = "Error fetching port list for node {node_id}".format( - node_id=uuid) - url = "/nodes/{node_id}/ports".format(node_id=uuid) - data = self._baremetal_client.get(url, - microversion="1.6", - error_message=msg) - return data['ports'] + # TODO(dtantsur): support node names here. + return [nic._to_munch() + for nic in self.baremetal.ports(details=True, node_id=uuid)] def get_nic_by_mac(self, mac): + """Get bare metal NIC by its hardware address (usually MAC).""" + results = [nic._to_munch() + for nic in self.baremetal.ports(address=mac, details=True)] try: - url = '/ports/detail?address=%s' % mac - data = self._baremetal_client.get(url) - if len(data['ports']) == 1: - return data['ports'][0] - except Exception: - pass - return None + return results[0] + except IndexError: + return None def list_machines(self): """List Machines. @@ -9497,14 +9489,11 @@ class OpenStackCloud(_normalize.Normalizer): :returns: ``munch.Munch`` representing the node found or None if the node is not found. """ - try: - port_url = '/ports/detail?address={mac}'.format(mac=mac) - port = self._baremetal_client.get(port_url, microversion=1.6) - machine_url = '/nodes/{machine}'.format( - machine=port['ports'][0]['node_uuid']) - return self._baremetal_client.get(machine_url, microversion=1.6) - except Exception: + nic = self.get_nic_by_mac(mac) + if nic is None: return None + else: + return self.get_machine(nic['node_uuid']) def inspect_machine(self, name_or_id, wait=False, timeout=3600): """Inspect a Barmetal machine diff --git a/openstack/tests/unit/cloud/test_baremetal_ports.py b/openstack/tests/unit/cloud/test_baremetal_ports.py index 942b472b2..aa39b67ed 100644 --- a/openstack/tests/unit/cloud/test_baremetal_ports.py +++ b/openstack/tests/unit/cloud/test_baremetal_ports.py @@ -43,20 +43,20 @@ class TestBaremetalPort(base.IronicTestCase): def test_list_nics(self): self.register_uris([ dict(method='GET', - uri=self.get_mock_url(resource='ports'), + uri=self.get_mock_url(resource='ports', append=['detail']), json={'ports': [self.fake_baremetal_port, self.fake_baremetal_port2]}), ]) return_value = self.cloud.list_nics() self.assertEqual(2, len(return_value)) - self.assertEqual(self.fake_baremetal_port, return_value[0]) + self.assertSubdict(self.fake_baremetal_port, return_value[0]) self.assert_calls() def test_list_nics_failure(self): self.register_uris([ dict(method='GET', - uri=self.get_mock_url(resource='ports'), + uri=self.get_mock_url(resource='ports', append=['detail']), status_code=400) ]) self.assertRaises(exc.OpenStackCloudException, @@ -64,11 +64,10 @@ class TestBaremetalPort(base.IronicTestCase): self.assert_calls() def test_list_nics_for_machine(self): + query = 'detail?node_uuid=%s' % self.fake_baremetal_node['uuid'] self.register_uris([ dict(method='GET', - uri=self.get_mock_url( - resource='nodes', - append=[self.fake_baremetal_node['uuid'], 'ports']), + uri=self.get_mock_url(resource='ports', append=[query]), json={'ports': [self.fake_baremetal_port, self.fake_baremetal_port2]}), ]) @@ -76,15 +75,14 @@ class TestBaremetalPort(base.IronicTestCase): return_value = self.cloud.list_nics_for_machine( self.fake_baremetal_node['uuid']) self.assertEqual(2, len(return_value)) - self.assertEqual(self.fake_baremetal_port, return_value[0]) + self.assertSubdict(self.fake_baremetal_port, return_value[0]) self.assert_calls() def test_list_nics_for_machine_failure(self): + query = 'detail?node_uuid=%s' % self.fake_baremetal_node['uuid'] self.register_uris([ dict(method='GET', - uri=self.get_mock_url( - resource='nodes', - append=[self.fake_baremetal_node['uuid'], 'ports']), + uri=self.get_mock_url(resource='ports', append=[query]), status_code=400) ]) @@ -104,7 +102,7 @@ class TestBaremetalPort(base.IronicTestCase): return_value = self.cloud.get_nic_by_mac(mac) - self.assertEqual(self.fake_baremetal_port, return_value) + self.assertSubdict(self.fake_baremetal_port, return_value) self.assert_calls() def test_get_nic_by_mac_failure(self): diff --git a/releasenotes/notes/baremetal-ports-cc0f56ae0d192aba.yaml b/releasenotes/notes/baremetal-ports-cc0f56ae0d192aba.yaml new file mode 100644 index 000000000..90adce120 --- /dev/null +++ b/releasenotes/notes/baremetal-ports-cc0f56ae0d192aba.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + The ``OpenStackCloud`` bare metal NIC calls now support all microversions + supported by the SDK. Previously version 1.6 was hardcoded.