diff options
| author | Cerberus <matt.dietz@rackspace.com> | 2011-03-10 16:07:50 -0600 |
|---|---|---|
| committer | Cerberus <matt.dietz@rackspace.com> | 2011-03-10 16:07:50 -0600 |
| commit | 4a9f4f4eef4e6fd6ab84ec2e03437144f9ab62f8 (patch) | |
| tree | 5be1194b0104ebfae3c7d43c4c22499a2ce22c91 /nova | |
| parent | af894c1f171212e722f5d0b8042e2c205df2aee4 (diff) | |
| download | nova-4a9f4f4eef4e6fd6ab84ec2e03437144f9ab62f8.tar.gz nova-4a9f4f4eef4e6fd6ab84ec2e03437144f9ab62f8.tar.xz nova-4a9f4f4eef4e6fd6ab84ec2e03437144f9ab62f8.zip | |
More resize
Diffstat (limited to 'nova')
| -rw-r--r-- | nova/compute/manager.py | 68 | ||||
| -rw-r--r-- | nova/virt/xenapi/vmops.py | 13 | ||||
| -rw-r--r-- | nova/virt/xenapi_conn.py | 9 |
3 files changed, 60 insertions, 30 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 399356a13..f73e81345 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -429,21 +429,37 @@ class ComputeManager(manager.Manager): instance_ref = self.db.instance_get(context, instance_id) migration_ref = self.db.migration_get(context, migration_id) - #TODO(mdietz): we may want to split these into separate methods. - if migration_ref['source_compute'] == FLAGS.host: - self.driver._start(instance_ref) - self.db.migration_update(context, migration_id, - {'status': 'reverted'}) - else: - self.driver.destroy(instance_ref) - topic = self.db.queue_get_for(context, FLAGS.compute_topic, - instance_ref['host']) - rpc.cast(context, topic, - {'method': 'revert_resize', - 'args': { - 'migration_id': migration_ref['id'], - 'instance_id': instance_id, }, - }) + self.driver.destroy(instance_ref) + topic = self.db.queue_get_for(context, FLAGS.compute_topic, + instance_ref['host']) + rpc.cast(context, topic, + {'method': 'finish_revert_resize', + 'args': { + 'migration_id': migration_ref['id'], + 'instance_id': instance_id, }, + }) + + @exception.wrap_exception + @checks_instance_lock + def finish_revert_resize(self, context, instance_id, migration_id): + """Finishes the second half of reverting a resize, powering back on + the source instance and reverting the resized attributes in the + database""" + instance_ref = self.db.instance_get(context, instance_id) + migration_ref = self.db.migration_get(context, migration_id) + instance_type = self.db.instance_type_get_by_flavor_id(context, + migration_ref['old_flavor_id']) + + #Just roll back the record. There's no need to resize down since + #the 'old' VM already has the preferred attributes + self.db.instance_update(context, + dict(memory_mb=instance_type['memory_mb'], + vcpus=instance_type['vcpus'], + local_gb=instance_type['local_gb'])) + + self.driver._start(instance_ref) + self.db.migration_update(context, migration_id, + {'status': 'reverted'}) @exception.wrap_exception @checks_instance_lock @@ -463,8 +479,8 @@ class ComputeManager(manager.Manager): 'source_compute': instance_ref['host'], 'dest_compute': FLAGS.host, 'dest_host': self.driver.get_host_ip_addr(), - 'old_flavor': instance_type['flavor_id'], - 'new_flavor': flavor_id, + 'old_flavor_id': instance_type['flavor_id'], + 'new_flavor_id': flavor_id, 'status': 'pre-migrating'}) LOG.audit(_('instance %s: migrating to '), instance_id, @@ -492,13 +508,7 @@ class ComputeManager(manager.Manager): self.db.migration_update(context, migration_id, {'status': 'post-migrating', }) - #TODO(mdietz): apply the rest of the instance_type attributes going - #after they're supported - self.db.instance_update(context, instance_ref, - dict(memory_mb=instance_type['memory_mb'], - vcpus=instance_type['vcpus'], - local_gb=instance_type['local_gb'])) - self.driver.resize_instance(context, instance_ref) + service = self.db.service_get_by_host_and_topic(context, migration_ref['dest_compute'], FLAGS.compute_topic) @@ -520,7 +530,17 @@ class ComputeManager(manager.Manager): migration_ref = self.db.migration_get(context, migration_id) instance_ref = self.db.instance_get(context, migration_ref['instance_id']) + + #TODO(mdietz): apply the rest of the instance_type attributes going + #after they're supported + instance_type = self.db.instance_type_get_by_flavor_id(context, + migration_ref['new_flavor_id']) + self.db.instance_update(context, instance_ref, + dict(memory_mb=instance_type['memory_mb'], + vcpus=instance_type['vcpus'], + local_gb=instance_type['local_gb'])) + self.driver.resize_instance(instance_ref, disk_info) self.driver.finish_resize(instance_ref, disk_info) self.db.migration_update(context, migration_id, diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py index 562ecd4d5..9e0bd6a75 100644 --- a/nova/virt/xenapi/vmops.py +++ b/nova/virt/xenapi/vmops.py @@ -365,9 +365,18 @@ class VMOps(object): return new_cow_uuid - def resize(self, instance, flavor): + def resize_instance(self, instance, vdi_uuid): """Resize a running instance by changing it's RAM and disk size """ - raise NotImplementedError() + vm_ref = VMHelper.lookup(self._session, instance.name) + vdi_ref, vm_vdi_rec = \ + VMHelper.get_vdi_for_vm_safely(self._session, vm_ref) + new_disk_size = instance.local_gb + + #TODO(mdietz): this will need to be adjusted for swap later + task = self._session.call_xenapi('VDI.resize_online', vdi_ref, + new_disk_size) + vm_ref = VMHelper.lookup(self._session, instance.name) + self._session.wait_for_task(task, instance.id) def reboot(self, instance): """Reboot VM instance""" diff --git a/nova/virt/xenapi_conn.py b/nova/virt/xenapi_conn.py index b63a5f8c3..92b262479 100644 --- a/nova/virt/xenapi_conn.py +++ b/nova/virt/xenapi_conn.py @@ -158,6 +158,11 @@ class XenAPIConnection(object): """Create VM instance""" self._vmops.spawn(instance) + def resize_instance(self, instance, disk_info): + """Resizes instance attributes such as RAM and disk space to the + attributes specified by the record""" + self._vmops.resize_instance(instance, disk_info['cow']) + def finish_resize(self, instance, disk_info): """Completes a resize, turning on the migrated instance""" vdi_uuid = self._vmops.attach_disk(instance, disk_info['base_copy'], @@ -168,10 +173,6 @@ class XenAPIConnection(object): """ Create snapshot from a running VM instance """ self._vmops.snapshot(instance, image_id) - def resize(self, instance, flavor): - """Resize a VM instance""" - raise NotImplementedError() - def reboot(self, instance): """Reboot VM instance""" self._vmops.reboot(instance) |
