summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2011-11-08 22:36:13 +0000
committerGerrit Code Review <review@openstack.org>2011-11-08 22:36:13 +0000
commit4a7b5d44b0d3a7264ca038e9a1271f0247049e9b (patch)
treec877da2b7bf777f2aeb564be22c8a72d2baafc27
parentf89f27b184eb950f4487002a821b2e9c0f8315c7 (diff)
parenteef2dfa580c1a675efc2af46830547befe89dd0f (diff)
downloadnova-4a7b5d44b0d3a7264ca038e9a1271f0247049e9b.tar.gz
nova-4a7b5d44b0d3a7264ca038e9a1271f0247049e9b.tar.xz
nova-4a7b5d44b0d3a7264ca038e9a1271f0247049e9b.zip
Merge "Set task state to UPDATING_PASSWORD when needed"
-rw-r--r--nova/compute/api.py4
-rw-r--r--nova/compute/manager.py12
-rw-r--r--nova/tests/test_compute.py29
3 files changed, 44 insertions, 1 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 297803e09..36ad07ed7 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -1438,6 +1438,10 @@ class API(base.Base):
@scheduler_api.reroute_compute("set_admin_password")
def set_admin_password(self, context, instance_id, password=None):
"""Set the root/admin password for the given instance."""
+ self.update(context,
+ instance_id,
+ task_state=task_states.UPDATING_PASSWORD)
+
host = self._find_host(context, instance_id)
rpc.cast(context,
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index af1c5e473..f548520ea 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -824,18 +824,25 @@ class ComputeManager(manager.SchedulerDependentManager):
expected_state = power_state.RUNNING
if instance_state != expected_state:
+ self._instance_update(context, instance_id, task_state=None)
raise exception.Error(_('Instance is not running'))
else:
try:
self.driver.set_admin_password(instance_ref, new_pass)
LOG.audit(_("Instance %s: Root password set"),
instance_ref["name"])
+ self._instance_update(context,
+ instance_id,
+ task_state=None)
break
except NotImplementedError:
# NOTE(dprince): if the driver doesn't implement
# set_admin_password we break to avoid a loop
LOG.warn(_('set_admin_password is not implemented '
- 'by this driver.'))
+ 'by this driver.'))
+ self._instance_update(context,
+ instance_id,
+ task_state=None)
break
except Exception, e:
# Catch all here because this could be anything.
@@ -844,6 +851,9 @@ class ComputeManager(manager.SchedulerDependentManager):
# At some point this exception may make it back
# to the API caller, and we don't want to reveal
# too much. The real exception is logged above
+ self._instance_update(context,
+ instance_id,
+ vm_state=vm_states.ERROR)
raise exception.Error(_('Internal error'))
time.sleep(1)
continue
diff --git a/nova/tests/test_compute.py b/nova/tests/test_compute.py
index 479fd4647..0de533069 100644
--- a/nova/tests/test_compute.py
+++ b/nova/tests/test_compute.py
@@ -410,7 +410,36 @@ class ComputeTestCase(test.TestCase):
"""Ensure instance can have its admin password set"""
instance_id = self._create_instance()
self.compute.run_instance(self.context, instance_id)
+ db.instance_update(self.context, instance_id,
+ {'task_state': task_states.UPDATING_PASSWORD})
+
+ inst_ref = db.instance_get(self.context, instance_id)
+ self.assertEqual(inst_ref['vm_state'], vm_states.ACTIVE)
+ self.assertEqual(inst_ref['task_state'], task_states.UPDATING_PASSWORD)
+
self.compute.set_admin_password(self.context, instance_id)
+
+ inst_ref = db.instance_get(self.context, instance_id)
+ self.assertEqual(inst_ref['vm_state'], vm_states.ACTIVE)
+ self.assertEqual(inst_ref['task_state'], None)
+
+ self.compute.terminate_instance(self.context, instance_id)
+
+ def test_set_admin_password_api(self):
+ """Ensure instance can have its admin password set"""
+ instance_id = self._create_instance()
+ self.compute.run_instance(self.context, instance_id)
+
+ inst_ref = db.instance_get(self.context, instance_id)
+ self.assertEqual(inst_ref['vm_state'], vm_states.ACTIVE)
+ self.assertEqual(inst_ref['task_state'], None)
+
+ self.compute_api.set_admin_password(self.context, instance_id)
+
+ inst_ref = db.instance_get(self.context, instance_id)
+ self.assertEqual(inst_ref['vm_state'], vm_states.ACTIVE)
+ self.assertEqual(inst_ref['task_state'], task_states.UPDATING_PASSWORD)
+
self.compute.terminate_instance(self.context, instance_id)
def test_inject_file(self):