summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Lamar <brian.lamar@rackspace.com>2011-03-30 16:25:49 -0400
committerBrian Lamar <brian.lamar@rackspace.com>2011-03-30 16:25:49 -0400
commitd2a04502d0dc374b6d61d42b92e2ea3d50114b39 (patch)
tree013551d4279f1913cb4af7e5ef90743e72297380
parente1d4ea7bcb69ae5d47b612eec19f2eafcc903e55 (diff)
parentcee0e90c058c3e50a3388eb4960afeb21b441f6a (diff)
Merged waldon.
-rw-r--r--nova/api/openstack/servers.py24
-rw-r--r--nova/compute/api.py7
-rw-r--r--nova/tests/api/openstack/test_servers.py64
3 files changed, 90 insertions, 5 deletions
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index 4b2703549..edf98fe93 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -611,9 +611,7 @@ class ControllerV10(Controller):
return faults.Fault(exc.HTTPBadRequest(msg))
image_id = input_dict['rebuild']['imageId']
-
self.compute_api.rebuild(context, id, image_id)
-
return exc.HTTPAccepted()
@@ -643,7 +641,27 @@ class ControllerV11(Controller):
return common.limited_by_marker(items, req)
def _action_rebuild(self, input_dict, req, id):
- return faults.Fault(exc.HTTPNotImplemented())
+ context = req.environ['nova.context']
+ if (not 'rebuild' in input_dict
+ or not 'imageRef' in input_dict['rebuild']):
+ msg = _("No imageRef was specified")
+ return faults.Fault(exc.HTTPBadRequest(msg))
+
+ image_ref = input_dict['rebuild']['imageRef']
+ image_id = common.get_id_from_href(image_ref)
+
+ metadata = []
+ if 'metadata' in input_dict['rebuild']:
+ try:
+ for k, v in input_dict['rebuild']['metadata'].items():
+ metadata.append({'key': k, 'value': v})
+
+ except Exception:
+ msg = _("Improperly formatted metadata provided")
+ return exc.HTTPBadRequest(msg)
+
+ self.compute_api.rebuild(context, id, image_id, metadata)
+ return exc.HTTPAccepted()
class ServerCreateRequestXMLDeserializer(object):
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 93a5e7855..fdfb8103b 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -482,12 +482,15 @@ class API(base.Base):
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
+ params = {
+ "image_id": image_id,
+ "metadata": metadata,
+ }
self._cast_compute_message('rebuild_instance', context,
- instance_id, metadata)
+ instance_id, params=params)
def revert_resize(self, context, instance_id):
"""Reverts a resize, deleting the 'new' instance in the process"""
diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
index 87abc0067..00c6d850a 100644
--- a/nova/tests/api/openstack/test_servers.py
+++ b/nova/tests/api/openstack/test_servers.py
@@ -803,6 +803,70 @@ class ServersTest(test.TestCase):
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 400)
+ def test_server_rebuild_accepted_minimum_v11(self):
+ body = {
+ "rebuild": {
+ "imageRef": "http://localhost/images/2",
+ },
+ }
+
+ req = webob.Request.blank('/v1.1/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_accepted_with_metadata_v11(self):
+ body = {
+ "rebuild": {
+ "imageRef": "http://localhost/images/2",
+ "metadata": {
+ "open": "stack",
+ },
+ },
+ }
+
+ req = webob.Request.blank('/v1.1/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_accepted_with_bad_metadata_v11(self):
+ body = {
+ "rebuild": {
+ "imageRef": "http://localhost/images/2",
+ "metadata": "stack",
+ },
+ }
+
+ req = webob.Request.blank('/v1.1/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_server_rebuild_bad_entity_v11(self):
+ body = {
+ "rebuild": {
+ "imageId": 2,
+ },
+ }
+
+ req = webob.Request.blank('/v1.1/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')
req.method = 'DELETE'