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:
Stephen Finucane
2024-12-03 10:53:41 +00:00
parent 3a0e2b6e42
commit ec2feca566
2 changed files with 48 additions and 17 deletions
@@ -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'}
+21 -17
View File
@@ -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)