Merge "Expose driver_block_device fields consistently"

This commit is contained in:
Zuul 2018-05-09 22:01:12 +00:00 committed by Gerrit Code Review
commit b5bf853f16
2 changed files with 45 additions and 7 deletions

View File

@ -259,8 +259,8 @@ class TestDriverBlockDevice(test.NoDBTestCase):
def _test_driver_device(self, name):
db_bdm = getattr(self, "%s_bdm" % name)
test_bdm = self.driver_classes[name](db_bdm)
self.assertThat(test_bdm, matchers.DictMatches(
getattr(self, "%s_driver_bdm" % name)))
expected = getattr(self, "%s_driver_bdm" % name)
self.assertThat(expected, matchers.DictMatches(test_bdm))
for k, v in db_bdm.items():
field_val = getattr(test_bdm._bdm_obj, k)
@ -268,9 +268,33 @@ class TestDriverBlockDevice(test.NoDBTestCase):
v = bool(v)
self.assertEqual(field_val, v)
self.assertThat(test_bdm.legacy(),
matchers.DictMatches(
getattr(self, "%s_legacy_driver_bdm" % name)))
for field, value in expected.items():
# Test that all driver bdm fields are available as both attrs and
# dict values
self.assertEqual(test_bdm[field], value)
self.assertEqual(getattr(test_bdm, field), value)
test_value = mock.sentinel.value
if field in test_bdm._proxy_as_attr:
# We can't set a versioned object field to a sentinel because
# it's an invalid type. It's not worth creating valid example
# values for all possible field types just for this, so we just
# test setting it to its current value. This at least
# exercises the code path without being a maintenance burden.
test_value = value
# Test that we can set values via either attribute or dict
test_bdm[field] = test_value
self.assertEqual(getattr(test_bdm, field), test_value)
setattr(test_bdm, field, value)
self.assertEqual(test_bdm[field], value)
# Reset the value
test_bdm[field] = value
expected = getattr(self, "%s_legacy_driver_bdm" % name)
self.assertThat(expected, matchers.DictMatches(test_bdm.legacy()))
# Test passthru attributes
for passthru in test_bdm._proxy_as_attr:

View File

@ -144,15 +144,29 @@ class DriverBlockDevice(dict):
def __getattr__(self, name):
if name in self._proxy_as_attr:
return getattr(self._bdm_obj, name)
elif name in self._fields:
return self[name]
else:
super(DriverBlockDevice, self).__getattr__(name)
return super(DriverBlockDevice, self).__getattr__(name)
def __setattr__(self, name, value):
if name in self._proxy_as_attr:
return setattr(self._bdm_obj, name, value)
setattr(self._bdm_obj, name, value)
elif name in self._fields:
self[name] = value
else:
super(DriverBlockDevice, self).__setattr__(name, value)
def __getitem__(self, name):
if name in self._proxy_as_attr:
return getattr(self._bdm_obj, name)
return super(DriverBlockDevice, self).__getitem__(name)
def __setitem__(self, name, value):
if name in self._proxy_as_attr:
setattr(self._bdm_obj, name, value)
super(DriverBlockDevice, self).__setitem__(name, value)
def _transform(self):
"""Transform bdm to the format that is passed to drivers."""
raise NotImplementedError()