From 2bca6431e69bf2c6e657736b7fe11f5a2fbb9433 Mon Sep 17 00:00:00 2001 From: "shuangyang.qian" Date: Mon, 22 Jan 2018 15:55:14 +0800 Subject: [PATCH] Add action initiator attribute to the instance payload The instance action notifications contain the user id and the project id of the owner of the instance. However an instance action might be initiated by another user. It could be another user from the same project or can be an admin from the admin project. To be able to distinguish between the user who initiated the instance action from the user owning the instance we need to add two new fields to the instance action notifications, action_initiator_user and action_initiator_project Change-Id: I649d8a27baa8840bc1bb567fef027c749c663432 Closes-bug: #1744658 Blueprint: add-action-initiator-to-instance-action-notifications --- .../InstanceActionPayload.json | 2 +- .../InstanceActionRebuildPayload.json | 2 +- .../InstanceActionRescuePayload.json | 2 +- .../InstanceActionResizePrepPayload.json | 2 +- .../InstanceActionSnapshotPayload.json | 2 +- .../InstanceActionVolumePayload.json | 2 +- .../InstanceActionVolumeSwapPayload.json | 2 +- .../InstanceCreatePayload.json | 2 +- .../InstanceExistsPayload.json | 2 +- .../common_payloads/InstancePayload.json | 6 ++- .../InstanceUpdatePayload.json | 2 +- .../instance-evacuate.json | 3 +- .../instance-live_migration_abort-end.json | 3 +- .../instance-live_migration_abort-start.json | 3 +- ...instance-live_migration_post_dest-end.json | 3 +- ...stance-live_migration_post_dest-start.json | 3 +- .../instance-live_migration_pre-end.json | 3 +- .../instance-live_migration_pre-start.json | 3 +- .../instance-live_migration_rollback-end.json | 7 ++- ...nstance-live_migration_rollback-start.json | 7 ++- nova/notifications/objects/instance.py | 50 ++++++++++++++----- .../objects/test_notification.py | 22 ++++---- nova/tests/unit/test_notifications.py | 15 ++++++ ...action-notifications-27e6a3031da274c5.yaml | 8 +++ 24 files changed, 111 insertions(+), 45 deletions(-) create mode 100644 releasenotes/notes/add-action-initiator-to-instance-action-notifications-27e6a3031da274c5.yaml diff --git a/doc/notification_samples/common_payloads/InstanceActionPayload.json b/doc/notification_samples/common_payloads/InstanceActionPayload.json index b6b4eb37e6..c0886a6593 100644 --- a/doc/notification_samples/common_payloads/InstanceActionPayload.json +++ b/doc/notification_samples/common_payloads/InstanceActionPayload.json @@ -5,5 +5,5 @@ }, "nova_object.name":"InstanceActionPayload", "nova_object.namespace":"nova", - "nova_object.version":"1.6" + "nova_object.version":"1.7" } diff --git a/doc/notification_samples/common_payloads/InstanceActionRebuildPayload.json b/doc/notification_samples/common_payloads/InstanceActionRebuildPayload.json index 3b13ca71bb..5b641db59b 100644 --- a/doc/notification_samples/common_payloads/InstanceActionRebuildPayload.json +++ b/doc/notification_samples/common_payloads/InstanceActionRebuildPayload.json @@ -7,5 +7,5 @@ ] }, "nova_object.name": "InstanceActionRebuildPayload", - "nova_object.version": "1.7" + "nova_object.version": "1.8" } diff --git a/doc/notification_samples/common_payloads/InstanceActionRescuePayload.json b/doc/notification_samples/common_payloads/InstanceActionRescuePayload.json index 74fe77fff4..e70dd84b9f 100644 --- a/doc/notification_samples/common_payloads/InstanceActionRescuePayload.json +++ b/doc/notification_samples/common_payloads/InstanceActionRescuePayload.json @@ -4,5 +4,5 @@ "rescue_image_ref": "a2459075-d96c-40d5-893e-577ff92e721c" }, "nova_object.name": "InstanceActionRescuePayload", - "nova_object.version": "1.1" + "nova_object.version": "1.2" } diff --git a/doc/notification_samples/common_payloads/InstanceActionResizePrepPayload.json b/doc/notification_samples/common_payloads/InstanceActionResizePrepPayload.json index c5bc759020..cf7146b125 100644 --- a/doc/notification_samples/common_payloads/InstanceActionResizePrepPayload.json +++ b/doc/notification_samples/common_payloads/InstanceActionResizePrepPayload.json @@ -27,5 +27,5 @@ "task_state": "resize_prep" }, "nova_object.name": "InstanceActionResizePrepPayload", - "nova_object.version": "1.1" + "nova_object.version": "1.2" } diff --git a/doc/notification_samples/common_payloads/InstanceActionSnapshotPayload.json b/doc/notification_samples/common_payloads/InstanceActionSnapshotPayload.json index 32370569f5..371e1de3ae 100644 --- a/doc/notification_samples/common_payloads/InstanceActionSnapshotPayload.json +++ b/doc/notification_samples/common_payloads/InstanceActionSnapshotPayload.json @@ -5,5 +5,5 @@ }, "nova_object.name":"InstanceActionSnapshotPayload", "nova_object.namespace":"nova", - "nova_object.version":"1.7" + "nova_object.version":"1.8" } diff --git a/doc/notification_samples/common_payloads/InstanceActionVolumePayload.json b/doc/notification_samples/common_payloads/InstanceActionVolumePayload.json index 5610cdf022..289fd3218e 100644 --- a/doc/notification_samples/common_payloads/InstanceActionVolumePayload.json +++ b/doc/notification_samples/common_payloads/InstanceActionVolumePayload.json @@ -5,5 +5,5 @@ }, "nova_object.name": "InstanceActionVolumePayload", "nova_object.namespace": "nova", - "nova_object.version": "1.4" + "nova_object.version": "1.5" } \ No newline at end of file diff --git a/doc/notification_samples/common_payloads/InstanceActionVolumeSwapPayload.json b/doc/notification_samples/common_payloads/InstanceActionVolumeSwapPayload.json index 4737095e41..e0445b4375 100644 --- a/doc/notification_samples/common_payloads/InstanceActionVolumeSwapPayload.json +++ b/doc/notification_samples/common_payloads/InstanceActionVolumeSwapPayload.json @@ -6,5 +6,5 @@ }, "nova_object.name": "InstanceActionVolumeSwapPayload", "nova_object.namespace": "nova", - "nova_object.version": "1.6" + "nova_object.version": "1.7" } diff --git a/doc/notification_samples/common_payloads/InstanceCreatePayload.json b/doc/notification_samples/common_payloads/InstanceCreatePayload.json index 8162c67324..3586c9166e 100644 --- a/doc/notification_samples/common_payloads/InstanceCreatePayload.json +++ b/doc/notification_samples/common_payloads/InstanceCreatePayload.json @@ -23,5 +23,5 @@ ] }, "nova_object.name":"InstanceCreatePayload", - "nova_object.version": "1.9" + "nova_object.version": "1.10" } diff --git a/doc/notification_samples/common_payloads/InstanceExistsPayload.json b/doc/notification_samples/common_payloads/InstanceExistsPayload.json index 59f11c55da..735a8ce206 100644 --- a/doc/notification_samples/common_payloads/InstanceExistsPayload.json +++ b/doc/notification_samples/common_payloads/InstanceExistsPayload.json @@ -8,5 +8,5 @@ }, "nova_object.name":"InstanceExistsPayload", "nova_object.namespace":"nova", - "nova_object.version":"1.0" + "nova_object.version":"1.1" } diff --git a/doc/notification_samples/common_payloads/InstancePayload.json b/doc/notification_samples/common_payloads/InstancePayload.json index aabc0eaaca..f92c6b43b0 100644 --- a/doc/notification_samples/common_payloads/InstancePayload.json +++ b/doc/notification_samples/common_payloads/InstancePayload.json @@ -35,9 +35,11 @@ "updated_at": "2012-10-29T13:42:11Z", "user_id":"fake", "uuid":"178b0921-8f85-4257-88b6-2e743b5a975c", - "request_id": "req-5b6c791d-5709-4f36-8fbe-c3e02869e35d" + "request_id": "req-5b6c791d-5709-4f36-8fbe-c3e02869e35d", + "action_initiator_user": "fake", + "action_initiator_project": "6f70656e737461636b20342065766572" }, "nova_object.name":"InstancePayload", "nova_object.namespace":"nova", - "nova_object.version":"1.6" + "nova_object.version":"1.7" } diff --git a/doc/notification_samples/common_payloads/InstanceUpdatePayload.json b/doc/notification_samples/common_payloads/InstanceUpdatePayload.json index 088fb1331e..39072fa1b7 100644 --- a/doc/notification_samples/common_payloads/InstanceUpdatePayload.json +++ b/doc/notification_samples/common_payloads/InstanceUpdatePayload.json @@ -29,5 +29,5 @@ }, "nova_object.name": "InstanceUpdatePayload", "nova_object.namespace": "nova", - "nova_object.version": "1.7" + "nova_object.version": "1.8" } \ No newline at end of file diff --git a/doc/notification_samples/instance-evacuate.json b/doc/notification_samples/instance-evacuate.json index 4aadfb940e..c3251182c4 100644 --- a/doc/notification_samples/instance-evacuate.json +++ b/doc/notification_samples/instance-evacuate.json @@ -6,7 +6,8 @@ "host": "host2", "node": "host2", "power_state": "pending", - "task_state": "rebuilding" + "task_state": "rebuilding", + "action_initiator_user": "admin" } }, "priority": "INFO", diff --git a/doc/notification_samples/instance-live_migration_abort-end.json b/doc/notification_samples/instance-live_migration_abort-end.json index d7409407a4..c4d6dd4f02 100644 --- a/doc/notification_samples/instance-live_migration_abort-end.json +++ b/doc/notification_samples/instance-live_migration_abort-end.json @@ -3,7 +3,8 @@ "payload":{ "$ref": "common_payloads/InstanceActionPayload.json#", "nova_object.data":{ - "task_state": "migrating" + "task_state": "migrating", + "action_initiator_user": "admin" } }, "priority":"INFO", diff --git a/doc/notification_samples/instance-live_migration_abort-start.json b/doc/notification_samples/instance-live_migration_abort-start.json index 140037d087..ea0d0059fe 100644 --- a/doc/notification_samples/instance-live_migration_abort-start.json +++ b/doc/notification_samples/instance-live_migration_abort-start.json @@ -3,7 +3,8 @@ "payload":{ "$ref": "common_payloads/InstanceActionPayload.json#", "nova_object.data":{ - "task_state": "migrating" + "task_state": "migrating", + "action_initiator_user": "admin" } }, "priority":"INFO", diff --git a/doc/notification_samples/instance-live_migration_post_dest-end.json b/doc/notification_samples/instance-live_migration_post_dest-end.json index 77f426ccef..fe3e08bf6e 100644 --- a/doc/notification_samples/instance-live_migration_post_dest-end.json +++ b/doc/notification_samples/instance-live_migration_post_dest-end.json @@ -5,7 +5,8 @@ "nova_object.data":{ "host": "host2", "node": "host2", - "power_state": "pending" + "power_state": "pending", + "action_initiator_user": "admin" } }, "priority":"INFO", diff --git a/doc/notification_samples/instance-live_migration_post_dest-start.json b/doc/notification_samples/instance-live_migration_post_dest-start.json index 74c158249a..628cab683a 100644 --- a/doc/notification_samples/instance-live_migration_post_dest-start.json +++ b/doc/notification_samples/instance-live_migration_post_dest-start.json @@ -3,7 +3,8 @@ "payload":{ "$ref": "common_payloads/InstanceActionPayload.json#", "nova_object.data":{ - "task_state": "migrating" + "task_state": "migrating", + "action_initiator_user": "admin" } }, "priority":"INFO", diff --git a/doc/notification_samples/instance-live_migration_pre-end.json b/doc/notification_samples/instance-live_migration_pre-end.json index adeae1780a..34df5c9b1e 100644 --- a/doc/notification_samples/instance-live_migration_pre-end.json +++ b/doc/notification_samples/instance-live_migration_pre-end.json @@ -3,7 +3,8 @@ "payload": { "$ref": "common_payloads/InstanceActionPayload.json#", "nova_object.data": { - "task_state": "migrating" + "task_state": "migrating", + "action_initiator_user": "admin" } }, "priority": "INFO", diff --git a/doc/notification_samples/instance-live_migration_pre-start.json b/doc/notification_samples/instance-live_migration_pre-start.json index b9cb80c63c..17697f887e 100644 --- a/doc/notification_samples/instance-live_migration_pre-start.json +++ b/doc/notification_samples/instance-live_migration_pre-start.json @@ -3,7 +3,8 @@ "payload": { "$ref": "common_payloads/InstanceActionPayload.json#", "nova_object.data": { - "task_state": "migrating" + "task_state": "migrating", + "action_initiator_user": "admin" } }, "priority": "INFO", diff --git a/doc/notification_samples/instance-live_migration_rollback-end.json b/doc/notification_samples/instance-live_migration_rollback-end.json index 2fc8230685..6904dd09b7 100644 --- a/doc/notification_samples/instance-live_migration_rollback-end.json +++ b/doc/notification_samples/instance-live_migration_rollback-end.json @@ -1,6 +1,11 @@ { "event_type":"instance.live_migration_rollback.end", - "payload":{"$ref":"common_payloads/InstanceActionPayload.json#"}, + "payload":{ + "$ref":"common_payloads/InstanceActionPayload.json#", + "nova_object.data":{ + "action_initiator_user": "admin" + } + }, "priority":"INFO", "publisher_id":"nova-compute:compute" } diff --git a/doc/notification_samples/instance-live_migration_rollback-start.json b/doc/notification_samples/instance-live_migration_rollback-start.json index 834efc91d0..5bffa6057e 100644 --- a/doc/notification_samples/instance-live_migration_rollback-start.json +++ b/doc/notification_samples/instance-live_migration_rollback-start.json @@ -1,6 +1,11 @@ { "event_type":"instance.live_migration_rollback.start", - "payload":{"$ref":"common_payloads/InstanceActionPayload.json#"}, + "payload":{ + "$ref":"common_payloads/InstanceActionPayload.json#", + "nova_object.data":{ + "action_initiator_user": "admin" + } + }, "priority":"INFO", "publisher_id":"nova-compute:compute" } diff --git a/nova/notifications/objects/instance.py b/nova/notifications/objects/instance.py index c85db2b633..74ce1fc518 100644 --- a/nova/notifications/objects/instance.py +++ b/nova/notifications/objects/instance.py @@ -66,7 +66,9 @@ class InstancePayload(base.NotificationPayloadBase): # Version 1.4: Add BDM related data # Version 1.5: Add updated_at field # Version 1.6: Add request_id field - VERSION = '1.6' + # Version 1.7: Added action_initiator_user and action_initiator_project to + # InstancePayload + VERSION = '1.7' fields = { 'uuid': fields.UUIDField(), 'user_id': fields.StringField(nullable=True), @@ -109,6 +111,8 @@ class InstancePayload(base.NotificationPayloadBase): 'auto_disk_config': fields.DiskConfigField(), 'request_id': fields.StringField(nullable=True), + 'action_initiator_user': fields.StringField(nullable=True), + 'action_initiator_project': fields.StringField(nullable=True), } def __init__(self, context, instance, bdms=None): @@ -126,7 +130,8 @@ class InstancePayload(base.NotificationPayloadBase): # consistent request_id. self.request_id = context.request_id if (context.project_id and context.user_id) else None - + self.action_initiator_user = context.user_id + self.action_initiator_project = context.project_id self.populate_schema(instance=instance) @@ -140,7 +145,9 @@ class InstanceActionPayload(InstancePayload): # Version 1.4: Add BDM related data # Version 1.5: Added updated_at field to InstancePayload # Version 1.6: Added request_id field to InstancePayload - VERSION = '1.6' + # Version 1.7: Added action_initiator_user and action_initiator_project to + # InstancePayload + VERSION = '1.7' fields = { 'fault': fields.ObjectField('ExceptionPayload', nullable=True), 'request_id': fields.StringField(nullable=True), @@ -160,8 +167,9 @@ class InstanceActionVolumePayload(InstanceActionPayload): # Version 1.2: Add BDM related data # Version 1.3: Added updated_at field to InstancePayload # Version 1.4: Added request_id field to InstancePayload - - VERSION = '1.4' + # Version 1.5: Added action_initiator_user and action_initiator_project to + # InstancePayload + VERSION = '1.5' fields = { 'volume_id': fields.UUIDField() } @@ -184,7 +192,9 @@ class InstanceActionVolumeSwapPayload(InstanceActionPayload): # Version 1.4: Add BDM related data # Version 1.5: Added updated_at field to InstancePayload # Version 1.6: Added request_id field to InstancePayload - VERSION = '1.6' + # Version 1.7: Added action_initiator_user and action_initiator_project to + # InstancePayload + VERSION = '1.7' fields = { 'old_volume_id': fields.UUIDField(), 'new_volume_id': fields.UUIDField(), @@ -216,7 +226,9 @@ class InstanceCreatePayload(InstanceActionPayload): # 1.8: Added request_id field to InstancePayload # 1.9: Add trusted_image_certificates field to # InstanceCreatePayload - VERSION = '1.9' + # 1.10: Added action_initiator_user and action_initiator_project to + # InstancePayload + VERSION = '1.10' fields = { 'keypairs': fields.ListOfObjectsField('KeypairPayload'), @@ -246,7 +258,9 @@ class InstanceActionResizePrepPayload(InstanceActionPayload): # Version 1.0: Initial version # Version 1.1: Added request_id field to InstancePayload - VERSION = '1.1' + # Version 1.2: Added action_initiator_user and action_initiator_project to + # InstancePayload + VERSION = '1.2' fields = { 'new_flavor': fields.ObjectField('FlavorPayload', nullable=True) } @@ -269,7 +283,9 @@ class InstanceUpdatePayload(InstancePayload): # Version 1.5: Add BDM related data # Version 1.6: Added updated_at field to InstancePayload # Version 1.7: Added request_id field to InstancePayload - VERSION = '1.7' + # Version 1.8: Added action_initiator_user and action_initiator_project to + # InstancePayload + VERSION = '1.8' fields = { 'state_update': fields.ObjectField('InstanceStateUpdatePayload'), 'audit_period': fields.ObjectField('AuditPeriodPayload'), @@ -294,7 +310,9 @@ class InstanceUpdatePayload(InstancePayload): class InstanceActionRescuePayload(InstanceActionPayload): # Version 1.0: Initial version # Version 1.1: Added request_id field to InstancePayload - VERSION = '1.1' + # Version 1.2: Added action_initiator_user and action_initiator_project to + # InstancePayload + VERSION = '1.2' fields = { 'rescue_image_ref': fields.UUIDField(nullable=True) } @@ -316,7 +334,9 @@ class InstanceActionRebuildPayload(InstanceActionPayload): # when this specific payload is created so that the # instance.rebuild.* notifications using this new payload # signal the change of nova_object.name. - VERSION = '1.7' + # Version 1.8: Added action_initiator_user and action_initiator_project to + # InstancePayload + VERSION = '1.8' fields = { 'trusted_image_certificates': fields.ListOfStringsField( nullable=True) @@ -661,7 +681,9 @@ class InstanceActionSnapshotPayload(InstanceActionPayload): # also it added a new field so we wanted to keep the version # number increasing to signal the change. # Version 1.7: Added request_id field to InstancePayload - VERSION = '1.7' + # Version 1.8: Added action_initiator_user and action_initiator_project to + # InstancePayload + VERSION = '1.8' fields = { 'snapshot_image_id': fields.UUIDField(), } @@ -677,7 +699,9 @@ class InstanceActionSnapshotPayload(InstanceActionPayload): @nova_base.NovaObjectRegistry.register_notification class InstanceExistsPayload(InstancePayload): # Version 1.0: Initial version - VERSION = '1.0' + # Version 1.1: Added action_initiator_user and action_initiator_project to + # InstancePayload + VERSION = '1.1' fields = { 'audit_period': fields.ObjectField('AuditPeriodPayload'), 'bandwidth': fields.ListOfObjectsField('BandwidthPayload'), diff --git a/nova/tests/unit/notifications/objects/test_notification.py b/nova/tests/unit/notifications/objects/test_notification.py index 8b1e5434b0..26a890f759 100644 --- a/nova/tests/unit/notifications/objects/test_notification.py +++ b/nova/tests/unit/notifications/objects/test_notification.py @@ -375,31 +375,31 @@ notification_object_data = { 'FlavorNotification': '1.0-a73147b93b520ff0061865849d3dfa56', 'FlavorPayload': '1.4-2e7011b8b4e59167fe8b7a0a81f0d452', 'InstanceActionNotification': '1.0-a73147b93b520ff0061865849d3dfa56', - 'InstanceActionPayload': '1.6-e9e4cbb94e07d3bcaa22743f41e094c8', + 'InstanceActionPayload': '1.7-8c77f0c85a83d325fded152376ca809a', 'InstanceActionRebuildNotification': '1.0-a73147b93b520ff0061865849d3dfa56', - 'InstanceActionRebuildPayload': '1.7-db0d6d549a7932428cdc0c7ca78859b5', + 'InstanceActionRebuildPayload': '1.8-ab76ecbf73b82bc010ab82bdc2792e1d', 'InstanceActionRescueNotification': '1.0-a73147b93b520ff0061865849d3dfa56', - 'InstanceActionRescuePayload': '1.1-99b9b25574b77abf6d3e5a0cea341b06', + 'InstanceActionRescuePayload': '1.2-b82aa24a966713dce26de3126716e8ef', 'InstanceActionResizePrepNotification': '1.0-a73147b93b520ff0061865849d3dfa56', - 'InstanceActionResizePrepPayload': '1.1-9dd5cd4124c660a86e3f00a2df222b8e', + 'InstanceActionResizePrepPayload': '1.2-1b41bec00f2b679e77a906b1df0c1d5a', 'InstanceActionVolumeNotification': '1.0-a73147b93b520ff0061865849d3dfa56', - 'InstanceActionVolumePayload': '1.4-83fcb4c12327da998116844ef4a16235', + 'InstanceActionVolumePayload': '1.5-3027aae42ee85155b2c378fad1f3b678', 'InstanceActionVolumeSwapNotification': '1.0-a73147b93b520ff0061865849d3dfa56', - 'InstanceActionVolumeSwapPayload': '1.6-bb322fd649d3626c7a83d5f2d9a866d4', + 'InstanceActionVolumeSwapPayload': '1.7-d3252403a9437bcdc80f1075214f8b45', 'InstanceCreateNotification': '1.0-a73147b93b520ff0061865849d3dfa56', - 'InstanceCreatePayload': '1.9-1c9f722bf51ddae910fb7e50fff8edd1', - 'InstancePayload': '1.6-b1e7818c7adf158e8a6e87e0944b0b21', + 'InstanceCreatePayload': '1.10-291b44932569b8ff864d911814293cfc', + 'InstancePayload': '1.7-78354572f699b9a6ad9996b199d03375', 'InstanceActionSnapshotNotification': '1.0-a73147b93b520ff0061865849d3dfa56', - 'InstanceActionSnapshotPayload': '1.7-73f96d93ca47750bb6a45e4ab1d268fd', + 'InstanceActionSnapshotPayload': '1.8-6a3a66f823b56268ea4b759c83e38c31', 'InstanceExistsNotification': '1.0-a73147b93b520ff0061865849d3dfa56', - 'InstanceExistsPayload': '1.0-9b0c1232136e6c850647dfabb63cff07', + 'InstanceExistsPayload': '1.1-b7095abb18f5b75f39dc1aa59942535d', 'InstanceStateUpdatePayload': '1.0-07e111c0fa0f6db0f79b0726d593e3da', 'InstanceUpdateNotification': '1.0-a73147b93b520ff0061865849d3dfa56', - 'InstanceUpdatePayload': '1.7-d48dd2cf8310c8f250dfeb65fd9df97a', + 'InstanceUpdatePayload': '1.8-375131acb12e612a460f68211a2b3a35', 'IpPayload': '1.0-8ecf567a99e516d4af094439a7632d34', 'KeypairNotification': '1.0-a73147b93b520ff0061865849d3dfa56', 'KeypairPayload': '1.0-6daebbbde0e1bf35c1556b1ecd9385c1', diff --git a/nova/tests/unit/test_notifications.py b/nova/tests/unit/test_notifications.py index c77f0183a8..aa005d7bdf 100644 --- a/nova/tests/unit/test_notifications.py +++ b/nova/tests/unit/test_notifications.py @@ -465,6 +465,21 @@ class NotificationsTestCase(test.TestCase): fake_notifier.VERSIONED_NOTIFICATIONS[0] ['payload']['nova_object.data']['tags']) + def test_send_versioned_action_initiator_update(self): + notifications.send_update(self.context, self.instance, self.instance) + action_initiator_user = self.context.user_id + action_initiator_project = self.context.project_id + self.assertEqual(1, len(fake_notifier.VERSIONED_NOTIFICATIONS)) + + self.assertEqual(action_initiator_user, + fake_notifier.VERSIONED_NOTIFICATIONS[0] + ['payload']['nova_object.data'] + ['action_initiator_user']) + self.assertEqual(action_initiator_project, + fake_notifier.VERSIONED_NOTIFICATIONS[0] + ['payload']['nova_object.data'] + ['action_initiator_project']) + def test_send_no_state_change(self): called = [False] diff --git a/releasenotes/notes/add-action-initiator-to-instance-action-notifications-27e6a3031da274c5.yaml b/releasenotes/notes/add-action-initiator-to-instance-action-notifications-27e6a3031da274c5.yaml new file mode 100644 index 0000000000..d09fa85391 --- /dev/null +++ b/releasenotes/notes/add-action-initiator-to-instance-action-notifications-27e6a3031da274c5.yaml @@ -0,0 +1,8 @@ +--- +features: + - | + Instance action versioned notifications now contain + ``action_initiator_user`` and ``action_initiator_project`` + fields to distinguish between the owner of the instance and + who initiated the action upon the instance, for example an + administrator or another user within the same project. \ No newline at end of file