From 8ddbe07e8f7aeb637f4b42b97236402ea28d651a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Antal?= Date: Tue, 4 Jul 2017 16:39:01 +0200 Subject: [PATCH] Transform instance.live_migration_rollback_dest notification The instance.live_migration_rollback_dest.start and instance.live_migration_rollback_dest.end notifications has been transformed to the versioned notification framework. Co-Authored-By: Takashi Natsume Change-Id: I8129cbd1785133d4cc1b70bbba6bd7fcc1d21f4a Implements: bp versioned-notification-transformation-rocky --- ...ance-live_migration_rollback_dest-end.json | 11 ++++++++ ...ce-live_migration_rollback_dest-start.json | 11 ++++++++ nova/compute/manager.py | 8 ++++++ nova/notifications/objects/instance.py | 4 +-- .../test_instance.py | 27 ++++++++++++++++--- nova/tests/unit/compute/test_compute.py | 15 ++++++++--- nova/virt/fake.py | 7 +++++ 7 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 doc/notification_samples/instance-live_migration_rollback_dest-end.json create mode 100644 doc/notification_samples/instance-live_migration_rollback_dest-start.json diff --git a/doc/notification_samples/instance-live_migration_rollback_dest-end.json b/doc/notification_samples/instance-live_migration_rollback_dest-end.json new file mode 100644 index 0000000000..fe36e55be3 --- /dev/null +++ b/doc/notification_samples/instance-live_migration_rollback_dest-end.json @@ -0,0 +1,11 @@ +{ + "event_type": "instance.live_migration_rollback_dest.end", + "payload": { + "$ref": "common_payloads/InstanceActionPayload.json#", + "nova_object.data": { + "action_initiator_user": "admin" + } + }, + "priority": "INFO", + "publisher_id": "nova-compute:host2" +} diff --git a/doc/notification_samples/instance-live_migration_rollback_dest-start.json b/doc/notification_samples/instance-live_migration_rollback_dest-start.json new file mode 100644 index 0000000000..422f7914d3 --- /dev/null +++ b/doc/notification_samples/instance-live_migration_rollback_dest-start.json @@ -0,0 +1,11 @@ +{ + "event_type": "instance.live_migration_rollback_dest.start", + "payload": { + "$ref": "common_payloads/InstanceActionPayload.json#", + "nova_object.data": { + "action_initiator_user": "admin" + } + }, + "priority": "INFO", + "publisher_id": "nova-compute:host2" +} diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 093a37e6d0..74c5c88fa0 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -6708,6 +6708,10 @@ class ComputeManager(manager.Manager): self._notify_about_instance_usage( context, instance, "live_migration.rollback.dest.start", network_info=network_info) + compute_utils.notify_about_instance_action( + context, instance, self.host, + action=fields.NotificationAction.LIVE_MIGRATION_ROLLBACK_DEST, + phase=fields.NotificationPhase.START) try: # NOTE(tr3buchet): tear down networks on destination host self.network_api.setup_networks_on_host(context, instance, @@ -6731,6 +6735,10 @@ class ComputeManager(manager.Manager): self._notify_about_instance_usage( context, instance, "live_migration.rollback.dest.end", network_info=network_info) + compute_utils.notify_about_instance_action( + context, instance, self.host, + action=fields.NotificationAction.LIVE_MIGRATION_ROLLBACK_DEST, + phase=fields.NotificationPhase.END) @periodic_task.periodic_task( spacing=CONF.heal_instance_info_cache_interval) diff --git a/nova/notifications/objects/instance.py b/nova/notifications/objects/instance.py index 74ce1fc518..431afcf097 100644 --- a/nova/notifications/objects/instance.py +++ b/nova/notifications/objects/instance.py @@ -542,8 +542,8 @@ class InstanceStateUpdatePayload(base.NotificationPayloadBase): @base.notification_sample('instance-live_migration_post_dest-end.json') @base.notification_sample('instance-live_migration_rollback-start.json') @base.notification_sample('instance-live_migration_rollback-end.json') -# @base.notification_sample('instance-live_migration_rollback_dest-start.json') -# @base.notification_sample('instance-live_migration_rollback_dest-end.json') +@base.notification_sample('instance-live_migration_rollback_dest-start.json') +@base.notification_sample('instance-live_migration_rollback_dest-end.json') @base.notification_sample('instance-interface_detach-start.json') @base.notification_sample('instance-interface_detach-end.json') @base.notification_sample('instance-resize_confirm-start.json') diff --git a/nova/tests/functional/notification_sample_tests/test_instance.py b/nova/tests/functional/notification_sample_tests/test_instance.py index 910cb92436..1e40c45b07 100644 --- a/nova/tests/functional/notification_sample_tests/test_instance.py +++ b/nova/tests/functional/notification_sample_tests/test_instance.py @@ -65,9 +65,12 @@ class TestInstanceNotificationSampleWithMultipleCompute( # Ensure that instance is in active state after an action self._wait_for_state_change(self.admin_api, server, 'ACTIVE') + @mock.patch('nova.compute.manager.ComputeManager.' + '_live_migration_cleanup_flags', return_value=[True, False]) @mock.patch('nova.compute.rpcapi.ComputeAPI.pre_live_migration', side_effect=exception.DestinationDiskExists(path='path')) - def _test_live_migration_rollback(self, server, mock_migration): + def _test_live_migration_rollback(self, server, mock_migration, + mock_flags): post = { 'os-migrateLive': { 'host': 'host2', @@ -76,10 +79,14 @@ class TestInstanceNotificationSampleWithMultipleCompute( } } self.admin_api.post_server_action(server['id'], post) - self._wait_for_notification('instance.live_migration_rollback.start') - self._wait_for_notification('instance.live_migration_rollback.end') + self._wait_for_notification( + 'instance.live_migration_rollback_dest.end') - self.assertEqual(2, len(fake_notifier.VERSIONED_NOTIFICATIONS)) + # 0. instance.live_migration_rollback.start + # 1. instance.live_migration_rollback.end + # 2. instance.live_migration_rollback_dest.start + # 3. instance.live_migration_rollback_dest.end + self.assertEqual(4, len(fake_notifier.VERSIONED_NOTIFICATIONS)) self._verify_notification( 'instance-live_migration_rollback-start', replacements={ @@ -92,6 +99,18 @@ class TestInstanceNotificationSampleWithMultipleCompute( 'reservation_id': server['reservation_id'], 'uuid': server['id']}, actual=fake_notifier.VERSIONED_NOTIFICATIONS[1]) + self._verify_notification( + 'instance-live_migration_rollback_dest-start', + replacements={ + 'reservation_id': server['reservation_id'], + 'uuid': server['id']}, + actual=fake_notifier.VERSIONED_NOTIFICATIONS[2]) + self._verify_notification( + 'instance-live_migration_rollback_dest-end', + replacements={ + 'reservation_id': server['reservation_id'], + 'uuid': server['id']}, + actual=fake_notifier.VERSIONED_NOTIFICATIONS[3]) def _test_live_migration_pre_and_post_dest(self, server): post = { diff --git a/nova/tests/unit/compute/test_compute.py b/nova/tests/unit/compute/test_compute.py index 10969ce998..63bd34c036 100644 --- a/nova/tests/unit/compute/test_compute.py +++ b/nova/tests/unit/compute/test_compute.py @@ -6717,10 +6717,12 @@ class ComputeTestCase(BaseTestCase, _test() + @mock.patch('nova.compute.utils.notify_about_instance_action') @mock.patch.object(fake.FakeDriver, 'rollback_live_migration_at_destination') def test_rollback_live_migration_at_destination_correctly(self, - mock_rollback): + mock_rollback, + mock_notify): # creating instance testdata c = context.get_admin_context() instance = self._create_fake_instance_obj({'host': 'dummy'}) @@ -6748,9 +6750,16 @@ class ComputeTestCase(BaseTestCase, 'root_device_name': None, 'block_device_mapping': []}, destroy_disks=True, migrate_data=None) + mock_notify.assert_has_calls([ + mock.call(c, instance, self.compute.host, + action='live_migration_rollback_dest', + phase='start'), + mock.call(c, instance, self.compute.host, + action='live_migration_rollback_dest', + phase='end')]) - @mock.patch('nova.virt.driver.ComputeDriver.' - 'rollback_live_migration_at_destination') + @mock.patch.object(fake.FakeDriver, + 'rollback_live_migration_at_destination') def test_rollback_live_migration_at_destination_network_fails( self, mock_rollback): c = context.get_admin_context() diff --git a/nova/virt/fake.py b/nova/virt/fake.py index 7f89411d46..9a44559670 100644 --- a/nova/virt/fake.py +++ b/nova/virt/fake.py @@ -551,6 +551,13 @@ class FakeDriver(driver.ComputeDriver): network_info, disk_info, migrate_data): return migrate_data + def rollback_live_migration_at_destination(self, context, instance, + network_info, + block_device_info, + destroy_disks=True, + migrate_data=None): + return + def unfilter_instance(self, instance, network_info): return