diff --git a/nova/objects/base.py b/nova/objects/base.py index 24df30f93782..d161ad5bf7f6 100644 --- a/nova/objects/base.py +++ b/nova/objects/base.py @@ -177,9 +177,11 @@ class NovaObject(object): fields = {} obj_extra_fields = [] - def __init__(self): + def __init__(self, context=None, **kwargs): self._changed_fields = set() - self._context = None + self._context = context + for key in kwargs.keys(): + self[key] = kwargs[key] @classmethod def obj_name(cls): diff --git a/nova/objects/instance.py b/nova/objects/instance.py index 4d72f9c9da42..405690deae77 100644 --- a/nova/objects/instance.py +++ b/nova/objects/instance.py @@ -163,15 +163,18 @@ class Instance(base.NovaPersistentObject, base.NovaObject): def __init__(self, *args, **kwargs): super(Instance, self).__init__(*args, **kwargs) - self.obj_reset_changes() + self._reset_metadata_tracking() - def obj_reset_changes(self, fields=None): - super(Instance, self).obj_reset_changes(fields) + def _reset_metadata_tracking(self): self._orig_system_metadata = (dict(self.system_metadata) if 'system_metadata' in self else {}) self._orig_metadata = (dict(self.metadata) if 'metadata' in self else {}) + def obj_reset_changes(self, fields=None): + super(Instance, self).obj_reset_changes(fields) + self._reset_metadata_tracking() + def obj_what_changed(self): changes = super(Instance, self).obj_what_changed() if 'metadata' in self and self.metadata != self._orig_metadata: diff --git a/nova/tests/objects/test_objects.py b/nova/tests/objects/test_objects.py index e7dc1856336d..1e46e1525823 100644 --- a/nova/tests/objects/test_objects.py +++ b/nova/tests/objects/test_objects.py @@ -647,6 +647,12 @@ class _TestObject(object): obj = TestObj() self.assertEqual(['foo', 'bar'], obj.obj_fields) + def test_obj_constructor(self): + obj = MyObj(context=self.context, foo=123, bar='abc') + self.assertEqual(123, obj.foo) + self.assertEqual('abc', obj.bar) + self.assertEqual(set(['foo', 'bar']), obj.obj_what_changed()) + class TestObject(_LocalTest, _TestObject): pass