Proxy is_volume through DriverBlockDevice

To resolve this TODO in the ironic virt driver [1], and because the
PowerVM driver is facing similar difficulties [2], this change proxies
the is_volume @property from BlockDeviceMapping through
DriverBlockDevice and thus its inheritors, including
DriverVolumeBlockDevice, which is what a bdm actually seems to be by the
time it gets to a virt driver.

[1] 1605391084/nova/virt/ironic/driver.py (L392-L397)
[2] https://review.openstack.org/#/c/526094/45/nova/virt/powervm/driver.py@559

Change-Id: I3976a9305e0583ee77295df3636926688a1ca4ce
This commit is contained in:
Eric Fried 2018-04-24 10:55:46 -05:00
parent 95d4d471b9
commit d247c89b05
3 changed files with 11 additions and 11 deletions

View File

@ -1239,11 +1239,15 @@ class TestDriverBlockDevice(test.NoDBTestCase):
_proxy_as_attr_inherited = set('E')
bdm = objects.BlockDeviceMapping(self.context, no_device=False)
self.assertEqual(set(['uuid']), A(bdm)._proxy_as_attr)
self.assertEqual(set(['uuid', 'B']), B(bdm)._proxy_as_attr)
self.assertEqual(set(['uuid', 'C']), C(bdm)._proxy_as_attr)
self.assertEqual(set(['uuid', 'B', 'D']), D(bdm)._proxy_as_attr)
self.assertEqual(set(['uuid', 'B', 'C', 'E']), E(bdm)._proxy_as_attr)
self.assertEqual(set(['uuid', 'is_volume']), A(bdm)._proxy_as_attr)
self.assertEqual(set(['uuid', 'is_volume', 'B']),
B(bdm)._proxy_as_attr)
self.assertEqual(set(['uuid', 'is_volume', 'C']),
C(bdm)._proxy_as_attr)
self.assertEqual(set(['uuid', 'is_volume', 'B', 'D']),
D(bdm)._proxy_as_attr)
self.assertEqual(set(['uuid', 'is_volume', 'B', 'C', 'E']),
E(bdm)._proxy_as_attr)
class TestDriverBlockDeviceNewFlow(TestDriverBlockDevice):

View File

@ -105,7 +105,7 @@ class DriverBlockDevice(dict):
_fields = set()
_legacy_fields = set()
_proxy_as_attr_inherited = set(['uuid'])
_proxy_as_attr_inherited = set(['uuid', 'is_volume'])
_update_on_save = {'disk_bus': None,
'device_name': None,
'device_type': None}

View File

@ -389,11 +389,7 @@ class IronicDriver(virt_driver.ComputeDriver):
bdms = virt_driver.block_device_info_get_mapping(block_device_info)
for bdm in bdms:
# TODO(TheJulia): In Queens, we should refactor the check below
# to something more elegent, as is_volume is not proxied through
# to the DriverVolumeBlockDevice object. Until then, we are
# checking the underlying object's status.
if not bdm._bdm_obj.is_volume:
if not bdm.is_volume:
continue
connection_info = jsonutils.loads(bdm._bdm_obj.connection_info)