api: Add response body schemas for server metadata APIs
Change-Id: I65877c15b268f8de08a51f451a6185f22c35c3cb Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
@@ -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'}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user