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 3c66b40dbd)
This commit is contained in:
Takashi NATSUME 2019-02-23 00:56:23 +09:00 committed by Takashi Natsume
parent a40f0c5a00
commit ae40ceba84
2 changed files with 13 additions and 2 deletions

View File

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

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.