From 964adebb3c4ca297dd61487dffffca48283be3b5 Mon Sep 17 00:00:00 2001 From: "Kevin L. Mitchell" Date: Wed, 20 Jun 2012 11:43:03 -0500 Subject: Admin action to reset states. Adds an Admin API action to reset the state of an instance. This will at least allow easy clean-up from bugs which corrupt the state of an instance and inhibit the owner of the instance from deleting it. Change-Id: Ia059cbd643e24e04dede06da330f444d03b07674 --- .../compute/contrib/test_admin_actions.py | 60 ++++++++++++++++++++++ nova/tests/policy.json | 1 + 2 files changed, 61 insertions(+) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/compute/contrib/test_admin_actions.py b/nova/tests/api/openstack/compute/contrib/test_admin_actions.py index 922e09f0b..330e24be6 100644 --- a/nova/tests/api/openstack/compute/contrib/test_admin_actions.py +++ b/nova/tests/api/openstack/compute/contrib/test_admin_actions.py @@ -17,6 +17,7 @@ import datetime import webob from nova.api.openstack import compute as compute_api +from nova.api.openstack.compute.contrib import admin_actions from nova import compute from nova.compute import vm_states from nova import context @@ -285,3 +286,62 @@ class CreateBackupTests(test.TestCase): request = self._get_request(body) response = request.get_response(self.app) self.assertEqual(response.status_int, 409) + + +class ResetStateTests(test.TestCase): + def setUp(self): + super(ResetStateTests, self).setUp() + + self.exists = True + self.kwargs = None + self.uuid = utils.gen_uuid() + + def fake_get(inst, context, instance_id): + if self.exists: + return dict(id=1, uuid=instance_id, vm_state=vm_states.ACTIVE) + raise exception.InstanceNotFound() + + def fake_update(inst, context, instance, **kwargs): + self.kwargs = kwargs + + self.stubs.Set(compute.API, 'get', fake_get) + self.stubs.Set(compute.API, 'update', fake_update) + self.admin_api = admin_actions.AdminActionsController() + + url = '/fake/servers/%s/action' % self.uuid + self.request = fakes.HTTPRequest.blank(url) + + def test_no_state(self): + self.assertRaises(webob.exc.HTTPBadRequest, + self.admin_api._reset_state, + self.request, 'inst_id', + {"os-resetState": None}) + + def test_bad_state(self): + self.assertRaises(webob.exc.HTTPBadRequest, + self.admin_api._reset_state, + self.request, 'inst_id', + {"os-resetState": {"state": "spam"}}) + + def test_no_instance(self): + self.exists = False + self.assertRaises(webob.exc.HTTPNotFound, + self.admin_api._reset_state, + self.request, 'inst_id', + {"os-resetState": {"state": "active"}}) + + def test_reset_active(self): + body = {"os-resetState": {"state": "active"}} + result = self.admin_api._reset_state(self.request, 'inst_id', body) + + self.assertEqual(result.status_int, 202) + self.assertEqual(self.kwargs, dict(vm_state=vm_states.ACTIVE, + task_state=None)) + + def test_reset_error(self): + body = {"os-resetState": {"state": "error"}} + result = self.admin_api._reset_state(self.request, 'inst_id', body) + + self.assertEqual(result.status_int, 202) + self.assertEqual(self.kwargs, dict(vm_state=vm_states.ERROR, + task_state=None)) diff --git a/nova/tests/policy.json b/nova/tests/policy.json index 8f8ea769c..e6b534f5a 100644 --- a/nova/tests/policy.json +++ b/nova/tests/policy.json @@ -78,6 +78,7 @@ "compute_extension:admin_actions:injectNetworkInfo": [], "compute_extension:admin_actions:createBackup": [], "compute_extension:admin_actions:migrateLive": [], + "compute_extension:admin_actions:resetState": [], "compute_extension:admin_actions:migrate": [], "compute_extension:aggregates": [], "compute_extension:certificates": [], -- cgit