Add conditional object registration

This adds a register_if() method to the object registry, which allows for
conditional registration of the object class. It does, however, always
build the class properties and remotable methods, even if registration is
not performed. This is useful when it is desirable to control which
implementation of an object is used, or for testing purposes.

Change-Id: I0deb82744e7db659e8e75ce300b2c5417830f18d
This commit is contained in:
Dan Smith
2015-02-16 11:34:49 -08:00
parent aff35c92ff
commit 5138b697b6
2 changed files with 27 additions and 0 deletions

View File

@@ -131,6 +131,17 @@ class VersionedObjectRegistry(object):
registry._register_class(obj_cls)
return obj_cls
@classmethod
def register_if(cls, condition):
def wraps(obj_cls):
if condition:
registry = cls()
registry._register_class(obj_cls)
else:
_make_class_properties(obj_cls)
return obj_cls
return wraps
@classmethod
def obj_classes(cls):
registry = cls()

View File

@@ -194,6 +194,14 @@ class TestRegistry(test.TestCase):
class Fake1TestObj5(Fake1TestObj1):
VERSION = '1.1'
@base.VersionedObjectRegistry.register_if(False)
class ConditionalObj1(NewBaseClass):
fields = {'foo': fields.IntegerField()}
@base.VersionedObjectRegistry.register_if(True)
class ConditionalObj2(NewBaseClass):
fields = {'foo': fields.IntegerField()}
# Newest versions first in the list. Duplicate versions take the
# newest object.
expected = {'fake1': [Fake1TestObj4, Fake1TestObj5, Fake1TestObj2],
@@ -202,6 +210,14 @@ class TestRegistry(test.TestCase):
base.VersionedObjectRegistry.obj_classes()['fake1'])
self.assertEqual(expected['fake2'],
base.VersionedObjectRegistry.obj_classes()['fake2'])
self.assertEqual(
[],
base.VersionedObjectRegistry.obj_classes()['ConditionalObj1'])
self.assertTrue(hasattr(ConditionalObj1, 'foo'))
self.assertEqual(
[ConditionalObj2],
base.VersionedObjectRegistry.obj_classes()['ConditionalObj2'])
self.assertTrue(hasattr(ConditionalObj2, 'foo'))
def test_field_checking(self):
def create_class(field):