From bc564eb7c43bf2ec75aba2ae666158eb18d9256d Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Thu, 22 Oct 2015 08:28:24 -0700 Subject: [PATCH] Fix missing obj_make_compatible() for ImageMetaProps object This object was never added with an obj_make_compatible() handler for the many versions we've had since its introduction. This adds that, rules for the existing versions, and a test for the future. Note that version 1.6 added values to an enum, so this validates that an exception is raised during backporting if that field has a value that would be invalid for the requested version. Change-Id: I64d40b6fe5e738cf32537c73b9fec57a7fbcdf2d --- nova/objects/image_meta.py | 25 ++++++++++++++++++++++ nova/tests/unit/objects/test_image_meta.py | 21 ++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/nova/objects/image_meta.py b/nova/objects/image_meta.py index 83770e15ea..3294ca6aa6 100644 --- a/nova/objects/image_meta.py +++ b/nova/objects/image_meta.py @@ -14,6 +14,7 @@ import copy +from nova import exception from nova import objects from nova.objects import base from nova.objects import fields @@ -147,6 +148,30 @@ class ImageMetaProps(base.NovaObject): # Version 1.7: added img_config_drive field VERSION = ImageMeta.VERSION + def obj_make_compatible(self, primitive, target_version): + super(ImageMetaProps, self).obj_make_compatible(primitive, + target_version) + target_version = utils.convert_version_to_tuple(target_version) + if target_version < (1, 7): + primitive.pop('img_config_drive', None) + if target_version < (1, 5): + primitive.pop('os_admin_user', None) + if target_version < (1, 4): + primitive.pop('hw_vif_multiqueue_enabled', None) + if target_version < (1, 2): + primitive.pop('img_hv_type', None) + primitive.pop('img_hv_requested_version', None) + if target_version < (1, 1): + primitive.pop('os_require_quiesce', None) + + if target_version < (1, 6): + bus = primitive.get('hw_disk_bus', None) + if bus in ('lxc', 'uml'): + raise exception.ObjectActionError( + action='obj_make_compatible', + reason='hw_disk_bus=%s not supported in version %s' % ( + bus, target_version)) + # Maximum number of NUMA nodes permitted for the guest topology NUMA_NODES_MAX = 128 diff --git a/nova/tests/unit/objects/test_image_meta.py b/nova/tests/unit/objects/test_image_meta.py index ae7dae3b6f..50befb6d5a 100644 --- a/nova/tests/unit/objects/test_image_meta.py +++ b/nova/tests/unit/objects/test_image_meta.py @@ -14,6 +14,7 @@ import datetime +from nova import exception from nova import objects from nova import test @@ -274,3 +275,23 @@ class TestImageMetaProps(test.NoDBTestCase): self.assertIsNone(virtprops.get("hw_numa_nodes")) self.assertEqual([set([0, 1, 2, 3])], virtprops.hw_numa_cpus) + + def test_obj_make_compatible(self): + props = { + 'img_config_drive': 'mandatory', + 'os_admin_user': 'root', + 'hw_vif_multiqueue_enabled': True, + 'img_hv_type': 'kvm', + 'img_hv_requested_version': '>= 1.0', + 'os_require_quiesce': True, + } + + obj = objects.ImageMetaProps(**props) + primitive = obj.obj_to_primitive('1.0') + self.assertFalse(any([x in primitive['nova_object.data'] + for x in props])) + + for bus in ('lxc', 'uml'): + obj.hw_disk_bus = bus + self.assertRaises(exception.ObjectActionError, + obj.obj_to_primitive, '1.0')