A nicer calling convention for object instantiation

This patch makes the base object constructor take some arguments
to streamline the process of creating a new object. By taking
a context and an optional set of keyword args, we can reduce
the lines of code required to create an object from many to, often,
one.

Change-Id: Id85c70d04af500ece48e9c93ee55a8e3d579299d
This commit is contained in:
Dan Smith
2013-10-16 08:58:12 -07:00
parent 6affe67067
commit 7e1731983c
3 changed files with 16 additions and 5 deletions

View File

@@ -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):

View File

@@ -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:

View File

@@ -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