From ebf011f11ebb4d329e90e7ec0e498a3a6832e154 Mon Sep 17 00:00:00 2001 From: Balazs Gibizer Date: Wed, 16 Jan 2019 10:57:07 +0100 Subject: 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. Conflicts: nova/objects/build_request.py Note(elod.illes): conflict is due to not having patch Ie3a83fef0dc689b9d37ac43e047ce5d48f567adc on stable/pike. Closes-Bug: #1812177 Change-Id: I1ef4a23aa2bf5cb46b481045f3d968f62f74606d (cherry picked from commit 975f0156137e37f7a9139c0268547d79dcc3c43c) (cherry picked from commit 6061186d2d86eb628dcdc61667c240576fa8f10e) (cherry picked from commit 7c85ebad0bf13d609b384e7637b0787bf8d484f7) --- 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 6553dc4598..306e1d2947 100644 --- a/nova/objects/build_request.py +++ b/nova/objects/build_request.py @@ -72,7 +72,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 @@ -81,7 +81,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(_LE('Could not deserialize instance in ' 'BuildRequest')) raise exception.BuildRequestNotFound(uuid=self.instance_uuid) diff --git a/nova/tests/unit/objects/test_build_request.py b/nova/tests/unit/objects/test_build_request.py index a124581076..c4b654cde9 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, -- cgit v1.2.1