diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 5199d048d9..e5a7558668 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -705,8 +705,8 @@ class ComputeManager(manager.Manager): try: network_info = self._get_instance_nw_info(context, instance) - bdi = self._get_instance_volume_block_device_info(context, - instance) + bdi = self._get_instance_block_device_info(context, + instance) destroy_disks = not (self._is_instance_storage_shared( context, instance)) except exception.InstanceNotFound: @@ -931,8 +931,8 @@ class ComputeManager(manager.Manager): power_on = (instance.system_metadata.get('old_vm_state') != vm_states.STOPPED) - block_dev_info = self._get_instance_volume_block_device_info( - context, instance) + block_dev_info = self._get_instance_block_device_info(context, + instance) self.driver.finish_revert_migration(context, instance, net_info, block_dev_info, power_on) @@ -962,8 +962,7 @@ class ComputeManager(manager.Manager): instance=instance) block_device_info = \ - self._get_instance_volume_block_device_info( - context, instance) + self._get_instance_block_device_info(context, instance) try: self.driver.resume_state_on_host_boot( @@ -1817,14 +1816,16 @@ class ComputeManager(manager.Manager): self.network_api.deallocate_for_instance( context, instance, requested_networks=requested_networks) - def _get_instance_volume_block_device_info(self, context, instance, - refresh_conn_info=False, - bdms=None): + def _get_instance_block_device_info(self, context, instance, + refresh_conn_info=False, + bdms=None): """Transform volumes to the driver block_device format.""" if not bdms: bdms = (block_device_obj.BlockDeviceMappingList. get_by_instance_uuid(context, instance['uuid'])) + swap = driver_block_device.convert_swap(bdms) + ephemerals = driver_block_device.convert_ephemerals(bdms) block_device_mapping = ( driver_block_device.convert_volumes(bdms) + driver_block_device.convert_snapshots(bdms) + @@ -1842,9 +1843,17 @@ class ComputeManager(manager.Manager): self.driver) if self.use_legacy_block_device_info: + swap = driver_block_device.legacy_block_devices(swap) + ephemerals = driver_block_device.legacy_block_devices(ephemerals) block_device_mapping = driver_block_device.legacy_block_devices( block_device_mapping) - return {'block_device_mapping': block_device_mapping} + + # Get swap out of the list + swap = driver_block_device.get_swap(swap) + + return {'swap': swap, + 'ephemerals': ephemerals, + 'block_device_mapping': block_device_mapping} # NOTE(mikal): No object_compat wrapper on this method because its # callers all pass objects already @@ -2143,7 +2152,7 @@ class ComputeManager(manager.Manager): # NOTE(vish) get bdms before destroying the instance vol_bdms = [bdm for bdm in bdms if bdm.is_volume] - block_device_info = self._get_instance_volume_block_device_info( + block_device_info = self._get_instance_block_device_info( context, instance, bdms=bdms) # NOTE(melwitt): attempt driver destroy before releasing ip, may @@ -2307,8 +2316,8 @@ class ComputeManager(manager.Manager): def _power_on(self, context, instance): network_info = self._get_instance_nw_info(context, instance) - block_device_info = self._get_instance_volume_block_device_info( - context, instance) + block_device_info = self._get_instance_block_device_info(context, + instance) self.driver.power_on(context, instance, network_info, block_device_info) @@ -2527,7 +2536,7 @@ class ComputeManager(manager.Manager): get_by_instance_uuid(context, instance.uuid)) block_device_info = \ - self._get_instance_volume_block_device_info( + self._get_instance_block_device_info( context, instance, bdms=bdms) def detach_block_devices(context, bdms): @@ -2621,8 +2630,8 @@ class ComputeManager(manager.Manager): context = context.elevated() LOG.audit(_("Rebooting instance"), context=context, instance=instance) - block_device_info = self._get_instance_volume_block_device_info( - context, instance) + block_device_info = self._get_instance_block_device_info(context, + instance) network_info = self._get_instance_nw_info(context, instance) @@ -3207,7 +3216,7 @@ class ComputeManager(manager.Manager): network_info = self._get_instance_nw_info(context, instance) bdms = (block_device_obj.BlockDeviceMappingList. get_by_instance_uuid(context, instance.uuid)) - block_device_info = self._get_instance_volume_block_device_info( + block_device_info = self._get_instance_block_device_info( context, instance, bdms=bdms) self.driver.destroy(context, instance, network_info, @@ -3269,7 +3278,7 @@ class ComputeManager(manager.Manager): self.network_api.setup_networks_on_host(context, instance, migration['source_compute']) - block_device_info = self._get_instance_volume_block_device_info( + block_device_info = self._get_instance_block_device_info( context, instance, refresh_conn_info=True) power_on = old_vm_state != vm_states.STOPPED @@ -3461,7 +3470,7 @@ class ComputeManager(manager.Manager): bdms = (block_device_obj.BlockDeviceMappingList. get_by_instance_uuid(context, instance.uuid)) - block_device_info = self._get_instance_volume_block_device_info( + block_device_info = self._get_instance_block_device_info( context, instance, bdms=bdms) disk_info = self.driver.migrate_disk_and_power_off( @@ -3547,7 +3556,7 @@ class ComputeManager(manager.Manager): context, instance, "finish_resize.start", network_info=network_info) - block_device_info = self._get_instance_volume_block_device_info( + block_device_info = self._get_instance_block_device_info( context, instance, refresh_conn_info=True) # NOTE(mriedem): If the original vm_state was STOPPED, we don't @@ -3754,7 +3763,7 @@ class ComputeManager(manager.Manager): LOG.audit(_('Resuming'), context=context, instance=instance) network_info = self._get_instance_nw_info(context, instance) - block_device_info = self._get_instance_volume_block_device_info( + block_device_info = self._get_instance_block_device_info( context, instance) self.driver.resume(context, instance, network_info, @@ -3840,8 +3849,8 @@ class ComputeManager(manager.Manager): current_power_state = self._get_power_state(context, instance) network_info = self._get_instance_nw_info(context, instance) - block_device_info = self._get_instance_volume_block_device_info( - context, instance) + block_device_info = self._get_instance_block_device_info(context, + instance) self.driver.destroy(context, instance, network_info, block_device_info) @@ -4500,7 +4509,7 @@ class ComputeManager(manager.Manager): required for live migration without shared storage. """ - block_device_info = self._get_instance_volume_block_device_info( + block_device_info = self._get_instance_block_device_info( context, instance, refresh_conn_info=True) network_info = self._get_instance_nw_info(context, instance) @@ -4599,7 +4608,7 @@ class ComputeManager(manager.Manager): ctxt, instance['uuid']) # Cleanup source host post live-migration - block_device_info = self._get_instance_volume_block_device_info( + block_device_info = self._get_instance_block_device_info( ctxt, instance, bdms) self.driver.post_live_migration(ctxt, instance, block_device_info, migrate_data) @@ -4711,8 +4720,8 @@ class ComputeManager(manager.Manager): self._notify_about_instance_usage( context, instance, "live_migration.post.dest.start", network_info=network_info) - block_device_info = self._get_instance_volume_block_device_info( - context, instance) + block_device_info = self._get_instance_block_device_info(context, + instance) self.driver.post_live_migration_at_destination(context, instance, network_info, @@ -4809,8 +4818,8 @@ class ComputeManager(manager.Manager): # NOTE(vish): The mapping is passed in so the driver can disconnect # from remote volumes if necessary - block_device_info = self._get_instance_volume_block_device_info( - context, instance) + block_device_info = self._get_instance_block_device_info(context, + instance) self.driver.rollback_live_migration_at_destination(context, instance, network_info, block_device_info) self._notify_about_instance_usage( diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index 3abce4dea1..e624a1523a 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -2385,7 +2385,7 @@ class ComputeTestCase(BaseTestCase): fake_network.unset_stub_network_methods(self.stubs) self.mox.StubOutWithMock(self.compute, - '_get_instance_volume_block_device_info') + '_get_instance_block_device_info') self.mox.StubOutWithMock(self.compute, '_get_instance_nw_info') self.mox.StubOutWithMock(self.compute, '_notify_about_instance_usage') self.mox.StubOutWithMock(self.compute, '_instance_update') @@ -2437,7 +2437,7 @@ class ComputeTestCase(BaseTestCase): self.mox.StubOutWithMock(self.context, 'elevated') self.context.elevated().AndReturn(econtext) - self.compute._get_instance_volume_block_device_info( + self.compute._get_instance_block_device_info( econtext, instance).AndReturn(fake_block_dev_info) self.compute._get_instance_nw_info(econtext, instance).AndReturn( @@ -2584,7 +2584,7 @@ class ComputeTestCase(BaseTestCase): self._test_reboot(False, fail_reboot=True, fail_running=True) - def test_get_instance_volume_block_device_info_source_image(self): + def test_get_instance_block_device_info_source_image(self): bdms = block_device_obj.block_device_make_list(self.context, [fake_block_device.FakeDbBlockDeviceDict({ 'id': 3, @@ -2604,10 +2604,12 @@ class ComputeTestCase(BaseTestCase): return_value=bdms) ) as mock_get_by_instance: block_device_info = ( - self.compute._get_instance_volume_block_device_info( + self.compute._get_instance_block_device_info( self.context, self._create_fake_instance()) ) expected = { + 'swap': None, + 'ephemerals': [], 'block_device_mapping': [{ 'connection_info': { 'driver_volume_type': 'rbd' @@ -2619,7 +2621,7 @@ class ComputeTestCase(BaseTestCase): self.assertTrue(mock_get_by_instance.called) self.assertEqual(block_device_info, expected) - def test_get_instance_volume_block_device_info_passed_bdms(self): + def test_get_instance_block_device_info_passed_bdms(self): bdms = block_device_obj.block_device_make_list(self.context, [fake_block_device.FakeDbBlockDeviceDict({ 'id': 3, @@ -2633,10 +2635,12 @@ class ComputeTestCase(BaseTestCase): block_device_obj.BlockDeviceMappingList, 'get_by_instance_uuid')) as mock_get_by_instance: block_device_info = ( - self.compute._get_instance_volume_block_device_info( + self.compute._get_instance_block_device_info( self.context, self._create_fake_instance(), bdms=bdms) ) expected = { + 'swap': None, + 'ephemerals': [], 'block_device_mapping': [{ 'connection_info': { 'driver_volume_type': 'rbd' @@ -2648,6 +2652,57 @@ class ComputeTestCase(BaseTestCase): self.assertFalse(mock_get_by_instance.called) self.assertEqual(block_device_info, expected) + def test_get_instance_block_device_info_swap_and_ephemeral(self): + instance = self._create_fake_instance() + + ephemerals = fake_block_device.FakeDbBlockDeviceDict({ + 'id': 1, 'instance_uuid': 'fake-instance', + 'device_name': '/dev/vdb', + 'source_type': 'blank', + 'destination_type': 'local', + 'device_type': 'disk', + 'disk_bus': 'virtio', + 'delete_on_termination': True, + 'guest_format': None, + 'volume_size': 1, + 'boot_index': -1 + }) + swap = fake_block_device.FakeDbBlockDeviceDict({ + 'id': 2, 'instance_uuid': 'fake-instance', + 'device_name': '/dev/vdc', + 'source_type': 'blank', + 'destination_type': 'local', + 'device_type': 'disk', + 'disk_bus': 'virtio', + 'delete_on_termination': True, + 'guest_format': 'swap', + 'volume_size': 1, + 'boot_index': -1 + }) + + bdms = block_device_obj.block_device_make_list(self.context, + [swap, ephemerals]) + + with ( + mock.patch.object(block_device_obj.BlockDeviceMappingList, + 'get_by_instance_uuid', return_value=bdms) + ) as mock_get_by_instance_uuid: + expected_block_device_info = { + 'swap': {'device_name': '/dev/vdc', 'swap_size': 1}, + 'ephemerals': [{'device_name': '/dev/vdb', 'num': 0, 'size': 1, + 'virtual_name': 'ephemeral0'}], + 'block_device_mapping': [] + } + + block_device_info = ( + self.compute._get_instance_block_device_info( + self.context, instance) + ) + + mock_get_by_instance_uuid.assert_called_once_with(self.context, + instance.uuid) + self.assertEqual(expected_block_device_info, block_device_info) + def test_set_admin_password(self): # Ensure instance can have its admin password set. instance = jsonutils.to_primitive(self._create_fake_instance()) @@ -4103,7 +4158,7 @@ class ComputeTestCase(BaseTestCase): '_notify_about_instance_usage') self.mox.StubOutWithMock(self.compute.driver, 'finish_migration') self.mox.StubOutWithMock(self.compute, - '_get_instance_volume_block_device_info') + '_get_instance_block_device_info') self.mox.StubOutWithMock(migration, 'save') self.mox.StubOutWithMock(instance, 'save') self.mox.StubOutWithMock(self.context, 'elevated') @@ -4153,7 +4208,7 @@ class ComputeTestCase(BaseTestCase): self.context, instance, 'finish_resize.start', network_info='fake-nwinfo1') - self.compute._get_instance_volume_block_device_info( + self.compute._get_instance_block_device_info( self.context, instance, refresh_conn_info=True).AndReturn('fake-bdminfo') # nova.conf sets the default flavor to m1.small and the test @@ -4733,7 +4788,7 @@ class ComputeTestCase(BaseTestCase): mock.patch.object(block_device_obj.BlockDeviceMappingList, 'get_by_instance_uuid', return_value='fake_bdms'), mock.patch.object( - self.compute, '_get_instance_volume_block_device_info', + self.compute, '_get_instance_block_device_info', return_value='fake_bdinfo'), mock.patch.object(self.compute, '_terminate_volume_connections') ) as (mock_get_by_inst_uuid, mock_get_instance_vol_bdinfo, @@ -5110,7 +5165,8 @@ class ComputeTestCase(BaseTestCase): # creating mocks self.mox.StubOutWithMock(self.compute.driver, 'pre_live_migration') self.compute.driver.pre_live_migration(mox.IsA(c), mox.IsA(instance), - {'block_device_mapping': []}, + {'swap': None, 'ephemerals': [], + 'block_device_mapping': []}, mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg()) @@ -5352,7 +5408,8 @@ class ComputeTestCase(BaseTestCase): self.compute._post_live_migration(c, instance, dest) post_live_migration.assert_has_calls([ - mock.call(c, instance, {'block_device_mapping': []}, None)]) + mock.call(c, instance, {'swap': None, 'ephemerals': [], + 'block_device_mapping': []}, None)]) unfilter_instance.assert_has_calls([mock.call(instance, [])]) migration = {'source_compute': srchost, 'dest_compute': dest, } @@ -5394,7 +5451,7 @@ class ComputeTestCase(BaseTestCase): mock.patch.object(self.compute.instance_events, 'clear_events_for_instance'), mock.patch.object(self.compute, - '_get_instance_volume_block_device_info'), + '_get_instance_block_device_info'), mock.patch.object(block_device_obj.BlockDeviceMappingList, 'get_by_instance_uuid'), mock.patch.object(self.compute.driver, 'get_volume_connector'), @@ -5510,7 +5567,8 @@ class ComputeTestCase(BaseTestCase): self.mox.StubOutWithMock(self.compute.driver, 'rollback_live_migration_at_destination') self.compute.driver.rollback_live_migration_at_destination(c, - instance, [], {'block_device_mapping': []}) + instance, [], {'swap': None, 'ephemerals': [], + 'block_device_mapping': []}) # start test self.mox.ReplayAll() @@ -6201,7 +6259,7 @@ class ComputeTestCase(BaseTestCase): self.mox.StubOutWithMock(self.compute, '_get_instance_nw_info') self.mox.StubOutWithMock(self.compute, - '_get_instance_volume_block_device_info') + '_get_instance_block_device_info') self.mox.StubOutWithMock(self.compute, '_is_instance_storage_shared') self.mox.StubOutWithMock(self.compute.driver, 'destroy') @@ -6211,7 +6269,7 @@ class ComputeTestCase(BaseTestCase): self.compute._get_instance_nw_info(fake_context, evacuated_instance).AndReturn( 'fake_network_info') - self.compute._get_instance_volume_block_device_info( + self.compute._get_instance_block_device_info( fake_context, evacuated_instance).AndReturn('fake_bdi') self.compute._is_instance_storage_shared(fake_context, evacuated_instance).AndReturn(True) @@ -6248,7 +6306,7 @@ class ComputeTestCase(BaseTestCase): self.mox.StubOutWithMock(self.compute, '_get_instance_nw_info') self.mox.StubOutWithMock(self.compute, - '_get_instance_volume_block_device_info') + '_get_instance_block_device_info') self.mox.StubOutWithMock(self.compute.driver, 'check_instance_shared_storage_local') self.mox.StubOutWithMock(self.compute.compute_rpcapi, @@ -6262,7 +6320,7 @@ class ComputeTestCase(BaseTestCase): self.compute._get_instance_nw_info(fake_context, evacuated_instance).AndReturn( 'fake_network_info') - self.compute._get_instance_volume_block_device_info( + self.compute._get_instance_block_device_info( fake_context, evacuated_instance).AndReturn('fake_bdi') self.compute.driver.check_instance_shared_storage_local(fake_context, evacuated_instance).AndReturn({'filename': 'tmpfilename'}) @@ -6304,7 +6362,7 @@ class ComputeTestCase(BaseTestCase): self.mox.StubOutWithMock(self.compute, '_get_instance_nw_info') self.mox.StubOutWithMock(self.compute, - '_get_instance_volume_block_device_info') + '_get_instance_block_device_info') self.mox.StubOutWithMock(self.compute.driver, 'check_instance_shared_storage_local') self.mox.StubOutWithMock(self.compute.compute_rpcapi, @@ -6318,7 +6376,7 @@ class ComputeTestCase(BaseTestCase): self.compute._get_instance_nw_info(fake_context, evacuated_instance).AndReturn( 'fake_network_info') - self.compute._get_instance_volume_block_device_info( + self.compute._get_instance_block_device_info( fake_context, evacuated_instance).AndReturn('fake_bdi') self.compute.driver.check_instance_shared_storage_local(fake_context, evacuated_instance).AndRaise(NotImplementedError()) @@ -10195,13 +10253,13 @@ class ComputeRescheduleOrErrorTestCase(BaseTestCase): mock.patch.object(self.compute, '_get_instance_nw_info', side_effect=error), mock.patch.object(self.compute, - '_get_instance_volume_block_device_info'), + '_get_instance_block_device_info'), mock.patch.object(self.compute.driver, 'destroy'), mock.patch.object(self.compute, '_try_deallocate_network') ) as ( elevated_mock, _get_instance_nw_info_mock, - _get_instance_volume_block_device_info_mock, + _get_instance_block_device_info_mock, destroy_mock, _try_deallocate_network_mock ): diff --git a/nova/tests/compute/test_compute_mgr.py b/nova/tests/compute/test_compute_mgr.py index 75387cd94d..ef0aa45f99 100644 --- a/nova/tests/compute/test_compute_mgr.py +++ b/nova/tests/compute/test_compute_mgr.py @@ -287,7 +287,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase): self.mox.StubOutWithMock(self.compute.driver, 'resume_state_on_host_boot') self.mox.StubOutWithMock(self.compute, - '_get_instance_volume_block_device_info') + '_get_instance_block_device_info') self.mox.StubOutWithMock(self.compute, '_set_instance_error_state') self.compute._get_power_state(mox.IgnoreArg(), @@ -297,7 +297,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase): self.compute._get_power_state(mox.IgnoreArg(), instance).AndReturn(power_state.SHUTDOWN) self.compute.driver.plug_vifs(instance, mox.IgnoreArg()) - self.compute._get_instance_volume_block_device_info(mox.IgnoreArg(), + self.compute._get_instance_block_device_info(mox.IgnoreArg(), instance).AndReturn('fake-bdm') self.compute.driver.resume_state_on_host_boot(mox.IgnoreArg(), instance, mox.IgnoreArg(), @@ -351,7 +351,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase): self.mox.StubOutWithMock(self.compute.driver, 'finish_revert_migration') self.mox.StubOutWithMock(self.compute, - '_get_instance_volume_block_device_info') + '_get_instance_block_device_info') self.mox.StubOutWithMock(self.compute.driver, 'get_info') self.mox.StubOutWithMock(instance, 'save') self.mox.StubOutWithMock(self.compute, '_retry_reboot') @@ -361,7 +361,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase): compute_utils.get_nw_info_for_instance(instance).AndReturn( network_model.NetworkInfo()) self.compute.driver.plug_vifs(instance, []) - self.compute._get_instance_volume_block_device_info( + self.compute._get_instance_block_device_info( self.context, instance).AndReturn([]) self.compute.driver.finish_revert_migration(self.context, instance, [], [], power_on) @@ -1907,7 +1907,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase): mock.patch.object(self.instance, 'save'), mock.patch.object(self.compute, '_notify_about_instance_usage'), mock.patch.object(self.compute, - '_get_instance_volume_block_device_info', + '_get_instance_block_device_info', return_value=None), mock.patch.object(block_device_obj.BlockDeviceMappingList, 'get_by_instance_uuid',