From bbceb088ebcf9be5be0c54dc9851637e3815e7b5 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Thu, 23 Jan 2020 11:17:09 +0000 Subject: [PATCH] Handle unregistered nested objects The 'obj_tree_get_versions' function is used by e.g. the 'test_compatibility_routines' fixture to sanity check object versioning and we don't do things like remove objects that are referenced elsewhere. Unfortunately if we do this exact thing, an unhelpful 'IndexError' is raised. Handle things better and raise a specific exception with hints towards what may be the root cause. Change-Id: I7c05c648a9efb018ef9718fa31a9cc075482db59 Signed-off-by: Stephen Finucane Closes-bug: #1860652 --- oslo_versionedobjects/base.py | 6 +++++- oslo_versionedobjects/exception.py | 5 +++++ oslo_versionedobjects/tests/test_objects.py | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/oslo_versionedobjects/base.py b/oslo_versionedobjects/base.py index cc0abb90..acb183da 100644 --- a/oslo_versionedobjects/base.py +++ b/oslo_versionedobjects/base.py @@ -1172,7 +1172,11 @@ def obj_tree_get_versions(objname, tree=None): else: continue - obj_tree_get_versions(child_cls, tree=tree) + try: + obj_tree_get_versions(child_cls, tree=tree) + except IndexError: + raise exception.UnregisteredSubobject( + child_objname=child_cls, parent_objname=objname) return tree diff --git a/oslo_versionedobjects/exception.py b/oslo_versionedobjects/exception.py index 1541bcfa..f2bad38c 100644 --- a/oslo_versionedobjects/exception.py +++ b/oslo_versionedobjects/exception.py @@ -189,3 +189,8 @@ class InvalidTargetVersion(VersionedObjectsException): class TargetBeforeSubobjectExistedException(VersionedObjectsException): msg_fmt = _("No subobject existed at version %(target_version)s") + + +class UnregisteredSubobject(VersionedObjectsException): + msg_fmt = _("%(child_objname)s is referenced by %(parent_objname)s but " + "is not registered") diff --git a/oslo_versionedobjects/tests/test_objects.py b/oslo_versionedobjects/tests/test_objects.py index 9598cd51..093ab1f6 100644 --- a/oslo_versionedobjects/tests/test_objects.py +++ b/oslo_versionedobjects/tests/test_objects.py @@ -2354,6 +2354,22 @@ class TestUtilityMethods(test.TestCase): 'TestChildTwo': '4.56'}, tree) + def test_missing_referenced(self): + """Ensure a missing child object is highlighted.""" + @base.VersionedObjectRegistry.register + class TestObjectFoo(base.VersionedObject): + VERSION = '1.23' + fields = { + # note that this object does not exist + 'child': fields.ObjectField('TestChildBar'), + } + + exc = self.assertRaises(exception.UnregisteredSubobject, + base.obj_tree_get_versions, + 'TestObjectFoo') + self.assertIn('TestChildBar is referenced by TestObjectFoo', + exc.format_message()) + class TestListObjectConcat(test.TestCase): def test_list_object_concat(self):