52
52
from nova.virt.hyperv import pathutils
53
53
from nova.virt.hyperv import vhdutils
54
54
from nova.virt.hyperv import vmutils
55
from nova.virt.hyperv import volumeops
56
55
from nova.virt.hyperv import volumeutils
57
56
from nova.virt.hyperv import volumeutilsv2
58
57
from nova.virt import images
84
83
self._instance_ide_dvds = []
85
84
self._instance_volume_disks = []
86
85
self._test_vm_name = None
86
self._check_min_windows_version_satisfied = True
88
88
self._setup_stubs()
90
90
self.flags(instances_path=r'C:\Hyper-V\test\instances',
91
91
network_api_class='nova.network.quantumv2.api.API')
92
self.flags(force_volumeutils_v1=True, group='hyperv')
93
94
self._conn = driver_hyperv.HyperVDriver(None)
112
113
self.stubs.Set(glance, 'get_remote_image_service',
113
114
fake_get_remote_image_service)
116
def fake_check_min_windows_version(fake_self, major, minor):
117
return self._check_min_windows_version_satisfied
118
self.stubs.Set(hostutils.HostUtils, 'check_min_windows_version',
119
fake_check_min_windows_version)
115
121
def fake_sleep(ms):
117
123
self.stubs.Set(time, 'sleep', fake_sleep)
121
127
vmutils.VMUtils.__init__ = fake_vmutils__init__
123
def fake_get_volume_utils(self):
124
return volumeutils.VolumeUtils()
125
volumeops.VolumeOps._get_volume_utils = fake_get_volume_utils
127
129
self.stubs.Set(pathutils, 'PathUtils', fake.PathUtils)
128
130
self._mox.StubOutWithMock(fake.PathUtils, 'open')
129
131
self._mox.StubOutWithMock(fake.PathUtils, 'copyfile')
490
492
constants.HYPERV_VM_STATE_DISABLED)
492
494
def test_power_on(self):
493
self._test_vm_state_change(self._conn.power_on,
494
constants.HYPERV_VM_STATE_DISABLED,
495
constants.HYPERV_VM_STATE_ENABLED)
495
self._instance_data = self._get_instance_data()
496
network_info = fake_network.fake_get_instance_nw_info(self.stubs,
498
vmutils.VMUtils.set_vm_state(mox.Func(self._check_instance_name),
499
constants.HYPERV_VM_STATE_ENABLED)
500
self._mox.ReplayAll()
501
self._conn.power_on(self._context, self._instance_data, network_info)
502
self._mox.VerifyAll()
497
504
def test_power_on_already_running(self):
498
self._test_vm_state_change(self._conn.power_on, None,
499
constants.HYPERV_VM_STATE_ENABLED)
505
self._instance_data = self._get_instance_data()
506
network_info = fake_network.fake_get_instance_nw_info(self.stubs,
508
vmutils.VMUtils.set_vm_state(mox.Func(self._check_instance_name),
509
constants.HYPERV_VM_STATE_ENABLED)
510
self._mox.ReplayAll()
511
self._conn.power_on(self._context, self._instance_data, network_info)
512
self._mox.VerifyAll()
501
514
def test_reboot(self):
533
546
self._conn.destroy(self._instance_data, None)
534
547
self._mox.VerifyAll()
549
def test_live_migration_unsupported_os(self):
550
self._check_min_windows_version_satisfied = False
551
self._conn = driver_hyperv.HyperVDriver(None)
552
self._test_live_migration(unsupported_os=True)
536
554
def test_live_migration_without_volumes(self):
537
555
self._test_live_migration()
543
561
self._test_live_migration(test_failure=True)
545
563
def _test_live_migration(self, test_failure=False,
565
unsupported_os=False):
547
566
dest_server = 'fake_server'
549
568
instance_data = self._get_instance_data()
550
569
instance_name = instance_data['name']
552
571
fake_post_method = self._mox.CreateMockAnything()
572
if not test_failure and not unsupported_os:
554
573
fake_post_method(self._context, instance_data, dest_server,
571
590
fake_scsi_paths = {}
573
m = livemigrationutils.LiveMigrationUtils.live_migrate_vm(
574
instance_data['name'], dest_server)
576
m.AndRaise(vmutils.HyperVException('Simulated failure'))
592
if not unsupported_os:
593
m = livemigrationutils.LiveMigrationUtils.live_migrate_vm(
594
instance_data['name'], dest_server)
596
m.AndRaise(vmutils.HyperVException('Simulated failure'))
579
m.AndReturn([(fake_target_iqn, fake_target_lun)])
580
volumeutils.VolumeUtils.logout_storage_target(fake_target_iqn)
599
m.AndReturn([(fake_target_iqn, fake_target_lun)])
600
volumeutils.VolumeUtils.logout_storage_target(fake_target_iqn)
584
604
self._mox.ReplayAll()
606
hyperv_exception_raised = False
607
unsupported_os_exception_raised = False
586
608
self._conn.live_migration(self._context, instance_data,
587
609
dest_server, fake_post_method,
588
610
fake_recover_method)
589
exception_raised = False
590
611
except vmutils.HyperVException:
591
exception_raised = True
612
hyperv_exception_raised = True
613
except NotImplementedError:
614
unsupported_os_exception_raised = True
593
self.assertTrue(not test_failure ^ exception_raised)
616
self.assertTrue(not test_failure ^ hyperv_exception_raised)
617
self.assertTrue(not unsupported_os ^ unsupported_os_exception_raised)
594
618
self._mox.VerifyAll()
596
620
def test_pre_live_migration_cow_image(self):
943
967
fake_mounted_disk)
944
968
m.WithSideEffects(self._add_volume_disk)
970
def _test_volumeutils_version(self, is_hyperv_2012=True,
971
force_volumeutils_v1=False):
972
self._check_min_windows_version_satisfied = is_hyperv_2012
973
self.flags(force_volumeutils_v1=force_volumeutils_v1, group='hyperv')
974
self._conn = driver_hyperv.HyperVDriver(None)
975
is_volutils_v2 = isinstance(self._conn._volumeops._volutils,
976
volumeutilsv2.VolumeUtilsV2)
978
self.assertTrue((is_hyperv_2012 and not force_volumeutils_v1) ^
979
(not is_volutils_v2))
981
def test_volumeutils_version_hyperv_2012(self):
982
self._test_volumeutils_version(True, False)
984
def test_volumeutils_version_hyperv_2012_force_v1(self):
985
self._test_volumeutils_version(True, True)
987
def test_volumeutils_version_hyperv_2008R2(self):
988
self._test_volumeutils_version(False, False)
946
990
def test_attach_volume(self):
947
991
instance_data = self._get_instance_data()