diff options
| author | Cory Stone <corystone@gmail.com> | 2012-12-28 15:39:54 -0600 |
|---|---|---|
| committer | Cory Stone <corystone@gmail.com> | 2013-01-03 09:21:43 -0600 |
| commit | 21ea2e6109831156592dd1e4f4f4caefdcedd04f (patch) | |
| tree | a2df7a97b460402a6f9b3d1ed7287550830e936d /nova/tests | |
| parent | 32eb83be79ff19e06b5057dce32052b98368ce40 (diff) | |
xenapi: Avoid hotplugging volumes on resize.
In finish_migration, instead of starting up the vm and then
hotplugging in the volumes to it, just attach the volumes before
starting the vm.
This avoids the issue where the guest OS hasn't loaded the PV
drivers for the volume yet.
Fixes bug 1094351
Change-Id: I51d754f8f82f1d22bc123b39777449b58b03e389
Diffstat (limited to 'nova/tests')
| -rw-r--r-- | nova/tests/test_xenapi.py | 2 | ||||
| -rw-r--r-- | nova/tests/virt/xenapi/test_volumeops.py | 75 |
2 files changed, 74 insertions, 3 deletions
diff --git a/nova/tests/test_xenapi.py b/nova/tests/test_xenapi.py index f2799b8f3..3ca69dc4c 100644 --- a/nova/tests/test_xenapi.py +++ b/nova/tests/test_xenapi.py @@ -911,7 +911,7 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): def __init__(self): self.finish_revert_migration_called = False - def finish_revert_migration(self, instance): + def finish_revert_migration(self, instance, block_info): self.finish_revert_migration_called = True conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False) diff --git a/nova/tests/virt/xenapi/test_volumeops.py b/nova/tests/virt/xenapi/test_volumeops.py index bc84386c4..5b5c38139 100644 --- a/nova/tests/virt/xenapi/test_volumeops.py +++ b/nova/tests/virt/xenapi/test_volumeops.py @@ -15,11 +15,12 @@ # under the License. from nova import test +from nova.tests.xenapi import stubs from nova.virt.xenapi import volumeops class VolumeAttachTestCase(test.TestCase): - def test_connect_volume_call(self): + def test_attach_volume_call(self): ops = volumeops.VolumeOps('session') self.mox.StubOutWithMock(ops, 'connect_volume') self.mox.StubOutWithMock(volumeops.vm_utils, 'vm_ref_or_raise') @@ -31,9 +32,79 @@ class VolumeAttachTestCase(test.TestCase): volumeops.volume_utils.get_device_number('mountpoint').AndReturn( 'devnumber') - ops.connect_volume('conn_data', 'devnumber', 'instance_1', 'vmref') + ops.connect_volume( + 'conn_data', 'devnumber', 'instance_1', 'vmref', hotplug=True) self.mox.ReplayAll() ops.attach_volume( dict(driver_volume_type='iscsi', data='conn_data'), 'instance_1', 'mountpoint') + + def test_attach_volume_no_hotplug(self): + ops = volumeops.VolumeOps('session') + self.mox.StubOutWithMock(ops, 'connect_volume') + self.mox.StubOutWithMock(volumeops.vm_utils, 'vm_ref_or_raise') + self.mox.StubOutWithMock(volumeops.volume_utils, 'get_device_number') + + volumeops.vm_utils.vm_ref_or_raise('session', 'instance_1').AndReturn( + 'vmref') + + volumeops.volume_utils.get_device_number('mountpoint').AndReturn( + 'devnumber') + + ops.connect_volume( + 'conn_data', 'devnumber', 'instance_1', 'vmref', hotplug=False) + + self.mox.ReplayAll() + ops.attach_volume( + dict(driver_volume_type='iscsi', data='conn_data'), + 'instance_1', 'mountpoint', hotplug=False) + + def test_connect_volume_no_hotplug(self): + session = stubs.FakeSessionForVolumeTests('fake_uri') + ops = volumeops.VolumeOps(session) + instance_name = 'instance_1' + sr_uuid = '1' + sr_label = 'Disk-for:%s' % instance_name + sr_params = '' + sr_ref = 'sr_ref' + vdi_uuid = '2' + vdi_ref = 'vdi_ref' + vbd_ref = 'vbd_ref' + connection_data = {'vdi_uuid': vdi_uuid} + vm_ref = 'vm_ref' + dev_number = 1 + + called = {'xenapi': False} + + def fake_call_xenapi(self, *args, **kwargs): + # Only used for VBD.plug in this code path. + called['xenapi'] = True + raise Exception() + + self.stubs.Set(ops._session, 'call_xenapi', fake_call_xenapi) + + self.mox.StubOutWithMock(volumeops.volume_utils, 'parse_sr_info') + self.mox.StubOutWithMock(ops, 'introduce_sr') + self.mox.StubOutWithMock(volumeops.volume_utils, 'introduce_vdi') + self.mox.StubOutWithMock(volumeops.vm_utils, 'create_vbd') + + volumeops.volume_utils.parse_sr_info( + connection_data, sr_label).AndReturn( + tuple([sr_uuid, sr_label, sr_params])) + + ops.introduce_sr(sr_uuid, sr_label, sr_params).AndReturn(sr_ref) + + volumeops.volume_utils.introduce_vdi( + session, sr_ref, vdi_uuid, None).AndReturn(vdi_ref) + + volumeops.vm_utils.create_vbd( + session, vm_ref, vdi_ref, dev_number, + bootable=False, osvol=True).AndReturn(vbd_ref) + + self.mox.ReplayAll() + + ops.connect_volume(connection_data, dev_number, instance_name, + vm_ref, hotplug=False) + + self.assertEquals(False, called['xenapi']) |
