summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Erdfelt <johannes.erdfelt@rackspace.com>2012-08-16 19:01:02 +0000
committerJohannes Erdfelt <johannes.erdfelt@rackspace.com>2012-08-16 19:56:05 +0000
commit5fc1abfc64f68ed56938f275ad6d7df0ccf228e7 (patch)
tree07b0a032732f4dbc3d733c43845649921f419124
parent71724dc2855376d9d54f7b136a6ba1ee61d023ec (diff)
downloadnova-5fc1abfc64f68ed56938f275ad6d7df0ccf228e7.tar.gz
nova-5fc1abfc64f68ed56938f275ad6d7df0ccf228e7.tar.xz
nova-5fc1abfc64f68ed56938f275ad6d7df0ccf228e7.zip
xenapi: attach root disk during rescue before boot
Fixes bug 1037729 The xenapi driver attaches the root disk after the rescue instance has booted. However, hotplugging block devices is only supported on images that use PV drivers. Attaching the disk before the rescue instance boots will allow rescue to work on instances that don't use PV drivers. Change-Id: I187762e4f1ea921d81afd40fcbde0b93d7d3cbc1
-rw-r--r--nova/virt/xenapi/vmops.py22
1 files changed, 15 insertions, 7 deletions
diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py
index 10cca68f4..3a0c8e4d1 100644
--- a/nova/virt/xenapi/vmops.py
+++ b/nova/virt/xenapi/vmops.py
@@ -303,6 +303,18 @@ class VMOps(object):
undo_mgr.undo_with(undo_create_vm)
return vm_ref
+ if rescue:
+ # NOTE(johannes): Attach root disk to rescue VM now, before
+ # booting the VM, since we can't hotplug block devices
+ # on non-PV guests
+ @step
+ def attach_root_disk_step(undo_mgr, vm_ref):
+ orig_vm_ref = vm_utils.lookup(self._session, instance['name'])
+ vdi_ref = self._find_root_vdi_ref(orig_vm_ref)
+
+ vm_utils.create_vbd(self._session, vm_ref, vdi_ref,
+ DEVICE_RESCUE, bootable=False)
+
@step
def prepare_security_group_filters_step(undo_mgr):
try:
@@ -345,6 +357,9 @@ class VMOps(object):
vm_ref = create_vm_step(undo_mgr, vdis, kernel_file, ramdisk_file)
prepare_security_group_filters_step(undo_mgr)
+ if rescue:
+ attach_root_disk_step(undo_mgr, vm_ref)
+
boot_instance_step(undo_mgr, vm_ref)
apply_security_group_filters_step(undo_mgr)
@@ -1054,13 +1069,6 @@ class VMOps(object):
self._acquire_bootlock(vm_ref)
self.spawn(context, instance, image_meta, [], rescue_password,
network_info, name_label=rescue_name_label, rescue=True)
- rescue_vm_ref = vm_utils.lookup(self._session, rescue_name_label)
- vdi_ref = self._find_root_vdi_ref(vm_ref)
-
- rescue_vbd_ref = vm_utils.create_vbd(self._session, rescue_vm_ref,
- vdi_ref, DEVICE_RESCUE,
- bootable=False)
- self._session.call_xenapi('VBD.plug', rescue_vbd_ref)
def unrescue(self, instance):
"""Unrescue the specified instance.