From ae40ceba8420b3b6c4bd8e29cf95ec21fd20e1e8 Mon Sep 17 00:00:00 2001 From: Takashi NATSUME Date: Sat, 23 Feb 2019 00:56:23 +0900 Subject: [PATCH] Override the 'get' method in DriverBlockDevice class The following methods are overridden in DriverBlockDevice class. * __getattr__ * __getitem__ The 'get' method is not overridden. The value cannot be got by the 'get' method though the value can be got by '__getattr__' (e.g. bdm.volumd_id) or '__getitem__' (e.g. bdm['volume_id']) method. So override the 'get' method to fix the issue. Change-Id: Ic665fc1956831110937d98553e526cb909e49997 Closes-Bug: #1816938 (cherry picked from commit 3c66b40dbd23e3f792a86da5a15c993c52c9b377) --- nova/tests/unit/virt/test_block_device.py | 7 +++++-- nova/virt/block_device.py | 8 ++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/nova/tests/unit/virt/test_block_device.py b/nova/tests/unit/virt/test_block_device.py index d4085bc71d84..9eb7d9ce8ead 100644 --- a/nova/tests/unit/virt/test_block_device.py +++ b/nova/tests/unit/virt/test_block_device.py @@ -191,7 +191,6 @@ class TestDriverBlockDevice(test.NoDBTestCase): 'destination_type': 'volume', 'connection_info': '{"fake": "connection_info"}', 'snapshot_id': 'fake-snapshot-id-1', - 'volume_id': 'fake-volume-id-2', 'boot_index': -1, 'volume_type': None}) @@ -379,6 +378,7 @@ class TestDriverBlockDevice(test.NoDBTestCase): self.assertEqual(test_bdm._bdm_obj.id, 3) self.assertEqual(test_bdm.volume_id, 'fake-volume-id-1') self.assertEqual(test_bdm.volume_size, 8) + self.assertEqual('fake-volume-id-1', test_bdm.get('volume_id')) def test_driver_snapshot_block_device(self): self._test_driver_device("volsnapshot") @@ -389,6 +389,7 @@ class TestDriverBlockDevice(test.NoDBTestCase): self.assertEqual(test_bdm.snapshot_id, 'fake-snapshot-id-1') self.assertEqual(test_bdm.volume_id, 'fake-volume-id-2') self.assertEqual(test_bdm.volume_size, 3) + self.assertEqual('fake-snapshot-id-1', test_bdm.get('snapshot_id')) def test_driver_image_block_device(self): self._test_driver_device('volimage') @@ -398,6 +399,7 @@ class TestDriverBlockDevice(test.NoDBTestCase): self.assertEqual(test_bdm._bdm_obj.id, 5) self.assertEqual(test_bdm.image_id, 'fake-image-id-1') self.assertEqual(test_bdm.volume_size, 1) + self.assertEqual('fake-image-id-1', test_bdm.get('image_id')) def test_driver_image_block_device_destination_local(self): self._test_driver_device('volimage') @@ -413,8 +415,9 @@ class TestDriverBlockDevice(test.NoDBTestCase): test_bdm = self.driver_classes['volblank']( self.volblank_bdm) self.assertEqual(6, test_bdm._bdm_obj.id) - self.assertEqual('fake-volume-id-2', test_bdm.volume_id) + self.assertIsNone(test_bdm.volume_id) self.assertEqual(3, test_bdm.volume_size) + self.assertIsNone(test_bdm.get('volume_id')) def _test_call_wait_func(self, delete_on_termination, delete_fail=False): test_bdm = self.driver_classes['volume'](self.volume_bdm) diff --git a/nova/virt/block_device.py b/nova/virt/block_device.py index 8abbdb40f2b0..236025596755 100644 --- a/nova/virt/block_device.py +++ b/nova/virt/block_device.py @@ -171,6 +171,14 @@ class DriverBlockDevice(dict): """Transform bdm to the format that is passed to drivers.""" raise NotImplementedError() + def get(self, name, default=None): + if name in self._proxy_as_attr: + return getattr(self._bdm_obj, name) + elif name in self._fields: + return self[name] + else: + return super(DriverBlockDevice, self).get(name, default) + def legacy(self): """Basic legacy transformation.