Merge "Add schema validation for Share Snapshot list API"
This commit is contained in:
149
manila/api/schemas/share_snapshots.py
Normal file
149
manila/api/schemas/share_snapshots.py
Normal file
@@ -0,0 +1,149 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
import copy
|
||||
from oslo_config import cfg
|
||||
|
||||
from manila.api.validation import parameter_types
|
||||
from manila.api.validation import response_types
|
||||
|
||||
CONF = cfg.CONF
|
||||
|
||||
# Base list snapshots query (v2.0+)
|
||||
index_request_query = {
|
||||
'type': 'object',
|
||||
'properties': {
|
||||
# Pagination
|
||||
'limit': parameter_types.single_param(
|
||||
parameter_types.non_negative_integer
|
||||
),
|
||||
'offset': parameter_types.single_param(
|
||||
parameter_types.non_negative_integer
|
||||
),
|
||||
|
||||
# Sorting
|
||||
'sort_key': parameter_types.single_param({
|
||||
'type': 'string',
|
||||
'minLength': 1,
|
||||
'maxLength': 255,
|
||||
}),
|
||||
'sort_dir': parameter_types.single_param({
|
||||
'type': 'string',
|
||||
'default': 'desc',
|
||||
'description': 'Sort direction',
|
||||
}),
|
||||
|
||||
# Project Scoping
|
||||
'project_id': parameter_types.single_param({
|
||||
'type': 'string',
|
||||
'minLength': 1,
|
||||
'maxLength': 255,
|
||||
}),
|
||||
# Admin only
|
||||
'all_tenants': {
|
||||
**parameter_types.boolean,
|
||||
'enum': [1, 0],
|
||||
'description': (
|
||||
"Set 1 to list resources for all projects;"
|
||||
"set 0 to list resources only for the current project"
|
||||
)},
|
||||
|
||||
# Basic filters
|
||||
'name': parameter_types.single_param({
|
||||
'type': 'string',
|
||||
'minLength': 1,
|
||||
'maxLength': 255,
|
||||
}),
|
||||
'description': parameter_types.single_param({
|
||||
'type': 'string',
|
||||
'minLength': 1,
|
||||
'maxLength': 255,
|
||||
}),
|
||||
'status': parameter_types.single_param({
|
||||
'type': 'string',
|
||||
'minLength': 1,
|
||||
'maxLength': 255,
|
||||
}),
|
||||
'share_id': parameter_types.single_param({
|
||||
'type': 'string',
|
||||
'minLength': 1,
|
||||
'maxLength': 255,
|
||||
}),
|
||||
'size': parameter_types.single_param(
|
||||
parameter_types.non_negative_integer,
|
||||
),
|
||||
},
|
||||
'required': [],
|
||||
'additionalProperties': True,
|
||||
}
|
||||
|
||||
# >= v2.36: like filters for name~/description~
|
||||
index_request_query_v236 = copy.copy(index_request_query)
|
||||
index_request_query_v236['properties'].update({
|
||||
'name~': parameter_types.single_param({
|
||||
'type': 'string',
|
||||
'minLength': 1,
|
||||
'maxLength': 255,
|
||||
}),
|
||||
'description~': parameter_types.single_param({
|
||||
'type': 'string',
|
||||
'minLength': 1,
|
||||
'maxLength': 255
|
||||
}),
|
||||
})
|
||||
|
||||
# >= v2.73: metadata filter
|
||||
index_request_query_v273 = copy.copy(index_request_query_v236)
|
||||
index_request_query_v273['properties'].update({
|
||||
'metadata': parameter_types.single_param({
|
||||
'type': 'string',
|
||||
'minLength': 1,
|
||||
'maxLength': 4096,
|
||||
}),
|
||||
})
|
||||
|
||||
# >= v2.79: with_count flag added on top
|
||||
index_request_query_v279 = copy.copy(index_request_query_v273)
|
||||
index_request_query_v279['properties'].update({
|
||||
'with_count': parameter_types.single_param({
|
||||
**parameter_types.boolean,
|
||||
'default': False,
|
||||
'description': "Show count in share snapshot list API response"
|
||||
}),
|
||||
})
|
||||
|
||||
_snapshot_response = {
|
||||
'type': 'object',
|
||||
'properties': {
|
||||
'id': {'type': ['string', 'integer'],
|
||||
'description': "The UUID of the snapshot."},
|
||||
'links': response_types.links,
|
||||
'name': {'type': ['string', 'null'],
|
||||
'description': "The user-defined name of the snapshot."},
|
||||
},
|
||||
'required': ['id', 'links', 'name'],
|
||||
'additionalProperties': False,
|
||||
}
|
||||
|
||||
index_response_body = {
|
||||
'type': 'object',
|
||||
'properties': {
|
||||
'snapshots': {
|
||||
'type': 'array',
|
||||
'items': _snapshot_response,
|
||||
},
|
||||
'share_snapshots_links': response_types.collection_links,
|
||||
# >= v2.79 when with_count=True
|
||||
'count': {'type': 'integer', 'minimum': 0},
|
||||
},
|
||||
'required': ['snapshots'],
|
||||
'additionalProperties': False,
|
||||
}
|
||||
@@ -25,8 +25,10 @@ from webob import exc
|
||||
from manila.api import common
|
||||
from manila.api.openstack import api_version_request as api_version
|
||||
from manila.api.openstack import wsgi
|
||||
from manila.api.schemas import share_snapshots as schema
|
||||
from manila.api.v1 import share_snapshots
|
||||
from manila.api.v2 import metadata
|
||||
from manila.api import validation
|
||||
from manila.api.views import share_snapshots as snapshot_views
|
||||
from manila.common import constants
|
||||
from manila.db import api as db_api
|
||||
@@ -333,6 +335,13 @@ class ShareSnapshotsController(share_snapshots.ShareSnapshotMixin,
|
||||
return self._access_list(req, snapshot_id)
|
||||
|
||||
@wsgi.Controller.api_version("2.0")
|
||||
@validation.request_query_schema(schema.index_request_query, "2.0", "2.35")
|
||||
@validation.request_query_schema(
|
||||
schema.index_request_query_v236, "2.36", "2.72")
|
||||
@validation.request_query_schema(
|
||||
schema.index_request_query_v273, "2.73", "2.78")
|
||||
@validation.request_query_schema(schema.index_request_query_v279, "2.79")
|
||||
@validation.response_body_schema(schema.index_response_body)
|
||||
def index(self, req):
|
||||
"""Returns a summary list of shares."""
|
||||
if req.api_version_request < api_version.APIVersionRequest("2.36"):
|
||||
|
||||
Reference in New Issue
Block a user