From 6dcb309e0fa3546add0c29f4a1c08fb3eabc6d48 Mon Sep 17 00:00:00 2001 From: Dmitry Tantsur Date: Mon, 9 Mar 2020 17:50:16 +0100 Subject: [PATCH] Consistent normalization of Machine objects in the cloud layer Currently some functions call node._to_munch, some - _normalize_machine, some both. When only _normalize_machine is used, the machine's fields are not normalized to their server-side representation, breaking the os_ironic ansible module expecting node['uuid']. This change makes _normalize_machine call _to_munch to ensure that normalization always happens. All cloud calls are changed to use _normalize_machine and not _to_munch. Change-Id: Ic431f1340c017a24eafe07832da6e6c579fb1921 (cherry picked from commit 5db3323be1766c9f6774e17250a4f5021f8478b7) --- openstack/cloud/_baremetal.py | 11 +++++------ openstack/cloud/_normalize.py | 7 ++++--- openstack/tests/unit/cloud/test_baremetal_node.py | 6 ++++-- .../notes/normalize-machine-290d9f2a3b3a7ef0.yaml | 4 ++++ 4 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 releasenotes/notes/normalize-machine-290d9f2a3b3a7ef0.yaml diff --git a/openstack/cloud/_baremetal.py b/openstack/cloud/_baremetal.py index 6c05b8d7d..b63b152e8 100644 --- a/openstack/cloud/_baremetal.py +++ b/openstack/cloud/_baremetal.py @@ -68,7 +68,7 @@ class BaremetalCloudMixin(_normalize.Normalizer): :returns: list of ``munch.Munch`` representing machines. """ - return [self._normalize_machine(node._to_munch()) + return [self._normalize_machine(node) for node in self.baremetal.nodes()] def get_machine(self, name_or_id): @@ -83,8 +83,7 @@ class BaremetalCloudMixin(_normalize.Normalizer): nodes are found. """ try: - return self._normalize_machine( - self.baremetal.get_node(name_or_id)._to_munch()) + return self._normalize_machine(self.baremetal.get_node(name_or_id)) except exc.OpenStackCloudResourceNotFound: return None @@ -159,7 +158,7 @@ class BaremetalCloudMixin(_normalize.Normalizer): wait=True, timeout=timeout) - return node._to_munch() + return self._normalize_machine(node) def register_machine(self, nics, wait=False, timeout=3600, lock_timeout=600, **kwargs): @@ -477,7 +476,7 @@ class BaremetalCloudMixin(_normalize.Normalizer): change_list = [change['path'] for change in patch] node = self.baremetal.update_node(machine, **attrs) return dict( - node=self._normalize_machine(node._to_munch()), + node=self._normalize_machine(node), changes=change_list ) @@ -573,7 +572,7 @@ class BaremetalCloudMixin(_normalize.Normalizer): node = self.baremetal.set_node_provision_state( name_or_id, target=state, config_drive=configdrive, wait=wait, timeout=timeout) - return node._to_munch() + return self._normalize_machine(node) def set_machine_maintenance_state( self, diff --git a/openstack/cloud/_normalize.py b/openstack/cloud/_normalize.py index c5f9d760a..2f7114cf8 100644 --- a/openstack/cloud/_normalize.py +++ b/openstack/cloud/_normalize.py @@ -1168,13 +1168,14 @@ class Normalizer(object): def _normalize_machine(self, machine): """Normalize Ironic Machine""" - machine = machine.copy() + if isinstance(machine, resource.Resource): + machine = machine._to_munch() + else: + machine = machine.copy() # Discard noise self._remove_novaclient_artifacts(machine) - # TODO(mordred) Normalize this resource - return machine def _normalize_roles(self, roles): diff --git a/openstack/tests/unit/cloud/test_baremetal_node.py b/openstack/tests/unit/cloud/test_baremetal_node.py index f5aa18519..6c7905eed 100644 --- a/openstack/tests/unit/cloud/test_baremetal_node.py +++ b/openstack/tests/unit/cloud/test_baremetal_node.py @@ -213,8 +213,9 @@ class TestBaremetalNode(base.IronicTestCase): json=self.fake_baremetal_node, validate=dict(json=test_patch)), ]) - self.cloud.patch_machine( + result = self.cloud.patch_machine( self.fake_baremetal_node['uuid'], test_patch) + self.assertEqual(self.fake_baremetal_node['uuid'], result['uuid']) self.assert_calls() @@ -759,10 +760,11 @@ class TestBaremetalNode(base.IronicTestCase): append=[self.fake_baremetal_node['uuid']]), json=self.fake_baremetal_node), ]) - self.cloud.node_set_provision_state( + result = self.cloud.node_set_provision_state( self.fake_baremetal_node['uuid'], 'active', configdrive='http://host/file') + self.assertEqual(self.fake_baremetal_node['uuid'], result['uuid']) self.assert_calls() diff --git a/releasenotes/notes/normalize-machine-290d9f2a3b3a7ef0.yaml b/releasenotes/notes/normalize-machine-290d9f2a3b3a7ef0.yaml new file mode 100644 index 000000000..04b36e4d8 --- /dev/null +++ b/releasenotes/notes/normalize-machine-290d9f2a3b3a7ef0.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - | + Fixes normalization of bare metal machines in the ``patch_machine`` call.