From 975f0156137e37f7a9139c0268547d79dcc3c43c Mon Sep 17 00:00:00 2001 From: Balazs Gibizer Date: Wed, 16 Jan 2019 10:57:07 +0100 Subject: [PATCH] Fix incompatible version handling in BuildRequest The BuildRequest object code assumed that IncompatibleObjectVersion exception has a objver field that contains the object version. This assumption is not true. The unit test made another mistake serializing the function object obj_to_primitive instead of serializing the result of the call of obj_to_primitive. This caused a false positive test covering the error in the implementation as well. Closes-Bug: #1812177 Change-Id: I1ef4a23aa2bf5cb46b481045f3d968f62f74606d --- nova/objects/build_request.py | 5 +++-- nova/tests/unit/objects/test_build_request.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/nova/objects/build_request.py b/nova/objects/build_request.py index 32c6c99a6eab..86303c62afe0 100644 --- a/nova/objects/build_request.py +++ b/nova/objects/build_request.py @@ -71,7 +71,7 @@ class BuildRequest(base.NovaObject): LOG.debug('Failed to load instance from BuildRequest with uuid ' '%s because it is None', self.instance_uuid) raise exception.BuildRequestNotFound(uuid=self.instance_uuid) - except ovoo_exc.IncompatibleObjectVersion as exc: + except ovoo_exc.IncompatibleObjectVersion: # This should only happen if proper service upgrade strategies are # not followed. Log the exception and raise BuildRequestNotFound. # If the instance can't be loaded this object is useless and may @@ -80,7 +80,8 @@ class BuildRequest(base.NovaObject): 'with uuid %(instance_uuid)s. Found version %(version)s ' 'which is not supported here.', dict(instance_uuid=self.instance_uuid, - version=exc.objver)) + version=jsonutils.loads( + db_instance)["nova_object.version"])) LOG.exception('Could not deserialize instance in BuildRequest') raise exception.BuildRequestNotFound(uuid=self.instance_uuid) # NOTE(sbauza): The instance primitive should already have the deleted diff --git a/nova/tests/unit/objects/test_build_request.py b/nova/tests/unit/objects/test_build_request.py index 5508607c3ae7..8597fe77f26f 100644 --- a/nova/tests/unit/objects/test_build_request.py +++ b/nova/tests/unit/objects/test_build_request.py @@ -59,7 +59,7 @@ class _TestBuildRequestObject(object): instance = fake_instance.fake_instance_obj(self.context, objects.Instance, uuid=fake_req['instance_uuid']) instance.VERSION = '99' - fake_req['instance'] = jsonutils.dumps(instance.obj_to_primitive) + fake_req['instance'] = jsonutils.dumps(instance.obj_to_primitive()) get_by_uuid.return_value = fake_req self.assertRaises(exception.BuildRequestNotFound,