diff --git a/ironic/objects/volume_connector.py b/ironic/objects/volume_connector.py index c66535f0bc..e91706d78c 100644 --- a/ironic/objects/volume_connector.py +++ b/ironic/objects/volume_connector.py @@ -20,6 +20,7 @@ from ironic.common import exception from ironic.db import api as db_api from ironic.objects import base from ironic.objects import fields as object_fields +from ironic.objects import notification @base.IronicObjectRegistry.register @@ -240,3 +241,44 @@ class VolumeConnector(base.IronicObject, current = self.get_by_uuid(self._context, uuid=self.uuid) self.obj_refresh(current) self.obj_reset_changes() + + +@base.IronicObjectRegistry.register +class VolumeConnectorCRUDNotification(notification.NotificationBase): + """Notification emitted at CRUD of a volume connector.""" + # Version 1.0: Initial version + VERSION = '1.0' + + fields = { + 'payload': object_fields.ObjectField('VolumeConnectorCRUDPayload') + } + + +@base.IronicObjectRegistry.register +class VolumeConnectorCRUDPayload(notification.NotificationPayloadBase): + """Payload schema for CRUD of a volume connector.""" + # Version 1.0: Initial version + VERSION = '1.0' + + SCHEMA = { + 'extra': ('connector', 'extra'), + 'type': ('connector', 'type'), + 'connector_id': ('connector', 'connector_id'), + 'created_at': ('connector', 'created_at'), + 'updated_at': ('connector', 'updated_at'), + 'uuid': ('connector', 'uuid'), + } + + fields = { + 'extra': object_fields.FlexibleDictField(nullable=True), + 'type': object_fields.StringField(nullable=True), + 'connector_id': object_fields.StringField(nullable=True), + 'node_uuid': object_fields.UUIDField(), + 'created_at': object_fields.DateTimeField(nullable=True), + 'updated_at': object_fields.DateTimeField(nullable=True), + 'uuid': object_fields.UUIDField(), + } + + def __init__(self, connector, node_uuid): + super(VolumeConnectorCRUDPayload, self).__init__(node_uuid=node_uuid) + self.populate_schema(connector=connector) diff --git a/ironic/objects/volume_target.py b/ironic/objects/volume_target.py index 20092c445a..68a54c4357 100644 --- a/ironic/objects/volume_target.py +++ b/ironic/objects/volume_target.py @@ -20,6 +20,7 @@ from ironic.common import exception from ironic.db import api as db_api from ironic.objects import base from ironic.objects import fields as object_fields +from ironic.objects import notification @base.IronicObjectRegistry.register @@ -263,3 +264,47 @@ class VolumeTarget(base.IronicObject, current = self.get_by_uuid(self._context, uuid=self.uuid) self.obj_refresh(current) self.obj_reset_changes() + + +@base.IronicObjectRegistry.register +class VolumeTargetCRUDNotification(notification.NotificationBase): + """Notification emitted at CRUD of a volume target.""" + # Version 1.0: Initial version + VERSION = '1.0' + + fields = { + 'payload': object_fields.ObjectField('VolumeTargetCRUDPayload') + } + + +@base.IronicObjectRegistry.register +class VolumeTargetCRUDPayload(notification.NotificationPayloadBase): + # Version 1.0: Initial Version + VERSION = '1.0' + + SCHEMA = { + 'boot_index': ('target', 'boot_index'), + 'extra': ('target', 'extra'), + 'properties': ('target', 'properties'), + 'volume_id': ('target', 'volume_id'), + 'volume_type': ('target', 'volume_type'), + 'created_at': ('target', 'created_at'), + 'updated_at': ('target', 'updated_at'), + 'uuid': ('target', 'uuid'), + } + + fields = { + 'boot_index': object_fields.IntegerField(nullable=True), + 'extra': object_fields.FlexibleDictField(nullable=True), + 'node_uuid': object_fields.UUIDField(), + 'properties': object_fields.FlexibleDictField(nullable=True), + 'volume_id': object_fields.StringField(nullable=True), + 'volume_type': object_fields.StringField(nullable=True), + 'created_at': object_fields.DateTimeField(nullable=True), + 'updated_at': object_fields.DateTimeField(nullable=True), + 'uuid': object_fields.UUIDField(), + } + + def __init__(self, target, node_uuid): + super(VolumeTargetCRUDPayload, self).__init__(node_uuid=node_uuid) + self.populate_schema(target=target) diff --git a/ironic/tests/unit/objects/test_objects.py b/ironic/tests/unit/objects/test_objects.py index fc1eb3529e..f6656677ce 100644 --- a/ironic/tests/unit/objects/test_objects.py +++ b/ironic/tests/unit/objects/test_objects.py @@ -654,6 +654,10 @@ expected_object_fingerprints = { 'NodeConsoleNotification': '1.0-59acc533c11d306f149846f922739c15', 'PortgroupCRUDNotification': '1.0-59acc533c11d306f149846f922739c15', 'PortgroupCRUDPayload': '1.0-b73c1fecf0cef3aa56bbe3c7e2275018', + 'VolumeConnectorCRUDNotification': '1.0-59acc533c11d306f149846f922739c15', + 'VolumeConnectorCRUDPayload': '1.0-5e8dbb41e05b6149d8f7bfd4daff9339', + 'VolumeTargetCRUDNotification': '1.0-59acc533c11d306f149846f922739c15', + 'VolumeTargetCRUDPayload': '1.0-30dcc4735512c104a3a36a2ae1e2aeb2', } diff --git a/ironic/tests/unit/objects/test_volume_connector.py b/ironic/tests/unit/objects/test_volume_connector.py index 090fff3351..817914d891 100644 --- a/ironic/tests/unit/objects/test_volume_connector.py +++ b/ironic/tests/unit/objects/test_volume_connector.py @@ -21,9 +21,11 @@ from ironic.common import exception from ironic import objects from ironic.tests.unit.db import base as db_base from ironic.tests.unit.db import utils as db_utils +from ironic.tests.unit.objects import utils as obj_utils -class TestVolumeConnectorObject(db_base.DbTestCase): +class TestVolumeConnectorObject(db_base.DbTestCase, + obj_utils.SchemasTestMixIn): def setUp(self): super(TestVolumeConnectorObject, self).setUp() @@ -193,3 +195,7 @@ class TestVolumeConnectorObject(db_base.DbTestCase): vc_copy.name = 'aaff' # Ensure this passes and an exception is not generated vc_copy.save() + + def test_payload_schemas(self): + self._check_payload_schemas(objects.volume_connector, + objects.VolumeConnector.fields) diff --git a/ironic/tests/unit/objects/test_volume_target.py b/ironic/tests/unit/objects/test_volume_target.py index c22ab5233a..cbb467947f 100644 --- a/ironic/tests/unit/objects/test_volume_target.py +++ b/ironic/tests/unit/objects/test_volume_target.py @@ -21,9 +21,10 @@ from ironic.common import exception from ironic import objects from ironic.tests.unit.db import base as db_base from ironic.tests.unit.db import utils as db_utils +from ironic.tests.unit.objects import utils as obj_utils -class TestVolumeTargetObject(db_base.DbTestCase): +class TestVolumeTargetObject(db_base.DbTestCase, obj_utils.SchemasTestMixIn): def setUp(self): super(TestVolumeTargetObject, self).setUp() @@ -204,3 +205,7 @@ class TestVolumeTargetObject(db_base.DbTestCase): vt_copy.name = 'aaff' # Ensure this passes and an exception is not generated vt_copy.save() + + def test_payload_schemas(self): + self._check_payload_schemas(objects.volume_target, + objects.VolumeTarget.fields)