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
This commit is contained in:
Dan Smith 2015-10-22 08:28:24 -07:00
parent 2c3f9c339c
commit bc564eb7c4
2 changed files with 46 additions and 0 deletions

View File

@ -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

View File

@ -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')