Hyper-V: Sets *DataRoot paths for instances
Sets the path for the instance's ConfigurationDataRoot,
LogDataRoot, SnapshotDataRoot, SuspendDataRoot and
SwapFileDataRoot for vmutilsv2 instances and
ExternalDataRoot and SnapshotDataRoot for vmutils
to the instance's location.
Closes-Bug: #1430239
(cherry picked from commit 3e42c7ae3f
)
Conflicts:
nova/tests/unit/virt/hyperv/test_hypervapi.py
nova/tests/unit/virt/hyperv/test_vmops.py
nova/tests/unit/virt/hyperv/test_vmutils.py
nova/tests/unit/virt/hyperv/test_vmutilsv2.py
nova/virt/hyperv/vmops.py
nova/virt/hyperv/vmutils.py
nova/virt/hyperv/vmutilsv2.py
Change-Id: I3c9e2dece00df06cafdcd164ece6269337feda71
This commit is contained in:
parent
1ace2f5c26
commit
6db38233ee
|
@ -985,6 +985,7 @@ class HyperVAPITestCase(HyperVAPIBaseTestCase):
|
|||
vmutils.VMUtils.create_vm(mox.Func(self._check_vm_name), mox.IsA(int),
|
||||
mox.IsA(int), mox.IsA(bool),
|
||||
CONF.hyperv.dynamic_memory_ratio,
|
||||
mox.IsA(str),
|
||||
mox.IsA(list))
|
||||
|
||||
if not boot_from_volume:
|
||||
|
|
|
@ -234,7 +234,8 @@ class VMUtilsTestCase(test.NoDBTestCase):
|
|||
|
||||
self._vmutils.create_vm(self._FAKE_VM_NAME, self._FAKE_MEMORY_MB,
|
||||
self._FAKE_VCPUS_NUM, False,
|
||||
self._FAKE_DYNAMIC_MEMORY_RATIO)
|
||||
self._FAKE_DYNAMIC_MEMORY_RATIO,
|
||||
mock.sentinel.instance_path)
|
||||
|
||||
self.assertTrue(getattr(mock_svc, self._DEFINE_SYSTEM).called)
|
||||
mock_set_mem.assert_called_with(mock_vm, mock_s, self._FAKE_MEMORY_MB,
|
||||
|
@ -635,17 +636,21 @@ class VMUtilsTestCase(test.NoDBTestCase):
|
|||
fake_job_path,
|
||||
fake_ret_val)
|
||||
|
||||
response = self._vmutils._create_vm_obj(vs_man_svc=mock_vs_man_svc,
|
||||
vm_name='fake vm',
|
||||
notes='fake notes',
|
||||
dynamic_memory_ratio=1.0)
|
||||
response = self._vmutils._create_vm_obj(
|
||||
vs_man_svc=mock_vs_man_svc,
|
||||
vm_name='fake vm',
|
||||
notes='fake notes', dynamic_memory_ratio=1.0,
|
||||
instance_path=mock.sentinel.instance_path)
|
||||
|
||||
_conn.new.assert_called_once_with()
|
||||
self.assertEqual(mock_vs_gs_data.ElementName, 'fake vm')
|
||||
mock_vs_man_svc.DefineVirtualSystem.assert_called_once_with(
|
||||
[], None, mock_vs_gs_data.GetText_(1))
|
||||
mock_check_ret_val.assert_called_once_with(fake_ret_val, fake_job_path)
|
||||
|
||||
self.assertEqual(mock.sentinel.instance_path,
|
||||
mock_vs_gs_data.ExternalDataRoot)
|
||||
self.assertEqual(mock.sentinel.instance_path,
|
||||
mock_vs_gs_data.SnapshotDataRoot)
|
||||
mock_get_wmi_obj.assert_called_with(fake_vm_path)
|
||||
mock_get_vm_setting_data.assert_called_once_with(mock_get_wmi_obj())
|
||||
mock_modify_virtual_system.assert_called_once_with(
|
||||
|
|
|
@ -141,6 +141,7 @@ class VMUtilsV2TestCase(test_vmutils.VMUtilsTestCase):
|
|||
mock_job = mock.MagicMock()
|
||||
fake_job_path = 'fake job path'
|
||||
fake_ret_val = 'fake return value'
|
||||
fake_vm_name = 'fake_vm_name'
|
||||
_conn = self._vmutils._conn.Msvm_VirtualSystemSettingData
|
||||
|
||||
mock_check_ret_val.return_value = mock_job
|
||||
|
@ -152,16 +153,17 @@ class VMUtilsV2TestCase(test_vmutils.VMUtilsTestCase):
|
|||
|
||||
response = self._vmutils._create_vm_obj(
|
||||
vs_man_svc=mock_vs_man_svc,
|
||||
vm_name='fake vm',
|
||||
vm_name=fake_vm_name,
|
||||
notes='fake notes',
|
||||
dynamic_memory_ratio=dynamic_memory_ratio)
|
||||
dynamic_memory_ratio=dynamic_memory_ratio,
|
||||
instance_path=mock.sentinel.instance_path)
|
||||
|
||||
if not vm_path:
|
||||
mock_job.associators.assert_called_once_with(
|
||||
self._vmutils._AFFECTED_JOB_ELEMENT_CLASS)
|
||||
|
||||
_conn.new.assert_called_once_with()
|
||||
self.assertEqual(mock_vs_data.ElementName, 'fake vm')
|
||||
self.assertEqual(mock_vs_data.ElementName, fake_vm_name)
|
||||
mock_vs_man_svc.DefineSystem.assert_called_once_with(
|
||||
ResourceSettings=[], ReferenceConfiguration=None,
|
||||
SystemSettings=mock_vs_data.GetText_(1))
|
||||
|
@ -173,6 +175,15 @@ class VMUtilsV2TestCase(test_vmutils.VMUtilsTestCase):
|
|||
mock_get_wmi_obj.assert_called_with('fake vm path')
|
||||
|
||||
self.assertEqual(mock_vs_data.Notes, 'fake notes')
|
||||
self.assertEqual(mock.sentinel.instance_path,
|
||||
mock_vs_data.ConfigurationDataRoot)
|
||||
self.assertEqual(mock.sentinel.instance_path, mock_vs_data.LogDataRoot)
|
||||
self.assertEqual(mock.sentinel.instance_path,
|
||||
mock_vs_data.SnapshotDataRoot)
|
||||
self.assertEqual(mock.sentinel.instance_path,
|
||||
mock_vs_data.SuspendDataRoot)
|
||||
self.assertEqual(mock.sentinel.instance_path,
|
||||
mock_vs_data.SwapFileDataRoot)
|
||||
self.assertEqual(response, mock_get_wmi_obj())
|
||||
|
||||
def test_create_vm_obj(self):
|
||||
|
|
|
@ -291,12 +291,14 @@ class VMOps(object):
|
|||
def create_instance(self, instance, network_info, block_device_info,
|
||||
root_vhd_path, eph_vhd_path):
|
||||
instance_name = instance['name']
|
||||
instance_path = os.path.join(CONF.instances_path, instance_name)
|
||||
|
||||
self._vmutils.create_vm(instance_name,
|
||||
instance['memory_mb'],
|
||||
instance['vcpus'],
|
||||
CONF.hyperv.limit_cpu_features,
|
||||
CONF.hyperv.dynamic_memory_ratio,
|
||||
instance_path,
|
||||
[instance['uuid']])
|
||||
|
||||
ctrl_disk_addr = 0
|
||||
|
|
|
@ -239,13 +239,13 @@ class VMUtils(object):
|
|||
raise HyperVAuthorizationException(msg)
|
||||
|
||||
def create_vm(self, vm_name, memory_mb, vcpus_num, limit_cpu_features,
|
||||
dynamic_memory_ratio, notes=None):
|
||||
dynamic_memory_ratio, instance_path, notes=None):
|
||||
"""Creates a VM."""
|
||||
vs_man_svc = self._conn.Msvm_VirtualSystemManagementService()[0]
|
||||
|
||||
LOG.debug('Creating VM %s', vm_name)
|
||||
vm = self._create_vm_obj(vs_man_svc, vm_name, notes,
|
||||
dynamic_memory_ratio)
|
||||
dynamic_memory_ratio, instance_path)
|
||||
|
||||
vmsetting = self._get_vm_setting_data(vm)
|
||||
|
||||
|
@ -255,11 +255,14 @@ class VMUtils(object):
|
|||
LOG.debug('Set vCPUs for vm %s', vm_name)
|
||||
self._set_vm_vcpus(vm, vmsetting, vcpus_num, limit_cpu_features)
|
||||
|
||||
def _create_vm_obj(self, vs_man_svc, vm_name, notes, dynamic_memory_ratio):
|
||||
def _create_vm_obj(self, vs_man_svc, vm_name, notes,
|
||||
dynamic_memory_ratio, instance_path):
|
||||
vs_gs_data = self._conn.Msvm_VirtualSystemGlobalSettingData.new()
|
||||
vs_gs_data.ElementName = vm_name
|
||||
# Don't start automatically on host boot
|
||||
vs_gs_data.AutomaticStartupAction = self._AUTOMATIC_STARTUP_ACTION_NONE
|
||||
vs_gs_data.ExternalDataRoot = instance_path
|
||||
vs_gs_data.SnapshotDataRoot = instance_path
|
||||
|
||||
(vm_path,
|
||||
job_path,
|
||||
|
|
|
@ -89,7 +89,8 @@ class VMUtilsV2(vmutils.VMUtils):
|
|||
['ElementName'],
|
||||
VirtualSystemType=self._VIRTUAL_SYSTEM_TYPE_REALIZED)]
|
||||
|
||||
def _create_vm_obj(self, vs_man_svc, vm_name, notes, dynamic_memory_ratio):
|
||||
def _create_vm_obj(self, vs_man_svc, vm_name, notes, dynamic_memory_ratio,
|
||||
instance_path):
|
||||
vs_data = self._conn.Msvm_VirtualSystemSettingData.new()
|
||||
vs_data.ElementName = vm_name
|
||||
vs_data.Notes = notes
|
||||
|
@ -100,6 +101,14 @@ class VMUtilsV2(vmutils.VMUtils):
|
|||
if dynamic_memory_ratio > 1:
|
||||
vs_data.VirtualNumaEnabled = False
|
||||
|
||||
# Created VMs must have their *DataRoot paths in the same location as
|
||||
# the instances' path.
|
||||
vs_data.ConfigurationDataRoot = instance_path
|
||||
vs_data.LogDataRoot = instance_path
|
||||
vs_data.SnapshotDataRoot = instance_path
|
||||
vs_data.SuspendDataRoot = instance_path
|
||||
vs_data.SwapFileDataRoot = instance_path
|
||||
|
||||
(job_path,
|
||||
vm_path,
|
||||
ret_val) = vs_man_svc.DefineSystem(ResourceSettings=[],
|
||||
|
|
Loading…
Reference in New Issue