diff --git a/cinder/objects/base.py b/cinder/objects/base.py index 61498370d8a..2d012848d87 100644 --- a/cinder/objects/base.py +++ b/cinder/objects/base.py @@ -238,7 +238,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 6e95124c334..cb14df5f5e5 100644 --- a/cinder/tests/unit/objects/test_base.py +++ b/cinder/tests/unit/objects/test_base.py @@ -559,6 +559,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'))