summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-09-03 21:12:29 +0000
committerGerrit Code Review <review@openstack.org>2013-09-03 21:12:29 +0000
commitc6214d883df5901e5c6476a73c76b063add3b247 (patch)
treef9f7f71105362141fd2540635302195b9de905b3
parent797fe9c2d3909a248b342d24f1c1a2dbfab3620a (diff)
parent69568687532109f1cd1fe8091566b5c8e3f4edb0 (diff)
downloadtrove-c6214d883df5901e5c6476a73c76b063add3b247.tar.gz
Merge "Implement resize volume method"
-rw-r--r--trove/taskmanager/models.py65
-rw-r--r--trove/tests/fakes/nova.py14
2 files changed, 61 insertions, 18 deletions
diff --git a/trove/taskmanager/models.py b/trove/taskmanager/models.py
index cc095734..c786badd 100644
--- a/trove/taskmanager/models.py
+++ b/trove/taskmanager/models.py
@@ -454,36 +454,50 @@ class BuiltInstanceTasks(BuiltInstance, NotifyMixin, ConfigurationMixin):
deleted_at=timeutils.isotime(deleted_at),
server=old_server)
- def resize_volume(self, new_size):
- old_volume_size = self.volume_size
- new_size = int(new_size)
- LOG.debug("%s: Resizing volume for instance: %s from %s to %r GB"
- % (greenthread.getcurrent(), self.server.id,
- old_volume_size, new_size))
+ def _resize_active_volume(self, new_size):
+ try:
+ LOG.debug("Instance %s calling stop_db..." % self.server.id)
+ self.guest.stop_db()
+
+ LOG.debug("Detach volume %s from instance %s" % (self.volume_id,
+ self.server.id))
+ self.volume_client.volumes.detach(self.volume_id)
+
+ utils.poll_until(
+ lambda: self.volume_client.volumes.get(self.volume_id),
+ lambda volume: volume.status == 'available',
+ sleep_time=2,
+ time_out=CONF.volume_time_out)
+
+ LOG.debug("Successfully detach volume %s" % self.volume_id)
+ except Exception as e:
+ LOG.error("Failed to detach volume %s instance %s: %s" % (
+ self.volume_id, self.server.id, str(e)))
+ self.restart()
+ raise
+
+ self._do_resize(new_size)
+ self.volume_client.volumes.attach(self.server.id, self.volume_id)
+
+ self.restart()
+
+ def _do_resize(self, new_size):
try:
self.volume_client.volumes.extend(self.volume_id, new_size)
except cinder_exceptions.ClientException:
- self.update_db(task_status=inst_models.InstanceTasks.NONE)
LOG.exception("Error encountered trying to rescan or resize the "
"attached volume filesystem for volume: "
"%s" % self.volume_id)
raise
try:
+ volume = self.volume_client.volumes.get(self.volume_id)
utils.poll_until(
lambda: self.volume_client.volumes.get(self.volume_id),
- lambda volume: volume.status == 'in-use',
+ lambda volume: volume.size == int(new_size),
sleep_time=2,
time_out=CONF.volume_time_out)
- volume = self.volume_client.volumes.get(self.volume_id)
- self.update_db(volume_size=volume.size)
- self.nova_client.volumes.rescan_server_volume(self.server,
- self.volume_id)
- self.send_usage_event('modify_volume',
- old_volume_size=old_volume_size,
- launched_at=timeutils.isotime(),
- modify_at=timeutils.isotime(),
- volume_size=new_size)
+ self.update_db(volume_size=new_size)
except PollTimeOut as pto:
LOG.error("Timeout trying to rescan or resize the attached volume "
"filesystem for volume: %s" % self.volume_id)
@@ -495,6 +509,23 @@ class BuiltInstanceTasks(BuiltInstance, NotifyMixin, ConfigurationMixin):
finally:
self.update_db(task_status=inst_models.InstanceTasks.NONE)
+ def resize_volume(self, new_size):
+ old_volume_size = self.volume_size
+ new_size = int(new_size)
+ LOG.debug("%s: Resizing volume for instance: %s from %s to %r GB"
+ % (greenthread.getcurrent(), self.server.id,
+ old_volume_size, new_size))
+
+ if self.server.status == 'active':
+ self._resize_active_volume(new_size)
+ else:
+ self._do_resize(new_size)
+
+ self.send_usage_event('modify_volume', old_volume_size=old_volume_size,
+ launched_at=timeutils.isotime(),
+ modify_at=timeutils.isotime(),
+ volume_size=new_size)
+
def resize_flavor(self, old_flavor, new_flavor):
action = ResizeAction(self, old_flavor, new_flavor)
action.execute()
diff --git a/trove/tests/fakes/nova.py b/trove/tests/fakes/nova.py
index b955722b..bd793f64 100644
--- a/trove/tests/fakes/nova.py
+++ b/trove/tests/fakes/nova.py
@@ -501,11 +501,23 @@ class FakeVolumes(object):
LOG.debug("Resize volume id (%s) to size (%s)" % (volume_id, new_size))
volume = self.get(volume_id)
+ if volume._current_status != 'available':
+ raise Exception("Invalid volume status")
+
def finish_resize():
- volume._current_status = "in-use"
volume.size = new_size
self.event_spawn(1.0, finish_resize)
+ def detach(self, volume_id):
+ volume = self.get(volume_id)
+
+ if volume._current_status != 'in-use':
+ raise Exception("Invalid volume status")
+
+ def finish_detach():
+ volume._current_status = "available"
+ self.event_spawn(1.0, finish_detach)
+
class FakeAccount(object):