summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorCerberus <matt.dietz@rackspace.com>2011-02-14 23:22:37 -0600
committerCerberus <matt.dietz@rackspace.com>2011-02-14 23:22:37 -0600
commite7fe96453760320ef897b9edfc39e057d565e6c0 (patch)
tree84426d28e730c14a8128346a3e91ace388f984de /nova
parent3014c0896202b592858fc1a7fc9c29b92a6f5d1b (diff)
downloadnova-e7fe96453760320ef897b9edfc39e057d565e6c0.tar.gz
nova-e7fe96453760320ef897b9edfc39e057d565e6c0.tar.xz
nova-e7fe96453760320ef897b9edfc39e057d565e6c0.zip
Refactored
Diffstat (limited to 'nova')
-rw-r--r--nova/compute/manager.py9
-rw-r--r--nova/virt/xenapi/vmops.py50
-rw-r--r--nova/virt/xenapi_conn.py2
3 files changed, 34 insertions, 27 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index 23d2b80ac..2308c8315 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -429,14 +429,15 @@ class ComputeManager(manager.Manager):
self.db.migration_update(context, migration_id,
{ 'status': 'migrating', })
- self.driver.migrate_disk_and_power_off(instance_ref,
+ disk_info = self.driver.migrate_disk_and_power_off(instance_ref,
migration_ref['dest_host'])
self.db.migration_update(context, migration_id,
{ 'status': 'post-migrating', })
+
#TODO(mdietz): This is where we would update the VM record
#after resizing
-
+
service = self.db.service_get_by_host_and_topic(context,
migration_ref['dest_host'], FLAGS.compute_topic)
topic = self.db.queue_get_for(context, FLAGS.compute_topic,
@@ -451,7 +452,7 @@ class ComputeManager(manager.Manager):
@exception.wrap_exception
@checks_instance_lock
- def finish_resize(self, context, instance_id, migration_id):
+ def finish_resize(self, context, instance_id, migration_id, disk_info):
"""Completes the migration process by setting up the newly transferred
disk and turning on the instance on its new host machine"""
migration_ref = self.db.migration_get(context, migration_id)
@@ -459,7 +460,7 @@ class ComputeManager(manager.Manager):
migration_ref['instance_id'])
# this may get passed into the following spawn instead
- disk_info = self.driver.attach_disk(instance_ref)
+ new_disk_info = self.driver.attach_disk(instance_ref, disk_info)
self.driver.spawn(instance_ref, disk=disk_info)
self.db.migration_update(context, migration_id,
diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py
index ba0db22f1..127a09ad1 100644
--- a/nova/virt/xenapi/vmops.py
+++ b/nova/virt/xenapi/vmops.py
@@ -103,17 +103,19 @@ class VMOps(object):
vdi_ref)
if instance.kernel_id:
kernel = VMHelper.fetch_image(self._session, instance.id,
- instance.kernel_id, user, project, ImageType.KERNEL_RAMDISK)
+ instance.kernel_id, user, project,
+ ImageType.KERNEL_RAMDISK)
if instance.ramdisk_id:
ramdisk = VMHelper.fetch_image(self._session, instance.id,
- instance.ramdisk_id, user, project, ImageType.KERNEL_RAMDISK)
+ instance.ramdisk_id, user, project,
+ ImageType.KERNEL_RAMDISK)
else:
vdi_ref = self._session.call_xenapi('VDI.get_by_uuid', disk)
vm_ref = VMHelper.create_vm(self._session,
instance, kernel, ramdisk, pv_kernel)
- VMHelper.create_vbd(session=self._session, vm_ref=vm_ref, vdi_ref=vdi_ref,
- userdevice=0, bootable=True)
+ VMHelper.create_vbd(session=self._session, vm_ref=vm_ref,
+ vdi_ref=vdi_ref, userdevice=0, bootable=True)
if network_ref:
VMHelper.create_vif(self._session, vm_ref,
@@ -234,7 +236,7 @@ class VMOps(object):
try:
template_vm_ref, template_vdi_uuids = VMHelper.create_snapshot(
self._session, instance.id, vm_ref, label)
- return Snapshot(self, instance, template_vm_ref,
+ return Snapshot(self, instance, template_vm_ref,
template_vdi_uuids)
except self.XenAPI.Failure, exc:
logging.error(_("Unable to Snapshot %(vm_ref)s: %(exc)s")
@@ -254,35 +256,40 @@ class VMOps(object):
# identify it via the VBD. The base copy is the parent_uuid returned
# from the snapshot creation
- #TODO(mdietz): explicitly forcing the base_copy and cow names is
- #pretty fugly
+ base_copy_uuid = cow_uuid = None
with self._get_snapshot(instance) as snapshot:
- params = {'host':dest, 'vdi_uuid':snapshot.vdi_uuids[1],
- 'dest_name': 'base_copy.vhd',
+ # transfer the base copy
+ base_copy_uuid = snapshot.vdi_uuids[1]
+ vdi_ref, vm_vdi_rec = \
+ VMHelper.get_vdi_for_vm_safely(self._session, vm_ref)
+ cow_uuid = vm_vdi_rec['uuid']
+
+ params = {'host': dest, 'vdi_uuid': base_copy_uuid,
'instance_id': instance.id, }
+
self._session.async_call_plugin('migration', 'transfer_vhd',
{'params': pickle.dumps(params)})
# Now power down the instance and transfer the COW VHD
self._shutdown(instance, vm_ref, method='clean')
- vdi_ref, vm_vdi_rec = \
- VMHelper.get_vdi_for_vm_safely(self._session, vm_ref)
- params = {'host':dest, 'vdi_uuid': vm_vdi_rec['uuid'],
- 'dest_name': 'cow.vhd',
+ params = {'host': dest, 'vdi_uuid': cow_uuid,
'instance_id': instance.id, }
self._session.async_call_plugin('migration', 'transfer_vhd',
{'params': pickle.dumps(params)})
- return snapshot.vdi_uuids[1], vm_vdi_rec['uuid']
- def attach_disk(self, instance):
- vm_ref = VMHelper.lookup(self._session, instance.name)
+ # TODO(mdietz): we could also consider renaming these to something
+ # sensible so we don't need to blindly pass around dictionaries
+ return {'base_copy': base_copy_uuid, 'cow': cow_uuid}
+ def attach_disk(self, instance, disk_info):
+ vm_ref = VMHelper.lookup(self._session, instance.name)
new_base_copy_uuid = str(uuid.uuid4())
-
- params = { 'instance_id': instance.id,
- 'new_base_copy_uuid': new_base_copy_uuid,
- 'new_cow_uuid': str(uuid.uuid4()) }
+ params = {'instance_id': instance.id,
+ 'old_base_copy_uuid': disk_info['base_copy'],
+ 'old_cow_uuid': disk_info['cow'],
+ 'new_base_copy_uuid': new_base_copy_uuid,
+ 'new_cow_uuid': str(uuid.uuid4())}
self._session.async_call_plugin('migration', 'move_vhds_into_sr',
{'params': pickle.dumps(params)})
@@ -290,7 +297,7 @@ class VMOps(object):
# Now we rescan the SR so we find the VHDs
VMHelper.scan_sr(self._session)
- return new_base_copy_uuid
+ return new_base_copy_uuid
def resize(self, instance, flavor):
"""Resize a running instance by changing it's RAM and disk size """
@@ -340,7 +347,6 @@ class VMOps(object):
raise RuntimeError(resp_dict['message'])
return resp_dict['message']
-
def _shutdown(self, instance, vm, method='hard'):
"""Shutdown an instance """
state = self.get_info(instance['name'])['state']
diff --git a/nova/virt/xenapi_conn.py b/nova/virt/xenapi_conn.py
index 6869ce8d8..21892ca37 100644
--- a/nova/virt/xenapi_conn.py
+++ b/nova/virt/xenapi_conn.py
@@ -197,7 +197,7 @@ class XenAPIConnection(object):
off the instance copies over the COW disk"""
self._vmops.migrate_disk_and_power_off(instance, dest)
- def attach_disk(self, instance):
+ def attach_disk(self, instance, disk_info):
"""Moves the copied VDIs into the SR"""
return self._vmops.attach_disk(instance)