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 import common
|
||||||
from manila.api.openstack import api_version_request as api_version
|
from manila.api.openstack import api_version_request as api_version
|
||||||
from manila.api.openstack import wsgi
|
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.v1 import share_snapshots
|
||||||
from manila.api.v2 import metadata
|
from manila.api.v2 import metadata
|
||||||
|
from manila.api import validation
|
||||||
from manila.api.views import share_snapshots as snapshot_views
|
from manila.api.views import share_snapshots as snapshot_views
|
||||||
from manila.common import constants
|
from manila.common import constants
|
||||||
from manila.db import api as db_api
|
from manila.db import api as db_api
|
||||||
@@ -333,6 +335,13 @@ class ShareSnapshotsController(share_snapshots.ShareSnapshotMixin,
|
|||||||
return self._access_list(req, snapshot_id)
|
return self._access_list(req, snapshot_id)
|
||||||
|
|
||||||
@wsgi.Controller.api_version("2.0")
|
@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):
|
def index(self, req):
|
||||||
"""Returns a summary list of shares."""
|
"""Returns a summary list of shares."""
|
||||||
if req.api_version_request < api_version.APIVersionRequest("2.36"):
|
if req.api_version_request < api_version.APIVersionRequest("2.36"):
|
||||||
|
|||||||
Reference in New Issue
Block a user