summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
Diffstat (limited to 'nova')
-rw-r--r--nova/api/openstack/servers.py19
-rw-r--r--nova/compute/api.py9
-rw-r--r--nova/tests/api/openstack/test_servers.py27
3 files changed, 48 insertions, 7 deletions
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index f7696d918..4b2703549 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -317,9 +317,6 @@ class Controller(wsgi.Controller):
return faults.Fault(exc.HTTPBadRequest())
return exc.HTTPAccepted()
- def _action_rebuild(self, input_dict, req, id):
- return faults.Fault(exc.HTTPNotImplemented())
-
def _action_resize(self, input_dict, req, id):
""" Resizes a given instance to the flavor size requested """
try:
@@ -606,6 +603,19 @@ class ControllerV10(Controller):
except exception.TimeoutException:
return exc.HTTPRequestTimeout()
+ def _action_rebuild(self, input_dict, req, id):
+ context = req.environ['nova.context']
+ if (not 'rebuild' in input_dict
+ or not 'imageId' in input_dict['rebuild']):
+ msg = _("No imageId was specified")
+ return faults.Fault(exc.HTTPBadRequest(msg))
+
+ image_id = input_dict['rebuild']['imageId']
+
+ self.compute_api.rebuild(context, id, image_id)
+
+ return exc.HTTPAccepted()
+
class ControllerV11(Controller):
def _image_id_from_req_data(self, data):
@@ -632,6 +642,9 @@ class ControllerV11(Controller):
def _limit_items(self, items, req):
return common.limited_by_marker(items, req)
+ def _action_rebuild(self, input_dict, req, id):
+ return faults.Fault(exc.HTTPNotImplemented())
+
class ServerCreateRequestXMLDeserializer(object):
"""
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 1dbd73f8f..93a5e7855 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -480,6 +480,15 @@ class API(base.Base):
"""Reboot the given instance."""
self._cast_compute_message('reboot_instance', context, instance_id)
+ def rebuild(self, context, instance_id, image_id, metadata=None):
+ """Rebuild the given instance with the provided metadata."""
+ return
+ # default to an empty list
+ metadata = metadata or []
+ #TODO: validate metadata
+ self._cast_compute_message('rebuild_instance', context,
+ instance_id, metadata)
+
def revert_resize(self, context, instance_id):
"""Reverts a resize, deleting the 'new' instance in the process"""
context = context.elevated()
diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
index 130b8c5d5..87abc0067 100644
--- a/nova/tests/api/openstack/test_servers.py
+++ b/nova/tests/api/openstack/test_servers.py
@@ -774,15 +774,34 @@ class ServersTest(test.TestCase):
req.body = json.dumps(body)
res = req.get_response(fakes.wsgi_app())
- def test_server_rebuild(self):
- body = dict(server=dict(
- name='server_test', imageId=2, flavorId=2, metadata={},
- personality={}))
+ def test_server_rebuild_accepted(self):
+ body = {
+ "rebuild": {
+ "imageId": 2,
+ },
+ }
+
req = webob.Request.blank('/v1.0/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
+
res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 202)
+
+ def test_server_rebuild_bad_entity(self):
+ body = {
+ "rebuild": {
+ },
+ }
+
+ req = webob.Request.blank('/v1.0/servers/1/action')
+ req.method = 'POST'
+ req.content_type = 'application/json'
+ req.body = json.dumps(body)
+
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 400)
def test_delete_server_instance(self):
req = webob.Request.blank('/v1.0/servers/1')