diff --git a/nova/tests/virt/hyperv/test_vmutils.py b/nova/tests/virt/hyperv/test_vmutils.py index 368272d9357d..6aa6ec24bc7f 100644 --- a/nova/tests/virt/hyperv/test_vmutils.py +++ b/nova/tests/virt/hyperv/test_vmutils.py @@ -1,4 +1,4 @@ -# Copyright 2013 Cloudbase Solutions Srl +# Copyright 2014 Cloudbase Solutions Srl # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -15,8 +15,9 @@ import mock +from nova import exception from nova import test - +from nova.virt.hyperv import constants from nova.virt.hyperv import vmutils @@ -25,10 +26,46 @@ class VMUtilsTestCase(test.NoDBTestCase): _FAKE_VM_NAME = 'fake_vm' _FAKE_MEMORY_MB = 2 + _FAKE_VCPUS_NUM = 4 + _FAKE_JOB_PATH = 'fake_job_path' + _FAKE_RET_VAL = 0 + _FAKE_RET_VAL_BAD = -1 + _FAKE_CTRL_PATH = 'fake_ctrl_path' + _FAKE_CTRL_ADDR = 0 + _FAKE_DRIVE_ADDR = 0 + _FAKE_MOUNTED_DISK_PATH = 'fake_mounted_disk_path' _FAKE_VM_PATH = "fake_vm_path" _FAKE_VHD_PATH = "fake_vhd_path" _FAKE_DVD_PATH = "fake_dvd_path" _FAKE_VOLUME_DRIVE_PATH = "fake_volume_drive_path" + _FAKE_SNAPSHOT_PATH = "fake_snapshot_path" + _FAKE_RES_DATA = "fake_res_data" + _FAKE_HOST_RESOURCE = "fake_host_resource" + _FAKE_CLASS = "FakeClass" + _FAKE_RES_PATH = "fake_res_path" + _FAKE_RES_NAME = 'fake_res_name' + _FAKE_ADDRESS = "fake_address" + _FAKE_JOB_STATUS_DONE = 7 + _FAKE_JOB_STATUS_BAD = -1 + _FAKE_JOB_DESCRIPTION = "fake_job_description" + _FAKE_ERROR = "fake_error" + _FAKE_ELAPSED_TIME = 0 + _CONCRETE_JOB = "Msvm_ConcreteJob" + _FAKE_DYNAMIC_MEMORY_RATIO = 1.0 + + _FAKE_SUMMARY_INFO = {'NumberOfProcessors': 4, + 'EnabledState': 2, + 'MemoryUsage': 2, + 'UpTime': 1} + + _DEFINE_SYSTEM = 'DefineVirtualSystem' + _DESTROY_SYSTEM = 'DestroyVirtualSystem' + _DESTROY_SNAPSHOT = 'RemoveVirtualSystemSnapshot' + _ADD_RESOURCE = 'AddVirtualSystemResources' + _REMOVE_RESOURCE = 'RemoveVirtualSystemResources' + _SETTING_TYPE = 'SettingType' + + _VIRTUAL_SYSTEM_TYPE_REALIZED = 3 def setUp(self): self._vmutils = vmutils.VMUtils() @@ -41,6 +78,20 @@ class VMUtilsTestCase(test.NoDBTestCase): self._vmutils.enable_vm_metrics_collection, self._FAKE_VM_NAME) + def test_get_vm_summary_info(self): + self._lookup_vm() + mock_svc = self._vmutils._conn.Msvm_VirtualSystemManagementService()[0] + + mock_summary = mock.MagicMock() + mock_svc.GetSummaryInformation.return_value = (self._FAKE_RET_VAL, + [mock_summary]) + + for (key, val) in self._FAKE_SUMMARY_INFO.items(): + setattr(mock_summary, key, val) + + summary = self._vmutils.get_vm_summary_info(self._FAKE_VM_NAME) + self.assertEqual(self._FAKE_SUMMARY_INFO, summary) + def _lookup_vm(self): mock_vm = mock.MagicMock() self._vmutils._lookup_vm_check = mock.MagicMock( @@ -48,6 +99,25 @@ class VMUtilsTestCase(test.NoDBTestCase): mock_vm.path_.return_value = self._FAKE_VM_PATH return mock_vm + def test_lookup_vm_ok(self): + mock_vm = mock.MagicMock() + self._vmutils._conn.Msvm_ComputerSystem.return_value = [mock_vm] + vm = self._vmutils._lookup_vm_check(self._FAKE_VM_NAME) + self.assertEqual(mock_vm, vm) + + def test_lookup_vm_multiple(self): + mockvm = mock.MagicMock() + self._vmutils._conn.Msvm_ComputerSystem.return_value = [mockvm, mockvm] + self.assertRaises(vmutils.HyperVException, + self._vmutils._lookup_vm_check, + self._FAKE_VM_NAME) + + def test_lookup_vm_none(self): + self._vmutils._conn.Msvm_ComputerSystem.return_value = [] + self.assertRaises(exception.NotFound, + self._vmutils._lookup_vm_check, + self._FAKE_VM_NAME) + def test_set_vm_memory_static(self): self._test_set_vm_memory_dynamic(1.0) @@ -109,6 +179,7 @@ class VMUtilsTestCase(test.NoDBTestCase): def _create_mock_disks(self): mock_rasd1 = mock.MagicMock() mock_rasd1.ResourceSubType = self._vmutils._IDE_DISK_RES_SUB_TYPE + mock_rasd1.HostResource = [self._FAKE_VHD_PATH] mock_rasd1.Connection = [self._FAKE_VHD_PATH] mock_rasd2 = mock.MagicMock() @@ -199,3 +270,300 @@ class VMUtilsTestCase(test.NoDBTestCase): self._vmutils._conn.Msvm_VirtualSystemSettingData.assert_called_with( ['ElementName'], SettingType=self._vmutils._VIRTUAL_SYSTEM_CURRENT_SETTINGS) + + @mock.patch.object(vmutils.VMUtils, '_set_vm_vcpus') + @mock.patch.object(vmutils.VMUtils, '_set_vm_memory') + @mock.patch.object(vmutils.VMUtils, '_get_wmi_obj') + def test_create_vm(self, mock_get_wmi_obj, mock_set_mem, mock_set_vcpus): + mock_svc = self._vmutils._conn.Msvm_VirtualSystemManagementService()[0] + getattr(mock_svc, self._DEFINE_SYSTEM).return_value = ( + None, self._FAKE_JOB_PATH, self._FAKE_RET_VAL) + + mock_vm = mock_get_wmi_obj.return_value + self._vmutils._conn.Msvm_ComputerSystem.return_value = [mock_vm] + + mock_s = mock.MagicMock() + setattr(mock_s, + self._SETTING_TYPE, + self._VIRTUAL_SYSTEM_TYPE_REALIZED) + mock_vm.associators.return_value = [mock_s] + + self._vmutils.create_vm(self._FAKE_VM_NAME, self._FAKE_MEMORY_MB, + self._FAKE_VCPUS_NUM, False, + self._FAKE_DYNAMIC_MEMORY_RATIO) + + self.assertTrue(getattr(mock_svc, self._DEFINE_SYSTEM).called) + mock_set_mem.assert_called_with(mock_vm, mock_s, self._FAKE_MEMORY_MB, + self._FAKE_DYNAMIC_MEMORY_RATIO) + + mock_set_vcpus.assert_called_with(mock_vm, mock_s, + self._FAKE_VCPUS_NUM, + False) + + def test_get_vm_scsi_controller(self): + self._prepare_get_vm_controller(self._vmutils._SCSI_CTRL_RES_SUB_TYPE) + path = self._vmutils.get_vm_scsi_controller(self._FAKE_VM_NAME) + self.assertEqual(self._FAKE_RES_PATH, path) + + def test_get_vm_ide_controller(self): + self._prepare_get_vm_controller(self._vmutils._IDE_CTRL_RES_SUB_TYPE) + path = self._vmutils.get_vm_ide_controller(self._FAKE_VM_NAME, + self._FAKE_ADDRESS) + self.assertEqual(self._FAKE_RES_PATH, path) + + def _prepare_get_vm_controller(self, resource_sub_type): + mock_vm = self._lookup_vm() + mock_vm_settings = mock.MagicMock() + mock_rasds = mock.MagicMock() + mock_rasds.path_.return_value = self._FAKE_RES_PATH + mock_rasds.ResourceSubType = resource_sub_type + mock_rasds.Address = self._FAKE_ADDRESS + mock_vm_settings.associators.return_value = [mock_rasds] + mock_vm.associators.return_value = [mock_vm_settings] + + def _prepare_resources(self, mock_path, mock_subtype, mock_vm_settings): + mock_rasds = mock_vm_settings.associators.return_value[0] + mock_rasds.path_.return_value = mock_path + mock_rasds.ResourceSubType = mock_subtype + return mock_rasds + + @mock.patch.object(vmutils.VMUtils, '_get_new_resource_setting_data') + @mock.patch.object(vmutils.VMUtils, '_get_vm_ide_controller') + def test_attach_ide_drive(self, mock_get_ide_ctrl, mock_get_new_rsd): + mock_vm = self._lookup_vm() + mock_rsd = mock_get_new_rsd.return_value + + with mock.patch.object(self._vmutils, + '_add_virt_resource') as mock_add_virt_res: + self._vmutils.attach_ide_drive(self._FAKE_VM_NAME, + self._FAKE_CTRL_PATH, + self._FAKE_CTRL_ADDR, + self._FAKE_DRIVE_ADDR) + + mock_add_virt_res.assert_called_with(mock_rsd, + mock_vm.path_.return_value) + + mock_get_ide_ctrl.assert_called_with(mock_vm, self._FAKE_CTRL_ADDR) + self.assertTrue(mock_get_new_rsd.called) + + @mock.patch.object(vmutils.VMUtils, '_get_new_resource_setting_data') + def test_create_scsi_controller(self, mock_get_new_rsd): + mock_vm = self._lookup_vm() + with mock.patch.object(self._vmutils, + '_add_virt_resource') as mock_add_virt_res: + self._vmutils.create_scsi_controller(self._FAKE_VM_NAME) + + mock_add_virt_res.assert_called_with(mock_get_new_rsd.return_value, + mock_vm.path_.return_value) + + @mock.patch.object(vmutils.VMUtils, '_get_new_resource_setting_data') + def test_attach_volume_to_controller(self, mock_get_new_rsd): + mock_vm = self._lookup_vm() + with mock.patch.object(self._vmutils, + '_add_virt_resource') as mock_add_virt_res: + self._vmutils.attach_volume_to_controller( + self._FAKE_VM_NAME, self._FAKE_CTRL_PATH, self._FAKE_CTRL_ADDR, + self._FAKE_MOUNTED_DISK_PATH) + + mock_add_virt_res.assert_called_with(mock_get_new_rsd.return_value, + mock_vm.path_.return_value) + + @mock.patch.object(vmutils.VMUtils, '_modify_virt_resource') + @mock.patch.object(vmutils.VMUtils, '_get_nic_data_by_name') + def test_set_nic_connection(self, mock_get_nic_conn, mock_modify_virt_res): + self._lookup_vm() + mock_nic = mock_get_nic_conn.return_value + self._vmutils.set_nic_connection(self._FAKE_VM_NAME, None, None) + + mock_modify_virt_res.assert_called_with(mock_nic, self._FAKE_VM_PATH) + + @mock.patch.object(vmutils.VMUtils, '_get_new_setting_data') + def test_create_nic(self, mock_get_new_virt_res): + self._lookup_vm() + mock_nic = mock_get_new_virt_res.return_value + + with mock.patch.object(self._vmutils, + '_add_virt_resource') as mock_add_virt_res: + self._vmutils.create_nic( + self._FAKE_VM_NAME, self._FAKE_RES_NAME, self._FAKE_ADDRESS) + + mock_add_virt_res.assert_called_with(mock_nic, self._FAKE_VM_PATH) + + def test_set_vm_state(self): + mock_vm = self._lookup_vm() + mock_vm.RequestStateChange.return_value = ( + self._FAKE_JOB_PATH, self._FAKE_RET_VAL) + + self._vmutils.set_vm_state(self._FAKE_VM_NAME, + constants.HYPERV_VM_STATE_ENABLED) + mock_vm.RequestStateChange.assert_called_with( + constants.HYPERV_VM_STATE_ENABLED) + + def test_destroy_vm(self): + self._lookup_vm() + + mock_svc = self._vmutils._conn.Msvm_VirtualSystemManagementService()[0] + getattr(mock_svc, self._DESTROY_SYSTEM).return_value = ( + self._FAKE_JOB_PATH, self._FAKE_RET_VAL) + + self._vmutils.destroy_vm(self._FAKE_VM_NAME) + + getattr(mock_svc, self._DESTROY_SYSTEM).assert_called_with( + self._FAKE_VM_PATH) + + @mock.patch.object(vmutils.VMUtils, '_wait_for_job') + def test_check_ret_val_ok(self, mock_wait_for_job): + self._vmutils.check_ret_val(constants.WMI_JOB_STATUS_STARTED, + self._FAKE_JOB_PATH) + mock_wait_for_job.assert_called_once_with(self._FAKE_JOB_PATH) + + def test_check_ret_val_exception(self): + self.assertRaises(vmutils.HyperVException, + self._vmutils.check_ret_val, + self._FAKE_RET_VAL_BAD, + self._FAKE_JOB_PATH) + + def test_wait_for_job_done(self): + mockjob = self._prepare_wait_for_job(constants.WMI_JOB_STATE_COMPLETED) + job = self._vmutils._wait_for_job(self._FAKE_JOB_PATH) + self.assertEqual(mockjob, job) + + def test_wait_for_job_exception_concrete_job(self): + mock_job = self._prepare_wait_for_job() + mock_job.path.return_value.Class = self._CONCRETE_JOB + self.assertRaises(vmutils.HyperVException, + self._vmutils._wait_for_job, + self._FAKE_JOB_PATH) + + def test_wait_for_job_exception_with_error(self): + mock_job = self._prepare_wait_for_job() + mock_job.GetError.return_value = (self._FAKE_ERROR, self._FAKE_RET_VAL) + self.assertRaises(vmutils.HyperVException, + self._vmutils._wait_for_job, + self._FAKE_JOB_PATH) + + def test_wait_for_job_exception_no_error(self): + mock_job = self._prepare_wait_for_job() + mock_job.GetError.return_value = (None, None) + self.assertRaises(vmutils.HyperVException, + self._vmutils._wait_for_job, + self._FAKE_JOB_PATH) + + def _prepare_wait_for_job(self, state=_FAKE_JOB_STATUS_BAD): + mock_job = mock.MagicMock() + mock_job.JobState = state + mock_job.Description = self._FAKE_JOB_DESCRIPTION + mock_job.ElapsedTime = self._FAKE_ELAPSED_TIME + + self._vmutils._get_wmi_obj = mock.MagicMock(return_value=mock_job) + return mock_job + + def test_add_virt_resource(self): + mock_svc = self._vmutils._conn.Msvm_VirtualSystemManagementService()[0] + getattr(mock_svc, self._ADD_RESOURCE).return_value = ( + self._FAKE_JOB_PATH, mock.MagicMock(), self._FAKE_RET_VAL) + mock_res_setting_data = mock.MagicMock() + mock_res_setting_data.GetText_.return_value = self._FAKE_RES_DATA + + self._vmutils._add_virt_resource(mock_res_setting_data, + self._FAKE_VM_PATH) + self._assert_add_resources(mock_svc) + + def test_modify_virt_resource(self): + mock_svc = self._vmutils._conn.Msvm_VirtualSystemManagementService()[0] + mock_svc.ModifyVirtualSystemResources.return_value = ( + self._FAKE_JOB_PATH, self._FAKE_RET_VAL) + mock_res_setting_data = mock.MagicMock() + mock_res_setting_data.GetText_.return_value = self._FAKE_RES_DATA + + self._vmutils._modify_virt_resource(mock_res_setting_data, + self._FAKE_VM_PATH) + + mock_svc.ModifyVirtualSystemResources.assert_called_with( + ResourceSettingData=[self._FAKE_RES_DATA], + ComputerSystem=self._FAKE_VM_PATH) + + def test_remove_virt_resource(self): + mock_svc = self._vmutils._conn.Msvm_VirtualSystemManagementService()[0] + getattr(mock_svc, self._REMOVE_RESOURCE).return_value = ( + self._FAKE_JOB_PATH, self._FAKE_RET_VAL) + mock_res_setting_data = mock.MagicMock() + mock_res_setting_data.path_.return_value = self._FAKE_RES_PATH + + self._vmutils._remove_virt_resource(mock_res_setting_data, + self._FAKE_VM_PATH) + self._assert_remove_resources(mock_svc) + + @mock.patch.object(vmutils, 'wmi', create=True) + @mock.patch.object(vmutils.VMUtils, 'check_ret_val') + def test_take_vm_snapshot(self, mock_check_ret_val, mock_wmi): + self._lookup_vm() + + mock_svc = self._get_snapshot_service() + mock_svc.CreateVirtualSystemSnapshot.return_value = ( + self._FAKE_JOB_PATH, self._FAKE_RET_VAL, mock.MagicMock()) + + self._vmutils.take_vm_snapshot(self._FAKE_VM_NAME) + + mock_svc.CreateVirtualSystemSnapshot.assert_called_with( + self._FAKE_VM_PATH) + + mock_check_ret_val.assert_called_once_with(self._FAKE_RET_VAL, + self._FAKE_JOB_PATH) + + def test_remove_vm_snapshot(self): + mock_svc = self._get_snapshot_service() + getattr(mock_svc, self._DESTROY_SNAPSHOT).return_value = ( + self._FAKE_JOB_PATH, self._FAKE_RET_VAL) + + self._vmutils.remove_vm_snapshot(self._FAKE_SNAPSHOT_PATH) + getattr(mock_svc, self._DESTROY_SNAPSHOT).assert_called_with( + self._FAKE_SNAPSHOT_PATH) + + def test_detach_vm_disk(self): + self._lookup_vm() + mock_disk = self._prepare_mock_disk() + + with mock.patch.object(self._vmutils, + '_remove_virt_resource') as mock_rm_virt_res: + self._vmutils.detach_vm_disk(self._FAKE_VM_NAME, + self._FAKE_HOST_RESOURCE) + + mock_rm_virt_res.assert_called_with(mock_disk, self._FAKE_VM_PATH) + + def test_get_mounted_disk_resource_from_path(self): + mock_disk_1 = mock.MagicMock() + mock_disk_2 = mock.MagicMock() + mock_disk_2.HostResource = [self._FAKE_MOUNTED_DISK_PATH] + self._vmutils._conn.query.return_value = [mock_disk_1, mock_disk_2] + + physical_disk = self._vmutils._get_mounted_disk_resource_from_path( + self._FAKE_MOUNTED_DISK_PATH) + + self.assertEqual(mock_disk_2, physical_disk) + + def test_get_controller_volume_paths(self): + self._prepare_mock_disk() + mock_disks = {self._FAKE_RES_PATH: self._FAKE_HOST_RESOURCE} + disks = self._vmutils.get_controller_volume_paths(self._FAKE_RES_PATH) + self.assertEqual(mock_disks, disks) + + def _prepare_mock_disk(self): + mock_disk = mock.MagicMock() + mock_disk.HostResource = [self._FAKE_HOST_RESOURCE] + mock_disk.path.return_value.RelPath = self._FAKE_RES_PATH + mock_disk.ResourceSubType = self._vmutils._IDE_DISK_RES_SUB_TYPE + self._vmutils._conn.query.return_value = [mock_disk] + + return mock_disk + + def _get_snapshot_service(self): + return self._vmutils._conn.Msvm_VirtualSystemManagementService()[0] + + def _assert_add_resources(self, mock_svc): + getattr(mock_svc, self._ADD_RESOURCE).assert_called_with( + [self._FAKE_RES_DATA], self._FAKE_VM_PATH) + + def _assert_remove_resources(self, mock_svc): + getattr(mock_svc, self._REMOVE_RESOURCE).assert_called_with( + [self._FAKE_RES_PATH], self._FAKE_VM_PATH) diff --git a/nova/tests/virt/hyperv/test_vmutilsv2.py b/nova/tests/virt/hyperv/test_vmutilsv2.py index 317699147bc5..b96bab729572 100644 --- a/nova/tests/virt/hyperv/test_vmutilsv2.py +++ b/nova/tests/virt/hyperv/test_vmutilsv2.py @@ -1,4 +1,4 @@ -# Copyright 2013 Cloudbase Solutions Srl +# Copyright 2014 Cloudbase Solutions Srl # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain @@ -14,205 +14,28 @@ import mock -from nova import test - +from nova.tests.virt.hyperv import test_vmutils from nova.virt.hyperv import vmutilsv2 -class VMUtilsV2TestCase(test.NoDBTestCase): +class VMUtilsV2TestCase(test_vmutils.VMUtilsTestCase): """Unit tests for the Hyper-V VMUtilsV2 class.""" - _FAKE_VM_NAME = 'fake_vm' - _FAKE_MEMORY_MB = 2 - _FAKE_VCPUS_NUM = 4 - _FAKE_JOB_PATH = 'fake_job_path' - _FAKE_RET_VAL = 0 - _FAKE_CTRL_PATH = 'fake_ctrl_path' - _FAKE_CTRL_ADDR = 0 - _FAKE_DRIVE_ADDR = 0 - _FAKE_MOUNTED_DISK_PATH = 'fake_mounted_disk_path' - _FAKE_VM_PATH = "fake_vm_path" - _FAKE_ENABLED_STATE = 1 - _FAKE_SNAPSHOT_PATH = "_FAKE_SNAPSHOT_PATH" - _FAKE_RES_DATA = "fake_res_data" - _FAKE_RES_PATH = "fake_res_path" - _FAKE_DYNAMIC_MEMORY_RATIO = 1.0 - _FAKE_VHD_PATH = "fake_vhd_path" - _FAKE_VOLUME_DRIVE_PATH = "fake_volume_drive_path" + _DEFINE_SYSTEM = 'DefineSystem' + _DESTROY_SYSTEM = 'DestroySystem' + _DESTROY_SNAPSHOT = 'DestroySnapshot' + + _ADD_RESOURCE = 'AddResourceSettings' + _REMOVE_RESOURCE = 'RemoveResourceSettings' + _SETTING_TYPE = 'VirtualSystemType' + + _VIRTUAL_SYSTEM_TYPE_REALIZED = 'Microsoft:Hyper-V:System:Realized' def setUp(self): + super(VMUtilsV2TestCase, self).setUp() self._vmutils = vmutilsv2.VMUtilsV2() self._vmutils._conn = mock.MagicMock() - super(VMUtilsV2TestCase, self).setUp() - - def _lookup_vm(self): - mock_vm = mock.MagicMock() - self._vmutils._lookup_vm_check = mock.MagicMock( - return_value=mock_vm) - mock_vm.path_.return_value = self._FAKE_VM_PATH - return mock_vm - - def test_create_vm(self): - mock_svc = self._vmutils._conn.Msvm_VirtualSystemManagementService()[0] - mock_svc.DefineSystem.return_value = (None, self._FAKE_JOB_PATH, - self._FAKE_RET_VAL) - - self._vmutils._get_wmi_obj = mock.MagicMock() - mock_vm = self._vmutils._get_wmi_obj.return_value - - mock_s = mock.MagicMock() - mock_s.VirtualSystemType = self._vmutils._VIRTUAL_SYSTEM_TYPE_REALIZED - mock_vm.associators.return_value = [mock_s] - - self._vmutils._set_vm_memory = mock.MagicMock() - self._vmutils._set_vm_vcpus = mock.MagicMock() - - self._vmutils.create_vm(self._FAKE_VM_NAME, self._FAKE_MEMORY_MB, - self._FAKE_VCPUS_NUM, False, - self._FAKE_DYNAMIC_MEMORY_RATIO) - - self.assertTrue(mock_svc.DefineSystem.called) - self._vmutils._set_vm_memory.assert_called_with( - mock_vm, mock_s, self._FAKE_MEMORY_MB, - self._FAKE_DYNAMIC_MEMORY_RATIO) - - self._vmutils._set_vm_vcpus.assert_called_with(mock_vm, mock_s, - self._FAKE_VCPUS_NUM, - False) - - def test_attach_ide_drive(self): - self._lookup_vm() - self._vmutils._get_vm_ide_controller = mock.MagicMock() - self._vmutils._get_new_resource_setting_data = mock.MagicMock() - self._vmutils._add_virt_resource = mock.MagicMock() - - self._vmutils.attach_ide_drive(self._FAKE_VM_NAME, - self._FAKE_CTRL_PATH, - self._FAKE_CTRL_ADDR, - self._FAKE_DRIVE_ADDR) - - self.assertTrue(self._vmutils._get_vm_ide_controller.called) - self.assertTrue(self._vmutils._get_new_resource_setting_data.called) - self.assertTrue(self._vmutils._add_virt_resource.called) - - def test_attach_volume_to_controller(self): - self._lookup_vm() - self._vmutils._add_virt_resource = mock.MagicMock() - - self._vmutils.attach_volume_to_controller(self._FAKE_VM_NAME, - self._FAKE_CTRL_PATH, - self._FAKE_CTRL_ADDR, - self._FAKE_MOUNTED_DISK_PATH) - - self.assertTrue(self._vmutils._add_virt_resource.called) - - def test_create_scsi_controller(self): - self._lookup_vm() - self._vmutils._add_virt_resource = mock.MagicMock() - - self._vmutils.create_scsi_controller(self._FAKE_VM_NAME) - - self.assertTrue(self._vmutils._add_virt_resource.called) - - def test_get_vm_storage_paths(self): - mock_vm = self._lookup_vm() - - mock_vmsettings = [mock.MagicMock()] - mock_vm.associators.return_value = mock_vmsettings - mock_sasds = [] - mock_sasd1 = mock.MagicMock() - mock_sasd1.ResourceSubType = self._vmutils._IDE_DISK_RES_SUB_TYPE - mock_sasd1.HostResource = [self._FAKE_VHD_PATH] - mock_sasd2 = mock.MagicMock() - mock_sasd2.ResourceSubType = self._vmutils._PHYS_DISK_RES_SUB_TYPE - mock_sasd2.HostResource = [self._FAKE_VOLUME_DRIVE_PATH] - mock_sasds.append(mock_sasd1) - mock_sasds.append(mock_sasd2) - mock_vmsettings[0].associators.return_value = mock_sasds - - storage = self._vmutils.get_vm_storage_paths(self._FAKE_VM_NAME) - (disk_files, volume_drives) = storage - - mock_vm.associators.assert_called_with( - wmi_result_class='Msvm_VirtualSystemSettingData') - mock_vmsettings[0].associators.assert_called_with( - wmi_result_class='Msvm_StorageAllocationSettingData') - self.assertEqual([self._FAKE_VHD_PATH], disk_files) - self.assertEqual([self._FAKE_VOLUME_DRIVE_PATH], volume_drives) - - def test_destroy(self): - self._lookup_vm() - - mock_svc = self._vmutils._conn.Msvm_VirtualSystemManagementService()[0] - mock_svc.DestroySystem.return_value = (self._FAKE_JOB_PATH, - self._FAKE_RET_VAL) - - self._vmutils.destroy_vm(self._FAKE_VM_NAME) - - mock_svc.DestroySystem.assert_called_with(self._FAKE_VM_PATH) - - def test_get_vm_state(self): - self._vmutils.get_vm_summary_info = mock.MagicMock( - return_value={'EnabledState': self._FAKE_ENABLED_STATE}) - - enabled_state = self._vmutils.get_vm_state(self._FAKE_VM_NAME) - - self.assertEqual(self._FAKE_ENABLED_STATE, enabled_state) - - def test_take_vm_snapshot(self): - self._lookup_vm() - - mock_svc = self._vmutils._conn.Msvm_VirtualSystemSnapshotService()[0] - mock_svc.CreateSnapshot.return_value = (self._FAKE_JOB_PATH, - mock.MagicMock(), - self._FAKE_RET_VAL) - vmutilsv2.wmi = mock.MagicMock() - - self._vmutils.take_vm_snapshot(self._FAKE_VM_NAME) - - mock_svc.CreateSnapshot.assert_called_with( - AffectedSystem=self._FAKE_VM_PATH, - SnapshotType=self._vmutils._SNAPSHOT_FULL) - - def test_remove_vm_snapshot(self): - mock_svc = self._vmutils._conn.Msvm_VirtualSystemSnapshotService()[0] - mock_svc.DestroySnapshot.return_value = (self._FAKE_JOB_PATH, - self._FAKE_RET_VAL) - - self._vmutils.remove_vm_snapshot(self._FAKE_SNAPSHOT_PATH) - - mock_svc.DestroySnapshot.assert_called_with(self._FAKE_SNAPSHOT_PATH) - - def test_set_nic_connection(self): - self._lookup_vm() - - self._vmutils._get_nic_data_by_name = mock.MagicMock() - self._vmutils._add_virt_resource = mock.MagicMock() - - fake_eth_port = mock.MagicMock() - self._vmutils._get_new_setting_data = mock.MagicMock( - return_value=fake_eth_port) - - self._vmutils.set_nic_connection(self._FAKE_VM_NAME, None, None) - - self._vmutils._add_virt_resource.assert_called_with(fake_eth_port, - self._FAKE_VM_PATH) - - def test_add_virt_resource(self): - mock_svc = self._vmutils._conn.Msvm_VirtualSystemManagementService()[0] - mock_svc.AddResourceSettings.return_value = (self._FAKE_JOB_PATH, - mock.MagicMock(), - self._FAKE_RET_VAL) - mock_res_setting_data = mock.MagicMock() - mock_res_setting_data.GetText_.return_value = self._FAKE_RES_DATA - - self._vmutils._add_virt_resource(mock_res_setting_data, - self._FAKE_VM_PATH) - - mock_svc.AddResourceSettings.assert_called_with(self._FAKE_VM_PATH, - [self._FAKE_RES_DATA]) - def test_modify_virt_resource(self): mock_svc = self._vmutils._conn.Msvm_VirtualSystemManagementService()[0] mock_svc.ModifyResourceSettings.return_value = (self._FAKE_JOB_PATH, @@ -227,18 +50,35 @@ class VMUtilsV2TestCase(test.NoDBTestCase): mock_svc.ModifyResourceSettings.assert_called_with( ResourceSettings=[self._FAKE_RES_DATA]) - def test_remove_virt_resource(self): - mock_svc = self._vmutils._conn.Msvm_VirtualSystemManagementService()[0] - mock_svc.RemoveResourceSettings.return_value = (self._FAKE_JOB_PATH, - self._FAKE_RET_VAL) - mock_res_setting_data = mock.MagicMock() - mock_res_setting_data.path_.return_value = self._FAKE_RES_PATH + @mock.patch.object(vmutilsv2, 'wmi', create=True) + @mock.patch.object(vmutilsv2.VMUtilsV2, 'check_ret_val') + def test_take_vm_snapshot(self, mock_check_ret_val, mock_wmi): + self._lookup_vm() - self._vmutils._remove_virt_resource(mock_res_setting_data, - self._FAKE_VM_PATH) + mock_svc = self._get_snapshot_service() + mock_svc.CreateSnapshot.return_value = (self._FAKE_JOB_PATH, + mock.MagicMock(), + self._FAKE_RET_VAL) - mock_svc.RemoveResourceSettings.assert_called_with( - [self._FAKE_RES_PATH]) + self._vmutils.take_vm_snapshot(self._FAKE_VM_NAME) + + mock_svc.CreateSnapshot.assert_called_with( + AffectedSystem=self._FAKE_VM_PATH, + SnapshotType=self._vmutils._SNAPSHOT_FULL) + + mock_check_ret_val.assert_called_once_with(self._FAKE_RET_VAL, + self._FAKE_JOB_PATH) + + @mock.patch.object(vmutilsv2.VMUtilsV2, '_add_virt_resource') + @mock.patch.object(vmutilsv2.VMUtilsV2, '_get_new_setting_data') + @mock.patch.object(vmutilsv2.VMUtilsV2, '_get_nic_data_by_name') + def test_set_nic_connection(self, mock_get_nic_data, mock_get_new_sd, + mock_add_virt_res): + self._lookup_vm() + fake_eth_port = mock_get_new_sd.return_value + + self._vmutils.set_nic_connection(self._FAKE_VM_NAME, None, None) + mock_add_virt_res.assert_called_with(fake_eth_port, self._FAKE_VM_PATH) @mock.patch('nova.virt.hyperv.vmutils.VMUtils._get_vm_disks') def test_enable_vm_metrics_collection(self, mock_get_vm_disks): @@ -336,3 +176,14 @@ class VMUtilsV2TestCase(test.NoDBTestCase): self._vmutils._conn.Msvm_VirtualSystemSettingData.assert_called_with( ['ElementName'], VirtualSystemType=self._vmutils._VIRTUAL_SYSTEM_TYPE_REALIZED) + + def _get_snapshot_service(self): + return self._vmutils._conn.Msvm_VirtualSystemSnapshotService()[0] + + def _assert_add_resources(self, mock_svc): + getattr(mock_svc, self._ADD_RESOURCE).assert_called_with( + self._FAKE_VM_PATH, [self._FAKE_RES_DATA]) + + def _assert_remove_resources(self, mock_svc): + getattr(mock_svc, self._REMOVE_RESOURCE).assert_called_with( + [self._FAKE_RES_PATH])