diff --git a/nova/api/openstack/compute/schemas/server_groups.py b/nova/api/openstack/compute/schemas/server_groups.py index dcaa7616d4..e56dd61339 100644 --- a/nova/api/openstack/compute/schemas/server_groups.py +++ b/nova/api/openstack/compute/schemas/server_groups.py @@ -59,16 +59,15 @@ policies['prefixItems'][0]['enum'].extend( create_v264 = copy.deepcopy(create_v215) del create_v264['properties']['server_group']['properties']['policies'] -sg_properties = create_v264['properties']['server_group'] -sg_properties['required'].remove('policies') -sg_properties['required'].append('policy') -sg_properties['properties']['policy'] = { +create_v264['properties']['server_group']['required'].remove('policies') +create_v264['properties']['server_group']['required'].append('policy') +create_v264['properties']['server_group']['properties']['policy'] = { 'type': 'string', 'enum': ['anti-affinity', 'affinity', 'soft-anti-affinity', 'soft-affinity'], } -sg_properties['properties']['rules'] = { +create_v264['properties']['server_group']['properties']['rules'] = { 'type': 'object', 'properties': { 'max_server_per_host': @@ -99,3 +98,132 @@ show_query = { 'properties': {}, 'additionalProperties': True, } + +_server_group_response = { + 'type': 'object', + 'properties': { + 'id': {'type': 'string', 'format': 'uuid'}, + 'members': { + 'type': 'array', + 'items': { + 'type': 'string', + 'format': 'uuid', + }, + }, + # Why yes, this is a **totally empty object**. It's removed later + 'metadata': { + 'type': 'object', + 'properties': {}, + 'required': [], + 'additionalProperties': False, + }, + 'name': {'type': 'string'}, + 'policies': { + 'type': 'array', + 'prefixItems': [ + { + 'type': 'string', + 'enum': ['affinity', 'anti-affinity',], + }, + ], + 'minItems': 0, + 'maxItems': 1, + }, + }, + 'required': ['id', 'members', 'metadata', 'name', 'policies'], + 'additionalProperties': False, +} + +_server_group_response_v213 = copy.deepcopy(_server_group_response) +_server_group_response_v213['properties'].update({ + 'project_id': parameter_types.project_id, + 'user_id': parameter_types.user_id, +}) +_server_group_response_v213['required'].extend(['project_id', 'user_id']) + +_server_group_response_v215 = copy.deepcopy(_server_group_response_v213) +_server_group_response_v215['properties']['policies']['prefixItems'][0][ + 'enum' +].extend(['soft-affinity', 'soft-anti-affinity']) + +_server_group_response_v264 = copy.deepcopy(_server_group_response_v215) +del _server_group_response_v264['properties']['metadata'] +del _server_group_response_v264['properties']['policies'] +_server_group_response_v264['properties'].update({ + 'policy': { + 'type': 'string', + 'enum': [ + 'affinity', + 'anti-affinity', + 'soft-affinity', + 'soft-anti-affinity', + ], + }, + 'rules': { + 'type': 'object', + 'properties': { + 'max_server_per_host': {'type': 'integer'}, + }, + 'required': [], + 'additionalProperties': False, + }, +}) +_server_group_response_v264['required'].remove('metadata') +_server_group_response_v264['required'].remove('policies') +_server_group_response_v264['required'].extend(['policy', 'rules']) + +show_response = { + 'type': 'object', + 'properties': { + 'server_group': copy.deepcopy(_server_group_response), + }, + 'required': ['server_group'], + 'additionalProperties': True, +} + +show_response_v213 = copy.deepcopy(show_response) +show_response_v213['properties']['server_group'] = _server_group_response_v213 + +show_response_v215 = copy.deepcopy(show_response) +show_response_v215['properties']['server_group'] = _server_group_response_v215 + +show_response_v264 = copy.deepcopy(show_response_v213) +show_response_v264['properties']['server_group'] = _server_group_response_v264 + +delete_response = {'type': 'null'} + +index_response = { + 'type': 'object', + 'properties': { + 'server_groups': { + 'type': 'array', + 'items': copy.deepcopy(_server_group_response), + }, + }, + 'required': ['server_groups'], + 'additionalProperties': True, +} + +index_response_v213 = copy.deepcopy(index_response) +index_response_v213['properties']['server_groups'][ + 'items' +] = _server_group_response_v213 + +index_response_v215 = copy.deepcopy(index_response_v213) +index_response_v215['properties']['server_groups'][ + 'items' +] = _server_group_response_v215 + +index_response_v264 = copy.deepcopy(index_response_v215) +index_response_v264['properties']['server_groups'][ + 'items' +] = _server_group_response_v264 + + +create_response = copy.deepcopy(show_response) + +create_response_v213 = copy.deepcopy(show_response_v213) + +create_response_v215 = copy.deepcopy(show_response_v215) + +create_response_v264 = copy.deepcopy(show_response_v264) diff --git a/nova/api/openstack/compute/server_groups.py b/nova/api/openstack/compute/server_groups.py index c69e1c1b0b..e7b38823d3 100644 --- a/nova/api/openstack/compute/server_groups.py +++ b/nova/api/openstack/compute/server_groups.py @@ -83,6 +83,7 @@ def _should_enable_custom_max_server_rules(context, rules): return True +@validation.validated class ServerGroupController(wsgi.Controller): """The Server group API controller for the OpenStack API.""" @@ -116,6 +117,10 @@ class ServerGroupController(wsgi.Controller): @wsgi.expected_errors(404) @validation.query_schema(schema.show_query) + @validation.response_body_schema(schema.show_response, '2.1', '2.12') + @validation.response_body_schema(schema.show_response_v213, '2.13', '2.14') + @validation.response_body_schema(schema.show_response_v215, '2.15', '2.63') + @validation.response_body_schema(schema.show_response_v264, '2.64') def show(self, req, id): """Return data about the given server group.""" context = req.environ['nova.context'] @@ -129,6 +134,7 @@ class ServerGroupController(wsgi.Controller): @wsgi.response(204) @wsgi.expected_errors(404) + @validation.response_body_schema(schema.delete_response) def delete(self, req, id): """Delete a server group.""" context = req.environ['nova.context'] @@ -146,6 +152,10 @@ class ServerGroupController(wsgi.Controller): @wsgi.expected_errors(()) @validation.query_schema(schema.index_query, '2.0', '2.74') @validation.query_schema(schema.index_query_v275, '2.75') + @validation.response_body_schema(schema.index_response, '2.1', '2.12') + @validation.response_body_schema(schema.index_response_v213, '2.13', '2.14') # noqa: E501 + @validation.response_body_schema(schema.index_response_v215, '2.15', '2.63') # noqa: E501 + @validation.response_body_schema(schema.index_response_v264, '2.64') def index(self, req): """Returns a list of server groups.""" context = req.environ['nova.context'] @@ -180,6 +190,10 @@ class ServerGroupController(wsgi.Controller): @validation.schema(schema.create, "2.0", "2.14") @validation.schema(schema.create_v215, "2.15", "2.63") @validation.schema(schema.create_v264, "2.64") + @validation.response_body_schema(schema.create_response, '2.1', '2.12') + @validation.response_body_schema(schema.create_response_v213, '2.13', '2.14') # noqa: E501 + @validation.response_body_schema(schema.create_response_v215, '2.15', '2.63') # noqa: E501 + @validation.response_body_schema(schema.create_response_v264, '2.64') def create(self, req, body): """Creates a new server group.""" context = req.environ['nova.context']