From 23efc549a1d01242f0b239aeb1fc45fcafa32d8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Antal?= Date: Wed, 5 Jul 2017 14:39:01 +0200 Subject: [PATCH] Transform instance.live_migration_force_complete notification The instance.live_migration_force_complete.start and instance.live_migration_force_complete.end notifications have been transformed to the versioned notification framework. Co-Authored-By: Takashi Natsume Change-Id: I2e9a474457a7597a9febc111b13a67ddcf45f29e Implements: bp versioned-notification-transformation-rocky --- ...nce-live_migration_force_complete-end.json | 12 ++++++ ...e-live_migration_force_complete-start.json | 12 ++++++ nova/compute/manager.py | 8 ++++ nova/notifications/objects/base.py | 4 +- nova/notifications/objects/instance.py | 2 + nova/objects/fields.py | 3 +- .../test_instance.py | 40 ++++++++++++++++++- nova/tests/unit/compute/test_compute_mgr.py | 11 ++++- .../objects/test_notification.py | 2 +- 9 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 doc/notification_samples/instance-live_migration_force_complete-end.json create mode 100644 doc/notification_samples/instance-live_migration_force_complete-start.json diff --git a/doc/notification_samples/instance-live_migration_force_complete-end.json b/doc/notification_samples/instance-live_migration_force_complete-end.json new file mode 100644 index 000000000000..27057ba62b6e --- /dev/null +++ b/doc/notification_samples/instance-live_migration_force_complete-end.json @@ -0,0 +1,12 @@ +{ + "event_type": "instance.live_migration_force_complete.end", + "payload": { + "$ref": "common_payloads/InstanceActionPayload.json#", + "nova_object.data": { + "action_initiator_user": "admin", + "task_state": "migrating" + } + }, + "priority": "INFO", + "publisher_id": "nova-compute:compute" +} diff --git a/doc/notification_samples/instance-live_migration_force_complete-start.json b/doc/notification_samples/instance-live_migration_force_complete-start.json new file mode 100644 index 000000000000..c80f73a76a00 --- /dev/null +++ b/doc/notification_samples/instance-live_migration_force_complete-start.json @@ -0,0 +1,12 @@ +{ + "event_type": "instance.live_migration_force_complete.start", + "payload": { + "$ref": "common_payloads/InstanceActionPayload.json#", + "nova_object.data": { + "action_initiator_user": "admin", + "task_state": "migrating" + } + }, + "priority": "INFO", + "publisher_id": "nova-compute:compute" +} diff --git a/nova/compute/manager.py b/nova/compute/manager.py index e44e58132b7f..cee21c0287f7 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -6282,9 +6282,17 @@ class ComputeManager(manager.Manager): self._notify_about_instance_usage( context, instance, 'live.migration.force.complete.start') + compute_utils.notify_about_instance_action( + context, instance, self.host, + action=fields.NotificationAction.LIVE_MIGRATION_FORCE_COMPLETE, + phase=fields.NotificationPhase.START) self.driver.live_migration_force_complete(instance) self._notify_about_instance_usage( context, instance, 'live.migration.force.complete.end') + compute_utils.notify_about_instance_action( + context, instance, self.host, + action=fields.NotificationAction.LIVE_MIGRATION_FORCE_COMPLETE, + phase=fields.NotificationPhase.END) @wrap_exception() @wrap_instance_event(prefix='compute') diff --git a/nova/notifications/objects/base.py b/nova/notifications/objects/base.py index 761fe62d8607..886380c89d78 100644 --- a/nova/notifications/objects/base.py +++ b/nova/notifications/objects/base.py @@ -63,7 +63,9 @@ class EventType(NotificationObject): # NotificationActionField enum # Version 1.14: UPDATE_PROP value is added to the NotificationActionField # enum - VERSION = '1.14' + # Version 1.15: LIVE_MIGRATION_FORCE_COMPLETE is added to the + # NotificationActionField enum + VERSION = '1.15' fields = { 'object': fields.StringField(nullable=False), diff --git a/nova/notifications/objects/instance.py b/nova/notifications/objects/instance.py index 3e625feb3046..77d22ff0e2b0 100644 --- a/nova/notifications/objects/instance.py +++ b/nova/notifications/objects/instance.py @@ -550,6 +550,8 @@ class InstanceStateUpdatePayload(base.NotificationPayloadBase): @base.notification_sample('instance-resize_confirm-end.json') @base.notification_sample('instance-resize_revert-start.json') @base.notification_sample('instance-resize_revert-end.json') +@base.notification_sample('instance-live_migration_force_complete-start.json') +@base.notification_sample('instance-live_migration_force_complete-end.json') @base.notification_sample('instance-shelve_offload-start.json') @base.notification_sample('instance-shelve_offload-end.json') @base.notification_sample('instance-soft_delete-start.json') diff --git a/nova/objects/fields.py b/nova/objects/fields.py index 3186a86d30ee..7fcef983e09e 100644 --- a/nova/objects/fields.py +++ b/nova/objects/fields.py @@ -807,6 +807,7 @@ class NotificationAction(BaseNovaEnum): LIVE_MIGRATION_PRE = 'live_migration_pre' LIVE_MIGRATION_ROLLBACK_DEST = 'live_migration_rollback_dest' LIVE_MIGRATION_ROLLBACK = 'live_migration_rollback' + LIVE_MIGRATION_FORCE_COMPLETE = 'live_migration_force_complete' REBUILD = 'rebuild' REBUILD_SCHEDULED = 'rebuild_scheduled' INTERFACE_DETACH = 'interface_detach' @@ -836,7 +837,7 @@ class NotificationAction(BaseNovaEnum): RESIZE_CONFIRM, RESIZE_PREP, RESIZE_REVERT, SHELVE_OFFLOAD, SOFT_DELETE, TRIGGER_CRASH_DUMP, UNRESCUE, UNSHELVE, ADD_HOST, REMOVE_HOST, ADD_MEMBER, UPDATE_METADATA, LOCK, UNLOCK, - REBUILD_SCHEDULED, UPDATE_PROP) + REBUILD_SCHEDULED, UPDATE_PROP, LIVE_MIGRATION_FORCE_COMPLETE) # TODO(rlrossit): These should be changed over to be a StateMachine enum from diff --git a/nova/tests/functional/notification_sample_tests/test_instance.py b/nova/tests/functional/notification_sample_tests/test_instance.py index d5fdca912a72..127fc928a3b3 100644 --- a/nova/tests/functional/notification_sample_tests/test_instance.py +++ b/nova/tests/functional/notification_sample_tests/test_instance.py @@ -56,7 +56,8 @@ class TestInstanceNotificationSampleWithMultipleCompute( self._test_live_migration_rollback, self._test_live_migration_abort, self._test_live_migration_success, - self._test_evacuate_server + self._test_evacuate_server, + self._test_live_migration_force_complete ] for action in actions: @@ -253,6 +254,43 @@ class TestInstanceNotificationSampleWithMultipleCompute( actual=notifications[0]) self.admin_api.put_service(service_id, {'forced_down': False}) + def _test_live_migration_force_complete(self, server): + post = { + 'os-migrateLive': { + 'host': 'host2', + 'block_migration': True, + 'force': True, + } + } + self.admin_api.post_server_action(server['id'], post) + + self._wait_for_state_change(self.api, server, 'MIGRATING') + + migrations = self._wait_and_get_migrations(server) + migration_id = migrations[0]['id'] + self.admin_api.force_complete_migration(server['id'], migration_id) + + self._wait_for_notification( + 'instance.live_migration_force_complete.end') + + # 0. instance.live_migration_pre.start + # 1. instance.live_migration_pre.end + # 2. instance.live_migration_force_complete.start + # 3. instance.live_migration_force_complete.end + self.assertEqual(4, len(fake_notifier.VERSIONED_NOTIFICATIONS)) + self._verify_notification( + 'instance-live_migration_force_complete-start', + replacements={ + 'reservation_id': server['reservation_id'], + 'uuid': server['id']}, + actual=fake_notifier.VERSIONED_NOTIFICATIONS[2]) + self._verify_notification( + 'instance-live_migration_force_complete-end', + replacements={ + 'reservation_id': server['reservation_id'], + 'uuid': server['id']}, + actual=fake_notifier.VERSIONED_NOTIFICATIONS[3]) + class TestInstanceNotificationSampleWithMultipleComputeOldAttachFlow( TestInstanceNotificationSampleWithMultipleCompute): diff --git a/nova/tests/unit/compute/test_compute_mgr.py b/nova/tests/unit/compute/test_compute_mgr.py index 190da051281e..15cc7f2156ac 100644 --- a/nova/tests/unit/compute/test_compute_mgr.py +++ b/nova/tests/unit/compute/test_compute_mgr.py @@ -7234,13 +7234,14 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase): migration.status = 'running' migration.id = 0 + @mock.patch('nova.compute.utils.notify_about_instance_action') @mock.patch('nova.image.api.API.generate_image_url', return_value='fake-url') @mock.patch.object(objects.Migration, 'get_by_id', return_value=migration) @mock.patch.object(self.compute.driver, 'live_migration_force_complete') - def _do_test(force_complete, get_by_id, gen_img_url): + def _do_test(force_complete, get_by_id, gen_img_url, mock_notify): self.compute.live_migration_force_complete( self.context, self.instance) @@ -7259,6 +7260,14 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase): self.assertEqual( self.instance.uuid, fake_notifier.NOTIFICATIONS[1].payload['instance_id']) + self.assertEqual(2, mock_notify.call_count) + mock_notify.assert_has_calls([ + mock.call(self.context, self.instance, self.compute.host, + action='live_migration_force_complete', + phase='start'), + mock.call(self.context, self.instance, self.compute.host, + action='live_migration_force_complete', + phase='end')]) _do_test() diff --git a/nova/tests/unit/notifications/objects/test_notification.py b/nova/tests/unit/notifications/objects/test_notification.py index 4253b630ad2f..eacb7de8b817 100644 --- a/nova/tests/unit/notifications/objects/test_notification.py +++ b/nova/tests/unit/notifications/objects/test_notification.py @@ -370,7 +370,7 @@ notification_object_data = { 'AuditPeriodPayload': '1.0-2b429dd307b8374636703b843fa3f9cb', 'BandwidthPayload': '1.0-ee2616a7690ab78406842a2b68e34130', 'BlockDevicePayload': '1.0-29751e1b6d41b1454e36768a1e764df8', - 'EventType': '1.14-471d49b27dce4b38484451f5146b7c16', + 'EventType': '1.15-a93b5b3b54ebf6c5a158dfcd985d15c5', 'ExceptionNotification': '1.0-a73147b93b520ff0061865849d3dfa56', 'ExceptionPayload': '1.1-6c43008bd81885a63bc7f7c629f0793b', 'FlavorNotification': '1.0-a73147b93b520ff0061865849d3dfa56',