diff --git a/oslo_versionedobjects/base.py b/oslo_versionedobjects/base.py index 9a64e654..c995bef7 100644 --- a/oslo_versionedobjects/base.py +++ b/oslo_versionedobjects/base.py @@ -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() diff --git a/oslo_versionedobjects/tests/test_objects.py b/oslo_versionedobjects/tests/test_objects.py index 8ccc40a5..e544a4db 100755 --- a/oslo_versionedobjects/tests/test_objects.py +++ b/oslo_versionedobjects/tests/test_objects.py @@ -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):