summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Smith <danms@us.ibm.com>2013-06-17 15:05:17 -0700
committerDan Smith <danms@us.ibm.com>2013-06-17 15:11:16 -0700
commite91c3d141c957485dcb66c73e84b41b775e4268b (patch)
tree969bed89cd4482d0f98644cb75ddfed03c1dd2e3
parent328b347cd058f1c87d7e32a18d9decc0ba517266 (diff)
downloadnova-e91c3d141c957485dcb66c73e84b41b775e4268b.tar.gz
nova-e91c3d141c957485dcb66c73e84b41b775e4268b.tar.xz
nova-e91c3d141c957485dcb66c73e84b41b775e4268b.zip
Make NovaObject support extra attributes in items()
An object could define a field as a property, which needs to get included in items() and iteritems() for dict compatibility. Related to blueprint unified-object-model Change-Id: I2ca665e70fc6d3c9664ae7a74dffd99a56f6a8c1
-rw-r--r--nova/objects/base.py6
-rw-r--r--nova/objects/instance.py2
-rw-r--r--nova/tests/objects/test_instance.py9
3 files changed, 15 insertions, 2 deletions
diff --git a/nova/objects/base.py b/nova/objects/base.py
index 2e0797477..b6071779f 100644
--- a/nova/objects/base.py
+++ b/nova/objects/base.py
@@ -182,6 +182,7 @@ class NovaObject(object):
'deleted_at': obj_utils.datetime_or_str_or_none,
'deleted': bool,
}
+ obj_extra_fields = []
def __init__(self):
self._changed_fields = set()
@@ -330,8 +331,9 @@ class NovaObject(object):
NOTE(danms): May be removed in the future.
"""
- for name in self.fields:
- if hasattr(self, get_attrname(name)):
+ for name in self.fields.keys() + self.obj_extra_fields:
+ if (hasattr(self, get_attrname(name)) or
+ name in self.obj_extra_fields):
yield name, getattr(self, name)
items = lambda self: list(self.iteritems())
diff --git a/nova/objects/instance.py b/nova/objects/instance.py
index aec6fe968..592206476 100644
--- a/nova/objects/instance.py
+++ b/nova/objects/instance.py
@@ -110,6 +110,8 @@ class Instance(base.NovaObject):
}
+ obj_extra_fields = ['name']
+
@property
def name(self):
try:
diff --git a/nova/tests/objects/test_instance.py b/nova/tests/objects/test_instance.py
index a9238a924..91c59f6ff 100644
--- a/nova/tests/objects/test_instance.py
+++ b/nova/tests/objects/test_instance.py
@@ -212,6 +212,15 @@ class _TestInstanceObject(object):
inst.info_cache.network_info = 'bar'
inst.save()
+ def test_iteritems_with_extra_attrs(self):
+ self.stubs.Set(instance.Instance, 'name', 'foo')
+ inst = instance.Instance()
+ inst.uuid = 'fake-uuid'
+ self.assertEqual(inst.items(),
+ {'uuid': 'fake-uuid',
+ 'name': 'foo',
+ }.items())
+
class TestInstanceObject(test_objects._LocalTest,
_TestInstanceObject):