From 5138b697b6665c0738fd95aaeeff5581a0d88a99 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Mon, 16 Feb 2015 11:34:49 -0800 Subject: [PATCH] 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 --- oslo_versionedobjects/base.py | 11 +++++++++++ oslo_versionedobjects/tests/test_objects.py | 16 ++++++++++++++++ 2 files changed, 27 insertions(+) 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):