Merge "Adds tests for Hyper-V VM Utils" into stable/icehouse
This commit is contained in:
commit
c04b6ea0ef
|
@ -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)
|
||||
|
|
|
@ -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])
|
||||
|
|
Loading…
Reference in New Issue