From 21ea2e6109831156592dd1e4f4f4caefdcedd04f Mon Sep 17 00:00:00 2001 From: Cory Stone Date: Fri, 28 Dec 2012 15:39:54 -0600 Subject: 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 --- nova/tests/test_xenapi.py | 2 +- nova/tests/virt/xenapi/test_volumeops.py | 75 +++++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 3 deletions(-) (limited to 'nova/tests') 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']) -- cgit