summaryrefslogtreecommitdiffstats
path: root/nova/tests
diff options
context:
space:
mode:
authorCory Stone <corystone@gmail.com>2012-12-28 15:39:54 -0600
committerCory Stone <corystone@gmail.com>2013-01-03 09:21:43 -0600
commit21ea2e6109831156592dd1e4f4f4caefdcedd04f (patch)
treea2df7a97b460402a6f9b3d1ed7287550830e936d /nova/tests
parent32eb83be79ff19e06b5057dce32052b98368ce40 (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.py2
-rw-r--r--nova/tests/virt/xenapi/test_volumeops.py75
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'])