Sync ImageMetaPropsPayload fields

This change adds missing fields to the image metadata
notification object and adds a unit tests to assert
that the notification object and nova object stay in sync.

This change also adds unit tests to assert the notification
schema and fields are in sync and that the schema is
valid.

Change-Id: I36ea5d5e677ab3e6c88223b20f5377e9471c55db
Closes-Bug: #1856100
This commit is contained in:
Sean Mooney 2019-12-12 01:42:57 +00:00 committed by Eric Fried
parent 8c72241726
commit 7dce615362
4 changed files with 40 additions and 5 deletions

View File

@ -4,5 +4,5 @@
"hw_architecture": "x86_64"
},
"nova_object.name": "ImageMetaPropsPayload",
"nova_object.version": "1.2"
"nova_object.version": "1.3"
}

View File

@ -107,7 +107,8 @@ class ImageMetaPropsPayload(base.NotificationPayloadBase):
# Version 1.0: Initial version
# Version 1.1: Added 'gop', 'virtio' and 'none' to hw_video_model field
# Version 1.2: Added hw_pci_numa_affinity_policy field
VERSION = '1.2'
# Version 1.3: Added hw_mem_encryption, hw_pmu and hw_time_hpet fields
VERSION = '1.3'
SCHEMA = {
'hw_architecture': ('image_meta_props', 'hw_architecture'),
@ -130,12 +131,14 @@ class ImageMetaPropsPayload(base.NotificationPayloadBase):
'hw_firmware_type': ('image_meta_props', 'hw_firmware_type'),
'hw_ipxe_boot': ('image_meta_props', 'hw_ipxe_boot'),
'hw_machine_type': ('image_meta_props', 'hw_machine_type'),
'hw_mem_encryption': ('image_meta_props', 'hw_mem_encryption'),
'hw_mem_page_size': ('image_meta_props', 'hw_mem_page_size'),
'hw_numa_nodes': ('image_meta_props', 'hw_numa_nodes'),
'hw_numa_cpus': ('image_meta_props', 'hw_numa_cpus'),
'hw_numa_mem': ('image_meta_props', 'hw_numa_mem'),
'hw_pci_numa_affinity_policy': ('image_meta_props',
'hw_pci_numa_affinity_policy'),
'hw_pmu': ('image_meta_props', 'hw_pmu'),
'hw_pointer_model': ('image_meta_props', 'hw_pointer_model'),
'hw_qemu_guest_agent': ('image_meta_props', 'hw_qemu_guest_agent'),
'hw_rescue_bus': ('image_meta_props', 'hw_rescue_bus'),
@ -143,6 +146,7 @@ class ImageMetaPropsPayload(base.NotificationPayloadBase):
'hw_rng_model': ('image_meta_props', 'hw_rng_model'),
'hw_serial_port_count': ('image_meta_props', 'hw_serial_port_count'),
'hw_scsi_model': ('image_meta_props', 'hw_scsi_model'),
'hw_time_hpet': ('image_meta_props', 'hw_time_hpet'),
'hw_video_model': ('image_meta_props', 'hw_video_model'),
'hw_video_ram': ('image_meta_props', 'hw_video_ram'),
'hw_vif_model': ('image_meta_props', 'hw_vif_model'),
@ -209,11 +213,13 @@ class ImageMetaPropsPayload(base.NotificationPayloadBase):
'hw_firmware_type': fields.FirmwareTypeField(),
'hw_ipxe_boot': fields.FlexibleBooleanField(),
'hw_machine_type': fields.StringField(),
'hw_mem_encryption': fields.FlexibleBooleanField(),
'hw_mem_page_size': fields.StringField(),
'hw_numa_nodes': fields.IntegerField(),
'hw_numa_cpus': fields.ListOfSetsOfIntegersField(),
'hw_numa_mem': fields.ListOfIntegersField(),
'hw_pci_numa_affinity_policy': fields.PCINUMAAffinityPolicyField(),
'hw_pmu': fields.FlexibleBooleanField(),
'hw_pointer_model': fields.PointerModelField(),
'hw_qemu_guest_agent': fields.FlexibleBooleanField(),
'hw_rescue_bus': fields.DiskBusField(),
@ -221,6 +227,7 @@ class ImageMetaPropsPayload(base.NotificationPayloadBase):
'hw_rng_model': fields.RNGModelField(),
'hw_serial_port_count': fields.IntegerField(),
'hw_scsi_model': fields.SCSIModelField(),
'hw_time_hpet': fields.FlexibleBooleanField(),
'hw_video_model': fields.VideoModelField(),
'hw_video_ram': fields.IntegerField(),
'hw_vif_model': fields.VIFModelField(),

View File

@ -1262,7 +1262,7 @@ class TestInstanceNotificationSample(
'nova_object.data': {},
'nova_object.name': 'ImageMetaPropsPayload',
'nova_object.namespace': 'nova',
'nova_object.version': u'1.2'},
'nova_object.version': u'1.3'},
'image.size': 58145823,
'image.tags': [],
'scheduler_hints': {'_nova_check_type': ['rebuild']},
@ -1359,7 +1359,7 @@ class TestInstanceNotificationSample(
'nova_object.data': {},
'nova_object.name': 'ImageMetaPropsPayload',
'nova_object.namespace': 'nova',
'nova_object.version': u'1.2'},
'nova_object.version': u'1.3'},
'image.size': 58145823,
'image.tags': [],
'scheduler_hints': {'_nova_check_type': ['rebuild']},

View File

@ -20,6 +20,7 @@ from oslo_versionedobjects import fixture
from nova import exception
from nova.notifications.objects import base as notification
from nova.notifications.objects.image import ImageMetaPropsPayload
from nova import objects
from nova.objects import base
from nova.objects import fields
@ -383,7 +384,7 @@ notification_object_data = {
'FlavorNotification': '1.0-a73147b93b520ff0061865849d3dfa56',
'FlavorPayload': '1.4-2e7011b8b4e59167fe8b7a0a81f0d452',
'ImageMetaPayload': '1.0-0e65beeacb3393beed564a57bc2bc989',
'ImageMetaPropsPayload': '1.2-f237f65e1f14f05a73481dc4192df3ba',
'ImageMetaPropsPayload': '1.3-9c200c895932163a4e14e6bb385fa1e0',
'InstanceActionNotification': '1.0-a73147b93b520ff0061865849d3dfa56',
'InstanceActionPayload': '1.8-4fa3da9cbf0761f1f700ae578f36dc2f',
'InstanceActionRebuildNotification':
@ -479,6 +480,33 @@ class TestNotificationObjectVersions(test.NoDBTestCase):
self.assertNotEqual(old_hash, new_hash)
class TestImageMetaPropsPayloadNotifications(test.NoDBTestCase):
def setUp(self):
super().setUp()
base.NovaObjectRegistry.register_notification_objects()
def test_object_field_sync(self):
"""Assert the fields of the ImageMetaPropsPayload object are
in sync with the fields of the ImageMetaProps object.
"""
self.assertEqual(
ImageMetaPropsPayload.fields.keys(),
objects.image_meta.ImageMetaProps.fields.keys())
def test_schema_field_sync(self):
"""Assert the fields of the ImageMetaPropsPayload object are
in sync with schema definition.
"""
self.assertEqual(
ImageMetaPropsPayload.fields.keys(),
ImageMetaPropsPayload.SCHEMA.keys())
def test_schema(self):
"""Assert the schema is generated correctly"""
for key, value in ImageMetaPropsPayload.SCHEMA.items():
self.assertEqual(('image_meta_props', key), value)
def get_extra_data(obj_class):
extra_data = tuple()