summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCerberus <matt.dietz@rackspace.com>2011-03-09 13:46:05 -0600
committerCerberus <matt.dietz@rackspace.com>2011-03-09 13:46:05 -0600
commit80a6dc5504378ae3d96829d96c02f50b9daa3029 (patch)
tree6216f6b69b469687b497ecfb6d604eb718641326
parentb238805d2ee9c19d3fb9b4dc43fa404630bdfaab (diff)
stuff
-rw-r--r--nova/compute/api.py15
-rw-r--r--nova/compute/manager.py17
2 files changed, 27 insertions, 5 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 33d25fc4b..93f0a12c1 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -456,12 +456,23 @@ class API(base.Base):
self.db.instance_update(context, instance_id,
{'host': migration_ref['dest_compute'], })
- def resize(self, context, instance_id, flavor):
+ def resize(self, context, instance_id, flavor_id):
"""Resize a running instance."""
+ instance = self.db.instance_get(context, instance_id)
+ current_instance_type = self.db.instance_type_get_by_flavor_id(
+ context, instance['flavor_id'])
+ new_instance_type = self.db.instance_type_get_by_flavor_id(
+ context, flavor_id)
+
+ if current_instance_type.memory_mb > new_instance_typ.memory_mb:
+ raise exception.ApiError(_("Invalid flavor: cannot downsize"
+ "instances"))
+
self._cast_scheduler_message(context,
{"method": "prep_resize",
"args": {"topic": FLAGS.compute_topic,
- "instance_id": instance_id, }},)
+ "instance_id": instance_id,
+ "instance_type": new_instance_type}})
def pause(self, context, instance_id):
"""Pause the given instance."""
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index b3e864154..f85ad91df 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -447,7 +447,7 @@ class ComputeManager(manager.Manager):
@exception.wrap_exception
@checks_instance_lock
- def prep_resize(self, context, instance_id):
+ def prep_resize(self, context, instance_id, flavor_id):
"""Initiates the process of moving a running instance to another
host, possibly changing the RAM and disk size in the process"""
context = context.elevated()
@@ -456,12 +456,17 @@ class ComputeManager(manager.Manager):
raise exception.Error(_(
'Migration error: destination same as source!'))
+ instance_type = self.db.instance_type_get_by_flavor_id(context,
+ flavor_id)
migration_ref = self.db.migration_create(context,
{'instance_id': instance_id,
'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,
'status': 'pre-migrating'})
+
LOG.audit(_('instance %s: migrating to '), instance_id,
context=context)
topic = self.db.queue_get_for(context, FLAGS.compute_topic,
@@ -487,8 +492,14 @@ class ComputeManager(manager.Manager):
self.db.migration_update(context, migration_id,
{'status': 'post-migrating', })
- #TODO(mdietz): This is where we would update the VM record
- #after resizing
+ #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)
topic = self.db.queue_get_for(context, FLAGS.compute_topic,