diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 27d0a95b2726..a38d95945d20 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -5783,8 +5783,10 @@ class ComputeManager(manager.Manager): :param dest_check_data: result of check_can_live_migrate_destination :returns: a dict containing migration info """ - is_volume_backed = compute_utils.is_volume_backed_instance(ctxt, - instance) + bdms = objects.BlockDeviceMappingList.get_by_instance_uuid( + ctxt, instance.uuid) + is_volume_backed = compute_utils.is_volume_backed_instance( + ctxt, instance, bdms) # TODO(tdurakov): remove dict to object conversion once RPC API version # is bumped to 5.x got_migrate_data_object = isinstance(dest_check_data, @@ -5795,7 +5797,7 @@ class ComputeManager(manager.Manager): dest_check_data) dest_check_data.is_volume_backed = is_volume_backed block_device_info = self._get_instance_block_device_info( - ctxt, instance, refresh_conn_info=False) + ctxt, instance, refresh_conn_info=False, bdms=bdms) result = self.driver.check_can_live_migrate_source(ctxt, instance, dest_check_data, block_device_info) diff --git a/nova/tests/unit/compute/test_compute_mgr.py b/nova/tests/unit/compute/test_compute_mgr.py index 2f28d13275fb..ee17f54f5957 100644 --- a/nova/tests/unit/compute/test_compute_mgr.py +++ b/nova/tests/unit/compute/test_compute_mgr.py @@ -2317,6 +2317,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase): # Cinder-initiated call, we don't call migrate_volume_completion. migrate_volume_completion.assert_not_called() + @mock.patch.object(objects.BlockDeviceMappingList, 'get_by_instance_uuid') @mock.patch.object(fake_driver.FakeDriver, 'check_can_live_migrate_source') @mock.patch.object(manager.ComputeManager, @@ -2324,7 +2325,10 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase): @mock.patch.object(compute_utils, 'is_volume_backed_instance') @mock.patch.object(compute_utils, 'EventReporter') def test_check_can_live_migrate_source(self, mock_event, mock_volume, - mock_get_inst, mock_check): + mock_get_inst, mock_check, + mock_get_bdms): + fake_bdms = objects.BlockDeviceMappingList() + mock_get_bdms.return_value = fake_bdms is_volume_backed = 'volume_backed' dest_check_data = migrate_data_obj.LiveMigrateData() db_instance = fake_instance.fake_db_instance() @@ -2343,9 +2347,10 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase): mock_check.assert_called_once_with(self.context, instance, dest_check_data, {'block_device_mapping': 'fake'}) - mock_volume.assert_called_once_with(self.context, instance) + mock_volume.assert_called_once_with(self.context, instance, fake_bdms) mock_get_inst.assert_called_once_with(self.context, instance, - refresh_conn_info=False) + refresh_conn_info=False, + bdms=fake_bdms) self.assertTrue(dest_check_data.is_volume_backed) @@ -6388,7 +6393,8 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase): self.assertIsInstance(compute._live_migration_semaphore, compute_utils.UnlimitedSemaphore) - def test_check_migrate_source_converts_object(self): + @mock.patch.object(objects.BlockDeviceMappingList, 'get_by_instance_uuid') + def test_check_migrate_source_converts_object(self, mock_get_bdms): # NOTE(danms): Make sure that we legacy-ify any data objects # the drivers give us back, if we were passed a non-object data = migrate_data_obj.LiveMigrateData(is_volume_backed=False) @@ -6401,7 +6407,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase): mock_cclms.return_value = data self.assertIsInstance( compute.check_can_live_migrate_source( - self.context, {'uuid': uuids.instance}, {}), + self.context, objects.Instance(uuid=uuids.instance), {}), dict) self.assertIsInstance(mock_cclms.call_args_list[0][0][2], migrate_data_obj.LiveMigrateData)