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.

Conflicts:
    nova/tests/unit/virt/test_block_device.py

    The conflict is due to not including
    Icc301230fe7c8e3ebbbcc7f4a807e562db7f93e3 in rocky.

Change-Id: Ic665fc1956831110937d98553e526cb909e49997
Closes-Bug: #1816938
(cherry picked from commit 3c66b40dbd)
(cherry picked from commit ae40ceba84)
This commit is contained in:
Takashi NATSUME 2019-02-23 00:56:23 +09:00 committed by Takashi Natsume
parent 9bb78d5765
commit 8d757888a8
2 changed files with 13 additions and 2 deletions

View File

@ -186,7 +186,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})
volblank_driver_bdm = {
@ -372,6 +371,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")
@ -382,6 +382,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')
@ -391,6 +392,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')
@ -406,8 +408,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)

View File

@ -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.