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:
@@ -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()
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user