diff --git a/cinder/objects/base.py b/cinder/objects/base.py index 4e789f60a89..a673c4ff06e 100644 --- a/cinder/objects/base.py +++ b/cinder/objects/base.py @@ -256,7 +256,13 @@ class CinderObjectDictCompat(base.VersionedObjectDictCompat): not self.obj_attr_is_set(key)): return value else: - return getattr(self, key) + try: + return getattr(self, key) + except (exception.ObjectActionError, NotImplementedError): + # Exception when haven't set a value for non-lazy + # loadable attribute, but to mimic typical dict 'get' + # behavior we should still return None + return None def __contains__(self, name): try: diff --git a/cinder/tests/unit/objects/test_base.py b/cinder/tests/unit/objects/test_base.py index 1aa6662e827..e487ac48f96 100644 --- a/cinder/tests/unit/objects/test_base.py +++ b/cinder/tests/unit/objects/test_base.py @@ -587,6 +587,7 @@ class TestCinderDictObject(test_objects.BaseObjectsTestCase): obj = self.TestDictObject() self.assertIsNone(obj.get('non_existing')) self.assertEqual('val', obj.get('abc', 'val')) + self.assertIsNone(obj.get('abc')) obj.abc = 'val2' self.assertEqual('val2', obj.get('abc', 'val')) self.assertEqual(42, obj.get('foo'))