From 25f74ebba886ed26d46c6553f113114218b34a8d Mon Sep 17 00:00:00 2001 From: Dmitry Tantsur Date: Fri, 12 Oct 2018 14:48:14 +0200 Subject: [PATCH] Switch bare metal NIC actions in OpenStackCloud to baremetal Proxy calls This change allows bare metal NIC actions to use the microversion negotiation process instead of the hardcoded version 1.6. Change-Id: I0d31251fc110b9db744509ce6f254745a13acebf --- openstack/cloud/openstackcloud.py | 41 +++++++------------ .../tests/unit/cloud/test_baremetal_ports.py | 20 ++++----- .../baremetal-ports-cc0f56ae0d192aba.yaml | 5 +++ 3 files changed, 29 insertions(+), 37 deletions(-) create mode 100644 releasenotes/notes/baremetal-ports-cc0f56ae0d192aba.yaml 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.