diff --git a/nova/api/openstack/compute/schemas/server_metadata.py b/nova/api/openstack/compute/schemas/server_metadata.py index 48f69b85a2..ac6b8dfe27 100644 --- a/nova/api/openstack/compute/schemas/server_metadata.py +++ b/nova/api/openstack/compute/schemas/server_metadata.py @@ -15,6 +15,7 @@ import copy from nova.api.validation import parameter_types +from nova.api.validation import response_types create = { @@ -63,3 +64,29 @@ show_query = { 'properties': {}, 'additionalProperties': True, } + +index_response = { + 'type': 'object', + 'properties': { + 'metadata': response_types.metadata, + }, + 'required': ['metadata'], + 'additionalProperties': False, +} + +create_response = copy.deepcopy(index_response) + +update_response = { + 'type': 'object', + 'properties': { + 'meta': response_types.meta, + }, + 'required': ['meta'], + 'additionalProperties': False, +} + +update_all_response = copy.deepcopy(index_response) + +show_response = copy.deepcopy(update_response) + +delete_response = {'type': 'null'} diff --git a/nova/api/openstack/compute/server_metadata.py b/nova/api/openstack/compute/server_metadata.py index 949ea0e5ff..c66959ee4b 100644 --- a/nova/api/openstack/compute/server_metadata.py +++ b/nova/api/openstack/compute/server_metadata.py @@ -17,7 +17,7 @@ from webob import exc from nova.api.openstack import common -from nova.api.openstack.compute.schemas import server_metadata +from nova.api.openstack.compute.schemas import server_metadata as schema from nova.api.openstack import wsgi from nova.api import validation from nova.compute import api as compute @@ -26,6 +26,7 @@ from nova.i18n import _ from nova.policies import server_metadata as sm_policies +@validation.validated class ServerMetadataController(wsgi.Controller): """The server metadata API controller for the OpenStack API.""" @@ -48,7 +49,8 @@ class ServerMetadataController(wsgi.Controller): return meta_dict @wsgi.expected_errors(404) - @validation.query_schema(server_metadata.index_query) + @validation.query_schema(schema.index_query) + @validation.response_body_schema(schema.index_response) def index(self, req, server_id): """Returns the list of metadata for a given instance.""" context = req.environ['nova.context'] @@ -57,10 +59,11 @@ class ServerMetadataController(wsgi.Controller): target={'project_id': server.project_id}) return {'metadata': self._get_metadata(context, server)} - @wsgi.expected_errors((403, 404, 409)) # NOTE(gmann): Returns 200 for backwards compatibility but should be 201 # as this operation complete the creation of metadata. - @validation.schema(server_metadata.create) + @wsgi.expected_errors((403, 404, 409)) + @validation.schema(schema.create) + @validation.response_body_schema(schema.create_response) def create(self, req, server_id, body): metadata = body['metadata'] context = req.environ['nova.context'] @@ -75,7 +78,8 @@ class ServerMetadataController(wsgi.Controller): return {'metadata': new_metadata} @wsgi.expected_errors((400, 403, 404, 409)) - @validation.schema(server_metadata.update) + @validation.schema(schema.update) + @validation.response_body_schema(schema.update_response) def update(self, req, server_id, id, body): context = req.environ['nova.context'] server = common.get_instance(self.compute_api, context, server_id) @@ -94,7 +98,8 @@ class ServerMetadataController(wsgi.Controller): return {'meta': meta_item} @wsgi.expected_errors((403, 404, 409)) - @validation.schema(server_metadata.update_all) + @validation.schema(schema.update_all) + @validation.response_body_schema(schema.update_all_response) def update_all(self, req, server_id, body): context = req.environ['nova.context'] server = common.get_instance(self.compute_api, context, server_id) @@ -108,23 +113,21 @@ class ServerMetadataController(wsgi.Controller): return {'metadata': new_metadata} - def _update_instance_metadata(self, context, server, metadata, - delete=False): + def _update_instance_metadata(self, context, server, metadata, delete): try: - return self.compute_api.update_instance_metadata(context, - server, - metadata, - delete) + return self.compute_api.update_instance_metadata( + context, server, metadata, delete) except exception.OverQuota as error: raise exc.HTTPForbidden(explanation=error.format_message()) except exception.InstanceIsLocked as e: raise exc.HTTPConflict(explanation=e.format_message()) except exception.InstanceInvalidState as state_error: - common.raise_http_conflict_for_instance_invalid_state(state_error, - 'update metadata', server.uuid) + common.raise_http_conflict_for_instance_invalid_state( + state_error, 'update metadata', server.uuid) @wsgi.expected_errors(404) - @validation.query_schema(server_metadata.show_query) + @validation.query_schema(schema.show_query) + @validation.response_body_schema(schema.show_response) def show(self, req, server_id, id): """Return a single metadata item.""" context = req.environ['nova.context'] @@ -141,6 +144,7 @@ class ServerMetadataController(wsgi.Controller): @wsgi.expected_errors((404, 409)) @wsgi.response(204) + @validation.response_body_schema(schema.delete_response) def delete(self, req, server_id, id): """Deletes an existing metadata.""" context = req.environ['nova.context'] @@ -158,5 +162,5 @@ class ServerMetadataController(wsgi.Controller): except exception.InstanceIsLocked as e: raise exc.HTTPConflict(explanation=e.format_message()) except exception.InstanceInvalidState as state_error: - common.raise_http_conflict_for_instance_invalid_state(state_error, - 'delete metadata', server_id) + common.raise_http_conflict_for_instance_invalid_state( + state_error, 'delete metadata', server_id)