Remove Block Storage API v2
In this patch: - adjusted VersionsController to return only v3 - removed cinder.api.v2.router - adjustments to cinder.tests.unit.api.contrib to use /v3 only - moved cinder.api.v2.snapshot_metadata (and tests) to cinder.api.v3 - moved cinder.api.v2.types (and view, tests) to cinder.api.v3 - updated versions response in api-ref - removed unnecessary config option - updated various sample config files - removed experimental tempest-cinder-v2-api job - updated some docs - updated non-voting rally job config Some cinder.api.v2 modules are left because the v3 classes depend on them, but with the v2 router removed, these are unreachable via the /v2 path. Depends-on: https://review.opendev.org/c/openstack/rally-openstack/+/794891 (changes rally to use Block Storage API v3) Depends-on: https://review.opendev.org/c/openstack/requirements/+/794894 (corrects regression in upper-constraint on Sphinx) Change-Id: I2093d77db9beec7543c7524d2cd273e79dd5fd5d
This commit is contained in:
parent
d5f0e51879
commit
e05b261af7
@ -91,8 +91,6 @@
|
|||||||
irrelevant-files: *gate-irrelevant-files
|
irrelevant-files: *gate-irrelevant-files
|
||||||
experimental:
|
experimental:
|
||||||
jobs:
|
jobs:
|
||||||
- tempest-cinder-v2-api:
|
|
||||||
irrelevant-files: *gate-irrelevant-files
|
|
||||||
- legacy-tempest-dsvm-multibackend-matrix:
|
- legacy-tempest-dsvm-multibackend-matrix:
|
||||||
irrelevant-files: *gate-irrelevant-files
|
irrelevant-files: *gate-irrelevant-files
|
||||||
- cinder-grenade-mn-sub-volschbak:
|
- cinder-grenade-mn-sub-volschbak:
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
],
|
],
|
||||||
"min_version": "3.0",
|
"min_version": "3.0",
|
||||||
"status": "CURRENT",
|
"status": "CURRENT",
|
||||||
"updated": "2021-02-03T00:00:00Z",
|
"updated": "2021-05-30T00:00:00Z",
|
||||||
"version": "3.64"
|
"version": "3.64"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -1,29 +1,5 @@
|
|||||||
{
|
{
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
|
||||||
"id": "v2.0",
|
|
||||||
"links": [
|
|
||||||
{
|
|
||||||
"href": "https://docs.openstack.org/",
|
|
||||||
"rel": "describedby",
|
|
||||||
"type": "text/html"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"href": "http://127.0.0.1:45697/v2/",
|
|
||||||
"rel": "self"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"media-types": [
|
|
||||||
{
|
|
||||||
"base": "application/json",
|
|
||||||
"type": "application/vnd.openstack.volume+json;version=2"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"min_version": "",
|
|
||||||
"status": "DEPRECATED",
|
|
||||||
"updated": "2017-02-25T12:00:00Z",
|
|
||||||
"version": ""
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "v3.0",
|
"id": "v3.0",
|
||||||
"links": [
|
"links": [
|
||||||
@ -45,7 +21,7 @@
|
|||||||
],
|
],
|
||||||
"min_version": "3.0",
|
"min_version": "3.0",
|
||||||
"status": "CURRENT",
|
"status": "CURRENT",
|
||||||
"updated": "2021-02-03T00:00:00Z",
|
"updated": "2021-05-30T00:00:00Z",
|
||||||
"version": "3.64"
|
"version": "3.64"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -29,15 +29,16 @@ def root_app_factory(loader, global_conf, **local_conf):
|
|||||||
# to check for and remove any legacy references to the v1 API
|
# to check for and remove any legacy references to the v1 API
|
||||||
if '/v1' in local_conf:
|
if '/v1' in local_conf:
|
||||||
LOG.warning('The v1 API has been removed and is no longer '
|
LOG.warning('The v1 API has been removed and is no longer '
|
||||||
'available. Client applications should now be '
|
'available. Client applications should be '
|
||||||
'moving to v3. Ensure enable_v3_api=true in your '
|
'using v3. Ensure enable_v3_api=true in your '
|
||||||
'cinder.conf file.')
|
'cinder.conf file.')
|
||||||
del local_conf['/v1']
|
del local_conf['/v1']
|
||||||
|
|
||||||
if CONF.enable_v2_api:
|
if '/v2' in local_conf:
|
||||||
LOG.warning('The v2 API is deprecated and is not under active '
|
LOG.warning('The v2 API has been removed and is no longer available. '
|
||||||
'development. You should set enable_v2_api=false '
|
'Client applications must now use the v3 API only. '
|
||||||
'and enable_v3_api=true in your cinder.conf file.')
|
'The \'enable_v2_api\' option has been removed and is '
|
||||||
else:
|
'ignored in the cinder.conf file.')
|
||||||
del local_conf['/v2']
|
del local_conf['/v2']
|
||||||
|
|
||||||
return paste.urlmap.urlmap_factory(loader, global_conf, **local_conf)
|
return paste.urlmap.urlmap_factory(loader, global_conf, **local_conf)
|
||||||
|
@ -202,7 +202,7 @@ class VolumeAdminController(AdminController):
|
|||||||
|
|
||||||
@wsgi.response(HTTPStatus.ACCEPTED)
|
@wsgi.response(HTTPStatus.ACCEPTED)
|
||||||
@wsgi.action('os-migrate_volume')
|
@wsgi.action('os-migrate_volume')
|
||||||
@validation.schema(admin_actions.migrate_volume, mv.V2_BASE_VERSION,
|
@validation.schema(admin_actions.migrate_volume, mv.BASE_VERSION,
|
||||||
mv.get_prior_version(mv.VOLUME_MIGRATE_CLUSTER))
|
mv.get_prior_version(mv.VOLUME_MIGRATE_CLUSTER))
|
||||||
@validation.schema(admin_actions.migrate_volume_v316,
|
@validation.schema(admin_actions.migrate_volume_v316,
|
||||||
mv.VOLUME_MIGRATE_CLUSTER)
|
mv.VOLUME_MIGRATE_CLUSTER)
|
||||||
|
@ -145,7 +145,7 @@ class BackupsController(wsgi.Controller):
|
|||||||
# immediately
|
# immediately
|
||||||
# - maybe also do validation of swift container name
|
# - maybe also do validation of swift container name
|
||||||
@wsgi.response(HTTPStatus.ACCEPTED)
|
@wsgi.response(HTTPStatus.ACCEPTED)
|
||||||
@validation.schema(backup.create, mv.V2_BASE_VERSION,
|
@validation.schema(backup.create, mv.BASE_VERSION,
|
||||||
mv.get_prior_version(mv.BACKUP_METADATA))
|
mv.get_prior_version(mv.BACKUP_METADATA))
|
||||||
@validation.schema(backup.create_backup_v343, mv.BACKUP_METADATA,
|
@validation.schema(backup.create_backup_v343, mv.BACKUP_METADATA,
|
||||||
mv.get_prior_version(mv.BACKUP_AZ))
|
mv.get_prior_version(mv.BACKUP_AZ))
|
||||||
|
@ -192,7 +192,7 @@ class VolumeActionsController(wsgi.Controller):
|
|||||||
|
|
||||||
@wsgi.response(HTTPStatus.ACCEPTED)
|
@wsgi.response(HTTPStatus.ACCEPTED)
|
||||||
@wsgi.action('os-volume_upload_image')
|
@wsgi.action('os-volume_upload_image')
|
||||||
@validation.schema(volume_action.volume_upload_image, mv.V2_BASE_VERSION,
|
@validation.schema(volume_action.volume_upload_image, mv.BASE_VERSION,
|
||||||
mv.get_prior_version(mv.UPLOAD_IMAGE_PARAMS))
|
mv.get_prior_version(mv.UPLOAD_IMAGE_PARAMS))
|
||||||
@validation.schema(volume_action.volume_upload_image_v31,
|
@validation.schema(volume_action.volume_upload_image_v31,
|
||||||
mv.UPLOAD_IMAGE_PARAMS)
|
mv.UPLOAD_IMAGE_PARAMS)
|
||||||
|
@ -46,7 +46,7 @@ class VolumeManageController(wsgi.Controller):
|
|||||||
self._list_manageable_view = list_manageable_view.ViewBuilder()
|
self._list_manageable_view = list_manageable_view.ViewBuilder()
|
||||||
|
|
||||||
@wsgi.response(HTTPStatus.ACCEPTED)
|
@wsgi.response(HTTPStatus.ACCEPTED)
|
||||||
@validation.schema(volume_manage.volume_manage_create, mv.V2_BASE_VERSION,
|
@validation.schema(volume_manage.volume_manage_create, mv.BASE_VERSION,
|
||||||
mv.get_prior_version(mv.VOLUME_MIGRATE_CLUSTER))
|
mv.get_prior_version(mv.VOLUME_MIGRATE_CLUSTER))
|
||||||
@validation.schema(volume_manage.volume_manage_create_v316,
|
@validation.schema(volume_manage.volume_manage_create_v316,
|
||||||
mv.VOLUME_MIGRATE_CLUSTER)
|
mv.VOLUME_MIGRATE_CLUSTER)
|
||||||
|
@ -37,8 +37,6 @@ from cinder import exception
|
|||||||
|
|
||||||
# Add new constants here for each new microversion.
|
# Add new constants here for each new microversion.
|
||||||
|
|
||||||
V2_BASE_VERSION = '2.0'
|
|
||||||
|
|
||||||
BASE_VERSION = '3.0'
|
BASE_VERSION = '3.0'
|
||||||
|
|
||||||
UPLOAD_IMAGE_PARAMS = '3.1'
|
UPLOAD_IMAGE_PARAMS = '3.1'
|
||||||
|
@ -153,11 +153,9 @@ REST_API_VERSION_HISTORY = """
|
|||||||
# The minimum and maximum versions of the API supported
|
# The minimum and maximum versions of the API supported
|
||||||
# The default api version request is defined to be the
|
# The default api version request is defined to be the
|
||||||
# minimum version of the API supported.
|
# minimum version of the API supported.
|
||||||
# Explicitly using /v2 endpoints will still work
|
|
||||||
_MIN_API_VERSION = "3.0"
|
_MIN_API_VERSION = "3.0"
|
||||||
_MAX_API_VERSION = "3.64"
|
_MAX_API_VERSION = "3.64"
|
||||||
_LEGACY_API_VERSION2 = "2.0"
|
UPDATED = "2021-05-30T00:00:00Z"
|
||||||
UPDATED = "2021-02-03T00:00:00Z"
|
|
||||||
|
|
||||||
|
|
||||||
# NOTE(cyeoh): min and max versions declared as functions so we can
|
# NOTE(cyeoh): min and max versions declared as functions so we can
|
||||||
@ -171,10 +169,6 @@ def max_api_version():
|
|||||||
return APIVersionRequest(_MAX_API_VERSION)
|
return APIVersionRequest(_MAX_API_VERSION)
|
||||||
|
|
||||||
|
|
||||||
def legacy_api_version2():
|
|
||||||
return APIVersionRequest(_LEGACY_API_VERSION2)
|
|
||||||
|
|
||||||
|
|
||||||
class APIVersionRequest(utils.ComparableMixin):
|
class APIVersionRequest(utils.ComparableMixin):
|
||||||
"""This class represents an API Version Request.
|
"""This class represents an API Version Request.
|
||||||
|
|
||||||
|
@ -275,16 +275,9 @@ class Request(webob.Request):
|
|||||||
return self.accept_language.best_match(all_languages)
|
return self.accept_language.best_match(all_languages)
|
||||||
|
|
||||||
def set_api_version_request(self, url):
|
def set_api_version_request(self, url):
|
||||||
"""Set API version request based on the request header information.
|
"""Set API version request based on the request header information."""
|
||||||
|
|
||||||
Microversions starts with /v3, so if a client sends a request for
|
if API_VERSION_REQUEST_HEADER in self.headers:
|
||||||
version 1.0 or 2.0 with the /v3 endpoint, throw an exception.
|
|
||||||
Sending a header with any microversion to a /v2 endpoint will
|
|
||||||
be ignored.
|
|
||||||
Note that a microversion must be set for the legacy endpoint. This
|
|
||||||
will appear as 2.0 for /v2.
|
|
||||||
"""
|
|
||||||
if API_VERSION_REQUEST_HEADER in self.headers and 'v3' in url:
|
|
||||||
hdr_string = self.headers[API_VERSION_REQUEST_HEADER]
|
hdr_string = self.headers[API_VERSION_REQUEST_HEADER]
|
||||||
# 'latest' is a special keyword which is equivalent to requesting
|
# 'latest' is a special keyword which is equivalent to requesting
|
||||||
# the maximum version of the API supported
|
# the maximum version of the API supported
|
||||||
@ -313,9 +306,6 @@ class Request(webob.Request):
|
|||||||
min_ver=api_version.min_api_version().get_string(),
|
min_ver=api_version.min_api_version().get_string(),
|
||||||
max_ver=api_version.max_api_version().get_string())
|
max_ver=api_version.max_api_version().get_string())
|
||||||
|
|
||||||
else:
|
|
||||||
if 'v2' in url:
|
|
||||||
self.api_version_request = api_version.legacy_api_version2()
|
|
||||||
else:
|
else:
|
||||||
self.api_version_request = api_version.APIVersionRequest(
|
self.api_version_request = api_version.APIVersionRequest(
|
||||||
api_version._MIN_API_VERSION)
|
api_version._MIN_API_VERSION)
|
||||||
|
@ -1,93 +0,0 @@
|
|||||||
# Copyright 2011 OpenStack Foundation
|
|
||||||
# Copyright 2011 United States Government as represented by the
|
|
||||||
# Administrator of the National Aeronautics and Space Administration.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
"""
|
|
||||||
WSGI middleware for OpenStack Volume API.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from cinder.api import extensions
|
|
||||||
import cinder.api.openstack
|
|
||||||
from cinder.api.v2 import limits
|
|
||||||
from cinder.api.v2 import snapshot_metadata
|
|
||||||
from cinder.api.v2 import snapshots
|
|
||||||
from cinder.api.v2 import types
|
|
||||||
from cinder.api.v2 import volume_metadata
|
|
||||||
from cinder.api.v2 import volumes
|
|
||||||
from cinder.api import versions
|
|
||||||
|
|
||||||
|
|
||||||
class APIRouter(cinder.api.openstack.APIRouter):
|
|
||||||
"""Routes requests on the API to the appropriate controller and method."""
|
|
||||||
ExtensionManager = extensions.ExtensionManager
|
|
||||||
|
|
||||||
def _setup_routes(self, mapper, ext_mgr):
|
|
||||||
self.resources['versions'] = versions.create_resource()
|
|
||||||
mapper.connect("versions", "/",
|
|
||||||
controller=self.resources['versions'],
|
|
||||||
action='index')
|
|
||||||
|
|
||||||
mapper.redirect("", "/")
|
|
||||||
|
|
||||||
self.resources['volumes'] = volumes.create_resource(ext_mgr)
|
|
||||||
mapper.resource("volume", "volumes",
|
|
||||||
controller=self.resources['volumes'],
|
|
||||||
collection={'detail': 'GET'},
|
|
||||||
member={'action': 'POST'})
|
|
||||||
|
|
||||||
self.resources['types'] = types.create_resource()
|
|
||||||
mapper.resource("type", "types",
|
|
||||||
controller=self.resources['types'],
|
|
||||||
member={'action': 'POST'})
|
|
||||||
|
|
||||||
self.resources['snapshots'] = snapshots.create_resource(ext_mgr)
|
|
||||||
mapper.resource("snapshot", "snapshots",
|
|
||||||
controller=self.resources['snapshots'],
|
|
||||||
collection={'detail': 'GET'},
|
|
||||||
member={'action': 'POST'})
|
|
||||||
|
|
||||||
self.resources['limits'] = limits.create_resource()
|
|
||||||
mapper.resource("limit", "limits",
|
|
||||||
controller=self.resources['limits'])
|
|
||||||
|
|
||||||
self.resources['snapshot_metadata'] = \
|
|
||||||
snapshot_metadata.create_resource()
|
|
||||||
snapshot_metadata_controller = self.resources['snapshot_metadata']
|
|
||||||
|
|
||||||
mapper.resource("snapshot_metadata", "metadata",
|
|
||||||
controller=snapshot_metadata_controller,
|
|
||||||
parent_resource=dict(member_name='snapshot',
|
|
||||||
collection_name='snapshots'))
|
|
||||||
|
|
||||||
mapper.connect("metadata",
|
|
||||||
"/{project_id}/snapshots/{snapshot_id}/metadata",
|
|
||||||
controller=snapshot_metadata_controller,
|
|
||||||
action='update_all',
|
|
||||||
conditions={"method": ['PUT']})
|
|
||||||
|
|
||||||
self.resources['volume_metadata'] = volume_metadata.create_resource()
|
|
||||||
volume_metadata_controller = self.resources['volume_metadata']
|
|
||||||
|
|
||||||
mapper.resource("volume_metadata", "metadata",
|
|
||||||
controller=volume_metadata_controller,
|
|
||||||
parent_resource=dict(member_name='volume',
|
|
||||||
collection_name='volumes'))
|
|
||||||
|
|
||||||
mapper.connect("metadata",
|
|
||||||
"/{project_id}/volumes/{volume_id}/metadata",
|
|
||||||
controller=volume_metadata_controller,
|
|
||||||
action='update_all',
|
|
||||||
conditions={"method": ['PUT']})
|
|
@ -177,8 +177,14 @@ class VolumeController(wsgi.Controller):
|
|||||||
"access requested image.")
|
"access requested image.")
|
||||||
raise exc.HTTPBadRequest(explanation=msg)
|
raise exc.HTTPBadRequest(explanation=msg)
|
||||||
|
|
||||||
|
# NOTE: using mv.BASE_VERSION (which is 3.0) is a bit nonstandard,
|
||||||
|
# but this class is no longer consumed by the v2 API, though it is
|
||||||
|
# a superclass of cinder.api.v3.volumes. Although create() is
|
||||||
|
# overridden in the subclass, I didn't want to remove it from
|
||||||
|
# here until we are sure that the v3 unit tests for create() test
|
||||||
|
# everything that the v2 unit tests covered.
|
||||||
@wsgi.response(HTTPStatus.ACCEPTED)
|
@wsgi.response(HTTPStatus.ACCEPTED)
|
||||||
@validation.schema(volumes.create, mv.V2_BASE_VERSION)
|
@validation.schema(volumes.create, mv.BASE_VERSION)
|
||||||
def create(self, req, body):
|
def create(self, req, body):
|
||||||
"""Creates a new volume."""
|
"""Creates a new volume."""
|
||||||
|
|
||||||
@ -279,7 +285,8 @@ class VolumeController(wsgi.Controller):
|
|||||||
"""Return volume search options allowed by non-admin."""
|
"""Return volume search options allowed by non-admin."""
|
||||||
return common.get_enabled_resource_filters('volume').get('volume', [])
|
return common.get_enabled_resource_filters('volume').get('volume', [])
|
||||||
|
|
||||||
@validation.schema(volumes.update, mv.V2_BASE_VERSION,
|
# NOTE: see NOTE for create(), above
|
||||||
|
@validation.schema(volumes.update, mv.BASE_VERSION,
|
||||||
mv.get_prior_version(mv.SUPPORT_VOLUME_SCHEMA_CHANGES))
|
mv.get_prior_version(mv.SUPPORT_VOLUME_SCHEMA_CHANGES))
|
||||||
@validation.schema(volumes.update_volume_v353,
|
@validation.schema(volumes.update_volume_v353,
|
||||||
mv.SUPPORT_VOLUME_SCHEMA_CHANGES)
|
mv.SUPPORT_VOLUME_SCHEMA_CHANGES)
|
||||||
|
@ -21,8 +21,6 @@ WSGI middleware for OpenStack Volume API.
|
|||||||
|
|
||||||
from cinder.api import extensions
|
from cinder.api import extensions
|
||||||
import cinder.api.openstack
|
import cinder.api.openstack
|
||||||
from cinder.api.v2 import snapshot_metadata
|
|
||||||
from cinder.api.v2 import types
|
|
||||||
from cinder.api.v3 import attachments
|
from cinder.api.v3 import attachments
|
||||||
from cinder.api.v3 import backups
|
from cinder.api.v3 import backups
|
||||||
from cinder.api.v3 import clusters
|
from cinder.api.v3 import clusters
|
||||||
@ -36,7 +34,9 @@ from cinder.api.v3 import limits
|
|||||||
from cinder.api.v3 import messages
|
from cinder.api.v3 import messages
|
||||||
from cinder.api.v3 import resource_filters
|
from cinder.api.v3 import resource_filters
|
||||||
from cinder.api.v3 import snapshot_manage
|
from cinder.api.v3 import snapshot_manage
|
||||||
|
from cinder.api.v3 import snapshot_metadata
|
||||||
from cinder.api.v3 import snapshots
|
from cinder.api.v3 import snapshots
|
||||||
|
from cinder.api.v3 import types
|
||||||
from cinder.api.v3 import volume_manage
|
from cinder.api.v3 import volume_manage
|
||||||
from cinder.api.v3 import volume_metadata
|
from cinder.api.v3 import volume_metadata
|
||||||
from cinder.api.v3 import volume_transfer
|
from cinder.api.v3 import volume_transfer
|
||||||
|
@ -23,7 +23,7 @@ from cinder.api import api_utils
|
|||||||
from cinder.api import common
|
from cinder.api import common
|
||||||
from cinder.api import microversions as mv
|
from cinder.api import microversions as mv
|
||||||
from cinder.api.openstack import wsgi
|
from cinder.api.openstack import wsgi
|
||||||
from cinder.api.v2.views import types as views_types
|
from cinder.api.v3.views import types as views_types
|
||||||
from cinder import exception
|
from cinder import exception
|
||||||
from cinder.i18n import _
|
from cinder.i18n import _
|
||||||
from cinder.policies import volume_type as type_policy
|
from cinder.policies import volume_type as type_policy
|
@ -147,7 +147,8 @@ class VolumeController(volumes_v2.VolumeController):
|
|||||||
self._process_volume_filtering(context=context, filters=filters,
|
self._process_volume_filtering(context=context, filters=filters,
|
||||||
req_version=req_version)
|
req_version=req_version)
|
||||||
|
|
||||||
# NOTE(thingee): v2 API allows name instead of display_name
|
# NOTE: it's 'name' in the REST API, but 'display_name' in the
|
||||||
|
# database layer, so we need to do this translation
|
||||||
if 'name' in sort_keys:
|
if 'name' in sort_keys:
|
||||||
sort_keys[sort_keys.index('name')] = 'display_name'
|
sort_keys[sort_keys.index('name')] = 'display_name'
|
||||||
|
|
||||||
@ -302,12 +303,11 @@ class VolumeController(volumes_v2.VolumeController):
|
|||||||
kwargs = {}
|
kwargs = {}
|
||||||
self.validate_name_and_description(volume, check_length=False)
|
self.validate_name_and_description(volume, check_length=False)
|
||||||
|
|
||||||
# NOTE(thingee): v2 API allows name instead of display_name
|
# NOTE: it's 'name'/'description' in the REST API, but
|
||||||
|
# 'display_name'/display_description' in the database layer,
|
||||||
|
# so we need to do this translation
|
||||||
if 'name' in volume:
|
if 'name' in volume:
|
||||||
volume['display_name'] = volume.pop('name')
|
volume['display_name'] = volume.pop('name')
|
||||||
|
|
||||||
# NOTE(thingee): v2 API allows description instead of
|
|
||||||
# display_description
|
|
||||||
if 'description' in volume:
|
if 'description' in volume:
|
||||||
volume['display_description'] = volume.pop('description')
|
volume['display_description'] = volume.pop('description')
|
||||||
|
|
||||||
|
@ -38,18 +38,6 @@ _LINKS = [{
|
|||||||
|
|
||||||
|
|
||||||
_KNOWN_VERSIONS = {
|
_KNOWN_VERSIONS = {
|
||||||
"v2.0": {
|
|
||||||
"id": "v2.0",
|
|
||||||
"status": "DEPRECATED",
|
|
||||||
"version": "",
|
|
||||||
"min_version": "",
|
|
||||||
"updated": "2017-02-25T12:00:00Z",
|
|
||||||
"links": _LINKS,
|
|
||||||
"media-types": [{
|
|
||||||
"base": "application/json",
|
|
||||||
"type": "application/vnd.openstack.volume+json;version=2",
|
|
||||||
}]
|
|
||||||
},
|
|
||||||
"v3.0": {
|
"v3.0": {
|
||||||
"id": "v3.0",
|
"id": "v3.0",
|
||||||
"status": "CURRENT",
|
"status": "CURRENT",
|
||||||
@ -93,24 +81,15 @@ class VersionsController(wsgi.Controller):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(VersionsController, self).__init__(None)
|
super(VersionsController, self).__init__(None)
|
||||||
|
|
||||||
@wsgi.Controller.api_version('2.0')
|
@wsgi.Controller.api_version('3.0')
|
||||||
def index(self, req): # pylint: disable=E0102
|
|
||||||
"""Return versions supported prior to the microversions epoch."""
|
|
||||||
builder = views_versions.get_view_builder(req)
|
|
||||||
known_versions = copy.deepcopy(_KNOWN_VERSIONS)
|
|
||||||
known_versions.pop('v3.0')
|
|
||||||
return builder.build_versions(known_versions)
|
|
||||||
|
|
||||||
@index.api_version('3.0')
|
|
||||||
def index(self, req): # pylint: disable=E0102
|
def index(self, req): # pylint: disable=E0102
|
||||||
"""Return versions supported after the start of microversions."""
|
"""Return versions supported after the start of microversions."""
|
||||||
builder = views_versions.get_view_builder(req)
|
builder = views_versions.get_view_builder(req)
|
||||||
known_versions = copy.deepcopy(_KNOWN_VERSIONS)
|
known_versions = copy.deepcopy(_KNOWN_VERSIONS)
|
||||||
known_versions.pop('v2.0')
|
|
||||||
return builder.build_versions(known_versions)
|
return builder.build_versions(known_versions)
|
||||||
|
|
||||||
# NOTE (cknight): Calling the versions API without
|
# NOTE (cknight): Calling the versions API without
|
||||||
# /v2 or /v3 in the URL will lead to this unversioned
|
# /v3 in the URL will lead to this unversioned
|
||||||
# method, which should always return info about all
|
# method, which should always return info about all
|
||||||
# available versions.
|
# available versions.
|
||||||
@wsgi.response(HTTPStatus.MULTIPLE_CHOICES)
|
@wsgi.response(HTTPStatus.MULTIPLE_CHOICES)
|
||||||
@ -119,8 +98,8 @@ class VersionsController(wsgi.Controller):
|
|||||||
builder = views_versions.get_view_builder(req)
|
builder = views_versions.get_view_builder(req)
|
||||||
known_versions = copy.deepcopy(_KNOWN_VERSIONS)
|
known_versions = copy.deepcopy(_KNOWN_VERSIONS)
|
||||||
|
|
||||||
if not CONF.enable_v2_api:
|
# FIXME: remove this in Y ... I suppose we should honor
|
||||||
known_versions.pop('v2.0')
|
# it in Xena, even though it doesn't make any sense
|
||||||
if not CONF.enable_v3_api:
|
if not CONF.enable_v3_api:
|
||||||
known_versions.pop('v3.0')
|
known_versions.pop('v3.0')
|
||||||
|
|
||||||
|
@ -47,12 +47,12 @@ core_opts = [
|
|||||||
CONF.register_cli_opts(core_opts)
|
CONF.register_cli_opts(core_opts)
|
||||||
|
|
||||||
api_opts = [
|
api_opts = [
|
||||||
cfg.BoolOpt('enable_v2_api',
|
|
||||||
default=True,
|
|
||||||
deprecated_for_removal=True,
|
|
||||||
help="DEPRECATED: Deploy v2 of the Cinder API."),
|
|
||||||
cfg.BoolOpt('enable_v3_api',
|
cfg.BoolOpt('enable_v3_api',
|
||||||
default=True,
|
default=True,
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason=('This is the only API version available, '
|
||||||
|
'so disabling it is not an option.'),
|
||||||
|
deprecated_since="Xena",
|
||||||
help="Deploy v3 of the Cinder API."),
|
help="Deploy v3 of the Cinder API."),
|
||||||
cfg.BoolOpt('api_rate_limit',
|
cfg.BoolOpt('api_rate_limit',
|
||||||
default=True,
|
default=True,
|
||||||
|
@ -1,29 +1,5 @@
|
|||||||
{
|
{
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
|
||||||
"status": "DEPRECATED",
|
|
||||||
"updated": "%(isotime)s",
|
|
||||||
"links": [
|
|
||||||
{
|
|
||||||
"href": "https://docs.openstack.org/",
|
|
||||||
"type": "text/html",
|
|
||||||
"rel": "describedby"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"href": "%(host)s/v2/",
|
|
||||||
"rel": "self"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"min_version": "",
|
|
||||||
"version": "",
|
|
||||||
"media-types": [
|
|
||||||
{
|
|
||||||
"base": "application/json",
|
|
||||||
"type": "application/vnd.openstack.volume+json;version=2"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"id": "v2.0"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"status": "CURRENT",
|
"status": "CURRENT",
|
||||||
"updated": "%(isotime)s",
|
"updated": "%(isotime)s",
|
||||||
|
@ -35,7 +35,7 @@ from cinder.objects import base as obj_base
|
|||||||
from cinder.objects import fields
|
from cinder.objects import fields
|
||||||
from cinder.scheduler import rpcapi as scheduler_rpcapi
|
from cinder.scheduler import rpcapi as scheduler_rpcapi
|
||||||
from cinder.tests.unit.api import fakes
|
from cinder.tests.unit.api import fakes
|
||||||
from cinder.tests.unit.api.v2 import fakes as v2_fakes
|
from cinder.tests.unit.api.v3 import fakes as v3_fakes
|
||||||
from cinder.tests.unit import cast_as_call
|
from cinder.tests.unit import cast_as_call
|
||||||
from cinder.tests.unit import fake_constants as fake
|
from cinder.tests.unit import fake_constants as fake
|
||||||
from cinder.tests.unit import fake_snapshot
|
from cinder.tests.unit import fake_snapshot
|
||||||
@ -48,14 +48,7 @@ from cinder.volume import volume_types
|
|||||||
|
|
||||||
def app():
|
def app():
|
||||||
# no auth, just let environ['cinder.context'] pass through
|
# no auth, just let environ['cinder.context'] pass through
|
||||||
api = fakes.router.APIRouter()
|
api = fakes.router_v3.APIRouter()
|
||||||
mapper = fakes.urlmap.URLMap()
|
|
||||||
mapper['/v2'] = api
|
|
||||||
return mapper
|
|
||||||
|
|
||||||
|
|
||||||
def app_v3():
|
|
||||||
api = fakes.router.APIRouter()
|
|
||||||
mapper = fakes.urlmap.URLMap()
|
mapper = fakes.urlmap.URLMap()
|
||||||
mapper['/v3'] = api
|
mapper['/v3'] = api
|
||||||
return mapper
|
return mapper
|
||||||
@ -123,7 +116,7 @@ class AdminActionsTest(BaseAdminTest):
|
|||||||
super(AdminActionsTest, self).tearDown()
|
super(AdminActionsTest, self).tearDown()
|
||||||
|
|
||||||
def _issue_resource_reset(self, ctx, name, id, status):
|
def _issue_resource_reset(self, ctx, name, id, status):
|
||||||
req = webob.Request.blank('/v2/%s/%s/%s/action' % (
|
req = webob.Request.blank('/v3/%s/%s/%s/action' % (
|
||||||
fake.PROJECT_ID, name, id))
|
fake.PROJECT_ID, name, id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -370,7 +363,7 @@ class AdminActionsTest(BaseAdminTest):
|
|||||||
'user_id': fake.USER_ID,
|
'user_id': fake.USER_ID,
|
||||||
'project_id': fake.PROJECT_ID})
|
'project_id': fake.PROJECT_ID})
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/%s/%s/action' % (
|
req = webob.Request.blank('/v3/%s/%s/%s/action' % (
|
||||||
fake.PROJECT_ID, 'backups', backup['id']))
|
fake.PROJECT_ID, 'backups', backup['id']))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -405,7 +398,7 @@ class AdminActionsTest(BaseAdminTest):
|
|||||||
self.assertEqual('available', volume['status'])
|
self.assertEqual('available', volume['status'])
|
||||||
|
|
||||||
def test_reset_status_for_missing_volume(self):
|
def test_reset_status_for_missing_volume(self):
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -541,7 +534,7 @@ class AdminActionsTest(BaseAdminTest):
|
|||||||
snapshot.create()
|
snapshot.create()
|
||||||
self.addCleanup(snapshot.destroy)
|
self.addCleanup(snapshot.destroy)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/%s/%s/action' % (
|
req = webob.Request.blank('/v3/%s/%s/%s/action' % (
|
||||||
fake.PROJECT_ID, 'snapshots', snapshot['id']))
|
fake.PROJECT_ID, 'snapshots', snapshot['id']))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -553,7 +546,7 @@ class AdminActionsTest(BaseAdminTest):
|
|||||||
def test_force_delete(self):
|
def test_force_delete(self):
|
||||||
# current status is creating
|
# current status is creating
|
||||||
volume = self._create_volume(self.ctx, {'size': 1, 'host': None})
|
volume = self._create_volume(self.ctx, {'size': 1, 'host': None})
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, volume['id']))
|
fake.PROJECT_ID, volume['id']))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -573,14 +566,14 @@ class AdminActionsTest(BaseAdminTest):
|
|||||||
@mock.patch.object(db, 'volume_get')
|
@mock.patch.object(db, 'volume_get')
|
||||||
def test_force_delete_snapshot(self, volume_get, snapshot_get, get_by_id,
|
def test_force_delete_snapshot(self, volume_get, snapshot_get, get_by_id,
|
||||||
delete_snapshot):
|
delete_snapshot):
|
||||||
volume = v2_fakes.create_fake_volume(fake.VOLUME_ID)
|
volume = v3_fakes.create_volume(fake.VOLUME_ID)
|
||||||
snapshot = v2_fakes.fake_snapshot(fake.SNAPSHOT_ID)
|
snapshot = v3_fakes.fake_snapshot(fake.SNAPSHOT_ID)
|
||||||
snapshot_obj = fake_snapshot.fake_snapshot_obj(self.ctx, **snapshot)
|
snapshot_obj = fake_snapshot.fake_snapshot_obj(self.ctx, **snapshot)
|
||||||
volume_get.return_value = volume
|
volume_get.return_value = volume
|
||||||
snapshot_get.return_value = snapshot
|
snapshot_get.return_value = snapshot
|
||||||
get_by_id.return_value = snapshot_obj
|
get_by_id.return_value = snapshot_obj
|
||||||
|
|
||||||
path = '/v2/%s/snapshots/%s/action' % (
|
path = '/v3/%s/snapshots/%s/action' % (
|
||||||
fake.PROJECT_ID, snapshot['id'])
|
fake.PROJECT_ID, snapshot['id'])
|
||||||
req = webob.Request.blank(path)
|
req = webob.Request.blank(path)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
@ -633,7 +626,7 @@ class AdminActionsTest(BaseAdminTest):
|
|||||||
body['os-migrate_volume']['cluster'] = cluster
|
body['os-migrate_volume']['cluster'] = cluster
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
resp = req.get_response(app_v3())
|
resp = req.get_response(app())
|
||||||
|
|
||||||
# verify status
|
# verify status
|
||||||
self.assertEqual(expected_status, resp.status_int)
|
self.assertEqual(expected_status, resp.status_int)
|
||||||
@ -676,7 +669,7 @@ class AdminActionsTest(BaseAdminTest):
|
|||||||
def _migrate_volume_exec(self, ctx, volume, host, expected_status,
|
def _migrate_volume_exec(self, ctx, volume, host, expected_status,
|
||||||
force_host_copy=False, lock_volume=False):
|
force_host_copy=False, lock_volume=False):
|
||||||
# build request to migrate to host
|
# build request to migrate to host
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, volume['id']))
|
fake.PROJECT_ID, volume['id']))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -737,7 +730,7 @@ class AdminActionsTest(BaseAdminTest):
|
|||||||
host = 'test3'
|
host = 'test3'
|
||||||
volume = self._migrate_volume_prep()
|
volume = self._migrate_volume_prep()
|
||||||
# build request to migrate without host
|
# build request to migrate without host
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, volume['id']))
|
fake.PROJECT_ID, volume['id']))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -804,7 +797,7 @@ class AdminActionsTest(BaseAdminTest):
|
|||||||
|
|
||||||
def _migrate_volume_comp_exec(self, ctx, volume, new_volume, error,
|
def _migrate_volume_comp_exec(self, ctx, volume, new_volume, error,
|
||||||
expected_status, expected_id, no_body=False):
|
expected_status, expected_id, no_body=False):
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, volume['id']))
|
fake.PROJECT_ID, volume['id']))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -893,7 +886,7 @@ class AdminActionsTest(BaseAdminTest):
|
|||||||
volume = db.volume_create(self.ctx, {'id': fake.VOLUME_ID,
|
volume = db.volume_create(self.ctx, {'id': fake.VOLUME_ID,
|
||||||
'volume_type_id':
|
'volume_type_id':
|
||||||
fake.VOLUME_TYPE_ID})
|
fake.VOLUME_TYPE_ID})
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, volume['id']))
|
fake.PROJECT_ID, volume['id']))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -920,7 +913,7 @@ class AdminActionsTest(BaseAdminTest):
|
|||||||
backup = test_utils.create_backup(self.ctx, status=test_status,
|
backup = test_utils.create_backup(self.ctx, status=test_status,
|
||||||
size=1, availability_zone='az1',
|
size=1, availability_zone='az1',
|
||||||
host='testhost')
|
host='testhost')
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/action' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/action' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -957,7 +950,7 @@ class AdminActionsTest(BaseAdminTest):
|
|||||||
# admin context
|
# admin context
|
||||||
self.override_config('backup_driver', 'cinder.backup.drivers.ceph')
|
self.override_config('backup_driver', 'cinder.backup.drivers.ceph')
|
||||||
backup = test_utils.create_backup(self.ctx, size=1)
|
backup = test_utils.create_backup(self.ctx, size=1)
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/action' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/action' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1003,7 +996,7 @@ class AdminActionsAttachDetachTest(BaseAdminTest):
|
|||||||
connector)
|
connector)
|
||||||
self.assertEqual('rw', conn_info['data']['access_mode'])
|
self.assertEqual('rw', conn_info['data']['access_mode'])
|
||||||
# build request to force detach
|
# build request to force detach
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, volume.id))
|
fake.PROJECT_ID, volume.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -1055,7 +1048,7 @@ class AdminActionsAttachDetachTest(BaseAdminTest):
|
|||||||
volume, connector)
|
volume, connector)
|
||||||
self.assertEqual('ro', conn_info['data']['access_mode'])
|
self.assertEqual('ro', conn_info['data']['access_mode'])
|
||||||
# build request to force detach
|
# build request to force detach
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, volume.id))
|
fake.PROJECT_ID, volume.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -1109,7 +1102,7 @@ class AdminActionsAttachDetachTest(BaseAdminTest):
|
|||||||
messaging.RemoteError(exc_type='VolumeAttachmentNotFound')
|
messaging.RemoteError(exc_type='VolumeAttachmentNotFound')
|
||||||
with mock.patch.object(volume_api.API, 'detach',
|
with mock.patch.object(volume_api.API, 'detach',
|
||||||
side_effect=volume_remote_error):
|
side_effect=volume_remote_error):
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, volume.id))
|
fake.PROJECT_ID, volume.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -1126,7 +1119,7 @@ class AdminActionsAttachDetachTest(BaseAdminTest):
|
|||||||
messaging.RemoteError(exc_type='VolumeBackendAPIException'))
|
messaging.RemoteError(exc_type='VolumeBackendAPIException'))
|
||||||
with mock.patch.object(volume_api.API, 'detach',
|
with mock.patch.object(volume_api.API, 'detach',
|
||||||
side_effect=volume_remote_error):
|
side_effect=volume_remote_error):
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, volume.id))
|
fake.PROJECT_ID, volume.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -1172,7 +1165,7 @@ class AdminActionsAttachDetachTest(BaseAdminTest):
|
|||||||
volume_remote_error = messaging.RemoteError(exc_type='DBError')
|
volume_remote_error = messaging.RemoteError(exc_type='DBError')
|
||||||
with mock.patch.object(volume_api.API, 'detach',
|
with mock.patch.object(volume_api.API, 'detach',
|
||||||
side_effect=volume_remote_error):
|
side_effect=volume_remote_error):
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, volume.id))
|
(fake.PROJECT_ID, volume.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -1214,7 +1207,7 @@ class AdminActionsAttachDetachTest(BaseAdminTest):
|
|||||||
|
|
||||||
# test when missing connector
|
# test when missing connector
|
||||||
with mock.patch.object(volume_api.API, 'detach'):
|
with mock.patch.object(volume_api.API, 'detach'):
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, volume.id))
|
fake.PROJECT_ID, volume.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
|
@ -82,7 +82,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
container='volumebackups',
|
container='volumebackups',
|
||||||
size=1,
|
size=1,
|
||||||
availability_zone='az1')
|
availability_zone='az1')
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
req = webob.Request.blank('/v3/%s/backups/%s' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -129,7 +129,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup.destroy()
|
backup.destroy()
|
||||||
|
|
||||||
def test_show_backup_with_backup_NotFound(self):
|
def test_show_backup_with_backup_NotFound(self):
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
req = webob.Request.blank('/v3/%s/backups/%s' % (
|
||||||
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers = mv.get_mv_header(mv.BACKUP_METADATA)
|
req.headers = mv.get_mv_header(mv.BACKUP_METADATA)
|
||||||
@ -150,7 +150,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup2 = utils.create_backup(self.context)
|
backup2 = utils.create_backup(self.context)
|
||||||
backup3 = utils.create_backup(self.context)
|
backup3 = utils.create_backup(self.context)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
res = req.get_response(fakes.wsgi_app(
|
res = req.get_response(fakes.wsgi_app(
|
||||||
@ -177,7 +177,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup2 = utils.create_backup(self.context)
|
backup2 = utils.create_backup(self.context)
|
||||||
backup3 = utils.create_backup(self.context)
|
backup3 = utils.create_backup(self.context)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups?limit=2' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups?limit=2' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
res = req.get_response(fakes.wsgi_app(
|
res = req.get_response(fakes.wsgi_app(
|
||||||
@ -198,7 +198,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup1.destroy()
|
backup1.destroy()
|
||||||
|
|
||||||
def test_list_backups_with_offset_out_of_range(self):
|
def test_list_backups_with_offset_out_of_range(self):
|
||||||
url = '/v2/%s/backups?offset=252452434242342434' % fake.PROJECT_ID
|
url = '/v3/%s/backups?offset=252452434242342434' % fake.PROJECT_ID
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -210,7 +210,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup1 = utils.create_backup(self.context)
|
backup1 = utils.create_backup(self.context)
|
||||||
backup2 = utils.create_backup(self.context)
|
backup2 = utils.create_backup(self.context)
|
||||||
backup3 = utils.create_backup(self.context)
|
backup3 = utils.create_backup(self.context)
|
||||||
url = '/v2/%s/backups?marker=%s' % (fake.PROJECT_ID, backup3.id)
|
url = '/v3/%s/backups?marker=%s' % (fake.PROJECT_ID, backup3.id)
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -236,7 +236,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup2 = utils.create_backup(self.context)
|
backup2 = utils.create_backup(self.context)
|
||||||
backup3 = utils.create_backup(self.context)
|
backup3 = utils.create_backup(self.context)
|
||||||
|
|
||||||
url = ('/v2/%s/backups?limit=1&marker=%s' % (fake.PROJECT_ID,
|
url = ('/v3/%s/backups?limit=1&marker=%s' % (fake.PROJECT_ID,
|
||||||
backup3.id))
|
backup3.id))
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
@ -264,7 +264,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup3 = utils.create_backup(self.context, availability_zone='az1',
|
backup3 = utils.create_backup(self.context, availability_zone='az1',
|
||||||
container='volumebackups', size=1)
|
container='volumebackups', size=1)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups/detail' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups/detail' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.headers['Accept'] = 'application/json'
|
req.headers['Accept'] = 'application/json'
|
||||||
@ -302,7 +302,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup3 = utils.create_backup(self.context, availability_zone='az1',
|
backup3 = utils.create_backup(self.context, availability_zone='az1',
|
||||||
container='volumebackups', size=1)
|
container='volumebackups', size=1)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups/detail' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups/detail' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.headers['Accept'] = 'application/json'
|
req.headers['Accept'] = 'application/json'
|
||||||
@ -395,7 +395,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
status=fields.BackupStatus.AVAILABLE)
|
status=fields.BackupStatus.AVAILABLE)
|
||||||
backup3 = utils.create_backup(self.context, volume_id=fake.VOLUME3_ID)
|
backup3 = utils.create_backup(self.context, volume_id=fake.VOLUME3_ID)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups/detail?name=test2' %
|
req = webob.Request.blank('/v3/%s/backups/detail?name=test2' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -408,7 +408,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
self.assertEqual(HTTPStatus.OK, res.status_int)
|
self.assertEqual(HTTPStatus.OK, res.status_int)
|
||||||
self.assertEqual(backup1.id, res_dict['backups'][0]['id'])
|
self.assertEqual(backup1.id, res_dict['backups'][0]['id'])
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups/detail?status=available' %
|
req = webob.Request.blank('/v3/%s/backups/detail?status=available' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -421,7 +421,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
self.assertEqual(HTTPStatus.OK, res.status_int)
|
self.assertEqual(HTTPStatus.OK, res.status_int)
|
||||||
self.assertEqual(backup2.id, res_dict['backups'][0]['id'])
|
self.assertEqual(backup2.id, res_dict['backups'][0]['id'])
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups/detail?volume_id=%s' % (
|
req = webob.Request.blank('/v3/%s/backups/detail?volume_id=%s' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME3_ID))
|
fake.PROJECT_ID, fake.VOLUME3_ID))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -442,7 +442,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup1 = utils.create_backup(self.context)
|
backup1 = utils.create_backup(self.context)
|
||||||
backup2 = utils.create_backup(self.context)
|
backup2 = utils.create_backup(self.context)
|
||||||
backup3 = utils.create_backup(self.context)
|
backup3 = utils.create_backup(self.context)
|
||||||
url = ('/v2/%s/backups/detail?limit=2&sort_key=created_at'
|
url = ('/v3/%s/backups/detail?limit=2&sort_key=created_at'
|
||||||
'&sort_dir=desc' % fake.PROJECT_ID)
|
'&sort_dir=desc' % fake.PROJECT_ID)
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
@ -467,7 +467,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup2 = utils.create_backup(self.context)
|
backup2 = utils.create_backup(self.context)
|
||||||
backup3 = utils.create_backup(self.context)
|
backup3 = utils.create_backup(self.context)
|
||||||
|
|
||||||
url = ('/v2/%s/backups/detail?marker=%s' % (
|
url = ('/v3/%s/backups/detail?marker=%s' % (
|
||||||
fake.PROJECT_ID, backup3.id))
|
fake.PROJECT_ID, backup3.id))
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
@ -492,7 +492,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup2 = utils.create_backup(self.context)
|
backup2 = utils.create_backup(self.context)
|
||||||
backup3 = utils.create_backup(self.context)
|
backup3 = utils.create_backup(self.context)
|
||||||
|
|
||||||
url = ('/v2/%s/backups/detail?limit=1&marker=%s' % (
|
url = ('/v3/%s/backups/detail?limit=1&marker=%s' % (
|
||||||
fake.PROJECT_ID, backup3.id))
|
fake.PROJECT_ID, backup3.id))
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
@ -511,7 +511,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup1.destroy()
|
backup1.destroy()
|
||||||
|
|
||||||
def test_list_backups_detail_with_offset_out_of_range(self):
|
def test_list_backups_detail_with_offset_out_of_range(self):
|
||||||
url = ('/v2/%s/backups/detail?offset=234534543657634523' %
|
url = ('/v3/%s/backups/detail?offset=234534543657634523' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
@ -530,7 +530,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
"container": "nightlybackups",
|
"container": "nightlybackups",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -560,7 +560,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
|
|
||||||
volume = utils.create_volume(self.context, size=5)
|
volume = utils.create_volume(self.context, size=5)
|
||||||
body['backup']['volume_id'] = volume.id
|
body['backup']['volume_id'] = volume.id
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -570,7 +570,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
|
|
||||||
# create backup call doesn't return 'description' in response so get
|
# create backup call doesn't return 'description' in response so get
|
||||||
# the created backup to assert name and description
|
# the created backup to assert name and description
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
req = webob.Request.blank('/v3/%s/backups/%s' % (
|
||||||
fake.PROJECT_ID, res_dict['backup']['id']))
|
fake.PROJECT_ID, res_dict['backup']['id']))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -668,7 +668,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
"container": "nightlybackups",
|
"container": "nightlybackups",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -698,7 +698,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
"force": True,
|
"force": True,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -723,7 +723,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
"container": "nightlybackups",
|
"container": "nightlybackups",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -750,7 +750,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
"container": "nightlybackups",
|
"container": "nightlybackups",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -777,7 +777,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -802,7 +802,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
"volume_id": volume.id,
|
"volume_id": volume.id,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -825,11 +825,10 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
"container": "a" * 256
|
"container": "a" * 256
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.environ['cinder.context'] = self.context
|
req.environ['cinder.context'] = self.context
|
||||||
req.api_version_request = api_version.APIVersionRequest()
|
req.api_version_request = api_version.APIVersionRequest("3.0")
|
||||||
req.api_version_request = api_version.APIVersionRequest("2.0")
|
|
||||||
self.assertRaises(exception.ValidationError,
|
self.assertRaises(exception.ValidationError,
|
||||||
self.controller.create,
|
self.controller.create,
|
||||||
req,
|
req,
|
||||||
@ -868,7 +867,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
size=1, availability_zone='az1',
|
size=1, availability_zone='az1',
|
||||||
host='testhost')
|
host='testhost')
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -905,7 +904,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
"incremental": True,
|
"incremental": True,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -924,7 +923,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_create_backup_with_no_body(self):
|
def test_create_backup_with_no_body(self):
|
||||||
# omit body from the request
|
# omit body from the request
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.body = jsonutils.dump_as_bytes(None)
|
req.body = jsonutils.dump_as_bytes(None)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -947,7 +946,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
"container": "nightlybackups",
|
"container": "nightlybackups",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -969,7 +968,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
"container": "nightlybackups",
|
"container": "nightlybackups",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -992,7 +991,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
"container": "nightlybackups",
|
"container": "nightlybackups",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -1013,7 +1012,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
"container": "nightlybackups",
|
"container": "nightlybackups",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -1033,7 +1032,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
_mock_service_get_all.return_value = []
|
_mock_service_get_all.return_value = []
|
||||||
|
|
||||||
volume = utils.create_volume(self.context, size=2)
|
volume = utils.create_volume(self.context, size=2)
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
body = {"backup": {"name": "nightly001",
|
body = {"backup": {"name": "nightly001",
|
||||||
"description":
|
"description":
|
||||||
"Nightly Backup 03-Sep-2012",
|
"Nightly Backup 03-Sep-2012",
|
||||||
@ -1069,7 +1068,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
"incremental": True,
|
"incremental": True,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -1095,7 +1094,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
"snapshot_id": None,
|
"snapshot_id": None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/backups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/backups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -1265,7 +1264,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup = utils.create_backup(self.context,
|
backup = utils.create_backup(self.context,
|
||||||
status=fields.BackupStatus.AVAILABLE,
|
status=fields.BackupStatus.AVAILABLE,
|
||||||
availability_zone='az1', host='testhost')
|
availability_zone='az1', host='testhost')
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
req = webob.Request.blank('/v3/%s/backups/%s' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1293,7 +1292,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
status=fields.BackupStatus.AVAILABLE,
|
status=fields.BackupStatus.AVAILABLE,
|
||||||
incremental=True,
|
incremental=True,
|
||||||
availability_zone='az1', host='testhost')
|
availability_zone='az1', host='testhost')
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
req = webob.Request.blank('/v3/%s/backups/%s' % (
|
||||||
fake.PROJECT_ID, delta.id))
|
fake.PROJECT_ID, delta.id))
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1318,7 +1317,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup = utils.create_backup(self.context,
|
backup = utils.create_backup(self.context,
|
||||||
status=fields.BackupStatus.ERROR,
|
status=fields.BackupStatus.ERROR,
|
||||||
availability_zone='az1', host='testhost')
|
availability_zone='az1', host='testhost')
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
req = webob.Request.blank('/v3/%s/backups/%s' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1333,7 +1332,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup.destroy()
|
backup.destroy()
|
||||||
|
|
||||||
def test_delete_backup_with_backup_NotFound(self):
|
def test_delete_backup_with_backup_NotFound(self):
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
req = webob.Request.blank('/v3/%s/backups/%s' % (
|
||||||
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1350,7 +1349,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_delete_backup_with_InvalidBackup(self):
|
def test_delete_backup_with_InvalidBackup(self):
|
||||||
backup = utils.create_backup(self.context)
|
backup = utils.create_backup(self.context)
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
req = webob.Request.blank('/v3/%s/backups/%s' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1382,7 +1381,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
status=fields.BackupStatus.AVAILABLE, incremental=True,
|
status=fields.BackupStatus.AVAILABLE, incremental=True,
|
||||||
parent_id=backup.id)
|
parent_id=backup.id)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
req = webob.Request.blank('/v3/%s/backups/%s' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1407,7 +1406,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
'disabled': 0, 'updated_at': '1775-04-19 05:00:00',
|
'disabled': 0, 'updated_at': '1775-04-19 05:00:00',
|
||||||
'uuid': 'a3a593da-7f8d-4bb7-8b4c-f2bc1e0b4824'}]
|
'uuid': 'a3a593da-7f8d-4bb7-8b4c-f2bc1e0b4824'}]
|
||||||
backup = utils.create_backup(self.context, status='available')
|
backup = utils.create_backup(self.context, status='available')
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
req = webob.Request.blank('/v3/%s/backups/%s' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
|
|
||||||
@ -1432,7 +1431,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
status=fields.BackupStatus.AVAILABLE,
|
status=fields.BackupStatus.AVAILABLE,
|
||||||
availability_zone='az1', host='testhost',
|
availability_zone='az1', host='testhost',
|
||||||
service=None)
|
service=None)
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
req = webob.Request.blank('/v3/%s/backups/%s' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1453,7 +1452,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
display_name=volume_name)
|
display_name=volume_name)
|
||||||
|
|
||||||
body = {"restore": {"volume_id": volume.id, }}
|
body = {"restore": {"volume_id": volume.id, }}
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1472,7 +1471,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup = utils.create_backup(self.context,
|
backup = utils.create_backup(self.context,
|
||||||
status=fields.BackupStatus.AVAILABLE)
|
status=fields.BackupStatus.AVAILABLE)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.body = jsonutils.dump_as_bytes(None)
|
req.body = jsonutils.dump_as_bytes(None)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
@ -1495,7 +1494,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup = utils.create_backup(self.context,
|
backup = utils.create_backup(self.context,
|
||||||
status=fields.BackupStatus.AVAILABLE)
|
status=fields.BackupStatus.AVAILABLE)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
body = {"restore": {'': ''}}
|
body = {"restore": {'': ''}}
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
@ -1537,7 +1536,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
availability_zone='az1', host='testhost')
|
availability_zone='az1', host='testhost')
|
||||||
|
|
||||||
body = {"restore": {}}
|
body = {"restore": {}}
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1572,7 +1571,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
availability_zone='az1', host='testhost')
|
availability_zone='az1', host='testhost')
|
||||||
|
|
||||||
body = {"restore": {'name': 'vol-01'}}
|
body = {"restore": {'name': 'vol-01'}}
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' %
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' %
|
||||||
(fake.PROJECT_ID, backup.id))
|
(fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1602,7 +1601,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
volume = utils.create_volume(self.context, size=5,
|
volume = utils.create_volume(self.context, size=5,
|
||||||
display_name=orig_vol_name)
|
display_name=orig_vol_name)
|
||||||
body = {"restore": {'name': 'vol-01', 'volume_id': volume.id}}
|
body = {"restore": {'name': 'vol-01', 'volume_id': volume.id}}
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1630,7 +1629,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
|
|
||||||
body = {"restore": {"name": None,
|
body = {"restore": {"name": None,
|
||||||
"volume_id": volume.id}}
|
"volume_id": volume.id}}
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1655,7 +1654,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
# need to create the volume referenced below first
|
# need to create the volume referenced below first
|
||||||
volume = utils.create_volume(self.context, size=0)
|
volume = utils.create_volume(self.context, size=0)
|
||||||
body = {"restore": {"volume_id": volume.id, }}
|
body = {"restore": {"volume_id": volume.id, }}
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
|
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
@ -1678,7 +1677,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
volume = utils.create_volume(self.context, size=5, status='attaching')
|
volume = utils.create_volume(self.context, size=5, status='attaching')
|
||||||
|
|
||||||
body = {"restore": {"volume_id": volume.id, }}
|
body = {"restore": {"volume_id": volume.id, }}
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1704,7 +1703,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
volume = utils.create_volume(self.context, size=5)
|
volume = utils.create_volume(self.context, size=5)
|
||||||
|
|
||||||
body = {"restore": {"volume_id": volume.id, }}
|
body = {"restore": {"volume_id": volume.id, }}
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1727,7 +1726,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
volume = utils.create_volume(self.context, size=5)
|
volume = utils.create_volume(self.context, size=5)
|
||||||
|
|
||||||
body = {"restore": {"volume_id": volume.id, }}
|
body = {"restore": {"volume_id": volume.id, }}
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' %
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' %
|
||||||
(fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
(fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1750,7 +1749,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
status=fields.BackupStatus.AVAILABLE)
|
status=fields.BackupStatus.AVAILABLE)
|
||||||
|
|
||||||
body = {"restore": {"volume_id": fake.WILL_NOT_BE_FOUND_ID, }}
|
body = {"restore": {"volume_id": fake.WILL_NOT_BE_FOUND_ID, }}
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1784,7 +1783,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
volume = utils.create_volume(self.context, size=5)
|
volume = utils.create_volume(self.context, size=5)
|
||||||
|
|
||||||
body = {"restore": {"volume_id": volume.id, }}
|
body = {"restore": {"volume_id": volume.id, }}
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
|
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
@ -1815,7 +1814,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
volume = utils.create_volume(self.context, size=5)
|
volume = utils.create_volume(self.context, size=5)
|
||||||
|
|
||||||
body = {"restore": {"volume_id": volume.id, }}
|
body = {"restore": {"volume_id": volume.id, }}
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
|
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
@ -1841,7 +1840,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
volume = utils.create_volume(self.context, size=volume_size)
|
volume = utils.create_volume(self.context, size=volume_size)
|
||||||
|
|
||||||
body = {"restore": {"volume_id": volume.id, }}
|
body = {"restore": {"volume_id": volume.id, }}
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1873,7 +1872,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
display_name=volume_name)
|
display_name=volume_name)
|
||||||
|
|
||||||
body = {"restore": {"volume_id": volume.id, }}
|
body = {"restore": {"volume_id": volume.id, }}
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1904,7 +1903,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
|
|
||||||
_mock_get_backup_host.return_value = 'testhost'
|
_mock_get_backup_host.return_value = 'testhost'
|
||||||
body = {"restore": {"volume_id": volume.id, }}
|
body = {"restore": {"volume_id": volume.id, }}
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/restore' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/restore' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1929,7 +1928,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup = utils.create_backup(self.context,
|
backup = utils.create_backup(self.context,
|
||||||
status=fields.BackupStatus.AVAILABLE,
|
status=fields.BackupStatus.AVAILABLE,
|
||||||
size=10)
|
size=10)
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/export_record' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/export_record' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -1955,7 +1954,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
{'backup_service': backup_service,
|
{'backup_service': backup_service,
|
||||||
'backup_url': backup_url}
|
'backup_url': backup_url}
|
||||||
_mock_get_backup_host.return_value = 'testhost'
|
_mock_get_backup_host.return_value = 'testhost'
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/export_record' % (
|
req = webob.Request.blank('/v3/%s/backups/%s/export_record' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -1975,7 +1974,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID,
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID,
|
||||||
is_admin=True)
|
is_admin=True)
|
||||||
backup_id = fake.WILL_NOT_BE_FOUND_ID
|
backup_id = fake.WILL_NOT_BE_FOUND_ID
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/export_record' %
|
req = webob.Request.blank('/v3/%s/backups/%s/export_record' %
|
||||||
(fake.PROJECT_ID, backup_id))
|
(fake.PROJECT_ID, backup_id))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -1994,7 +1993,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
status=fields.BackupStatus.RESTORING)
|
status=fields.BackupStatus.RESTORING)
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID,
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID,
|
||||||
is_admin=True)
|
is_admin=True)
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/export_record' %
|
req = webob.Request.blank('/v3/%s/backups/%s/export_record' %
|
||||||
(fake.PROJECT_ID, backup.id))
|
(fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -2022,7 +2021,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
status=fields.BackupStatus.AVAILABLE)
|
status=fields.BackupStatus.AVAILABLE)
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID,
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID,
|
||||||
is_admin=True)
|
is_admin=True)
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s/export_record' %
|
req = webob.Request.blank('/v3/%s/backups/%s/export_record' %
|
||||||
(fake.PROJECT_ID, backup.id))
|
(fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -2040,7 +2039,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
def test_import_record_as_non_admin(self):
|
def test_import_record_as_non_admin(self):
|
||||||
backup_service = 'fake'
|
backup_service = 'fake'
|
||||||
backup_url = 'fake'
|
backup_url = 'fake'
|
||||||
req = webob.Request.blank('/v2/%s/backups/import_record' %
|
req = webob.Request.blank('/v3/%s/backups/import_record' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
body = {'backup-record': {'backup_service': backup_service,
|
body = {'backup-record': {'backup_service': backup_service,
|
||||||
'backup_url': backup_url}}
|
'backup_url': backup_url}}
|
||||||
@ -2077,7 +2076,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
_mock_import_record_rpc.return_value = None
|
_mock_import_record_rpc.return_value = None
|
||||||
_mock_list_services.return_value = [backup_service]
|
_mock_list_services.return_value = [backup_service]
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups/import_record' %
|
req = webob.Request.blank('/v3/%s/backups/import_record' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
body = {'backup-record': {'backup_service': backup_service,
|
body = {'backup-record': {'backup_service': backup_service,
|
||||||
'backup_url': backup_url}}
|
'backup_url': backup_url}}
|
||||||
@ -2134,7 +2133,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
_mock_import_record_rpc.return_value = None
|
_mock_import_record_rpc.return_value = None
|
||||||
_mock_list_services.return_value = [backup_service]
|
_mock_list_services.return_value = [backup_service]
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups/import_record' %
|
req = webob.Request.blank('/v3/%s/backups/import_record' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
body = {'backup-record': {'backup_service': backup_service,
|
body = {'backup-record': {'backup_service': backup_service,
|
||||||
'backup_url': backup_url}}
|
'backup_url': backup_url}}
|
||||||
@ -2170,7 +2169,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup_url = 'fake'
|
backup_url = 'fake'
|
||||||
_mock_list_services.return_value = []
|
_mock_list_services.return_value = []
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups/import_record' %
|
req = webob.Request.blank('/v3/%s/backups/import_record' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
body = {'backup-record': {'backup_service': backup_service,
|
body = {'backup-record': {'backup_service': backup_service,
|
||||||
'backup_url': backup_url}}
|
'backup_url': backup_url}}
|
||||||
@ -2194,7 +2193,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup_service = 'fake'
|
backup_service = 'fake'
|
||||||
backup_url = 'fake'
|
backup_url = 'fake'
|
||||||
_mock_list_services.return_value = ['no-match1', 'no-match2']
|
_mock_list_services.return_value = ['no-match1', 'no-match2']
|
||||||
req = webob.Request.blank('/v2/%s/backups/import_record' %
|
req = webob.Request.blank('/v3/%s/backups/import_record' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
body = {'backup-record': {'backup_service': backup_service,
|
body = {'backup-record': {'backup_service': backup_service,
|
||||||
'backup_url': backup_url}}
|
'backup_url': backup_url}}
|
||||||
@ -2226,7 +2225,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup_service = 'fake'
|
backup_service = 'fake'
|
||||||
backup_url = backup.encode_record()
|
backup_url = backup.encode_record()
|
||||||
_mock_list_services.return_value = ['no-match1', 'no-match2']
|
_mock_list_services.return_value = ['no-match1', 'no-match2']
|
||||||
req = webob.Request.blank('/v2/%s/backups/import_record' %
|
req = webob.Request.blank('/v3/%s/backups/import_record' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
body = {'backup-record': {'backup_service': backup_service,
|
body = {'backup-record': {'backup_service': backup_service,
|
||||||
'backup_url': backup_url}}
|
'backup_url': backup_url}}
|
||||||
@ -2266,7 +2265,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
_mock_list_services.return_value = ['no-match1', 'no-match2']
|
_mock_list_services.return_value = ['no-match1', 'no-match2']
|
||||||
_mock_import_record.side_effect = \
|
_mock_import_record.side_effect = \
|
||||||
exception.ServiceNotFound(service_id='fake')
|
exception.ServiceNotFound(service_id='fake')
|
||||||
req = webob.Request.blank('/v2/%s/backups/import_record' %
|
req = webob.Request.blank('/v3/%s/backups/import_record' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
body = {'backup-record': {'backup_service': backup_service,
|
body = {'backup-record': {'backup_service': backup_service,
|
||||||
'backup_url': backup_url}}
|
'backup_url': backup_url}}
|
||||||
@ -2291,7 +2290,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
backup_url = 'fake'
|
backup_url = 'fake'
|
||||||
|
|
||||||
# test with no backup_service
|
# test with no backup_service
|
||||||
req = webob.Request.blank('/v2/%s/backups/import_record' %
|
req = webob.Request.blank('/v3/%s/backups/import_record' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
body = {'backup-record': {'backup_url': backup_url}}
|
body = {'backup-record': {'backup_url': backup_url}}
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -2309,7 +2308,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
res_dict['badRequest']['message'])
|
res_dict['badRequest']['message'])
|
||||||
|
|
||||||
# test with no backup_url
|
# test with no backup_url
|
||||||
req = webob.Request.blank('/v2/%s/backups/import_record' %
|
req = webob.Request.blank('/v3/%s/backups/import_record' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
body = {'backup-record': {'backup_service': backup_service}}
|
body = {'backup-record': {'backup_service': backup_service}}
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -2328,7 +2327,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
res_dict['badRequest']['message'])
|
res_dict['badRequest']['message'])
|
||||||
|
|
||||||
# test with no backup_url and backup_url
|
# test with no backup_url and backup_url
|
||||||
req = webob.Request.blank('/v2/%s/backups/import_record' %
|
req = webob.Request.blank('/v3/%s/backups/import_record' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
body = {'backup-record': {}}
|
body = {'backup-record': {}}
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -2349,7 +2348,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID,
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID,
|
||||||
is_admin=True)
|
is_admin=True)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups/import_record' %
|
req = webob.Request.blank('/v3/%s/backups/import_record' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.body = jsonutils.dump_as_bytes(None)
|
req.body = jsonutils.dump_as_bytes(None)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
@ -2394,7 +2393,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
self.context, volume.id, status=fields.BackupStatus.AVAILABLE,
|
self.context, volume.id, status=fields.BackupStatus.AVAILABLE,
|
||||||
incremental=True, parent_id=backup.id, snapshot_id=snapshot_id)
|
incremental=True, parent_id=backup.id, snapshot_id=snapshot_id)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
req = webob.Request.blank('/v3/%s/backups/%s' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -2407,7 +2406,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
self.assertTrue(res_dict['backup']['has_dependent_backups'])
|
self.assertTrue(res_dict['backup']['has_dependent_backups'])
|
||||||
self.assertIsNone(res_dict['backup']['snapshot_id'])
|
self.assertIsNone(res_dict['backup']['snapshot_id'])
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
req = webob.Request.blank('/v3/%s/backups/%s' % (
|
||||||
fake.PROJECT_ID, parent_backup.id))
|
fake.PROJECT_ID, parent_backup.id))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -2420,7 +2419,7 @@ class BackupsAPITestCase(test.TestCase):
|
|||||||
self.assertTrue(res_dict['backup']['has_dependent_backups'])
|
self.assertTrue(res_dict['backup']['has_dependent_backups'])
|
||||||
self.assertIsNone(res_dict['backup']['snapshot_id'])
|
self.assertIsNone(res_dict['backup']['snapshot_id'])
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
req = webob.Request.blank('/v3/%s/backups/%s' % (
|
||||||
fake.PROJECT_ID, child_backup.id))
|
fake.PROJECT_ID, child_backup.id))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
|
@ -65,7 +65,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
|
|||||||
volume_id=volume_id,
|
volume_id=volume_id,
|
||||||
group_snapshot_id=cgsnapshot.id)['id']
|
group_snapshot_id=cgsnapshot.id)['id']
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/cgsnapshots/%s' % (
|
req = webob.Request.blank('/v3/%s/cgsnapshots/%s' % (
|
||||||
fake.PROJECT_ID, cgsnapshot.id))
|
fake.PROJECT_ID, cgsnapshot.id))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -87,7 +87,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
|
|||||||
consistencygroup.destroy()
|
consistencygroup.destroy()
|
||||||
|
|
||||||
def test_show_cgsnapshot_with_cgsnapshot_NotFound(self):
|
def test_show_cgsnapshot_with_cgsnapshot_NotFound(self):
|
||||||
req = webob.Request.blank('/v2/%s/cgsnapshots/%s' % (
|
req = webob.Request.blank('/v3/%s/cgsnapshots/%s' % (
|
||||||
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -123,7 +123,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
|
|||||||
self.context, group_id=consistencygroup.id,
|
self.context, group_id=consistencygroup.id,
|
||||||
group_type_id=fake.GROUP_TYPE_ID,)
|
group_type_id=fake.GROUP_TYPE_ID,)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/cgsnapshots' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/cgsnapshots' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
res = req.get_response(fakes.wsgi_app(
|
res = req.get_response(fakes.wsgi_app(
|
||||||
@ -171,7 +171,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
|
|||||||
self.context, group_id=consistencygroup.id,
|
self.context, group_id=consistencygroup.id,
|
||||||
group_type_id=fake.GROUP_TYPE_ID,)
|
group_type_id=fake.GROUP_TYPE_ID,)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/cgsnapshots/detail' %
|
req = webob.Request.blank('/v3/%s/cgsnapshots/detail' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -232,7 +232,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
|
|||||||
"description":
|
"description":
|
||||||
"CG Snapshot 1",
|
"CG Snapshot 1",
|
||||||
"consistencygroup_id": consistencygroup.id}}
|
"consistencygroup_id": consistencygroup.id}}
|
||||||
req = webob.Request.blank('/v2/%s/cgsnapshots' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/cgsnapshots' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -270,7 +270,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
|
|||||||
"description":
|
"description":
|
||||||
"CG Snapshot 1",
|
"CG Snapshot 1",
|
||||||
"consistencygroup_id": consistencygroup.id}}
|
"consistencygroup_id": consistencygroup.id}}
|
||||||
req = webob.Request.blank('/v2/%s/cgsnapshots' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/cgsnapshots' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -293,7 +293,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_create_cgsnapshot_with_no_body(self):
|
def test_create_cgsnapshot_with_no_body(self):
|
||||||
# omit body from the request
|
# omit body from the request
|
||||||
req = webob.Request.blank('/v2/%s/cgsnapshots' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/cgsnapshots' % fake.PROJECT_ID)
|
||||||
req.body = jsonutils.dump_as_bytes(None)
|
req.body = jsonutils.dump_as_bytes(None)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -327,7 +327,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
|
|||||||
"description":
|
"description":
|
||||||
"CG Snapshot 1",
|
"CG Snapshot 1",
|
||||||
"consistencygroup_id": consistencygroup.id}}
|
"consistencygroup_id": consistencygroup.id}}
|
||||||
req = webob.Request.blank('/v2/%s/cgsnapshots' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/cgsnapshots' % fake.PROJECT_ID)
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -363,7 +363,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
|
|||||||
"CG Snapshot 1",
|
"CG Snapshot 1",
|
||||||
"consistencygroup_id": consistencygroup.id}}
|
"consistencygroup_id": consistencygroup.id}}
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/cgsnapshots' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/cgsnapshots' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -393,7 +393,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
|
|||||||
"CG Snapshot 1",
|
"CG Snapshot 1",
|
||||||
"consistencygroup_id": consistencygroup.id}}
|
"consistencygroup_id": consistencygroup.id}}
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/cgsnapshots' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/cgsnapshots' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -427,7 +427,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
|
|||||||
self.context, group_id=consistencygroup.id,
|
self.context, group_id=consistencygroup.id,
|
||||||
group_type_id=fake.GROUP_TYPE_ID,
|
group_type_id=fake.GROUP_TYPE_ID,
|
||||||
status='available')
|
status='available')
|
||||||
req = webob.Request.blank('/v2/%s/cgsnapshots/%s' %
|
req = webob.Request.blank('/v3/%s/cgsnapshots/%s' %
|
||||||
(fake.PROJECT_ID, cgsnapshot.id))
|
(fake.PROJECT_ID, cgsnapshot.id))
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -463,7 +463,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
|
|||||||
self.context, status='creating',
|
self.context, status='creating',
|
||||||
group_snapshot_id=cgsnapshot.id,
|
group_snapshot_id=cgsnapshot.id,
|
||||||
group_type_id=fake.GROUP_TYPE_ID)
|
group_type_id=fake.GROUP_TYPE_ID)
|
||||||
req = webob.Request.blank('/v2/fake/cgsnapshots/%s' %
|
req = webob.Request.blank('/v3/fake/cgsnapshots/%s' %
|
||||||
cgsnapshot.id)
|
cgsnapshot.id)
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -480,7 +480,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
|
|||||||
cg2.destroy()
|
cg2.destroy()
|
||||||
|
|
||||||
def test_delete_cgsnapshot_with_cgsnapshot_NotFound(self):
|
def test_delete_cgsnapshot_with_cgsnapshot_NotFound(self):
|
||||||
req = webob.Request.blank('/v2/%s/cgsnapshots/%s' %
|
req = webob.Request.blank('/v3/%s/cgsnapshots/%s' %
|
||||||
(fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
(fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -511,7 +511,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
|
|||||||
group_type_id=fake.GROUP_TYPE_ID,
|
group_type_id=fake.GROUP_TYPE_ID,
|
||||||
status='invalid')
|
status='invalid')
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/cgsnapshots/%s' % (
|
req = webob.Request.blank('/v3/%s/cgsnapshots/%s' % (
|
||||||
fake.PROJECT_ID, cgsnapshot.id))
|
fake.PROJECT_ID, cgsnapshot.id))
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -546,7 +546,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
|
|||||||
status='available')
|
status='available')
|
||||||
mock_delete.side_effect = exception.PolicyNotAuthorized(
|
mock_delete.side_effect = exception.PolicyNotAuthorized(
|
||||||
message='PolicyNotAuthorized')
|
message='PolicyNotAuthorized')
|
||||||
req = webob.Request.blank('/v2/%s/cgsnapshots/%s' %
|
req = webob.Request.blank('/v3/%s/cgsnapshots/%s' %
|
||||||
(fake.PROJECT_ID, cgsnapshot.id))
|
(fake.PROJECT_ID, cgsnapshot.id))
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
|
@ -30,7 +30,7 @@ from cinder.i18n import _
|
|||||||
from cinder import objects
|
from cinder import objects
|
||||||
from cinder.objects import fields
|
from cinder.objects import fields
|
||||||
from cinder.tests.unit.api import fakes
|
from cinder.tests.unit.api import fakes
|
||||||
from cinder.tests.unit.api.v2 import fakes as v2_fakes
|
from cinder.tests.unit.api.v3 import fakes as v3_fakes
|
||||||
from cinder.tests.unit import fake_constants as fake
|
from cinder.tests.unit import fake_constants as fake
|
||||||
from cinder.tests.unit import test
|
from cinder.tests.unit import test
|
||||||
from cinder.tests.unit import utils
|
from cinder.tests.unit import utils
|
||||||
@ -51,7 +51,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
fake.USER_ID, fake.PROJECT_ID, auth_token=True)
|
fake.USER_ID, fake.PROJECT_ID, auth_token=True)
|
||||||
self.admin_ctxt = context.get_admin_context()
|
self.admin_ctxt = context.get_admin_context()
|
||||||
db.volume_type_create(self.admin_ctxt,
|
db.volume_type_create(self.admin_ctxt,
|
||||||
v2_fakes.fake_default_type_get(
|
v3_fakes.fake_default_type_get(
|
||||||
fake.VOLUME_TYPE2_ID))
|
fake.VOLUME_TYPE2_ID))
|
||||||
self.vol_type = db.volume_type_get_by_name(self.admin_ctxt,
|
self.vol_type = db.volume_type_get_by_name(self.admin_ctxt,
|
||||||
'vol_type_name')
|
'vol_type_name')
|
||||||
@ -90,7 +90,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
self, name='my_vol_type')
|
self, name='my_vol_type')
|
||||||
consistencygroup = self._create_consistencygroup(
|
consistencygroup = self._create_consistencygroup(
|
||||||
volume_type_ids=[vol_type['id']])
|
volume_type_ids=[vol_type['id']])
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -113,7 +113,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
res_dict['consistencygroup']['volume_types'])
|
res_dict['consistencygroup']['volume_types'])
|
||||||
|
|
||||||
def test_show_consistencygroup_with_consistencygroup_NotFound(self):
|
def test_show_consistencygroup_with_consistencygroup_NotFound(self):
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s' %
|
||||||
(fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
(fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -130,7 +130,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_show_consistencygroup_with_null_volume_type(self):
|
def test_show_consistencygroup_with_null_volume_type(self):
|
||||||
consistencygroup = self._create_consistencygroup(volume_type_id=None)
|
consistencygroup = self._create_consistencygroup(volume_type_id=None)
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -151,16 +151,14 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
|
|
||||||
consistencygroup.destroy()
|
consistencygroup.destroy()
|
||||||
|
|
||||||
@ddt.data(2, 3)
|
def test_list_consistencygroups_json(self):
|
||||||
def test_list_consistencygroups_json(self, version):
|
|
||||||
consistencygroup1 = self._create_consistencygroup()
|
consistencygroup1 = self._create_consistencygroup()
|
||||||
consistencygroup2 = self._create_consistencygroup()
|
consistencygroup2 = self._create_consistencygroup()
|
||||||
consistencygroup3 = self._create_consistencygroup()
|
consistencygroup3 = self._create_consistencygroup()
|
||||||
|
|
||||||
req = webob.Request.blank('/v%(version)s/%(project_id)s/'
|
req = webob.Request.blank('/v3/%(project_id)s/'
|
||||||
'consistencygroups'
|
'consistencygroups'
|
||||||
% {'version': version,
|
% {'project_id': fake.PROJECT_ID})
|
||||||
'project_id': fake.PROJECT_ID})
|
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
res = req.get_response(fakes.wsgi_app(
|
res = req.get_response(fakes.wsgi_app(
|
||||||
@ -190,9 +188,9 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
consistencygroup1 = self._create_consistencygroup()
|
consistencygroup1 = self._create_consistencygroup()
|
||||||
consistencygroup2 = self._create_consistencygroup()
|
consistencygroup2 = self._create_consistencygroup()
|
||||||
consistencygroup3 = self._create_consistencygroup()
|
consistencygroup3 = self._create_consistencygroup()
|
||||||
url = '/v2/%s/consistencygroups?limit=1' % fake.PROJECT_ID
|
url = '/v3/%s/consistencygroups?limit=1' % fake.PROJECT_ID
|
||||||
if is_detail:
|
if is_detail:
|
||||||
url = '/v2/%s/consistencygroups/detail?limit=1' % fake.PROJECT_ID
|
url = '/v3/%s/consistencygroups/detail?limit=1' % fake.PROJECT_ID
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -205,7 +203,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
self.assertEqual(consistencygroup3.id,
|
self.assertEqual(consistencygroup3.id,
|
||||||
res_dict['consistencygroups'][0]['id'])
|
res_dict['consistencygroups'][0]['id'])
|
||||||
next_link = (
|
next_link = (
|
||||||
'http://localhost/v2/%s/consistencygroups?limit='
|
'http://localhost/v3/%s/consistencygroups?limit='
|
||||||
'1&marker=%s' %
|
'1&marker=%s' %
|
||||||
(fake.PROJECT_ID, res_dict['consistencygroups'][0]['id']))
|
(fake.PROJECT_ID, res_dict['consistencygroups'][0]['id']))
|
||||||
self.assertEqual(next_link,
|
self.assertEqual(next_link,
|
||||||
@ -219,9 +217,9 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
consistencygroup1 = self._create_consistencygroup()
|
consistencygroup1 = self._create_consistencygroup()
|
||||||
consistencygroup2 = self._create_consistencygroup()
|
consistencygroup2 = self._create_consistencygroup()
|
||||||
consistencygroup3 = self._create_consistencygroup()
|
consistencygroup3 = self._create_consistencygroup()
|
||||||
url = '/v2/%s/consistencygroups?offset=1' % fake.PROJECT_ID
|
url = '/v3/%s/consistencygroups?offset=1' % fake.PROJECT_ID
|
||||||
if is_detail:
|
if is_detail:
|
||||||
url = '/v2/%s/consistencygroups/detail?offset=1' % fake.PROJECT_ID
|
url = '/v3/%s/consistencygroups/detail?offset=1' % fake.PROJECT_ID
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -241,10 +239,10 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
|
|
||||||
@ddt.data(False, True)
|
@ddt.data(False, True)
|
||||||
def test_list_consistencygroups_with_offset_out_of_range(self, is_detail):
|
def test_list_consistencygroups_with_offset_out_of_range(self, is_detail):
|
||||||
url = ('/v2/%s/consistencygroups?offset=234523423455454' %
|
url = ('/v3/%s/consistencygroups?offset=234523423455454' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
if is_detail:
|
if is_detail:
|
||||||
url = ('/v2/%s/consistencygroups/detail?offset=234523423455454' %
|
url = ('/v3/%s/consistencygroups/detail?offset=234523423455454' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
@ -258,9 +256,9 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
consistencygroup1 = self._create_consistencygroup()
|
consistencygroup1 = self._create_consistencygroup()
|
||||||
consistencygroup2 = self._create_consistencygroup()
|
consistencygroup2 = self._create_consistencygroup()
|
||||||
consistencygroup3 = self._create_consistencygroup()
|
consistencygroup3 = self._create_consistencygroup()
|
||||||
url = '/v2/%s/consistencygroups?limit=2&offset=1' % fake.PROJECT_ID
|
url = '/v3/%s/consistencygroups?limit=2&offset=1' % fake.PROJECT_ID
|
||||||
if is_detail:
|
if is_detail:
|
||||||
url = ('/v2/%s/consistencygroups/detail?limit=2&offset=1' %
|
url = ('/v3/%s/consistencygroups/detail?limit=2&offset=1' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
@ -287,11 +285,11 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
auth_token=True,
|
auth_token=True,
|
||||||
is_admin=False)
|
is_admin=False)
|
||||||
consistencygroup3 = self._create_consistencygroup(ctxt=common_ctxt)
|
consistencygroup3 = self._create_consistencygroup(ctxt=common_ctxt)
|
||||||
url = ('/v2/%s/consistencygroups?'
|
url = ('/v3/%s/consistencygroups?'
|
||||||
'all_tenants=True&id=%s') % (fake.PROJECT_ID,
|
'all_tenants=True&id=%s') % (fake.PROJECT_ID,
|
||||||
consistencygroup3.id)
|
consistencygroup3.id)
|
||||||
if is_detail:
|
if is_detail:
|
||||||
url = ('/v2/%s/consistencygroups/detail?'
|
url = ('/v3/%s/consistencygroups/detail?'
|
||||||
'all_tenants=True&id=%s') % (fake.PROJECT_ID,
|
'all_tenants=True&id=%s') % (fake.PROJECT_ID,
|
||||||
consistencygroup3.id)
|
consistencygroup3.id)
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
@ -314,11 +312,11 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
consistencygroup2 = self._create_consistencygroup(
|
consistencygroup2 = self._create_consistencygroup(
|
||||||
name="group", project_id=fake.PROJECT2_ID)
|
name="group", project_id=fake.PROJECT2_ID)
|
||||||
|
|
||||||
url = ('/v2/%s/consistencygroups?'
|
url = ('/v3/%s/consistencygroups?'
|
||||||
'all_tenants=True&project_id=%s') % (fake.PROJECT_ID,
|
'all_tenants=True&project_id=%s') % (fake.PROJECT_ID,
|
||||||
fake.PROJECT2_ID)
|
fake.PROJECT2_ID)
|
||||||
if is_detail:
|
if is_detail:
|
||||||
url = ('/v2/%s/consistencygroups/detail?'
|
url = ('/v3/%s/consistencygroups/detail?'
|
||||||
'all_tenants=True&project_id=%s') % (fake.PROJECT_ID,
|
'all_tenants=True&project_id=%s') % (fake.PROJECT_ID,
|
||||||
fake.PROJECT2_ID)
|
fake.PROJECT2_ID)
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
@ -338,9 +336,9 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
consistencygroup1 = self._create_consistencygroup()
|
consistencygroup1 = self._create_consistencygroup()
|
||||||
consistencygroup2 = self._create_consistencygroup()
|
consistencygroup2 = self._create_consistencygroup()
|
||||||
consistencygroup3 = self._create_consistencygroup()
|
consistencygroup3 = self._create_consistencygroup()
|
||||||
url = '/v2/%s/consistencygroups?sort=id:asc' % fake.PROJECT_ID
|
url = '/v3/%s/consistencygroups?sort=id:asc' % fake.PROJECT_ID
|
||||||
if is_detail:
|
if is_detail:
|
||||||
url = ('/v2/%s/consistencygroups/detail?sort=id:asc' %
|
url = ('/v3/%s/consistencygroups/detail?sort=id:asc' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
@ -375,7 +373,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
volume_type_ids=[vol_type1['id']])
|
volume_type_ids=[vol_type1['id']])
|
||||||
consistencygroup3 = self._create_consistencygroup(
|
consistencygroup3 = self._create_consistencygroup(
|
||||||
volume_type_ids=[vol_type1['id'], vol_type2['id']])
|
volume_type_ids=[vol_type1['id'], vol_type2['id']])
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/detail' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/detail' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -443,7 +441,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
"volume_types": vol_type_id,
|
"volume_types": vol_type_id,
|
||||||
"description":
|
"description":
|
||||||
"Consistency Group 1", }}
|
"Consistency Group 1", }}
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/consistencygroups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -462,7 +460,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_create_consistencygroup_with_no_body(self):
|
def test_create_consistencygroup_with_no_body(self):
|
||||||
# omit body from the request
|
# omit body from the request
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/consistencygroups' % fake.PROJECT_ID)
|
||||||
req.body = jsonutils.dump_as_bytes(None)
|
req.body = jsonutils.dump_as_bytes(None)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -481,7 +479,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
def test_delete_consistencygroup_available(self):
|
def test_delete_consistencygroup_available(self):
|
||||||
consistencygroup = self._create_consistencygroup(
|
consistencygroup = self._create_consistencygroup(
|
||||||
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/delete' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/delete' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -498,7 +496,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
def test_delete_consistencygroup_available_used_as_source_success(self):
|
def test_delete_consistencygroup_available_used_as_source_success(self):
|
||||||
consistencygroup = self._create_consistencygroup(
|
consistencygroup = self._create_consistencygroup(
|
||||||
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/delete' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/delete' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
# The other CG used the first CG as source, but it's no longer in
|
# The other CG used the first CG as source, but it's no longer in
|
||||||
# creating status, so we should be able to delete it.
|
# creating status, so we should be able to delete it.
|
||||||
@ -520,7 +518,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_delete_consistencygroup_available_no_force(self):
|
def test_delete_consistencygroup_available_no_force(self):
|
||||||
consistencygroup = self._create_consistencygroup(status='available')
|
consistencygroup = self._create_consistencygroup(status='available')
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/delete' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/delete' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -538,7 +536,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
consistencygroup.destroy()
|
consistencygroup.destroy()
|
||||||
|
|
||||||
def test_delete_consistencygroup_with_consistencygroup_NotFound(self):
|
def test_delete_consistencygroup_with_consistencygroup_NotFound(self):
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/delete' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/delete' %
|
||||||
(fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
(fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -563,7 +561,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
def test_delete_consistencygroup_invalid_force(self):
|
def test_delete_consistencygroup_invalid_force(self):
|
||||||
consistencygroup = self._create_consistencygroup(
|
consistencygroup = self._create_consistencygroup(
|
||||||
status=fields.ConsistencyGroupStatus.CREATING)
|
status=fields.ConsistencyGroupStatus.CREATING)
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/delete' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/delete' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -580,7 +578,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
consistencygroup = self._create_consistencygroup(
|
consistencygroup = self._create_consistencygroup(
|
||||||
host=None,
|
host=None,
|
||||||
status=fields.ConsistencyGroupStatus.ERROR)
|
status=fields.ConsistencyGroupStatus.ERROR)
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/delete' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/delete' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -634,7 +632,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
def test_delete_consistencygroup_with_invalid_body(self):
|
def test_delete_consistencygroup_with_invalid_body(self):
|
||||||
consistencygroup = self._create_consistencygroup(
|
consistencygroup = self._create_consistencygroup(
|
||||||
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/delete' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/delete' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -648,7 +646,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
def test_delete_consistencygroup_with_invalid_force_value_in_body(self):
|
def test_delete_consistencygroup_with_invalid_force_value_in_body(self):
|
||||||
consistencygroup = self._create_consistencygroup(
|
consistencygroup = self._create_consistencygroup(
|
||||||
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/delete' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/delete' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -662,7 +660,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
def test_delete_consistencygroup_with_empty_force_value_in_body(self):
|
def test_delete_consistencygroup_with_empty_force_value_in_body(self):
|
||||||
consistencygroup = self._create_consistencygroup(
|
consistencygroup = self._create_consistencygroup(
|
||||||
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/delete' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/delete' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -674,7 +672,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
self.assertEqual(HTTPStatus.BAD_REQUEST, res.status_int)
|
self.assertEqual(HTTPStatus.BAD_REQUEST, res.status_int)
|
||||||
|
|
||||||
def _assert_deleting_result_400(self, cg_id, force=False):
|
def _assert_deleting_result_400(self, cg_id, force=False):
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/delete' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/delete' %
|
||||||
(fake.PROJECT_ID, cg_id))
|
(fake.PROJECT_ID, cg_id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -730,7 +728,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
utils.create_volume(self.ctxt, consistencygroup_id=consistencygroup.id,
|
utils.create_volume(self.ctxt, consistencygroup_id=consistencygroup.id,
|
||||||
testcase_instance=self)
|
testcase_instance=self)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/delete' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/delete' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -751,7 +749,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
utils.create_snapshot(self.ctxt, vol.id, status='deleted',
|
utils.create_snapshot(self.ctxt, vol.id, status='deleted',
|
||||||
deleted=True, testcase_instance=self)
|
deleted=True, testcase_instance=self)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/delete' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/delete' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -770,7 +768,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
body = {"consistencygroup": {"name": name,
|
body = {"consistencygroup": {"name": name,
|
||||||
"description":
|
"description":
|
||||||
"Consistency Group 1", }}
|
"Consistency Group 1", }}
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/consistencygroups' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -841,7 +839,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
self.ctxt,
|
self.ctxt,
|
||||||
testcase_instance=self,
|
testcase_instance=self,
|
||||||
volume_type_id=volume_type_id)['id']
|
volume_type_id=volume_type_id)['id']
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/update' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/update' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -890,7 +888,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
volume_type_id=volume_type_id,
|
volume_type_id=volume_type_id,
|
||||||
consistencygroup_id=consistencygroup.id)['id']
|
consistencygroup_id=consistencygroup.id)['id']
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/update' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/update' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -935,7 +933,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
self.ctxt,
|
self.ctxt,
|
||||||
volume_type_id=volume_type_id)['id']
|
volume_type_id=volume_type_id)['id']
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/update' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/update' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -961,7 +959,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
consistencygroup = self._create_consistencygroup(
|
consistencygroup = self._create_consistencygroup(
|
||||||
ctxt=self.ctxt,
|
ctxt=self.ctxt,
|
||||||
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/update' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/update' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -985,7 +983,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
consistencygroup = self._create_consistencygroup(
|
consistencygroup = self._create_consistencygroup(
|
||||||
ctxt=self.ctxt,
|
ctxt=self.ctxt,
|
||||||
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/update' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/update' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1009,7 +1007,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
consistencygroup = self._create_consistencygroup(
|
consistencygroup = self._create_consistencygroup(
|
||||||
ctxt=self.ctxt,
|
ctxt=self.ctxt,
|
||||||
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
status=fields.ConsistencyGroupStatus.AVAILABLE)
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/update' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/update' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1037,7 +1035,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
self.ctxt,
|
self.ctxt,
|
||||||
volume_type_id=volume_type_id,
|
volume_type_id=volume_type_id,
|
||||||
status='wrong_status')['id']
|
status='wrong_status')['id']
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/update' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/update' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1066,7 +1064,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
add_volume_id = utils.create_volume(
|
add_volume_id = utils.create_volume(
|
||||||
self.ctxt,
|
self.ctxt,
|
||||||
volume_type_id=wrong_type)['id']
|
volume_type_id=wrong_type)['id']
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/update' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/update' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1094,7 +1092,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
add_volume_id = utils.create_volume(
|
add_volume_id = utils.create_volume(
|
||||||
self.ctxt,
|
self.ctxt,
|
||||||
consistencygroup_id=fake.CONSISTENCY_GROUP2_ID)['id']
|
consistencygroup_id=fake.CONSISTENCY_GROUP2_ID)['id']
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/update' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/update' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1126,7 +1124,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
self.ctxt,
|
self.ctxt,
|
||||||
testcase_instance=self,
|
testcase_instance=self,
|
||||||
volume_type_id=volume_type_id)['id']
|
volume_type_id=volume_type_id)['id']
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/%s/update' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/%s/update' %
|
||||||
(fake.PROJECT_ID, consistencygroup.id))
|
(fake.PROJECT_ID, consistencygroup.id))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1151,7 +1149,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
@mock.patch('cinder.scheduler.rpcapi.SchedulerAPI.validate_host_capacity')
|
@mock.patch('cinder.scheduler.rpcapi.SchedulerAPI.validate_host_capacity')
|
||||||
def test_create_consistencygroup_from_src_snap(self, mock_validate_host,
|
def test_create_consistencygroup_from_src_snap(self, mock_validate_host,
|
||||||
mock_validate):
|
mock_validate):
|
||||||
self.mock_object(volume_api.API, "create", v2_fakes.fake_volume_create)
|
self.mock_object(volume_api.API, "create", v3_fakes.fake_volume_create)
|
||||||
|
|
||||||
consistencygroup = utils.create_group(
|
consistencygroup = utils.create_group(
|
||||||
self.ctxt, group_type_id=fake.GROUP_TYPE_ID,
|
self.ctxt, group_type_id=fake.GROUP_TYPE_ID,
|
||||||
@ -1175,7 +1173,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
"description":
|
"description":
|
||||||
"Consistency Group 1",
|
"Consistency Group 1",
|
||||||
"cgsnapshot_id": cgsnapshot.id}}
|
"cgsnapshot_id": cgsnapshot.id}}
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/create_from_src' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/create_from_src' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1201,7 +1199,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
@mock.patch('cinder.scheduler.rpcapi.SchedulerAPI.validate_host_capacity')
|
@mock.patch('cinder.scheduler.rpcapi.SchedulerAPI.validate_host_capacity')
|
||||||
def test_create_consistencygroup_from_src_cg(self, mock_validate):
|
def test_create_consistencygroup_from_src_cg(self, mock_validate):
|
||||||
|
|
||||||
self.mock_object(volume_api.API, "create", v2_fakes.fake_volume_create)
|
self.mock_object(volume_api.API, "create", v3_fakes.fake_volume_create)
|
||||||
|
|
||||||
source_cg = utils.create_group(
|
source_cg = utils.create_group(
|
||||||
self.ctxt, group_type_id=fake.GROUP_TYPE_ID,
|
self.ctxt, group_type_id=fake.GROUP_TYPE_ID,
|
||||||
@ -1217,7 +1215,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
"description":
|
"description":
|
||||||
"Consistency Group 1",
|
"Consistency Group 1",
|
||||||
"source_cgid": source_cg.id}}
|
"source_cgid": source_cg.id}}
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/create_from_src' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/create_from_src' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1237,7 +1235,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
source_cg.destroy()
|
source_cg.destroy()
|
||||||
|
|
||||||
def test_create_consistencygroup_from_src_both_snap_cg(self):
|
def test_create_consistencygroup_from_src_both_snap_cg(self):
|
||||||
self.mock_object(volume_api.API, "create", v2_fakes.fake_volume_create)
|
self.mock_object(volume_api.API, "create", v3_fakes.fake_volume_create)
|
||||||
|
|
||||||
consistencygroup = utils.create_group(
|
consistencygroup = utils.create_group(
|
||||||
self.ctxt, group_type_id=fake.GROUP_TYPE_ID,
|
self.ctxt, group_type_id=fake.GROUP_TYPE_ID,
|
||||||
@ -1263,7 +1261,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
"cgsnapshot_id": cgsnapshot_id,
|
"cgsnapshot_id": cgsnapshot_id,
|
||||||
"source_cgid":
|
"source_cgid":
|
||||||
consistencygroup.id}}
|
consistencygroup.id}}
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/create_from_src' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/create_from_src' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1287,7 +1285,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
body = {"invalid": {"name": name,
|
body = {"invalid": {"name": name,
|
||||||
"description":
|
"description":
|
||||||
"Consistency Group 1", }}
|
"Consistency Group 1", }}
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/create_from_src' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/create_from_src' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1307,7 +1305,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
body = {"consistencygroup-from-src": {"name": name,
|
body = {"consistencygroup-from-src": {"name": name,
|
||||||
"description":
|
"description":
|
||||||
"Consistency Group 1", }}
|
"Consistency Group 1", }}
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/create_from_src' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/create_from_src' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1342,7 +1340,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
"description":
|
"description":
|
||||||
"Consistency Group 1",
|
"Consistency Group 1",
|
||||||
"cgsnapshot_id": cgsnapshot.id}}
|
"cgsnapshot_id": cgsnapshot.id}}
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/create_from_src' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/create_from_src' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1381,7 +1379,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
"description":
|
"description":
|
||||||
"Consistency Group 1",
|
"Consistency Group 1",
|
||||||
"cgsnapshot_id": cgsnapshot.id}}
|
"cgsnapshot_id": cgsnapshot.id}}
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/create_from_src' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/create_from_src' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1412,7 +1410,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
"description":
|
"description":
|
||||||
"Consistency Group 1",
|
"Consistency Group 1",
|
||||||
"source_cgid": source_cg.id}}
|
"source_cgid": source_cg.id}}
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/create_from_src' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/create_from_src' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1445,7 +1443,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
"source_cgid": fake.CGSNAPSHOT_ID
|
"source_cgid": fake.CGSNAPSHOT_ID
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/create_from_src' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/create_from_src' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1472,7 +1470,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
"source_cgid": fake.CONSISTENCY_GROUP_ID
|
"source_cgid": fake.CONSISTENCY_GROUP_ID
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/create_from_src' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/create_from_src' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1513,7 +1511,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
"description":
|
"description":
|
||||||
"Consistency Group 1",
|
"Consistency Group 1",
|
||||||
"cgsnapshot_id": cgsnapshot.id}}
|
"cgsnapshot_id": cgsnapshot.id}}
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/create_from_src' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/create_from_src' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1554,7 +1552,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
|
|||||||
"description":
|
"description":
|
||||||
"Consistency Group 1",
|
"Consistency Group 1",
|
||||||
"source_cgid": source_cg.id}}
|
"source_cgid": source_cg.id}}
|
||||||
req = webob.Request.blank('/v2/%s/consistencygroups/create_from_src' %
|
req = webob.Request.blank('/v3/%s/consistencygroups/create_from_src' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
|
@ -98,7 +98,7 @@ class ExtendedSnapshotAttributesTest(test.TestCase):
|
|||||||
snapshot_get_by_id.return_value = snapshot_obj
|
snapshot_get_by_id.return_value = snapshot_obj
|
||||||
volume_get_by_id.return_value = fake_volume_obj
|
volume_get_by_id.return_value = fake_volume_obj
|
||||||
|
|
||||||
url = '/v2/%s/snapshots/%s' % (fake.PROJECT_ID, UUID1)
|
url = '/v3/%s/snapshots/%s' % (fake.PROJECT_ID, UUID1)
|
||||||
res = self._make_request(url)
|
res = self._make_request(url)
|
||||||
|
|
||||||
self.assertEqual(HTTPStatus.OK, res.status_int)
|
self.assertEqual(HTTPStatus.OK, res.status_int)
|
||||||
@ -111,7 +111,7 @@ class ExtendedSnapshotAttributesTest(test.TestCase):
|
|||||||
|
|
||||||
@mock.patch('cinder.context.RequestContext.authorize')
|
@mock.patch('cinder.context.RequestContext.authorize')
|
||||||
def test_detail(self, mock_authorize):
|
def test_detail(self, mock_authorize):
|
||||||
url = '/v2/%s/snapshots/detail' % fake.PROJECT_ID
|
url = '/v3/%s/snapshots/detail' % fake.PROJECT_ID
|
||||||
res = self._make_request(url)
|
res = self._make_request(url)
|
||||||
mock_authorize.return_value = False
|
mock_authorize.return_value = False
|
||||||
|
|
||||||
|
@ -177,7 +177,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
@mock.patch('cinder.volume.qos_specs.get_all_specs',
|
@mock.patch('cinder.volume.qos_specs.get_all_specs',
|
||||||
side_effect=return_qos_specs_get_all)
|
side_effect=return_qos_specs_get_all)
|
||||||
def test_index(self, mock_get_all_specs):
|
def test_index(self, mock_get_all_specs):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs' % fake.PROJECT_ID,
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs' % fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
|
|
||||||
@ -193,7 +193,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
self.assertEqual(set(expected_names), names)
|
self.assertEqual(set(expected_names), names)
|
||||||
|
|
||||||
def test_index_with_limit(self):
|
def test_index_with_limit(self):
|
||||||
url = '/v2/%s/qos-specs?limit=2' % fake.PROJECT_ID
|
url = '/v3/%s/qos-specs?limit=2' % fake.PROJECT_ID
|
||||||
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
|
|
||||||
@ -201,26 +201,26 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
self.assertEqual(self.qos_id4, res['qos_specs'][0]['id'])
|
self.assertEqual(self.qos_id4, res['qos_specs'][0]['id'])
|
||||||
self.assertEqual(self.qos_id3, res['qos_specs'][1]['id'])
|
self.assertEqual(self.qos_id3, res['qos_specs'][1]['id'])
|
||||||
|
|
||||||
expect_next_link = ('http://localhost/v2/%s/qos-specs?limit'
|
expect_next_link = ('http://localhost/v3/%s/qos-specs?limit'
|
||||||
'=2&marker=%s') % (
|
'=2&marker=%s') % (
|
||||||
fake.PROJECT_ID, res['qos_specs'][1]['id'])
|
fake.PROJECT_ID, res['qos_specs'][1]['id'])
|
||||||
self.assertEqual(expect_next_link, res['qos_specs_links'][0]['href'])
|
self.assertEqual(expect_next_link, res['qos_specs_links'][0]['href'])
|
||||||
|
|
||||||
def test_index_with_offset(self):
|
def test_index_with_offset(self):
|
||||||
url = '/v2/%s/qos-specs?offset=1' % fake.PROJECT_ID
|
url = '/v3/%s/qos-specs?offset=1' % fake.PROJECT_ID
|
||||||
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
|
|
||||||
self.assertEqual(3, len(res['qos_specs']))
|
self.assertEqual(3, len(res['qos_specs']))
|
||||||
|
|
||||||
def test_index_with_offset_out_of_range(self):
|
def test_index_with_offset_out_of_range(self):
|
||||||
url = '/v2/%s/qos-specs?offset=356576877698707' % fake.PROJECT_ID
|
url = '/v3/%s/qos-specs?offset=356576877698707' % fake.PROJECT_ID
|
||||||
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest, self.controller.index,
|
self.assertRaises(webob.exc.HTTPBadRequest, self.controller.index,
|
||||||
req)
|
req)
|
||||||
|
|
||||||
def test_index_with_limit_and_offset(self):
|
def test_index_with_limit_and_offset(self):
|
||||||
url = '/v2/%s/qos-specs?limit=2&offset=1' % fake.PROJECT_ID
|
url = '/v3/%s/qos-specs?limit=2&offset=1' % fake.PROJECT_ID
|
||||||
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
|
|
||||||
@ -229,14 +229,14 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
self.assertEqual(self.qos_id2, res['qos_specs'][1]['id'])
|
self.assertEqual(self.qos_id2, res['qos_specs'][1]['id'])
|
||||||
|
|
||||||
def test_index_with_marker(self):
|
def test_index_with_marker(self):
|
||||||
url = '/v2/%s/qos-specs?marker=%s' % (fake.PROJECT_ID, self.qos_id4)
|
url = '/v3/%s/qos-specs?marker=%s' % (fake.PROJECT_ID, self.qos_id4)
|
||||||
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
|
|
||||||
self.assertEqual(3, len(res['qos_specs']))
|
self.assertEqual(3, len(res['qos_specs']))
|
||||||
|
|
||||||
def test_index_with_filter(self):
|
def test_index_with_filter(self):
|
||||||
url = '/v2/%s/qos-specs?id=%s' % (fake.PROJECT_ID, self.qos_id4)
|
url = '/v3/%s/qos-specs?id=%s' % (fake.PROJECT_ID, self.qos_id4)
|
||||||
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
|
|
||||||
@ -244,7 +244,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
self.assertEqual(self.qos_id4, res['qos_specs'][0]['id'])
|
self.assertEqual(self.qos_id4, res['qos_specs'][0]['id'])
|
||||||
|
|
||||||
def test_index_with_sort_keys(self):
|
def test_index_with_sort_keys(self):
|
||||||
url = '/v2/%s/qos-specs?sort=id' % fake.PROJECT_ID
|
url = '/v3/%s/qos-specs?sort=id' % fake.PROJECT_ID
|
||||||
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
self.assertEqual(4, len(res['qos_specs']))
|
self.assertEqual(4, len(res['qos_specs']))
|
||||||
@ -258,7 +258,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
self.assertEqual(expect_result[3], res['qos_specs'][3]['id'])
|
self.assertEqual(expect_result[3], res['qos_specs'][3]['id'])
|
||||||
|
|
||||||
def test_index_with_sort_keys_and_sort_dirs(self):
|
def test_index_with_sort_keys_and_sort_dirs(self):
|
||||||
url = '/v2/%s/qos-specs?sort=id:asc' % fake.PROJECT_ID
|
url = '/v3/%s/qos-specs?sort=id:asc' % fake.PROJECT_ID
|
||||||
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
self.assertEqual(4, len(res['qos_specs']))
|
self.assertEqual(4, len(res['qos_specs']))
|
||||||
@ -276,7 +276,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
@mock.patch('cinder.volume.qos_specs.delete',
|
@mock.patch('cinder.volume.qos_specs.delete',
|
||||||
side_effect=return_qos_specs_delete)
|
side_effect=return_qos_specs_delete)
|
||||||
def test_qos_specs_delete(self, mock_qos_delete, mock_qos_get_specs):
|
def test_qos_specs_delete(self, mock_qos_delete, mock_qos_get_specs):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s' % (
|
||||||
fake.PROJECT_ID, fake.QOS_SPEC_ID), use_admin_context=True)
|
fake.PROJECT_ID, fake.QOS_SPEC_ID), use_admin_context=True)
|
||||||
self.controller.delete(req, fake.QOS_SPEC_ID)
|
self.controller.delete(req, fake.QOS_SPEC_ID)
|
||||||
self.assertEqual(1, self.notifier.get_notification_count())
|
self.assertEqual(1, self.notifier.get_notification_count())
|
||||||
@ -287,7 +287,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_qos_specs_delete)
|
side_effect=return_qos_specs_delete)
|
||||||
def test_qos_specs_delete_not_found(self, mock_qos_delete,
|
def test_qos_specs_delete_not_found(self, mock_qos_delete,
|
||||||
mock_qos_get_specs):
|
mock_qos_get_specs):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s' %
|
||||||
(fake.PROJECT_ID,
|
(fake.PROJECT_ID,
|
||||||
fake.WILL_NOT_BE_FOUND_ID),
|
fake.WILL_NOT_BE_FOUND_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
@ -302,7 +302,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_qos_specs_delete)
|
side_effect=return_qos_specs_delete)
|
||||||
def test_qos_specs_delete_inuse(self, mock_qos_delete,
|
def test_qos_specs_delete_inuse(self, mock_qos_delete,
|
||||||
mock_qos_get_specs):
|
mock_qos_get_specs):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s' % (
|
||||||
fake.PROJECT_ID, fake.IN_USE_ID), use_admin_context=True)
|
fake.PROJECT_ID, fake.IN_USE_ID), use_admin_context=True)
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest, self.controller.delete,
|
self.assertRaises(webob.exc.HTTPBadRequest, self.controller.delete,
|
||||||
@ -315,7 +315,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_qos_specs_delete)
|
side_effect=return_qos_specs_delete)
|
||||||
def test_qos_specs_delete_inuse_force(self, mock_qos_delete,
|
def test_qos_specs_delete_inuse_force(self, mock_qos_delete,
|
||||||
mock_qos_get_specs):
|
mock_qos_get_specs):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s?force=True' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s?force=True' %
|
||||||
(fake.PROJECT_ID, fake.IN_USE_ID),
|
(fake.PROJECT_ID, fake.IN_USE_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
|
|
||||||
@ -327,7 +327,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
def test_qos_specs_delete_with_invalid_force(self):
|
def test_qos_specs_delete_with_invalid_force(self):
|
||||||
invalid_force = "invalid_bool"
|
invalid_force = "invalid_bool"
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/delete_keys?force=%s' %
|
'/v3/%s/qos-specs/%s/delete_keys?force=%s' %
|
||||||
(fake.PROJECT_ID, fake.QOS_SPEC_ID, invalid_force),
|
(fake.PROJECT_ID, fake.QOS_SPEC_ID, invalid_force),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
|
|
||||||
@ -342,7 +342,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
def test_qos_specs_delete_keys(self, mock_qos_delete_keys,
|
def test_qos_specs_delete_keys(self, mock_qos_delete_keys,
|
||||||
mock_get_qos):
|
mock_get_qos):
|
||||||
body = {"keys": ['bar', 'zoo']}
|
body = {"keys": ['bar', 'zoo']}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s/delete_keys' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s/delete_keys' %
|
||||||
(fake.PROJECT_ID, fake.IN_USE_ID),
|
(fake.PROJECT_ID, fake.IN_USE_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
|
|
||||||
@ -353,7 +353,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_qos_specs_delete_keys)
|
side_effect=return_qos_specs_delete_keys)
|
||||||
def test_qos_specs_delete_keys_qos_notfound(self, mock_qos_specs_delete):
|
def test_qos_specs_delete_keys_qos_notfound(self, mock_qos_specs_delete):
|
||||||
body = {"keys": ['bar', 'zoo']}
|
body = {"keys": ['bar', 'zoo']}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s/delete_keys' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s/delete_keys' %
|
||||||
(fake.PROJECT_ID,
|
(fake.PROJECT_ID,
|
||||||
fake.WILL_NOT_BE_FOUND_ID),
|
fake.WILL_NOT_BE_FOUND_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
@ -365,7 +365,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
|
|
||||||
def test_qos_specs_delete_keys_invalid_key(self):
|
def test_qos_specs_delete_keys_invalid_key(self):
|
||||||
body = {"keys": ['', None]}
|
body = {"keys": ['', None]}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s/delete_keys' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s/delete_keys' %
|
||||||
(fake.PROJECT_ID,
|
(fake.PROJECT_ID,
|
||||||
fake.IN_USE_ID),
|
fake.IN_USE_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
@ -380,7 +380,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_qos_specs_delete_keys)
|
side_effect=return_qos_specs_delete_keys)
|
||||||
def test_qos_specs_delete_keys_badkey(self, mock_qos_specs_delete,
|
def test_qos_specs_delete_keys_badkey(self, mock_qos_specs_delete,
|
||||||
mock_get_qos):
|
mock_get_qos):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s/delete_keys' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s/delete_keys' %
|
||||||
(fake.PROJECT_ID, fake.IN_USE_ID),
|
(fake.PROJECT_ID, fake.IN_USE_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
body = {"keys": ['foo', 'zoo']}
|
body = {"keys": ['foo', 'zoo']}
|
||||||
@ -397,7 +397,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
def test_qos_specs_delete_keys_get_notifier(self, mock_get_qos_specs,
|
def test_qos_specs_delete_keys_get_notifier(self, mock_get_qos_specs,
|
||||||
mock_qos_delete_keys):
|
mock_qos_delete_keys):
|
||||||
body = {"keys": ['bar', 'zoo']}
|
body = {"keys": ['bar', 'zoo']}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s/delete_keys' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s/delete_keys' %
|
||||||
(fake.PROJECT_ID, fake.IN_USE_ID),
|
(fake.PROJECT_ID, fake.IN_USE_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
|
|
||||||
@ -410,7 +410,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
|
|
||||||
body = {"qos_specs": {"name": "qos_specs_%s" % fake.QOS_SPEC_ID,
|
body = {"qos_specs": {"name": "qos_specs_%s" % fake.QOS_SPEC_ID,
|
||||||
"key1": "value1"}}
|
"key1": "value1"}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs' %
|
||||||
fake.PROJECT_ID,
|
fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
|
|
||||||
@ -425,7 +425,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
def test_create_invalid_input(self, mock_qos_get_specs):
|
def test_create_invalid_input(self, mock_qos_get_specs):
|
||||||
body = {"qos_specs": {"name": 'qos_spec_%s' % fake.INVALID_ID,
|
body = {"qos_specs": {"name": 'qos_spec_%s' % fake.INVALID_ID,
|
||||||
"consumer": "invalid_consumer"}}
|
"consumer": "invalid_consumer"}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs' % fake.PROJECT_ID,
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs' % fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
@ -437,7 +437,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
def test_create_conflict(self, mock_qos_spec_create):
|
def test_create_conflict(self, mock_qos_spec_create):
|
||||||
body = {"qos_specs": {"name": 'qos_spec_%s' % fake.ALREADY_EXISTS_ID,
|
body = {"qos_specs": {"name": 'qos_spec_%s' % fake.ALREADY_EXISTS_ID,
|
||||||
"key1": "value1"}}
|
"key1": "value1"}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs' % fake.PROJECT_ID,
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs' % fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPConflict,
|
self.assertRaises(webob.exc.HTTPConflict,
|
||||||
@ -449,7 +449,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
def test_create_failed(self, mock_qos_spec_create):
|
def test_create_failed(self, mock_qos_spec_create):
|
||||||
body = {"qos_specs": {"name": 'qos_spec_%s' % fake.ACTION_FAILED_ID,
|
body = {"qos_specs": {"name": 'qos_spec_%s' % fake.ACTION_FAILED_ID,
|
||||||
"key1": "value1"}}
|
"key1": "value1"}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs' % fake.PROJECT_ID,
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs' % fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPInternalServerError,
|
self.assertRaises(webob.exc.HTTPInternalServerError,
|
||||||
@ -461,7 +461,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
{'qos_specs': 'string'},
|
{'qos_specs': 'string'},
|
||||||
None)
|
None)
|
||||||
def test_create_invalid_body_bad_request(self, body):
|
def test_create_invalid_body_bad_request(self, body):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs' % fake.PROJECT_ID,
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs' % fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
self.assertRaises(exception.ValidationError,
|
self.assertRaises(exception.ValidationError,
|
||||||
@ -472,7 +472,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
{'name': 'fake_name', '': 'a'})
|
{'name': 'fake_name', '': 'a'})
|
||||||
def test_create_qos_with_invalid_specs(self, value):
|
def test_create_qos_with_invalid_specs(self, value):
|
||||||
body = {'qos_specs': value}
|
body = {'qos_specs': value}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs' % fake.PROJECT_ID,
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs' % fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
self.assertRaises(exception.InvalidInput,
|
self.assertRaises(exception.InvalidInput,
|
||||||
@ -485,7 +485,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
@ddt.unpack
|
@ddt.unpack
|
||||||
def test_create_qos_with_invalid_spec_name(self, value, exception_class):
|
def test_create_qos_with_invalid_spec_name(self, value, exception_class):
|
||||||
body = {'qos_specs': value}
|
body = {'qos_specs': value}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs' % fake.PROJECT_ID,
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs' % fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
self.assertRaises(exception_class,
|
self.assertRaises(exception_class,
|
||||||
@ -496,7 +496,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
@mock.patch('cinder.volume.qos_specs.get_qos_specs',
|
@mock.patch('cinder.volume.qos_specs.get_qos_specs',
|
||||||
side_effect=return_qos_specs_get_qos_specs)
|
side_effect=return_qos_specs_get_qos_specs)
|
||||||
def test_update(self, mock_get_qos, mock_qos_update):
|
def test_update(self, mock_get_qos, mock_qos_update):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s' %
|
||||||
(fake.PROJECT_ID, fake.QOS_SPEC_ID),
|
(fake.PROJECT_ID, fake.QOS_SPEC_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
body = {'qos_specs': {'key1': 'value1',
|
body = {'qos_specs': {'key1': 'value1',
|
||||||
@ -510,7 +510,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
@mock.patch('cinder.volume.qos_specs.get_qos_specs',
|
@mock.patch('cinder.volume.qos_specs.get_qos_specs',
|
||||||
side_effect=return_qos_specs_get_qos_specs)
|
side_effect=return_qos_specs_get_qos_specs)
|
||||||
def test_update_not_found(self, mock_get_qos_specs, mock_qos_update):
|
def test_update_not_found(self, mock_get_qos_specs, mock_qos_update):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s' %
|
||||||
(fake.PROJECT_ID,
|
(fake.PROJECT_ID,
|
||||||
fake.WILL_NOT_BE_FOUND_ID),
|
fake.WILL_NOT_BE_FOUND_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
@ -526,7 +526,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
@mock.patch('cinder.volume.qos_specs.update',
|
@mock.patch('cinder.volume.qos_specs.update',
|
||||||
side_effect=return_qos_specs_update)
|
side_effect=return_qos_specs_update)
|
||||||
def test_update_invalid_input(self, mock_qos_update, mock_get_qos):
|
def test_update_invalid_input(self, mock_qos_update, mock_get_qos):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s' %
|
||||||
(fake.PROJECT_ID, fake.INVALID_ID),
|
(fake.PROJECT_ID, fake.INVALID_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
body = {'qos_specs': {'key1': 'value1',
|
body = {'qos_specs': {'key1': 'value1',
|
||||||
@ -542,7 +542,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
{'qos_specs': {1: 'value1'}}
|
{'qos_specs': {1: 'value1'}}
|
||||||
)
|
)
|
||||||
def test_update_non_string_key_or_value(self, body, mock_get_qos):
|
def test_update_non_string_key_or_value(self, body, mock_get_qos):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s' %
|
||||||
(fake.PROJECT_ID, fake.UUID1),
|
(fake.PROJECT_ID, fake.UUID1),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
self.assertRaises(exception.ValidationError,
|
self.assertRaises(exception.ValidationError,
|
||||||
@ -555,7 +555,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
@mock.patch('cinder.volume.qos_specs.update',
|
@mock.patch('cinder.volume.qos_specs.update',
|
||||||
side_effect=return_qos_specs_update)
|
side_effect=return_qos_specs_update)
|
||||||
def test_update_failed(self, mock_qos_update, mock_get_qos):
|
def test_update_failed(self, mock_qos_update, mock_get_qos):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s' %
|
||||||
(fake.PROJECT_ID,
|
(fake.PROJECT_ID,
|
||||||
fake.UPDATE_FAILED_ID),
|
fake.UPDATE_FAILED_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
@ -569,7 +569,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
@mock.patch('cinder.volume.qos_specs.get_qos_specs',
|
@mock.patch('cinder.volume.qos_specs.get_qos_specs',
|
||||||
side_effect=return_qos_specs_get_qos_specs)
|
side_effect=return_qos_specs_get_qos_specs)
|
||||||
def test_show(self, mock_get_qos_specs):
|
def test_show(self, mock_get_qos_specs):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s' % (
|
||||||
fake.PROJECT_ID, fake.QOS_SPEC_ID), use_admin_context=True)
|
fake.PROJECT_ID, fake.QOS_SPEC_ID), use_admin_context=True)
|
||||||
res_dict = self.controller.show(req, fake.QOS_SPEC_ID)
|
res_dict = self.controller.show(req, fake.QOS_SPEC_ID)
|
||||||
|
|
||||||
@ -583,7 +583,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_qos_specs_get_qos_specs)
|
side_effect=return_qos_specs_get_qos_specs)
|
||||||
def test_get_associations(self, mock_get_qos, mock_get_assciations):
|
def test_get_associations(self, mock_get_qos, mock_get_assciations):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/associations' % (
|
'/v3/%s/qos-specs/%s/associations' % (
|
||||||
fake.PROJECT_ID, fake.QOS_SPEC_ID), use_admin_context=True)
|
fake.PROJECT_ID, fake.QOS_SPEC_ID), use_admin_context=True)
|
||||||
res = self.controller.associations(req, fake.QOS_SPEC_ID)
|
res = self.controller.associations(req, fake.QOS_SPEC_ID)
|
||||||
|
|
||||||
@ -596,7 +596,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_get_qos_associations)
|
side_effect=return_get_qos_associations)
|
||||||
def test_get_associations_not_found(self, mock_get_assciations):
|
def test_get_associations_not_found(self, mock_get_assciations):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/associations' %
|
'/v3/%s/qos-specs/%s/associations' %
|
||||||
(fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID),
|
(fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
self.assertRaises(exception.QoSSpecsNotFound,
|
self.assertRaises(exception.QoSSpecsNotFound,
|
||||||
@ -610,7 +610,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
def test_get_associations_failed(self, mock_get_qos,
|
def test_get_associations_failed(self, mock_get_qos,
|
||||||
mock_get_associations):
|
mock_get_associations):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/associations' % (
|
'/v3/%s/qos-specs/%s/associations' % (
|
||||||
fake.PROJECT_ID, fake.RAISE_ID), use_admin_context=True)
|
fake.PROJECT_ID, fake.RAISE_ID), use_admin_context=True)
|
||||||
self.assertRaises(webob.exc.HTTPInternalServerError,
|
self.assertRaises(webob.exc.HTTPInternalServerError,
|
||||||
self.controller.associations,
|
self.controller.associations,
|
||||||
@ -622,7 +622,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_associate_qos_specs)
|
side_effect=return_associate_qos_specs)
|
||||||
def test_associate(self, mock_associate, mock_get_qos):
|
def test_associate(self, mock_associate, mock_get_qos):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/associate?vol_type_id=%s' %
|
'/v3/%s/qos-specs/%s/associate?vol_type_id=%s' %
|
||||||
(fake.PROJECT_ID, fake.QOS_SPEC_ID, fake.VOLUME_TYPE_ID),
|
(fake.PROJECT_ID, fake.QOS_SPEC_ID, fake.VOLUME_TYPE_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
res = self.controller.associate(req, fake.QOS_SPEC_ID)
|
res = self.controller.associate(req, fake.QOS_SPEC_ID)
|
||||||
@ -634,7 +634,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
@mock.patch('cinder.volume.qos_specs.associate_qos_with_type',
|
@mock.patch('cinder.volume.qos_specs.associate_qos_with_type',
|
||||||
side_effect=return_associate_qos_specs)
|
side_effect=return_associate_qos_specs)
|
||||||
def test_associate_no_type(self, mock_associate, mock_get_qos):
|
def test_associate_no_type(self, mock_associate, mock_get_qos):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s/associate' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s/associate' %
|
||||||
(fake.PROJECT_ID, fake.QOS_SPEC_ID),
|
(fake.PROJECT_ID, fake.QOS_SPEC_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
@ -646,7 +646,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_associate_qos_specs)
|
side_effect=return_associate_qos_specs)
|
||||||
def test_associate_not_found(self, mock_associate, mock_get_qos):
|
def test_associate_not_found(self, mock_associate, mock_get_qos):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/associate?vol_type_id=%s' % (
|
'/v3/%s/qos-specs/%s/associate?vol_type_id=%s' % (
|
||||||
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID,
|
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID,
|
||||||
fake.VOLUME_TYPE_ID), use_admin_context=True)
|
fake.VOLUME_TYPE_ID), use_admin_context=True)
|
||||||
self.assertRaises(exception.QoSSpecsNotFound,
|
self.assertRaises(exception.QoSSpecsNotFound,
|
||||||
@ -654,7 +654,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
fake.WILL_NOT_BE_FOUND_ID)
|
fake.WILL_NOT_BE_FOUND_ID)
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/associate?vol_type_id=%s' %
|
'/v3/%s/qos-specs/%s/associate?vol_type_id=%s' %
|
||||||
(fake.PROJECT_ID, fake.QOS_SPEC_ID, fake.WILL_NOT_BE_FOUND_ID),
|
(fake.PROJECT_ID, fake.QOS_SPEC_ID, fake.WILL_NOT_BE_FOUND_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
|
|
||||||
@ -667,7 +667,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_associate_qos_specs)
|
side_effect=return_associate_qos_specs)
|
||||||
def test_associate_fail(self, mock_associate, mock_get_qos):
|
def test_associate_fail(self, mock_associate, mock_get_qos):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/associate?vol_type_id=%s' %
|
'/v3/%s/qos-specs/%s/associate?vol_type_id=%s' %
|
||||||
(fake.PROJECT_ID, fake.ACTION_FAILED_ID, fake.VOLUME_TYPE_ID),
|
(fake.PROJECT_ID, fake.ACTION_FAILED_ID, fake.VOLUME_TYPE_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
self.assertRaises(webob.exc.HTTPInternalServerError,
|
self.assertRaises(webob.exc.HTTPInternalServerError,
|
||||||
@ -680,7 +680,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_associate_qos_specs)
|
side_effect=return_associate_qos_specs)
|
||||||
def test_disassociate(self, mock_disassociate, mock_get_qos):
|
def test_disassociate(self, mock_disassociate, mock_get_qos):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/disassociate?vol_type_id=%s' % (
|
'/v3/%s/qos-specs/%s/disassociate?vol_type_id=%s' % (
|
||||||
fake.PROJECT_ID, fake.QOS_SPEC_ID, fake.VOLUME_TYPE_ID),
|
fake.PROJECT_ID, fake.QOS_SPEC_ID, fake.VOLUME_TYPE_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
res = self.controller.disassociate(req, fake.QOS_SPEC_ID)
|
res = self.controller.disassociate(req, fake.QOS_SPEC_ID)
|
||||||
@ -692,7 +692,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_associate_qos_specs)
|
side_effect=return_associate_qos_specs)
|
||||||
def test_disassociate_no_type(self, mock_disassociate, mock_get_qos):
|
def test_disassociate_no_type(self, mock_disassociate, mock_get_qos):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/disassociate' % (
|
'/v3/%s/qos-specs/%s/disassociate' % (
|
||||||
fake.PROJECT_ID, fake.QOS_SPEC_ID), use_admin_context=True)
|
fake.PROJECT_ID, fake.QOS_SPEC_ID), use_admin_context=True)
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
@ -704,7 +704,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_associate_qos_specs)
|
side_effect=return_associate_qos_specs)
|
||||||
def test_disassociate_not_found(self, mock_disassociate, mock_get_qos):
|
def test_disassociate_not_found(self, mock_disassociate, mock_get_qos):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/disassociate?vol_type_id=%s' % (
|
'/v3/%s/qos-specs/%s/disassociate?vol_type_id=%s' % (
|
||||||
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID,
|
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID,
|
||||||
fake.VOLUME_TYPE_ID), use_admin_context=True)
|
fake.VOLUME_TYPE_ID), use_admin_context=True)
|
||||||
self.assertRaises(exception.QoSSpecsNotFound,
|
self.assertRaises(exception.QoSSpecsNotFound,
|
||||||
@ -712,7 +712,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
fake.WILL_NOT_BE_FOUND_ID)
|
fake.WILL_NOT_BE_FOUND_ID)
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/disassociate?vol_type_id=%s' %
|
'/v3/%s/qos-specs/%s/disassociate?vol_type_id=%s' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_TYPE_ID, fake.WILL_NOT_BE_FOUND_ID),
|
(fake.PROJECT_ID, fake.VOLUME_TYPE_ID, fake.WILL_NOT_BE_FOUND_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
self.assertRaises(exception.VolumeTypeNotFound,
|
self.assertRaises(exception.VolumeTypeNotFound,
|
||||||
@ -725,7 +725,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_associate_qos_specs)
|
side_effect=return_associate_qos_specs)
|
||||||
def test_disassociate_failed(self, mock_disassociate, mock_get_qos):
|
def test_disassociate_failed(self, mock_disassociate, mock_get_qos):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/disassociate?vol_type_id=%s' % (
|
'/v3/%s/qos-specs/%s/disassociate?vol_type_id=%s' % (
|
||||||
fake.PROJECT_ID, fake.ACTION2_FAILED_ID, fake.VOLUME_TYPE_ID),
|
fake.PROJECT_ID, fake.ACTION2_FAILED_ID, fake.VOLUME_TYPE_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
self.assertRaises(webob.exc.HTTPInternalServerError,
|
self.assertRaises(webob.exc.HTTPInternalServerError,
|
||||||
@ -738,7 +738,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_disassociate_all)
|
side_effect=return_disassociate_all)
|
||||||
def test_disassociate_all(self, mock_disassociate, mock_get_qos):
|
def test_disassociate_all(self, mock_disassociate, mock_get_qos):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/disassociate_all' % (
|
'/v3/%s/qos-specs/%s/disassociate_all' % (
|
||||||
fake.PROJECT_ID, fake.QOS_SPEC_ID), use_admin_context=True)
|
fake.PROJECT_ID, fake.QOS_SPEC_ID), use_admin_context=True)
|
||||||
res = self.controller.disassociate_all(req, fake.QOS_SPEC_ID)
|
res = self.controller.disassociate_all(req, fake.QOS_SPEC_ID)
|
||||||
self.assertEqual(HTTPStatus.ACCEPTED, res.status_int)
|
self.assertEqual(HTTPStatus.ACCEPTED, res.status_int)
|
||||||
@ -750,7 +750,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
def test_disassociate_all_not_found(self, mock_disassociate,
|
def test_disassociate_all_not_found(self, mock_disassociate,
|
||||||
mock_get_qos):
|
mock_get_qos):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/disassociate_all' % (
|
'/v3/%s/qos-specs/%s/disassociate_all' % (
|
||||||
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID),
|
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
self.assertRaises(exception.QoSSpecsNotFound,
|
self.assertRaises(exception.QoSSpecsNotFound,
|
||||||
@ -763,7 +763,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
side_effect=return_disassociate_all)
|
side_effect=return_disassociate_all)
|
||||||
def test_disassociate_all_failed(self, mock_disassociate, mock_get):
|
def test_disassociate_all_failed(self, mock_disassociate, mock_get):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/qos-specs/%s/disassociate_all' % (
|
'/v3/%s/qos-specs/%s/disassociate_all' % (
|
||||||
fake.PROJECT_ID, fake.ACTION2_FAILED_ID),
|
fake.PROJECT_ID, fake.ACTION2_FAILED_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
self.assertRaises(webob.exc.HTTPInternalServerError,
|
self.assertRaises(webob.exc.HTTPInternalServerError,
|
||||||
@ -771,7 +771,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
fake.ACTION2_FAILED_ID)
|
fake.ACTION2_FAILED_ID)
|
||||||
|
|
||||||
def test_index_no_admin_user(self):
|
def test_index_no_admin_user(self):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs' %
|
||||||
fake.PROJECT_ID, use_admin_context=False)
|
fake.PROJECT_ID, use_admin_context=False)
|
||||||
self.assertRaises(exception.PolicyNotAuthorized,
|
self.assertRaises(exception.PolicyNotAuthorized,
|
||||||
self.controller.index, req)
|
self.controller.index, req)
|
||||||
@ -779,13 +779,13 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
def test_create_no_admin_user(self):
|
def test_create_no_admin_user(self):
|
||||||
body = {"qos_specs": {"name": "qos_specs_%s" % fake.QOS_SPEC_ID,
|
body = {"qos_specs": {"name": "qos_specs_%s" % fake.QOS_SPEC_ID,
|
||||||
"key1": "value1"}}
|
"key1": "value1"}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs' %
|
||||||
fake.PROJECT_ID, use_admin_context=False)
|
fake.PROJECT_ID, use_admin_context=False)
|
||||||
self.assertRaises(exception.PolicyNotAuthorized,
|
self.assertRaises(exception.PolicyNotAuthorized,
|
||||||
self.controller.create, req, body=body)
|
self.controller.create, req, body=body)
|
||||||
|
|
||||||
def test_update_no_admin_user(self):
|
def test_update_no_admin_user(self):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s' %
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s' %
|
||||||
(fake.PROJECT_ID, fake.QOS_SPEC_ID),
|
(fake.PROJECT_ID, fake.QOS_SPEC_ID),
|
||||||
use_admin_context=False)
|
use_admin_context=False)
|
||||||
body = {'qos_specs': {'key1': 'value1',
|
body = {'qos_specs': {'key1': 'value1',
|
||||||
@ -795,7 +795,7 @@ class QoSSpecManageApiTest(test.TestCase):
|
|||||||
body=body)
|
body=body)
|
||||||
|
|
||||||
def test_qos_specs_delete_no_admin_user(self):
|
def test_qos_specs_delete_no_admin_user(self):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/qos-specs/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/qos-specs/%s' % (
|
||||||
fake.PROJECT_ID, fake.QOS_SPEC_ID), use_admin_context=False)
|
fake.PROJECT_ID, fake.QOS_SPEC_ID), use_admin_context=False)
|
||||||
self.assertRaises(exception.PolicyNotAuthorized,
|
self.assertRaises(exception.PolicyNotAuthorized,
|
||||||
self.controller.delete, req, fake.QOS_SPEC_ID)
|
self.controller.delete, req, fake.QOS_SPEC_ID)
|
||||||
|
@ -23,7 +23,7 @@ import cinder
|
|||||||
from cinder.api.openstack import wsgi
|
from cinder.api.openstack import wsgi
|
||||||
from cinder import context
|
from cinder import context
|
||||||
from cinder.tests.unit.api import fakes
|
from cinder.tests.unit.api import fakes
|
||||||
from cinder.tests.unit.api.v2 import fakes as v2_fakes
|
from cinder.tests.unit.api.v3 import fakes as v3_fakes
|
||||||
from cinder.tests.unit import fake_constants as fake
|
from cinder.tests.unit import fake_constants as fake
|
||||||
from cinder.tests.unit import test
|
from cinder.tests.unit import test
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ class SchedulerHintsTestCase(test.TestCase):
|
|||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(SchedulerHintsTestCase, self).setUp()
|
super(SchedulerHintsTestCase, self).setUp()
|
||||||
self.fake_instance = v2_fakes.create_fake_volume(fake.VOLUME_ID,
|
self.fake_instance = v3_fakes.create_volume(fake.VOLUME_ID,
|
||||||
uuid=UUID)
|
uuid=UUID)
|
||||||
self.fake_instance['created_at'] =\
|
self.fake_instance['created_at'] =\
|
||||||
datetime.datetime(2013, 1, 1, 1, 1, 1)
|
datetime.datetime(2013, 1, 1, 1, 1, 1)
|
||||||
@ -51,7 +51,7 @@ class SchedulerHintsTestCase(test.TestCase):
|
|||||||
self.app = fakes.wsgi_app(fake_auth_context=self.user_ctxt)
|
self.app = fakes.wsgi_app(fake_auth_context=self.user_ctxt)
|
||||||
self.admin_ctxt = context.get_admin_context()
|
self.admin_ctxt = context.get_admin_context()
|
||||||
cinder.db.volume_type_create(self.admin_ctxt,
|
cinder.db.volume_type_create(self.admin_ctxt,
|
||||||
v2_fakes.fake_default_type_get(
|
v3_fakes.fake_default_type_get(
|
||||||
fake.VOLUME_TYPE2_ID))
|
fake.VOLUME_TYPE2_ID))
|
||||||
self.vol_type = cinder.db.volume_type_get_by_name(self.admin_ctxt,
|
self.vol_type = cinder.db.volume_type_get_by_name(self.admin_ctxt,
|
||||||
'vol_type_name')
|
'vol_type_name')
|
||||||
@ -63,10 +63,10 @@ class SchedulerHintsTestCase(test.TestCase):
|
|||||||
self.assertNotIn('scheduler_hints', kwargs['body'])
|
self.assertNotIn('scheduler_hints', kwargs['body'])
|
||||||
return self.fake_instance
|
return self.fake_instance
|
||||||
|
|
||||||
self.mock_object(cinder.api.v2.volumes.VolumeController, 'create',
|
self.mock_object(cinder.api.v3.volumes.VolumeController, 'create',
|
||||||
fake_create)
|
fake_create)
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
body = {'id': UUID,
|
body = {'id': UUID,
|
||||||
@ -84,10 +84,10 @@ class SchedulerHintsTestCase(test.TestCase):
|
|||||||
self.assertEqual({"a": "b"}, kwargs['body']['scheduler_hints'])
|
self.assertEqual({"a": "b"}, kwargs['body']['scheduler_hints'])
|
||||||
return self.fake_instance
|
return self.fake_instance
|
||||||
|
|
||||||
self.mock_object(cinder.api.v2.volumes.VolumeController, 'create',
|
self.mock_object(cinder.api.v3.volumes.VolumeController, 'create',
|
||||||
fake_create)
|
fake_create)
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
body = {'id': UUID,
|
body = {'id': UUID,
|
||||||
@ -100,7 +100,7 @@ class SchedulerHintsTestCase(test.TestCase):
|
|||||||
self.assertEqual(HTTPStatus.ACCEPTED, res.status_int)
|
self.assertEqual(HTTPStatus.ACCEPTED, res.status_int)
|
||||||
|
|
||||||
def test_create_server_bad_hints(self):
|
def test_create_server_bad_hints(self):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
body = {'volume': {
|
body = {'volume': {
|
||||||
@ -123,7 +123,7 @@ class SchedulerHintsTestCase(test.TestCase):
|
|||||||
{'query': {}},
|
{'query': {}},
|
||||||
None)
|
None)
|
||||||
def test_scheduler_hints_with_valid_body(self, value):
|
def test_scheduler_hints_with_valid_body(self, value):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
body = {'volume': {'size': 1, 'volume_type': self.vol_type['id']},
|
body = {'volume': {'size': 1, 'volume_type': self.vol_type['id']},
|
||||||
@ -143,7 +143,7 @@ class SchedulerHintsTestCase(test.TestCase):
|
|||||||
{'query': None},
|
{'query': None},
|
||||||
{'scheduler_hints'})
|
{'scheduler_hints'})
|
||||||
def test_scheduler_hints_with_invalid_body(self, value):
|
def test_scheduler_hints_with_invalid_body(self, value):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
body = {'volume': {'size': 1},
|
body = {'volume': {'size': 1},
|
||||||
|
@ -60,7 +60,7 @@ class SchedulerStatsAPITest(test.TestCase):
|
|||||||
@mock.patch('cinder.scheduler.rpcapi.SchedulerAPI.get_pools',
|
@mock.patch('cinder.scheduler.rpcapi.SchedulerAPI.get_pools',
|
||||||
schedule_rpcapi_get_pools)
|
schedule_rpcapi_get_pools)
|
||||||
def test_get_pools_summary(self):
|
def test_get_pools_summary(self):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/scheduler_stats' %
|
req = fakes.HTTPRequest.blank('/v3/%s/scheduler_stats' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.environ['cinder.context'] = self.ctxt
|
req.environ['cinder.context'] = self.ctxt
|
||||||
res = self.controller.get_pools(req)
|
res = self.controller.get_pools(req)
|
||||||
@ -130,7 +130,7 @@ class SchedulerStatsAPITest(test.TestCase):
|
|||||||
@mock.patch('cinder.scheduler.rpcapi.SchedulerAPI.get_pools',
|
@mock.patch('cinder.scheduler.rpcapi.SchedulerAPI.get_pools',
|
||||||
schedule_rpcapi_get_pools)
|
schedule_rpcapi_get_pools)
|
||||||
def test_get_pools_detail(self):
|
def test_get_pools_detail(self):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/scheduler_stats?detail=True' %
|
req = fakes.HTTPRequest.blank('/v3/%s/scheduler_stats?detail=True' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.environ['cinder.context'] = self.ctxt
|
req.environ['cinder.context'] = self.ctxt
|
||||||
res = self.controller.get_pools(req)
|
res = self.controller.get_pools(req)
|
||||||
@ -170,7 +170,7 @@ class SchedulerStatsAPITest(test.TestCase):
|
|||||||
|
|
||||||
def test_get_pools_detail_invalid_bool(self):
|
def test_get_pools_detail_invalid_bool(self):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/scheduler_stats?detail=InvalidBool' %
|
'/v3/%s/scheduler_stats?detail=InvalidBool' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.environ['cinder.context'] = self.ctxt
|
req.environ['cinder.context'] = self.ctxt
|
||||||
self.assertRaises(exception.InvalidParameterValue,
|
self.assertRaises(exception.InvalidParameterValue,
|
||||||
|
@ -637,7 +637,7 @@ class ServicesTest(test.TestCase):
|
|||||||
def test_services_enable_with_service_key(self):
|
def test_services_enable_with_service_key(self):
|
||||||
body = {'host': 'host1', 'service': constants.VOLUME_BINARY}
|
body = {'host': 'host1', 'service': constants.VOLUME_BINARY}
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/os-services/enable' % fake.PROJECT_ID)
|
'/v3/%s/os-services/enable' % fake.PROJECT_ID)
|
||||||
res_dict = self.controller.update(req, "enable", body)
|
res_dict = self.controller.update(req, "enable", body)
|
||||||
|
|
||||||
self.assertEqual('enabled', res_dict['status'])
|
self.assertEqual('enabled', res_dict['status'])
|
||||||
@ -645,14 +645,14 @@ class ServicesTest(test.TestCase):
|
|||||||
def test_services_enable_with_binary_key(self):
|
def test_services_enable_with_binary_key(self):
|
||||||
body = {'host': 'host1', 'binary': constants.VOLUME_BINARY}
|
body = {'host': 'host1', 'binary': constants.VOLUME_BINARY}
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/os-services/enable' % fake.PROJECT_ID)
|
'/v3/%s/os-services/enable' % fake.PROJECT_ID)
|
||||||
res_dict = self.controller.update(req, "enable", body)
|
res_dict = self.controller.update(req, "enable", body)
|
||||||
|
|
||||||
self.assertEqual('enabled', res_dict['status'])
|
self.assertEqual('enabled', res_dict['status'])
|
||||||
|
|
||||||
def test_services_disable_with_service_key(self):
|
def test_services_disable_with_service_key(self):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/os-services/disable' % fake.PROJECT_ID)
|
'/v3/%s/os-services/disable' % fake.PROJECT_ID)
|
||||||
body = {'host': 'host1', 'service': constants.VOLUME_BINARY}
|
body = {'host': 'host1', 'service': constants.VOLUME_BINARY}
|
||||||
res_dict = self.controller.update(req, "disable", body)
|
res_dict = self.controller.update(req, "disable", body)
|
||||||
|
|
||||||
@ -660,7 +660,7 @@ class ServicesTest(test.TestCase):
|
|||||||
|
|
||||||
def test_services_disable_with_binary_key(self):
|
def test_services_disable_with_binary_key(self):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/os-services/disable' % fake.PROJECT_ID)
|
'/v3/%s/os-services/disable' % fake.PROJECT_ID)
|
||||||
body = {'host': 'host1', 'binary': constants.VOLUME_BINARY}
|
body = {'host': 'host1', 'binary': constants.VOLUME_BINARY}
|
||||||
res_dict = self.controller.update(req, "disable", body)
|
res_dict = self.controller.update(req, "disable", body)
|
||||||
|
|
||||||
@ -723,7 +723,7 @@ class ServicesTest(test.TestCase):
|
|||||||
req, "disable-log-reason", body)
|
req, "disable-log-reason", body)
|
||||||
|
|
||||||
def test_services_failover_host(self):
|
def test_services_failover_host(self):
|
||||||
url = '/v2/%s/os-services/failover_host' % fake.PROJECT_ID
|
url = '/v3/%s/os-services/failover_host' % fake.PROJECT_ID
|
||||||
req = fakes.HTTPRequest.blank(url)
|
req = fakes.HTTPRequest.blank(url)
|
||||||
body = {'host': 'fake_host',
|
body = {'host': 'fake_host',
|
||||||
'backend_id': 'fake_backend'}
|
'backend_id': 'fake_backend'}
|
||||||
@ -744,7 +744,7 @@ class ServicesTest(test.TestCase):
|
|||||||
@mock.patch('cinder.objects.ServiceList.get_all')
|
@mock.patch('cinder.objects.ServiceList.get_all')
|
||||||
def test_services_action_host_not_found(self, method, body,
|
def test_services_action_host_not_found(self, method, body,
|
||||||
mock_get_all_services):
|
mock_get_all_services):
|
||||||
url = '/v2/%s/os-services/%s' % (fake.PROJECT_ID, method)
|
url = '/v3/%s/os-services/%s' % (fake.PROJECT_ID, method)
|
||||||
req = fakes.HTTPRequest.blank(url)
|
req = fakes.HTTPRequest.blank(url)
|
||||||
mock_get_all_services.return_value = []
|
mock_get_all_services.return_value = []
|
||||||
msg = 'No service found with host=%s' % 'fake_host'
|
msg = 'No service found with host=%s' % 'fake_host'
|
||||||
@ -771,7 +771,7 @@ class ServicesTest(test.TestCase):
|
|||||||
self.assertEqual(msg, result.msg)
|
self.assertEqual(msg, result.msg)
|
||||||
|
|
||||||
def test_services_freeze(self):
|
def test_services_freeze(self):
|
||||||
url = '/v2/%s/os-services/freeze' % fake.PROJECT_ID
|
url = '/v3/%s/os-services/freeze' % fake.PROJECT_ID
|
||||||
req = fakes.HTTPRequest.blank(url)
|
req = fakes.HTTPRequest.blank(url)
|
||||||
body = {'host': 'fake_host'}
|
body = {'host': 'fake_host'}
|
||||||
with mock.patch.object(self.controller.volume_api, 'freeze_host') \
|
with mock.patch.object(self.controller.volume_api, 'freeze_host') \
|
||||||
@ -782,7 +782,7 @@ class ServicesTest(test.TestCase):
|
|||||||
self.assertEqual(freeze_mock.return_value, res)
|
self.assertEqual(freeze_mock.return_value, res)
|
||||||
|
|
||||||
def test_services_thaw(self):
|
def test_services_thaw(self):
|
||||||
url = '/v2/%s/os-services/thaw' % fake.PROJECT_ID
|
url = '/v3/%s/os-services/thaw' % fake.PROJECT_ID
|
||||||
req = fakes.HTTPRequest.blank(url)
|
req = fakes.HTTPRequest.blank(url)
|
||||||
body = {'host': 'fake_host'}
|
body = {'host': 'fake_host'}
|
||||||
with mock.patch.object(self.controller.volume_api, 'thaw_host') \
|
with mock.patch.object(self.controller.volume_api, 'thaw_host') \
|
||||||
@ -794,7 +794,7 @@ class ServicesTest(test.TestCase):
|
|||||||
|
|
||||||
@ddt.data('freeze', 'thaw', 'failover_host')
|
@ddt.data('freeze', 'thaw', 'failover_host')
|
||||||
def test_services_replication_calls_no_host(self, method):
|
def test_services_replication_calls_no_host(self, method):
|
||||||
url = '/v2/%s/os-services/%s' % (fake.PROJECT_ID, method)
|
url = '/v3/%s/os-services/%s' % (fake.PROJECT_ID, method)
|
||||||
req = fakes.HTTPRequest.blank(url)
|
req = fakes.HTTPRequest.blank(url)
|
||||||
self.assertRaises(exception.InvalidInput,
|
self.assertRaises(exception.InvalidInput,
|
||||||
self.controller.update, req, method, {})
|
self.controller.update, req, method, {})
|
||||||
|
@ -26,13 +26,13 @@ from cinder import db
|
|||||||
from cinder import exception
|
from cinder import exception
|
||||||
from cinder.objects import fields
|
from cinder.objects import fields
|
||||||
from cinder.tests.unit.api import fakes
|
from cinder.tests.unit.api import fakes
|
||||||
from cinder.tests.unit.api.v2 import fakes as v2_fakes
|
from cinder.tests.unit.api.v3 import fakes as v3_fakes
|
||||||
from cinder.tests.unit import fake_constants as fake
|
from cinder.tests.unit import fake_constants as fake
|
||||||
from cinder.tests.unit import test
|
from cinder.tests.unit import test
|
||||||
|
|
||||||
|
|
||||||
def fake_snapshot_get(context, snapshot_id):
|
def fake_snapshot_get(context, snapshot_id):
|
||||||
snapshot = v2_fakes.fake_snapshot(snapshot_id)
|
snapshot = v3_fakes.fake_snapshot(snapshot_id)
|
||||||
|
|
||||||
if snapshot_id == fake.SNAPSHOT_ID:
|
if snapshot_id == fake.SNAPSHOT_ID:
|
||||||
snapshot['status'] = fields.SnapshotStatus.CREATING
|
snapshot['status'] = fields.SnapshotStatus.CREATING
|
||||||
@ -58,7 +58,7 @@ class SnapshotActionsTest(test.TestCase):
|
|||||||
|
|
||||||
body = {'os-update_snapshot_status':
|
body = {'os-update_snapshot_status':
|
||||||
{'status': fields.SnapshotStatus.AVAILABLE}}
|
{'status': fields.SnapshotStatus.AVAILABLE}}
|
||||||
req = webob.Request.blank('/v2/%s/snapshots/%s/action' % (
|
req = webob.Request.blank('/v3/%s/snapshots/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.SNAPSHOT_ID))
|
fake.PROJECT_ID, fake.SNAPSHOT_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -73,7 +73,7 @@ class SnapshotActionsTest(test.TestCase):
|
|||||||
@mock.patch('cinder.db.snapshot_metadata_get', return_value=dict())
|
@mock.patch('cinder.db.snapshot_metadata_get', return_value=dict())
|
||||||
def test_update_snapshot_status_invalid_status(self, metadata_get, *args):
|
def test_update_snapshot_status_invalid_status(self, metadata_get, *args):
|
||||||
body = {'os-update_snapshot_status': {'status': 'in-use'}}
|
body = {'os-update_snapshot_status': {'status': 'in-use'}}
|
||||||
req = webob.Request.blank('/v2/%s/snapshots/%s/action' % (
|
req = webob.Request.blank('/v3/%s/snapshots/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.SNAPSHOT_ID))
|
fake.PROJECT_ID, fake.SNAPSHOT_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -86,7 +86,7 @@ class SnapshotActionsTest(test.TestCase):
|
|||||||
def test_update_snapshot_status_without_status(self):
|
def test_update_snapshot_status_without_status(self):
|
||||||
self.mock_object(db, 'snapshot_get', fake_snapshot_get)
|
self.mock_object(db, 'snapshot_get', fake_snapshot_get)
|
||||||
body = {'os-update_snapshot_status': {}}
|
body = {'os-update_snapshot_status': {}}
|
||||||
req = webob.Request.blank('/v2/%s/snapshots/%s/action' % (
|
req = webob.Request.blank('/v3/%s/snapshots/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.SNAPSHOT_ID))
|
fake.PROJECT_ID, fake.SNAPSHOT_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -104,7 +104,7 @@ class SnapshotActionsTest(test.TestCase):
|
|||||||
body = {'os-update_snapshot_status':
|
body = {'os-update_snapshot_status':
|
||||||
{'status': fields.SnapshotStatus.AVAILABLE,
|
{'status': fields.SnapshotStatus.AVAILABLE,
|
||||||
'progress': '50%'}}
|
'progress': '50%'}}
|
||||||
req = webob.Request.blank('/v2/%s/snapshots/%s/action' % (
|
req = webob.Request.blank('/v3/%s/snapshots/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.SNAPSHOT_ID))
|
fake.PROJECT_ID, fake.SNAPSHOT_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
|
@ -36,9 +36,9 @@ CONF = cfg.CONF
|
|||||||
|
|
||||||
def app():
|
def app():
|
||||||
# no auth, just let environ['cinder.context'] pass through
|
# no auth, just let environ['cinder.context'] pass through
|
||||||
api = fakes.router.APIRouter()
|
api = fakes.router_v3.APIRouter()
|
||||||
mapper = fakes.urlmap.URLMap()
|
mapper = fakes.urlmap.URLMap()
|
||||||
mapper['/v2'] = api
|
mapper['/v3'] = api
|
||||||
return mapper
|
return mapper
|
||||||
|
|
||||||
|
|
||||||
@ -100,7 +100,7 @@ class SnapshotManageTest(test.TestCase):
|
|||||||
|
|
||||||
def _get_resp_post(self, body):
|
def _get_resp_post(self, body):
|
||||||
"""Helper to execute an os-snapshot-manage API call."""
|
"""Helper to execute an os-snapshot-manage API call."""
|
||||||
req = webob.Request.blank('/v2/%s/os-snapshot-manage' %
|
req = webob.Request.blank('/v3/%s/os-snapshot-manage' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -271,7 +271,7 @@ class SnapshotManageTest(test.TestCase):
|
|||||||
detail = ""
|
detail = ""
|
||||||
if detailed:
|
if detailed:
|
||||||
detail = "/detail"
|
detail = "/detail"
|
||||||
url = "/v2/%s/os-snapshot-manage%s%s" % (fake.PROJECT_ID, detail,
|
url = "/v3/%s/os-snapshot-manage%s%s" % (fake.PROJECT_ID, detail,
|
||||||
query_string)
|
query_string)
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
|
@ -34,9 +34,9 @@ bad_snp_id = fake.WILL_NOT_BE_FOUND_ID
|
|||||||
|
|
||||||
def app():
|
def app():
|
||||||
# no auth, just let environ['cinder.context'] pass through
|
# no auth, just let environ['cinder.context'] pass through
|
||||||
api = fakes.router.APIRouter()
|
api = fakes.router_v3.APIRouter()
|
||||||
mapper = fakes.urlmap.URLMap()
|
mapper = fakes.urlmap.URLMap()
|
||||||
mapper['/v2'] = api
|
mapper['/v3'] = api
|
||||||
return mapper
|
return mapper
|
||||||
|
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ class SnapshotUnmanageTest(test.TestCase):
|
|||||||
|
|
||||||
def _get_resp(self, snapshot_id):
|
def _get_resp(self, snapshot_id):
|
||||||
"""Helper to build an os-unmanage req for the specified snapshot_id."""
|
"""Helper to build an os-unmanage req for the specified snapshot_id."""
|
||||||
req = webob.Request.blank('/v2/%s/snapshots/%s/action' % (
|
req = webob.Request.blank('/v3/%s/snapshots/%s/action' % (
|
||||||
fake.PROJECT_ID, snapshot_id))
|
fake.PROJECT_ID, snapshot_id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
|
@ -73,7 +73,7 @@ class VolumeTypesExtraSpecsTest(test.TestCase):
|
|||||||
super(VolumeTypesExtraSpecsTest, self).setUp()
|
super(VolumeTypesExtraSpecsTest, self).setUp()
|
||||||
self.flags(host='fake')
|
self.flags(host='fake')
|
||||||
self.mock_object(cinder.db, 'volume_type_get', return_volume_type)
|
self.mock_object(cinder.db, 'volume_type_get', return_volume_type)
|
||||||
self.api_path = '/v2/%s/os-volume-types/%s/extra_specs' % (
|
self.api_path = '/v3/%s/types/%s/extra_specs' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_TYPE_ID)
|
fake.PROJECT_ID, fake.VOLUME_TYPE_ID)
|
||||||
self.controller = types_extra_specs.VolumeTypeExtraSpecsController()
|
self.controller = types_extra_specs.VolumeTypeExtraSpecsController()
|
||||||
|
|
||||||
@ -379,7 +379,7 @@ class VolumeTypesExtraSpecsTest(test.TestCase):
|
|||||||
req, fake.VOLUME_ID, 'bad', body=body)
|
req, fake.VOLUME_ID, 'bad', body=body)
|
||||||
|
|
||||||
def _extra_specs_empty_update(self, body):
|
def _extra_specs_empty_update(self, body):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s/extra_specs' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s/extra_specs' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_TYPE_ID))
|
fake.PROJECT_ID, fake.VOLUME_TYPE_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
|
|
||||||
@ -394,7 +394,7 @@ class VolumeTypesExtraSpecsTest(test.TestCase):
|
|||||||
self._extra_specs_empty_update(body={})
|
self._extra_specs_empty_update(body={})
|
||||||
|
|
||||||
def _extra_specs_create_bad_body(self, body):
|
def _extra_specs_create_bad_body(self, body):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s/extra_specs' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s/extra_specs' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_TYPE_ID))
|
fake.PROJECT_ID, fake.VOLUME_TYPE_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
|
|
||||||
@ -431,7 +431,7 @@ class VolumeTypesExtraSpecsTest(test.TestCase):
|
|||||||
cinder.db,
|
cinder.db,
|
||||||
'volume_get_all',
|
'volume_get_all',
|
||||||
return_value=['a']):
|
return_value=['a']):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s/extra_specs' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s/extra_specs' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_TYPE_ID))
|
fake.PROJECT_ID, fake.VOLUME_TYPE_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
|
|
||||||
@ -447,7 +447,7 @@ class VolumeTypesExtraSpecsTest(test.TestCase):
|
|||||||
{'extra_specs': {'': 'a'}},
|
{'extra_specs': {'': 'a'}},
|
||||||
{'extra_specs': {' ': 'a'}})
|
{'extra_specs': {' ': 'a'}})
|
||||||
def test_create_with_invalid_extra_specs(self, body):
|
def test_create_with_invalid_extra_specs(self, body):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s/extra_specs' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s/extra_specs' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_TYPE_ID))
|
fake.PROJECT_ID, fake.VOLUME_TYPE_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
self.mock_object(volume_types, 'destroy',
|
self.mock_object(volume_types, 'destroy',
|
||||||
return_volume_types_destroy)
|
return_volume_types_destroy)
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
||||||
self.assertEqual(0, len(self.notifier.notifications))
|
self.assertEqual(0, len(self.notifier.notifications))
|
||||||
self.controller._delete(req, DEFAULT_VOLUME_TYPE)
|
self.controller._delete(req, DEFAULT_VOLUME_TYPE)
|
||||||
@ -163,7 +163,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
return_volume_types_destroy)
|
return_volume_types_destroy)
|
||||||
|
|
||||||
self.assertEqual(0, len(self.notifier.notifications))
|
self.assertEqual(0, len(self.notifier.notifications))
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, NOT_FOUND_VOLUME_TYPE))
|
fake.PROJECT_ID, NOT_FOUND_VOLUME_TYPE))
|
||||||
self.assertRaises(exception.VolumeTypeNotFound,
|
self.assertRaises(exception.VolumeTypeNotFound,
|
||||||
self.controller._delete, req, NOT_FOUND_VOLUME_TYPE)
|
self.controller._delete, req, NOT_FOUND_VOLUME_TYPE)
|
||||||
@ -174,7 +174,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
return_volume_types_get_volume_type)
|
return_volume_types_get_volume_type)
|
||||||
self.mock_object(volume_types, 'destroy',
|
self.mock_object(volume_types, 'destroy',
|
||||||
return_volume_types_with_volumes_destroy)
|
return_volume_types_with_volumes_destroy)
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
||||||
self.assertEqual(0, len(self.notifier.notifications))
|
self.assertEqual(0, len(self.notifier.notifications))
|
||||||
self.controller._delete(req, DEFAULT_VOLUME_TYPE)
|
self.controller._delete(req, DEFAULT_VOLUME_TYPE)
|
||||||
@ -195,7 +195,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
'description': 'vol_type_desc_%s' % DEFAULT_VOLUME_TYPE}
|
'description': 'vol_type_desc_%s' % DEFAULT_VOLUME_TYPE}
|
||||||
mock_destroy.side_effect = return_volume_types_destroy
|
mock_destroy.side_effect = return_volume_types_destroy
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' %
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' %
|
||||||
(fake.PROJECT_ID, DEFAULT_VOLUME_TYPE),
|
(fake.PROJECT_ID, DEFAULT_VOLUME_TYPE),
|
||||||
use_admin_context=False)
|
use_admin_context=False)
|
||||||
self.assertEqual(0, len(self.notifier.notifications))
|
self.assertEqual(0, len(self.notifier.notifications))
|
||||||
@ -217,7 +217,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
body = {"volume_type": {"name": "vol_type_1",
|
body = {"volume_type": {"name": "vol_type_1",
|
||||||
"os-volume-type-access:is_public": True,
|
"os-volume-type-access:is_public": True,
|
||||||
"extra_specs": {"key1": "value1"}}}
|
"extra_specs": {"key1": "value1"}}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/types' % fake.PROJECT_ID)
|
||||||
|
|
||||||
self.assertEqual(0, len(self.notifier.notifications))
|
self.assertEqual(0, len(self.notifier.notifications))
|
||||||
res_dict = self.controller._create(req, body=body)
|
res_dict = self.controller._create(req, body=body)
|
||||||
@ -242,7 +242,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
body = {"volume_type": {"name": "vol_type_1",
|
body = {"volume_type": {"name": "vol_type_1",
|
||||||
"description": type_description,
|
"description": type_description,
|
||||||
"extra_specs": {"key1": "value1"}}}
|
"extra_specs": {"key1": "value1"}}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/types' % fake.PROJECT_ID)
|
||||||
|
|
||||||
res_dict = self.controller._create(req, body=body)
|
res_dict = self.controller._create(req, body=body)
|
||||||
|
|
||||||
@ -253,7 +253,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
type_name = 'a' * 256
|
type_name = 'a' * 256
|
||||||
body = {"volume_type": {"name": type_name,
|
body = {"volume_type": {"name": type_name,
|
||||||
"extra_specs": {"key1": "value1"}}}
|
"extra_specs": {"key1": "value1"}}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/types' % fake.PROJECT_ID)
|
||||||
self.assertRaises(exception.ValidationError,
|
self.assertRaises(exception.ValidationError,
|
||||||
self.controller._create, req, body=body)
|
self.controller._create, req, body=body)
|
||||||
|
|
||||||
@ -262,7 +262,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
body = {"volume_type": {"name": "vol_type_1",
|
body = {"volume_type": {"name": "vol_type_1",
|
||||||
"description": type_description,
|
"description": type_description,
|
||||||
"extra_specs": {"key1": "value1"}}}
|
"extra_specs": {"key1": "value1"}}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/types' % fake.PROJECT_ID)
|
||||||
self.assertRaises(exception.ValidationError,
|
self.assertRaises(exception.ValidationError,
|
||||||
self.controller._create, req, body=body)
|
self.controller._create, req, body=body)
|
||||||
|
|
||||||
@ -274,7 +274,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
|
|
||||||
body = {"volume_type": {"name": "vol_type_1",
|
body = {"volume_type": {"name": "vol_type_1",
|
||||||
"extra_specs": {"key1": "value1"}}}
|
"extra_specs": {"key1": "value1"}}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/types' % fake.PROJECT_ID)
|
||||||
self.assertRaises(webob.exc.HTTPConflict,
|
self.assertRaises(webob.exc.HTTPConflict,
|
||||||
self.controller._create, req, body=body)
|
self.controller._create, req, body=body)
|
||||||
|
|
||||||
@ -283,7 +283,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
"os-volume-type-access:is_public": "fake",
|
"os-volume-type-access:is_public": "fake",
|
||||||
"description": "test description",
|
"description": "test description",
|
||||||
"extra_specs": {"key1": "value1"}}}
|
"extra_specs": {"key1": "value1"}}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/types' % fake.PROJECT_ID)
|
||||||
self.assertRaises(exception.ValidationError,
|
self.assertRaises(exception.ValidationError,
|
||||||
self.controller._create, req, body=body)
|
self.controller._create, req, body=body)
|
||||||
|
|
||||||
@ -302,7 +302,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
"os-volume-type-access:is_public":
|
"os-volume-type-access:is_public":
|
||||||
is_public,
|
is_public,
|
||||||
"extra_specs": {"key1": "value1"}}}
|
"extra_specs": {"key1": "value1"}}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/types' % fake.PROJECT_ID)
|
||||||
req.environ['cinder.context'] = ctxt
|
req.environ['cinder.context'] = ctxt
|
||||||
self.controller._create(req, body=body)
|
self.controller._create(req, body=body)
|
||||||
mock_create.assert_called_once_with(
|
mock_create.assert_called_once_with(
|
||||||
@ -310,7 +310,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
boolean_is_public, description=None)
|
boolean_is_public, description=None)
|
||||||
|
|
||||||
def _create_volume_type_bad_body(self, body):
|
def _create_volume_type_bad_body(self, body):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/types' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
self.assertRaises(exception.ValidationError,
|
self.assertRaises(exception.ValidationError,
|
||||||
self.controller._create, req, body=body)
|
self.controller._create, req, body=body)
|
||||||
@ -344,7 +344,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
body = {"volume_type": {"name": "vol_type_1",
|
body = {"volume_type": {"name": "vol_type_1",
|
||||||
"os-volume-type-access:is_public": True,
|
"os-volume-type-access:is_public": True,
|
||||||
"extra_specs": {"key1": "value1"}}}
|
"extra_specs": {"key1": "value1"}}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types' % fake.PROJECT_ID,
|
req = fakes.HTTPRequest.blank('/v3/%s/types' % fake.PROJECT_ID,
|
||||||
use_admin_context=False)
|
use_admin_context=False)
|
||||||
|
|
||||||
self.assertEqual(0, len(self.notifier.notifications))
|
self.assertEqual(0, len(self.notifier.notifications))
|
||||||
@ -371,7 +371,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
"os-volume-type-access:is_public": False,
|
"os-volume-type-access:is_public": False,
|
||||||
"description": "test description"}}
|
"description": "test description"}}
|
||||||
body['volume_type']['extra_specs'] = value
|
body['volume_type']['extra_specs'] = value
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/types' % fake.PROJECT_ID)
|
||||||
self.assertRaises(exception.ValidationError,
|
self.assertRaises(exception.ValidationError,
|
||||||
self.controller._create, req, body=body)
|
self.controller._create, req, body=body)
|
||||||
|
|
||||||
@ -381,7 +381,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
mock_get.return_value = return_volume_types_get_volume_type_updated(
|
mock_get.return_value = return_volume_types_get_volume_type_updated(
|
||||||
DEFAULT_VOLUME_TYPE, is_public=False)
|
DEFAULT_VOLUME_TYPE, is_public=False)
|
||||||
body = {"volume_type": {"is_public": False}}
|
body = {"volume_type": {"is_public": False}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
|
|
||||||
@ -406,7 +406,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
self, is_public, mock_show, mock_cache_resource,
|
self, is_public, mock_show, mock_cache_resource,
|
||||||
mock_get, mock_update):
|
mock_get, mock_update):
|
||||||
body = {"volume_type": {"is_public": is_public}}
|
body = {"volume_type": {"is_public": is_public}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
ctxt = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
ctxt = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
||||||
@ -429,7 +429,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
|
|
||||||
type_description = ""
|
type_description = ""
|
||||||
body = {"volume_type": {"description": type_description}}
|
body = {"volume_type": {"description": type_description}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
resp = self.controller._update(req, DEFAULT_VOLUME_TYPE, body=body)
|
resp = self.controller._update(req, DEFAULT_VOLUME_TYPE, body=body)
|
||||||
@ -441,7 +441,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
type_name = 'a' * 256
|
type_name = 'a' * 256
|
||||||
body = {"volume_type": {"name": type_name,
|
body = {"volume_type": {"name": type_name,
|
||||||
"description": ""}}
|
"description": ""}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
self.assertRaises(exception.ValidationError,
|
self.assertRaises(exception.ValidationError,
|
||||||
@ -451,7 +451,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
def test_update_type_with_description_too_long(self):
|
def test_update_type_with_description_too_long(self):
|
||||||
type_description = 'a' * 256
|
type_description = 'a' * 256
|
||||||
body = {"volume_type": {"description": type_description}}
|
body = {"volume_type": {"description": type_description}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
self.assertRaises(exception.ValidationError,
|
self.assertRaises(exception.ValidationError,
|
||||||
@ -465,7 +465,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
volume_type_id=NOT_FOUND_VOLUME_TYPE)
|
volume_type_id=NOT_FOUND_VOLUME_TYPE)
|
||||||
body = {"volume_type": {"name": "vol_type_1_1",
|
body = {"volume_type": {"name": "vol_type_1_1",
|
||||||
"description": "vol_type_desc_1_1"}}
|
"description": "vol_type_desc_1_1"}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, NOT_FOUND_VOLUME_TYPE))
|
fake.PROJECT_ID, NOT_FOUND_VOLUME_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
|
|
||||||
@ -485,7 +485,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
|
|
||||||
body = {"volume_type": {"name": "vol_type_1_1",
|
body = {"volume_type": {"name": "vol_type_1_1",
|
||||||
"description": "vol_type_desc_1_1"}}
|
"description": "vol_type_desc_1_1"}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
|
|
||||||
@ -497,7 +497,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
|
|
||||||
def test_update_no_name_no_description(self):
|
def test_update_no_name_no_description(self):
|
||||||
body = {"volume_type": {}}
|
body = {"volume_type": {}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
|
|
||||||
@ -508,7 +508,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
def test_update_empty_name(self):
|
def test_update_empty_name(self):
|
||||||
body = {"volume_type": {"name": " ",
|
body = {"volume_type": {"name": " ",
|
||||||
"description": "something"}}
|
"description": "something"}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
|
|
||||||
@ -530,7 +530,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
updated_name = "%s_%s" % (name, UPDATE_NAME_ONLY_TYPE)
|
updated_name = "%s_%s" % (name, UPDATE_NAME_ONLY_TYPE)
|
||||||
desc = "vol_type_desc_%s" % UPDATE_NAME_ONLY_TYPE
|
desc = "vol_type_desc_%s" % UPDATE_NAME_ONLY_TYPE
|
||||||
body = {"volume_type": {"name": name}}
|
body = {"volume_type": {"name": name}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' %
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' %
|
||||||
(fake.PROJECT_ID, UPDATE_NAME_ONLY_TYPE))
|
(fake.PROJECT_ID, UPDATE_NAME_ONLY_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.environ['cinder.context'] = ctxt
|
req.environ['cinder.context'] = ctxt
|
||||||
@ -553,7 +553,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
desc = "vol_type_desc_%s" % UPDATE_DESC_ONLY_TYPE
|
desc = "vol_type_desc_%s" % UPDATE_DESC_ONLY_TYPE
|
||||||
updated_desc = "%s_%s" % (desc, UPDATE_DESC_ONLY_TYPE)
|
updated_desc = "%s_%s" % (desc, UPDATE_DESC_ONLY_TYPE)
|
||||||
body = {"volume_type": {"description": updated_desc}}
|
body = {"volume_type": {"description": updated_desc}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, UPDATE_DESC_ONLY_TYPE))
|
fake.PROJECT_ID, UPDATE_DESC_ONLY_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
|
|
||||||
@ -576,7 +576,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
desc = "vol_type_desc_%s" % DEFAULT_VOLUME_TYPE
|
desc = "vol_type_desc_%s" % DEFAULT_VOLUME_TYPE
|
||||||
updated_desc = "%s_%s" % (desc, DEFAULT_VOLUME_TYPE)
|
updated_desc = "%s_%s" % (desc, DEFAULT_VOLUME_TYPE)
|
||||||
body = {"volume_type": {"is_public": is_public}}
|
body = {"volume_type": {"is_public": is_public}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
|
|
||||||
@ -592,7 +592,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
body = {"volume_type": {"name": "test",
|
body = {"volume_type": {"name": "test",
|
||||||
"description": "something",
|
"description": "something",
|
||||||
"is_public": "fake"}}
|
"is_public": "fake"}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
|
|
||||||
@ -613,7 +613,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
UPDATE_NAME_AFTER_DELETE_TYPE)
|
UPDATE_NAME_AFTER_DELETE_TYPE)
|
||||||
# first attempt fail
|
# first attempt fail
|
||||||
body = {"volume_type": {"name": name}}
|
body = {"volume_type": {"name": name}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, UPDATE_NAME_AFTER_DELETE_TYPE))
|
fake.PROJECT_ID, UPDATE_NAME_AFTER_DELETE_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
|
|
||||||
@ -628,7 +628,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
self.notifier.reset()
|
self.notifier.reset()
|
||||||
self.mock_object(volume_types, 'destroy',
|
self.mock_object(volume_types, 'destroy',
|
||||||
return_volume_types_destroy)
|
return_volume_types_destroy)
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, UPDATE_NAME_AFTER_DELETE_TYPE))
|
fake.PROJECT_ID, UPDATE_NAME_AFTER_DELETE_TYPE))
|
||||||
self.assertEqual(0, len(self.notifier.notifications))
|
self.assertEqual(0, len(self.notifier.notifications))
|
||||||
self.controller._delete(req, UPDATE_NAME_AFTER_DELETE_TYPE)
|
self.controller._delete(req, UPDATE_NAME_AFTER_DELETE_TYPE)
|
||||||
@ -637,7 +637,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
# update again
|
# update again
|
||||||
mock_update.side_effect = mock.MagicMock()
|
mock_update.side_effect = mock.MagicMock()
|
||||||
body = {"volume_type": {"name": updated_name}}
|
body = {"volume_type": {"name": updated_name}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, UPDATE_NAME_AFTER_DELETE_TYPE))
|
fake.PROJECT_ID, UPDATE_NAME_AFTER_DELETE_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
|
|
||||||
@ -667,7 +667,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
body = {"volume_type": {"name": updated_name,
|
body = {"volume_type": {"name": updated_name,
|
||||||
"description": updated_desc,
|
"description": updated_desc,
|
||||||
"is_public": False}}
|
"is_public": False}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE),
|
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE),
|
||||||
use_admin_context=False)
|
use_admin_context=False)
|
||||||
|
|
||||||
@ -701,7 +701,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
|
|
||||||
def test_update_with_name_null(self):
|
def test_update_with_name_null(self):
|
||||||
body = {"volume_type": {"name": None}}
|
body = {"volume_type": {"name": None}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
|
|
||||||
@ -714,7 +714,7 @@ class VolumeTypesManageApiTest(test.TestCase):
|
|||||||
{"volume_type": {"description": "description",
|
{"volume_type": {"description": "description",
|
||||||
"is_public": True}})
|
"is_public": True}})
|
||||||
def test_update_volume_type(self, body):
|
def test_update_volume_type(self, body):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' % (
|
||||||
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
fake.PROJECT_ID, DEFAULT_VOLUME_TYPE))
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
ctxt = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
ctxt = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
||||||
|
@ -31,7 +31,7 @@ from cinder import exception
|
|||||||
from cinder.image import glance
|
from cinder.image import glance
|
||||||
from cinder import objects
|
from cinder import objects
|
||||||
from cinder.tests.unit.api import fakes
|
from cinder.tests.unit.api import fakes
|
||||||
from cinder.tests.unit.api.v2 import fakes as v2_fakes
|
from cinder.tests.unit.api.v3 import fakes as v3_fakes
|
||||||
from cinder.tests.unit import fake_constants as fake
|
from cinder.tests.unit import fake_constants as fake
|
||||||
from cinder.tests.unit import fake_volume
|
from cinder.tests.unit import fake_volume
|
||||||
from cinder.tests.unit import test
|
from cinder.tests.unit import test
|
||||||
@ -89,7 +89,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
def test_simple_api_actions(self):
|
def test_simple_api_actions(self):
|
||||||
app = fakes.wsgi_app(fake_auth_context=self.context)
|
app = fakes.wsgi_app(fake_auth_context=self.context)
|
||||||
for _action in self._actions:
|
for _action in self._actions:
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = jsonutils.dump_as_bytes({_action: None})
|
req.body = jsonutils.dump_as_bytes({_action: None})
|
||||||
@ -103,7 +103,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
init_conn.return_value = {}
|
init_conn.return_value = {}
|
||||||
body = {'os-initialize_connection': {'connector': {
|
body = {'os-initialize_connection': {'connector': {
|
||||||
'fake': 'fake'}}}
|
'fake': 'fake'}}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -118,7 +118,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
'initialize_connection') as init_conn:
|
'initialize_connection') as init_conn:
|
||||||
init_conn.return_value = {}
|
init_conn.return_value = {}
|
||||||
body = {'os-initialize_connection': {}}
|
body = {'os-initialize_connection': {}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -133,7 +133,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
_init_connection):
|
_init_connection):
|
||||||
_init_connection.side_effect = messaging.RemoteError('InvalidInput')
|
_init_connection.side_effect = messaging.RemoteError('InvalidInput')
|
||||||
body = {'os-initialize_connection': {'connector': 'w/o_initiator'}}
|
body = {'os-initialize_connection': {'connector': 'w/o_initiator'}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -150,7 +150,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
exception.VolumeBackendAPIException(data=None)
|
exception.VolumeBackendAPIException(data=None)
|
||||||
body = {'os-initialize_connection': {'connector': {
|
body = {'os-initialize_connection': {'connector': {
|
||||||
'fake': 'fake'}}}
|
'fake': 'fake'}}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -166,7 +166,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
'terminate_connection') as terminate_conn:
|
'terminate_connection') as terminate_conn:
|
||||||
terminate_conn.return_value = {}
|
terminate_conn.return_value = {}
|
||||||
body = {'os-terminate_connection': {'connector': 'fake'}}
|
body = {'os-terminate_connection': {'connector': 'fake'}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -181,7 +181,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
'terminate_connection') as terminate_conn:
|
'terminate_connection') as terminate_conn:
|
||||||
terminate_conn.return_value = {}
|
terminate_conn.return_value = {}
|
||||||
body = {'os-terminate_connection': {}}
|
body = {'os-terminate_connection': {}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -197,7 +197,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
terminate_conn.side_effect = \
|
terminate_conn.side_effect = \
|
||||||
exception.VolumeBackendAPIException(data=None)
|
exception.VolumeBackendAPIException(data=None)
|
||||||
body = {'os-terminate_connection': {'connector': 'fake'}}
|
body = {'os-terminate_connection': {'connector': 'fake'}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -212,7 +212,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
body = {'os-attach': {'instance_uuid': fake.INSTANCE_ID,
|
body = {'os-attach': {'instance_uuid': fake.INSTANCE_ID,
|
||||||
'mountpoint': '/dev/vdc',
|
'mountpoint': '/dev/vdc',
|
||||||
'mode': 'rw'}}
|
'mode': 'rw'}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -225,7 +225,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
body = {'os-attach': {'instance_uuid': fake.INSTANCE_ID,
|
body = {'os-attach': {'instance_uuid': fake.INSTANCE_ID,
|
||||||
'host_name': 'fake_host',
|
'host_name': 'fake_host',
|
||||||
'mountpoint': '/dev/vdc'}}
|
'mountpoint': '/dev/vdc'}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -238,7 +238,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
# using 'read-write' mode attach volume by default
|
# using 'read-write' mode attach volume by default
|
||||||
body = {'os-attach': {'host_name': 'fake_host',
|
body = {'os-attach': {'host_name': 'fake_host',
|
||||||
'mountpoint': '/dev/vdc'}}
|
'mountpoint': '/dev/vdc'}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -258,7 +258,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
"mountpoint": "/dev/vdc",
|
"mountpoint": "/dev/vdc",
|
||||||
"mode": "rw"}
|
"mode": "rw"}
|
||||||
body = {"os-attach": vol}
|
body = {"os-attach": vol}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' %
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, id))
|
(fake.PROJECT_ID, id))
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller._attach,
|
self.controller._attach,
|
||||||
@ -277,7 +277,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
"mountpoint": "/dev/vdc",
|
"mountpoint": "/dev/vdc",
|
||||||
"mode": "rw"}
|
"mode": "rw"}
|
||||||
body = {"os-attach": vol}
|
body = {"os-attach": vol}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' %
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, id))
|
(fake.PROJECT_ID, id))
|
||||||
self.assertRaises(messaging.RemoteError,
|
self.assertRaises(messaging.RemoteError,
|
||||||
self.controller._attach,
|
self.controller._attach,
|
||||||
@ -287,7 +287,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
|
|
||||||
def test_detach(self):
|
def test_detach(self):
|
||||||
body = {'os-detach': {'attachment_id': fake.ATTACHMENT_ID}}
|
body = {'os-detach': {'attachment_id': fake.ATTACHMENT_ID}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -299,7 +299,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
|
|
||||||
def test_detach_null_attachment_id(self):
|
def test_detach_null_attachment_id(self):
|
||||||
body = {'os-detach': {'attachment_id': None}}
|
body = {'os-detach': {'attachment_id': None}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -317,7 +317,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
id = fake.VOLUME_ID
|
id = fake.VOLUME_ID
|
||||||
vol = {"attachment_id": fake.ATTACHMENT_ID}
|
vol = {"attachment_id": fake.ATTACHMENT_ID}
|
||||||
body = {"os-detach": vol}
|
body = {"os-detach": vol}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' %
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, id))
|
(fake.PROJECT_ID, id))
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller._detach,
|
self.controller._detach,
|
||||||
@ -334,7 +334,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
id = fake.VOLUME_ID
|
id = fake.VOLUME_ID
|
||||||
vol = {"attachment_id": fake.ATTACHMENT_ID}
|
vol = {"attachment_id": fake.ATTACHMENT_ID}
|
||||||
body = {"os-detach": vol}
|
body = {"os-detach": vol}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' %
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, id))
|
(fake.PROJECT_ID, id))
|
||||||
self.assertRaises(messaging.RemoteError,
|
self.assertRaises(messaging.RemoteError,
|
||||||
self.controller._detach,
|
self.controller._detach,
|
||||||
@ -345,7 +345,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
def test_attach_with_invalid_arguments(self):
|
def test_attach_with_invalid_arguments(self):
|
||||||
# Invalid request to attach volume an invalid target
|
# Invalid request to attach volume an invalid target
|
||||||
body = {'os-attach': {'mountpoint': '/dev/vdc'}}
|
body = {'os-attach': {'mountpoint': '/dev/vdc'}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -358,7 +358,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
body = {'os-attach': {'instance_uuid': 'fake',
|
body = {'os-attach': {'instance_uuid': 'fake',
|
||||||
'mountpoint': '/dev/vdc',
|
'mountpoint': '/dev/vdc',
|
||||||
'mode': 'rr'}}
|
'mode': 'rr'}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -369,7 +369,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
body = {'os-attach': {'host_name': 'fake_host',
|
body = {'os-attach': {'host_name': 'fake_host',
|
||||||
'mountpoint': '/dev/vdc',
|
'mountpoint': '/dev/vdc',
|
||||||
'mode': 'ww'}}
|
'mode': 'ww'}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -383,7 +383,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
# API should fail with a 400 error.
|
# API should fail with a 400 error.
|
||||||
body = {'os-attach': {'instance_uuid': fake.INSTANCE_ID,
|
body = {'os-attach': {'instance_uuid': fake.INSTANCE_ID,
|
||||||
'mode': 'rw'}}
|
'mode': 'rw'}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -400,7 +400,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
fake_begin_detaching)
|
fake_begin_detaching)
|
||||||
|
|
||||||
body = {'os-begin_detaching': {'fake': 'fake'}}
|
body = {'os-begin_detaching': {'fake': 'fake'}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -417,7 +417,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
fake_roll_detaching)
|
fake_roll_detaching)
|
||||||
|
|
||||||
body = {'os-roll_detaching': {'fake': 'fake'}}
|
body = {'os-roll_detaching': {'fake': 'fake'}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -434,7 +434,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
fake_extend_volume)
|
fake_extend_volume)
|
||||||
|
|
||||||
body = {'os-extend': {'new_size': 5}}
|
body = {'os-extend': {'new_size': 5}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -452,7 +452,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
fake_extend_volume)
|
fake_extend_volume)
|
||||||
|
|
||||||
body = {'os-extend': {'new_size': 5}}
|
body = {'os-extend': {'new_size': 5}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -476,7 +476,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
body = {"os-update_readonly_flag": {"readonly": readonly}}
|
body = {"os-update_readonly_flag": {"readonly": readonly}}
|
||||||
if readonly is None:
|
if readonly is None:
|
||||||
body = {"os-update_readonly_flag": {}}
|
body = {"os-update_readonly_flag": {}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -495,7 +495,7 @@ class VolumeActionsTest(test.TestCase):
|
|||||||
body = {"os-set_bootable": {"bootable": bootable}}
|
body = {"os-set_bootable": {"bootable": bootable}}
|
||||||
if bootable is None:
|
if bootable is None:
|
||||||
body = {"os-set_bootable": {}}
|
body = {"os-set_bootable": {}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -528,7 +528,7 @@ class VolumeRetypeActionsTest(test.TestCase):
|
|||||||
new_type=fake.VOLUME_TYPE2_ID, vol_id=None,
|
new_type=fake.VOLUME_TYPE2_ID, vol_id=None,
|
||||||
exists_mock=None):
|
exists_mock=None):
|
||||||
vol_id = vol_id or fake.VOLUME_ID
|
vol_id = vol_id or fake.VOLUME_ID
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, vol_id))
|
(fake.PROJECT_ID, vol_id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -542,7 +542,7 @@ class VolumeRetypeActionsTest(test.TestCase):
|
|||||||
vol = utils.create_volume(self.context,
|
vol = utils.create_volume(self.context,
|
||||||
status='available',
|
status='available',
|
||||||
testcase_instance=self)
|
testcase_instance=self)
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, vol.id))
|
(fake.PROJECT_ID, vol.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -555,7 +555,7 @@ class VolumeRetypeActionsTest(test.TestCase):
|
|||||||
vol = utils.create_volume(self.context,
|
vol = utils.create_volume(self.context,
|
||||||
status='available',
|
status='available',
|
||||||
testcase_instance=self)
|
testcase_instance=self)
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, vol.id))
|
(fake.PROJECT_ID, vol.id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['content-type'] = 'application/json'
|
req.headers['content-type'] = 'application/json'
|
||||||
@ -709,7 +709,7 @@ class VolumeRetypeActionsTest(test.TestCase):
|
|||||||
name='old',
|
name='old',
|
||||||
qos_specs_id=qos_old).id
|
qos_specs_id=qos_old).id
|
||||||
else:
|
else:
|
||||||
vol_type_old = v2_fakes.fake_default_type_get()['id']
|
vol_type_old = v3_fakes.fake_default_type_get()['id']
|
||||||
|
|
||||||
vol_type_new = utils.create_volume_type(admin_ctxt, self,
|
vol_type_new = utils.create_volume_type(admin_ctxt, self,
|
||||||
name='new',
|
name='new',
|
||||||
@ -739,7 +739,7 @@ class VolumeRetypeActionsTest(test.TestCase):
|
|||||||
if enc_orig:
|
if enc_orig:
|
||||||
utils.create_encryption(admin_ctxt, vol_type_old, self)
|
utils.create_encryption(admin_ctxt, vol_type_old, self)
|
||||||
else:
|
else:
|
||||||
vol_type_old = v2_fakes.fake_default_type_get()['id']
|
vol_type_old = v3_fakes.fake_default_type_get()['id']
|
||||||
|
|
||||||
vol_type_new = utils.create_volume_type(admin_ctxt, self,
|
vol_type_new = utils.create_volume_type(admin_ctxt, self,
|
||||||
name='new').id
|
name='new').id
|
||||||
@ -755,7 +755,7 @@ class VolumeRetypeActionsTest(test.TestCase):
|
|||||||
|
|
||||||
|
|
||||||
def fake_volume_get(self, context, volume_id):
|
def fake_volume_get(self, context, volume_id):
|
||||||
volume = v2_fakes.create_fake_volume(volume_id)
|
volume = v3_fakes.create_volume(volume_id)
|
||||||
if volume_id == fake.VOLUME3_ID:
|
if volume_id == fake.VOLUME3_ID:
|
||||||
volume['status'] = 'in-use'
|
volume['status'] = 'in-use'
|
||||||
else:
|
else:
|
||||||
@ -778,7 +778,7 @@ def fake_volume_get_obj(self, context, volume_id, **kwargs):
|
|||||||
|
|
||||||
volume.volume_type = fake_volume.fake_volume_type_obj(
|
volume.volume_type = fake_volume.fake_volume_type_obj(
|
||||||
context,
|
context,
|
||||||
name=v2_fakes.DEFAULT_VOL_TYPE)
|
name=v3_fakes.DEFAULT_VOL_TYPE)
|
||||||
return volume
|
return volume
|
||||||
|
|
||||||
|
|
||||||
@ -867,7 +867,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
"image_name": 'image_name',
|
"image_name": 'image_name',
|
||||||
"force": True}
|
"force": True}
|
||||||
body = {"os-volume_upload_image": img}
|
body = {"os-volume_upload_image": img}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' %
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, id))
|
(fake.PROJECT_ID, id))
|
||||||
res_dict = self.controller._volume_upload_image(req, id, body=body)
|
res_dict = self.controller._volume_upload_image(req, id, body=body)
|
||||||
expected = {'os-volume_upload_image':
|
expected = {'os-volume_upload_image':
|
||||||
@ -913,7 +913,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
"image_name": 'image_name',
|
"image_name": 'image_name',
|
||||||
"force": True}
|
"force": True}
|
||||||
body = {"os-volume_upload_image": img}
|
body = {"os-volume_upload_image": img}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' %
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, vol_id))
|
(fake.PROJECT_ID, vol_id))
|
||||||
res_dict = self.controller._volume_upload_image(req, vol_id, body=body)
|
res_dict = self.controller._volume_upload_image(req, vol_id, body=body)
|
||||||
|
|
||||||
@ -941,7 +941,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
"image_name": 'image_name',
|
"image_name": 'image_name',
|
||||||
"force": True}
|
"force": True}
|
||||||
body = {"os-volume_upload_image": img}
|
body = {"os-volume_upload_image": img}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' %
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, id))
|
(fake.PROJECT_ID, id))
|
||||||
res_dict = self.controller._volume_upload_image(req, id, body=body)
|
res_dict = self.controller._volume_upload_image(req, id, body=body)
|
||||||
|
|
||||||
@ -961,7 +961,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
"image_name": 'image_name',
|
"image_name": 'image_name',
|
||||||
"force": True}
|
"force": True}
|
||||||
body = {"os-volume_upload_image": vol}
|
body = {"os-volume_upload_image": vol}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' %
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, id))
|
(fake.PROJECT_ID, id))
|
||||||
self.assertRaises(exception.VolumeNotFound,
|
self.assertRaises(exception.VolumeNotFound,
|
||||||
self.controller._volume_upload_image,
|
self.controller._volume_upload_image,
|
||||||
@ -979,7 +979,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
"image_name": 'image_name',
|
"image_name": 'image_name',
|
||||||
"force": True}
|
"force": True}
|
||||||
body = {"os-volume_upload_image": vol}
|
body = {"os-volume_upload_image": vol}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' %
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller._volume_upload_image,
|
self.controller._volume_upload_image,
|
||||||
@ -995,7 +995,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
"image_name": 'image_name',
|
"image_name": 'image_name',
|
||||||
"force": True}
|
"force": True}
|
||||||
body = {"os-volume_upload_image": vol}
|
body = {"os-volume_upload_image": vol}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action'
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action'
|
||||||
% (fake.PROJECT_ID, id))
|
% (fake.PROJECT_ID, id))
|
||||||
self.assertRaises(exception.ValidationError,
|
self.assertRaises(exception.ValidationError,
|
||||||
self.controller._volume_upload_image,
|
self.controller._volume_upload_image,
|
||||||
@ -1033,7 +1033,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
"image_name": 'image_name',
|
"image_name": 'image_name',
|
||||||
"force": True}
|
"force": True}
|
||||||
body = {"os-volume_upload_image": vol}
|
body = {"os-volume_upload_image": vol}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' %
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, fake.VOLUME_ID))
|
(fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller._volume_upload_image,
|
self.controller._volume_upload_image,
|
||||||
@ -1051,7 +1051,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
"image_name": 'image_name',
|
"image_name": 'image_name',
|
||||||
"force": True}
|
"force": True}
|
||||||
body = {"os-volume_upload_image": vol}
|
body = {"os-volume_upload_image": vol}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' %
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, id))
|
(fake.PROJECT_ID, id))
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller._volume_upload_image,
|
self.controller._volume_upload_image,
|
||||||
@ -1090,7 +1090,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
def test_volume_upload_image_typeerror(self):
|
def test_volume_upload_image_typeerror(self):
|
||||||
id = fake.VOLUME2_ID
|
id = fake.VOLUME2_ID
|
||||||
body = {"os-volume_upload_image_fake": "fake"}
|
body = {"os-volume_upload_image_fake": "fake"}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, id))
|
(fake.PROJECT_ID, id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1105,7 +1105,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
"image_name": None,
|
"image_name": None,
|
||||||
"force": True}
|
"force": True}
|
||||||
body = {"": vol}
|
body = {"": vol}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, id))
|
(fake.PROJECT_ID, id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -1117,7 +1117,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
def test_extend_volume_valueerror(self):
|
def test_extend_volume_valueerror(self):
|
||||||
id = fake.VOLUME2_ID
|
id = fake.VOLUME2_ID
|
||||||
body = {'os-extend': {'new_size': 'fake'}}
|
body = {'os-extend': {'new_size': 'fake'}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' %
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, id))
|
(fake.PROJECT_ID, id))
|
||||||
self.assertRaises(exception.ValidationError,
|
self.assertRaises(exception.ValidationError,
|
||||||
self.controller._extend,
|
self.controller._extend,
|
||||||
@ -1157,7 +1157,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
vol_id = fake.WILL_NOT_BE_FOUND_ID
|
vol_id = fake.WILL_NOT_BE_FOUND_ID
|
||||||
|
|
||||||
body = {'os-extend': {'new_size': 5}}
|
body = {'os-extend': {'new_size': 5}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' %
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, vol_id))
|
(fake.PROJECT_ID, vol_id))
|
||||||
|
|
||||||
self.assertRaises(exception.VolumeNotFound,
|
self.assertRaises(exception.VolumeNotFound,
|
||||||
@ -1173,7 +1173,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
"image_name": None,
|
"image_name": None,
|
||||||
"force": True}
|
"force": True}
|
||||||
body = {"os-volume_upload_image": vol}
|
body = {"os-volume_upload_image": vol}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' %
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' %
|
||||||
(fake.PROJECT_ID, id))
|
(fake.PROJECT_ID, id))
|
||||||
self.assertRaises(exception.ValidationError,
|
self.assertRaises(exception.ValidationError,
|
||||||
self.controller._volume_upload_image,
|
self.controller._volume_upload_image,
|
||||||
@ -1222,7 +1222,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
mock_create.side_effect = self.fake_image_service_create
|
mock_create.side_effect = self.fake_image_service_create
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/volumes/%s/action' % (fake.PROJECT_ID, volume.id),
|
'/v3/%s/volumes/%s/action' % (fake.PROJECT_ID, volume.id),
|
||||||
use_admin_context=self.context.is_admin)
|
use_admin_context=self.context.is_admin)
|
||||||
body = self._get_os_volume_upload_image()
|
body = self._get_os_volume_upload_image()
|
||||||
|
|
||||||
@ -1265,7 +1265,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
mock_create.side_effect = self.fake_image_service_create
|
mock_create.side_effect = self.fake_image_service_create
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/volumes/%s/action' % (fake.PROJECT_ID, volume.id),
|
'/v3/%s/volumes/%s/action' % (fake.PROJECT_ID, volume.id),
|
||||||
use_admin_context=self.context.is_admin)
|
use_admin_context=self.context.is_admin)
|
||||||
body = self._get_os_volume_upload_image()
|
body = self._get_os_volume_upload_image()
|
||||||
res_dict = self.controller._volume_upload_image(req, volume.id,
|
res_dict = self.controller._volume_upload_image(req, volume.id,
|
||||||
@ -1291,7 +1291,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
mock_create.side_effect = Exception()
|
mock_create.side_effect = Exception()
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/fakeproject/volumes/%s/action' % volume.id)
|
'/v3/fakeproject/volumes/%s/action' % volume.id)
|
||||||
body = self._get_os_volume_upload_image()
|
body = self._get_os_volume_upload_image()
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller._volume_upload_image, req, volume.id,
|
self.controller._volume_upload_image, req, volume.id,
|
||||||
@ -1318,7 +1318,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
mock_create.side_effect = self.fake_image_service_create
|
mock_create.side_effect = self.fake_image_service_create
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/fakeproject/volumes/%s/action' % volume.id)
|
'/v3/fakeproject/volumes/%s/action' % volume.id)
|
||||||
body = self._get_os_volume_upload_image()
|
body = self._get_os_volume_upload_image()
|
||||||
body['os-volume_upload_image']['force'] = False
|
body['os-volume_upload_image']['force'] = False
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
@ -1346,7 +1346,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
mock_create.side_effect = self.fake_image_service_create
|
mock_create.side_effect = self.fake_image_service_create
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/fakeproject/volumes/%s/action' % volume.id,
|
'/v3/fakeproject/volumes/%s/action' % volume.id,
|
||||||
use_admin_context=self.context.is_admin)
|
use_admin_context=self.context.is_admin)
|
||||||
body = self._get_os_volume_upload_image()
|
body = self._get_os_volume_upload_image()
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
@ -1380,7 +1380,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
mock_create.side_effect = self.fake_image_service_create
|
mock_create.side_effect = self.fake_image_service_create
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/fakeproject/volumes/%s/action' % volume.id,
|
'/v3/fakeproject/volumes/%s/action' % volume.id,
|
||||||
use_admin_context=self.context.is_admin)
|
use_admin_context=self.context.is_admin)
|
||||||
|
|
||||||
body = self._get_os_volume_upload_image()
|
body = self._get_os_volume_upload_image()
|
||||||
@ -1403,7 +1403,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
self.override_config('glance_core_properties', [])
|
self.override_config('glance_core_properties', [])
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/fakeproject/volumes/%s/action' % volume.id,
|
'/v3/fakeproject/volumes/%s/action' % volume.id,
|
||||||
use_admin_context=self.context.is_admin)
|
use_admin_context=self.context.is_admin)
|
||||||
|
|
||||||
body = self._get_os_volume_upload_image()
|
body = self._get_os_volume_upload_image()
|
||||||
@ -1429,7 +1429,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
mock_create.side_effect = self.fake_image_service_create
|
mock_create.side_effect = self.fake_image_service_create
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/volumes/%s/action' % (fake.PROJECT_ID, volume.id),
|
'/v3/%s/volumes/%s/action' % (fake.PROJECT_ID, volume.id),
|
||||||
use_admin_context=self.context.is_admin)
|
use_admin_context=self.context.is_admin)
|
||||||
body = self._get_os_volume_upload_image()
|
body = self._get_os_volume_upload_image()
|
||||||
res_dict = self.controller._volume_upload_image(req, volume.id,
|
res_dict = self.controller._volume_upload_image(req, volume.id,
|
||||||
@ -1483,7 +1483,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
mock_get_image_metadata.return_value = {}
|
mock_get_image_metadata.return_value = {}
|
||||||
mock_create.side_effect = self.fake_image_service_create
|
mock_create.side_effect = self.fake_image_service_create
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/fakeproject/volumes/%s/action' % volume.id)
|
'/v3/fakeproject/volumes/%s/action' % volume.id)
|
||||||
body = self._get_os_volume_upload_image()
|
body = self._get_os_volume_upload_image()
|
||||||
body['os-volume_upload_image']['force'] = True
|
body['os-volume_upload_image']['force'] = True
|
||||||
body['os-volume_upload_image']['container_format'] = 'bare'
|
body['os-volume_upload_image']['container_format'] = 'bare'
|
||||||
@ -1507,7 +1507,7 @@ class VolumeImageActionsTest(test.TestCase):
|
|||||||
mock_get_image_metadata.return_value = {}
|
mock_get_image_metadata.return_value = {}
|
||||||
mock_create.side_effect = self.fake_image_service_create
|
mock_create.side_effect = self.fake_image_service_create
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/fakeproject/volumes/%s/action' % volume.id)
|
'/v3/fakeproject/volumes/%s/action' % volume.id)
|
||||||
body = self._get_os_volume_upload_image()
|
body = self._get_os_volume_upload_image()
|
||||||
body['os-volume_upload_image']['force'] = True
|
body['os-volume_upload_image']['force'] = True
|
||||||
body['os-volume_upload_image']['container_format'] = 'bare'
|
body['os-volume_upload_image']['container_format'] = 'bare'
|
||||||
|
@ -81,7 +81,7 @@ class VolumeEncryptionMetadataTest(test.TestCase):
|
|||||||
self.volume_id)
|
self.volume_id)
|
||||||
|
|
||||||
def test_index(self):
|
def test_index(self):
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/encryption' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/encryption' % (
|
||||||
fake.PROJECT_ID, self.volume_id))
|
fake.PROJECT_ID, self.volume_id))
|
||||||
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
||||||
self.assertEqual(HTTPStatus.OK, res.status_code)
|
self.assertEqual(HTTPStatus.OK, res.status_code)
|
||||||
@ -97,7 +97,7 @@ class VolumeEncryptionMetadataTest(test.TestCase):
|
|||||||
self.assertEqual(expected, res_dict)
|
self.assertEqual(expected, res_dict)
|
||||||
|
|
||||||
def test_index_bad_tenant_id(self):
|
def test_index_bad_tenant_id(self):
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/encryption' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/encryption' % (
|
||||||
fake.WILL_NOT_BE_FOUND_ID, self.volume_id))
|
fake.WILL_NOT_BE_FOUND_ID, self.volume_id))
|
||||||
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
||||||
self.assertEqual(HTTPStatus.BAD_REQUEST, res.status_code)
|
self.assertEqual(HTTPStatus.BAD_REQUEST, res.status_code)
|
||||||
@ -109,7 +109,7 @@ class VolumeEncryptionMetadataTest(test.TestCase):
|
|||||||
|
|
||||||
def test_index_bad_volume_id(self):
|
def test_index_bad_volume_id(self):
|
||||||
bad_volume_id = fake.WILL_NOT_BE_FOUND_ID
|
bad_volume_id = fake.WILL_NOT_BE_FOUND_ID
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/encryption' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/encryption' % (
|
||||||
fake.PROJECT_ID, bad_volume_id))
|
fake.PROJECT_ID, bad_volume_id))
|
||||||
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
||||||
self.assertEqual(HTTPStatus.NOT_FOUND, res.status_code)
|
self.assertEqual(HTTPStatus.NOT_FOUND, res.status_code)
|
||||||
@ -121,7 +121,7 @@ class VolumeEncryptionMetadataTest(test.TestCase):
|
|||||||
self.assertEqual(expected, res_dict)
|
self.assertEqual(expected, res_dict)
|
||||||
|
|
||||||
def test_show_key(self):
|
def test_show_key(self):
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/encryption/'
|
req = webob.Request.blank('/v3/%s/volumes/%s/encryption/'
|
||||||
'encryption_key_id' % (
|
'encryption_key_id' % (
|
||||||
fake.PROJECT_ID, self.volume_id))
|
fake.PROJECT_ID, self.volume_id))
|
||||||
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
||||||
@ -130,7 +130,7 @@ class VolumeEncryptionMetadataTest(test.TestCase):
|
|||||||
self.assertEqual(fake.ENCRYPTION_KEY_ID, res.body.decode())
|
self.assertEqual(fake.ENCRYPTION_KEY_ID, res.body.decode())
|
||||||
|
|
||||||
def test_show_control(self):
|
def test_show_control(self):
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/encryption/'
|
req = webob.Request.blank('/v3/%s/volumes/%s/encryption/'
|
||||||
'control_location' % (
|
'control_location' % (
|
||||||
fake.PROJECT_ID, self.volume_id))
|
fake.PROJECT_ID, self.volume_id))
|
||||||
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
||||||
@ -139,7 +139,7 @@ class VolumeEncryptionMetadataTest(test.TestCase):
|
|||||||
self.assertEqual(b'front-end', res.body)
|
self.assertEqual(b'front-end', res.body)
|
||||||
|
|
||||||
def test_show_provider(self):
|
def test_show_provider(self):
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/encryption/'
|
req = webob.Request.blank('/v3/%s/volumes/%s/encryption/'
|
||||||
'provider' % (
|
'provider' % (
|
||||||
fake.PROJECT_ID, self.volume_id))
|
fake.PROJECT_ID, self.volume_id))
|
||||||
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
||||||
@ -149,7 +149,7 @@ class VolumeEncryptionMetadataTest(test.TestCase):
|
|||||||
res.body)
|
res.body)
|
||||||
|
|
||||||
def test_show_bad_tenant_id(self):
|
def test_show_bad_tenant_id(self):
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/encryption/'
|
req = webob.Request.blank('/v3/%s/volumes/%s/encryption/'
|
||||||
'encryption_key_id' %
|
'encryption_key_id' %
|
||||||
(fake.WILL_NOT_BE_FOUND_ID,
|
(fake.WILL_NOT_BE_FOUND_ID,
|
||||||
self.volume_id))
|
self.volume_id))
|
||||||
@ -163,7 +163,7 @@ class VolumeEncryptionMetadataTest(test.TestCase):
|
|||||||
|
|
||||||
def test_show_bad_volume_id(self):
|
def test_show_bad_volume_id(self):
|
||||||
bad_volume_id = fake.WILL_NOT_BE_FOUND_ID
|
bad_volume_id = fake.WILL_NOT_BE_FOUND_ID
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/encryption/'
|
req = webob.Request.blank('/v3/%s/volumes/%s/encryption/'
|
||||||
'encryption_key_id' % (
|
'encryption_key_id' % (
|
||||||
fake.PROJECT_ID, bad_volume_id))
|
fake.PROJECT_ID, bad_volume_id))
|
||||||
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
||||||
@ -179,7 +179,7 @@ class VolumeEncryptionMetadataTest(test.TestCase):
|
|||||||
ctxt = context.RequestContext(fake.USER_ID, fake.PROJECT_ID,
|
ctxt = context.RequestContext(fake.USER_ID, fake.PROJECT_ID,
|
||||||
is_admin=True)
|
is_admin=True)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/encryption/'
|
req = webob.Request.blank('/v3/%s/volumes/%s/encryption/'
|
||||||
'encryption_key_id' % (
|
'encryption_key_id' % (
|
||||||
fake.PROJECT_ID, self.volume_id))
|
fake.PROJECT_ID, self.volume_id))
|
||||||
res = req.get_response(fakes.wsgi_app(fake_auth_context=ctxt))
|
res = req.get_response(fakes.wsgi_app(fake_auth_context=ctxt))
|
||||||
@ -194,7 +194,7 @@ class VolumeEncryptionMetadataTest(test.TestCase):
|
|||||||
volume_id = self._create_volume(self.ctxt, encryption_key_id=None)
|
volume_id = self._create_volume(self.ctxt, encryption_key_id=None)
|
||||||
self.addCleanup(db.volume_destroy, self.ctxt.elevated(), volume_id)
|
self.addCleanup(db.volume_destroy, self.ctxt.elevated(), volume_id)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/encryption/'
|
req = webob.Request.blank('/v3/%s/volumes/%s/encryption/'
|
||||||
'encryption_key_id' % (
|
'encryption_key_id' % (
|
||||||
fake.PROJECT_ID, volume_id))
|
fake.PROJECT_ID, volume_id))
|
||||||
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
||||||
@ -208,7 +208,7 @@ class VolumeEncryptionMetadataTest(test.TestCase):
|
|||||||
volume_id = self._create_volume(self.ctxt, encryption_key_id=None)
|
volume_id = self._create_volume(self.ctxt, encryption_key_id=None)
|
||||||
self.addCleanup(db.volume_destroy, self.ctxt.elevated(), volume_id)
|
self.addCleanup(db.volume_destroy, self.ctxt.elevated(), volume_id)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/encryption' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/encryption' % (
|
||||||
fake.PROJECT_ID, volume_id))
|
fake.PROJECT_ID, volume_id))
|
||||||
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
res = req.get_response(fakes.wsgi_app(fake_auth_context=self.ctxt))
|
||||||
|
|
||||||
|
@ -60,9 +60,9 @@ def fake_volume_get_all(*args, **kwargs):
|
|||||||
|
|
||||||
def app():
|
def app():
|
||||||
# no auth, just let environ['cinder.context'] pass through
|
# no auth, just let environ['cinder.context'] pass through
|
||||||
api = fakes.router.APIRouter()
|
api = fakes.router_v3.APIRouter()
|
||||||
mapper = fakes.urlmap.URLMap()
|
mapper = fakes.urlmap.URLMap()
|
||||||
mapper['/v2'] = api
|
mapper['/v3'] = api
|
||||||
return mapper
|
return mapper
|
||||||
|
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ class VolumeHostAttributeTest(test.TestCase):
|
|||||||
|
|
||||||
def test_get_volume_allowed(self):
|
def test_get_volume_allowed(self):
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s' % (
|
||||||
fake.PROJECT_ID, self.UUID))
|
fake.PROJECT_ID, self.UUID))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
@ -88,7 +88,7 @@ class VolumeHostAttributeTest(test.TestCase):
|
|||||||
|
|
||||||
def test_get_volume_unallowed(self):
|
def test_get_volume_unallowed(self):
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, False)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, False)
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s' % (
|
||||||
fake.PROJECT_ID, self.UUID))
|
fake.PROJECT_ID, self.UUID))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
@ -98,7 +98,7 @@ class VolumeHostAttributeTest(test.TestCase):
|
|||||||
|
|
||||||
def test_list_detail_volumes_allowed(self):
|
def test_list_detail_volumes_allowed(self):
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
||||||
req = webob.Request.blank('/v2/%s/volumes/detail' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/volumes/detail' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
res = req.get_response(app())
|
res = req.get_response(app())
|
||||||
@ -107,7 +107,7 @@ class VolumeHostAttributeTest(test.TestCase):
|
|||||||
|
|
||||||
def test_list_detail_volumes_unallowed(self):
|
def test_list_detail_volumes_unallowed(self):
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, False)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, False)
|
||||||
req = webob.Request.blank('/v2/%s/volumes/detail' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/volumes/detail' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
res = req.get_response(app())
|
res = req.get_response(app())
|
||||||
@ -116,7 +116,7 @@ class VolumeHostAttributeTest(test.TestCase):
|
|||||||
|
|
||||||
def test_list_simple_volumes_no_host(self):
|
def test_list_simple_volumes_no_host(self):
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
||||||
req = webob.Request.blank('/v2/%s/volumes' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/volumes' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
res = req.get_response(app())
|
res = req.get_response(app())
|
||||||
|
@ -163,7 +163,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
|
|
||||||
def test_get_volume(self):
|
def test_get_volume(self):
|
||||||
self._create_volume_and_glance_metadata()
|
self._create_volume_and_glance_metadata()
|
||||||
res = self._make_request('/v2/%s/volumes/%s' % (
|
res = self._make_request('/v3/%s/volumes/%s' % (
|
||||||
fake.PROJECT_ID, self.UUID))
|
fake.PROJECT_ID, self.UUID))
|
||||||
self.assertEqual(HTTPStatus.OK, res.status_int)
|
self.assertEqual(HTTPStatus.OK, res.status_int)
|
||||||
self.assertEqual(fake_image_metadata,
|
self.assertEqual(fake_image_metadata,
|
||||||
@ -171,7 +171,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
|
|
||||||
def test_list_detail_volumes(self):
|
def test_list_detail_volumes(self):
|
||||||
self._create_volume_and_glance_metadata()
|
self._create_volume_and_glance_metadata()
|
||||||
res = self._make_request('/v2/%s/volumes/detail' % fake.PROJECT_ID)
|
res = self._make_request('/v3/%s/volumes/detail' % fake.PROJECT_ID)
|
||||||
self.assertEqual(HTTPStatus.OK, res.status_int)
|
self.assertEqual(HTTPStatus.OK, res.status_int)
|
||||||
self.assertEqual(fake_image_metadata,
|
self.assertEqual(fake_image_metadata,
|
||||||
self._get_image_metadata_list(res.body)[0])
|
self._get_image_metadata_list(res.body)[0])
|
||||||
@ -185,7 +185,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
self.mock_object(volume.api.API, 'get_all',
|
self.mock_object(volume.api.API, 'get_all',
|
||||||
fake_volume_get_all_empty)
|
fake_volume_get_all_empty)
|
||||||
|
|
||||||
res = self._make_request('/v2/%s/volumes/detail' % fake.PROJECT_ID)
|
res = self._make_request('/v3/%s/volumes/detail' % fake.PROJECT_ID)
|
||||||
self.assertEqual(HTTPStatus.OK, res.status_int)
|
self.assertEqual(HTTPStatus.OK, res.status_int)
|
||||||
self.assertFalse(fake_dont_call_this.called)
|
self.assertFalse(fake_dont_call_this.called)
|
||||||
|
|
||||||
@ -199,7 +199,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
'key1', 'value1')
|
'key1', 'value1')
|
||||||
db.volume_glance_metadata_create(ctxt, fake.VOLUME_ID,
|
db.volume_glance_metadata_create(ctxt, fake.VOLUME_ID,
|
||||||
'key2', 'value2')
|
'key2', 'value2')
|
||||||
res = self._make_request('/v2/%s/volumes/detail?limit=1'
|
res = self._make_request('/v3/%s/volumes/detail?limit=1'
|
||||||
% fake.PROJECT_ID)
|
% fake.PROJECT_ID)
|
||||||
self.assertEqual(HTTPStatus.OK, res.status_int)
|
self.assertEqual(HTTPStatus.OK, res.status_int)
|
||||||
self.assertEqual({'key1': 'value1', 'key2': 'value2'},
|
self.assertEqual({'key1': 'value1', 'key2': 'value2'},
|
||||||
@ -213,7 +213,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
fake_create_volume_metadata)
|
fake_create_volume_metadata)
|
||||||
|
|
||||||
body = {"os-set_image_metadata": {"metadata": fake_image_metadata}}
|
body = {"os-set_image_metadata": {"metadata": fake_image_metadata}}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_ID))
|
fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = "POST"
|
req.method = "POST"
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -235,7 +235,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
self.addCleanup(policy.reset)
|
self.addCleanup(policy.reset)
|
||||||
fake_get.return_value = {}
|
fake_get.return_value = {}
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_ID), use_admin_context=False)
|
fake.PROJECT_ID, fake.VOLUME_ID), use_admin_context=False)
|
||||||
|
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
@ -270,7 +270,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_ID))
|
fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -284,7 +284,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
|
|
||||||
@mock.patch('cinder.objects.Volume.get_by_id')
|
@mock.patch('cinder.objects.Volume.get_by_id')
|
||||||
def test_create_empty_body(self, fake_get):
|
def test_create_empty_body(self, fake_get):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_ID))
|
fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -297,7 +297,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
def test_create_nonexistent_volume(self):
|
def test_create_nonexistent_volume(self):
|
||||||
self.mock_object(volume.api.API, 'get', return_volume_nonexistent)
|
self.mock_object(volume.api.API, 'get', return_volume_nonexistent)
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_ID))
|
fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = "application/json"
|
req.content_type = "application/json"
|
||||||
@ -313,7 +313,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
def test_invalid_metadata_items_on_create(self, fake_get):
|
def test_invalid_metadata_items_on_create(self, fake_get):
|
||||||
self.mock_object(db, 'volume_metadata_update',
|
self.mock_object(db, 'volume_metadata_update',
|
||||||
fake_create_volume_metadata)
|
fake_create_volume_metadata)
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_ID))
|
fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -355,7 +355,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
body = {"os-unset_image_metadata": {
|
body = {"os-unset_image_metadata": {
|
||||||
"key": "ramdisk_id"}
|
"key": "ramdisk_id"}
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_ID))
|
fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -375,7 +375,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
self.addCleanup(policy.reset)
|
self.addCleanup(policy.reset)
|
||||||
fake_get.return_value = {}
|
fake_get.return_value = {}
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_ID), use_admin_context=False)
|
fake.PROJECT_ID, fake.VOLUME_ID), use_admin_context=False)
|
||||||
|
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
@ -394,7 +394,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
data = {"os-unset_image_metadata": {
|
data = {"os-unset_image_metadata": {
|
||||||
"key": "invalid_id"}
|
"key": "invalid_id"}
|
||||||
}
|
}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_ID))
|
fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = jsonutils.dump_as_bytes(data)
|
req.body = jsonutils.dump_as_bytes(data)
|
||||||
@ -413,7 +413,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
body = {"os-unset_image_metadata": {
|
body = {"os-unset_image_metadata": {
|
||||||
"key": "fake"}
|
"key": "fake"}
|
||||||
}
|
}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_ID))
|
fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
@ -425,7 +425,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
body=body)
|
body=body)
|
||||||
|
|
||||||
def test_delete_empty_body(self):
|
def test_delete_empty_body(self):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/volumes/%s/action' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_ID))
|
fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -436,7 +436,7 @@ class VolumeImageMetadataTest(test.TestCase):
|
|||||||
|
|
||||||
def test_show_image_metadata(self):
|
def test_show_image_metadata(self):
|
||||||
body = {"os-show_image_metadata": None}
|
body = {"os-show_image_metadata": None}
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_ID))
|
fake.PROJECT_ID, fake.VOLUME_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
|
@ -39,15 +39,7 @@ CONF = cfg.CONF
|
|||||||
|
|
||||||
def app():
|
def app():
|
||||||
# no auth, just let environ['cinder.context'] pass through
|
# no auth, just let environ['cinder.context'] pass through
|
||||||
api = fakes.router.APIRouter()
|
api = fakes.router_v3.APIRouter()
|
||||||
mapper = fakes.urlmap.URLMap()
|
|
||||||
mapper['/v2'] = api
|
|
||||||
return mapper
|
|
||||||
|
|
||||||
|
|
||||||
def app_v3():
|
|
||||||
# no auth, just let environ['cinder.context'] pass through
|
|
||||||
api = fakes.router.APIRouter()
|
|
||||||
mapper = fakes.urlmap.URLMap()
|
mapper = fakes.urlmap.URLMap()
|
||||||
mapper['/v3'] = api
|
mapper['/v3'] = api
|
||||||
return mapper
|
return mapper
|
||||||
@ -181,17 +173,7 @@ class VolumeManageTest(test.TestCase):
|
|||||||
is_admin=False)
|
is_admin=False)
|
||||||
self.controller = volume_manage.VolumeManageController()
|
self.controller = volume_manage.VolumeManageController()
|
||||||
|
|
||||||
def _get_resp_post(self, body):
|
def _get_resp_post(self, body, version='3.11'):
|
||||||
"""Helper to execute a POST os-volume-manage API call."""
|
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-manage' % fake.PROJECT_ID)
|
|
||||||
req.method = 'POST'
|
|
||||||
req.headers['Content-Type'] = 'application/json'
|
|
||||||
req.environ['cinder.context'] = self._admin_ctxt
|
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
|
||||||
res = req.get_response(app())
|
|
||||||
return res
|
|
||||||
|
|
||||||
def _get_resp_post_v3(self, body, version):
|
|
||||||
"""Helper to execute a POST os-volume-manage API call."""
|
"""Helper to execute a POST os-volume-manage API call."""
|
||||||
req = webob.Request.blank('/v3/%s/os-volume-manage' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/os-volume-manage' % fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
@ -200,7 +182,7 @@ class VolumeManageTest(test.TestCase):
|
|||||||
req.headers["OpenStack-API-Version"] = "volume " + version
|
req.headers["OpenStack-API-Version"] = "volume " + version
|
||||||
req.api_version_request = api_version.APIVersionRequest(version)
|
req.api_version_request = api_version.APIVersionRequest(version)
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
res = req.get_response(app_v3())
|
res = req.get_response(app())
|
||||||
return res
|
return res
|
||||||
|
|
||||||
@ddt.data({'host': 'host_ok'},
|
@ddt.data({'host': 'host_ok'},
|
||||||
@ -381,7 +363,7 @@ class VolumeManageTest(test.TestCase):
|
|||||||
detail = ""
|
detail = ""
|
||||||
if detailed:
|
if detailed:
|
||||||
detail = "/detail"
|
detail = "/detail"
|
||||||
url = "/v2/%s/os-volume-manage%s%s" % (fake.PROJECT_ID, detail,
|
url = "/v3/%s/os-volume-manage%s%s" % (fake.PROJECT_ID, detail,
|
||||||
query_string)
|
query_string)
|
||||||
req = webob.Request.blank(url)
|
req = webob.Request.blank(url)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
@ -486,29 +468,12 @@ class VolumeManageTest(test.TestCase):
|
|||||||
self.assertTrue(mock_is_up.called)
|
self.assertTrue(mock_is_up.called)
|
||||||
|
|
||||||
@mock.patch('cinder.volume.api.API.manage_existing', wraps=api_manage_new)
|
@mock.patch('cinder.volume.api.API.manage_existing', wraps=api_manage_new)
|
||||||
def test_manage_volume_with_creating_status_in_v3(self, mock_api_manage):
|
def test_manage_volume_with_creating_status(self, mock_api_manage):
|
||||||
"""Test managing volume to return 'creating' status in V3 API."""
|
"""Test managing volume to return 'creating' status in V3 API."""
|
||||||
body = {'volume': {'host': 'host_ok',
|
body = {'volume': {'host': 'host_ok',
|
||||||
'ref': 'fake_ref'}}
|
'ref': 'fake_ref'}}
|
||||||
res = self._get_resp_post_v3(body, mv.ETAGS)
|
res = self._get_resp_post(body, mv.ETAGS)
|
||||||
self.assertEqual(HTTPStatus.ACCEPTED, res.status_int)
|
self.assertEqual(HTTPStatus.ACCEPTED, res.status_int)
|
||||||
self.assertEqual(1, mock_api_manage.call_count)
|
self.assertEqual(1, mock_api_manage.call_count)
|
||||||
self.assertEqual('creating',
|
self.assertEqual('creating',
|
||||||
jsonutils.loads(res.body)['volume']['status'])
|
jsonutils.loads(res.body)['volume']['status'])
|
||||||
|
|
||||||
@mock.patch('cinder.volume.api.API.manage_existing', wraps=api_manage_new)
|
|
||||||
def test_manage_volume_with_creating_status_in_v2(self, mock_api_manage):
|
|
||||||
"""Test managing volume to return 'creating' status in V2 API."""
|
|
||||||
|
|
||||||
body = {'volume': {'host': 'host_ok',
|
|
||||||
'ref': 'fake_ref'}}
|
|
||||||
res = self._get_resp_post(body)
|
|
||||||
self.assertEqual(HTTPStatus.ACCEPTED, res.status_int)
|
|
||||||
self.assertEqual(1, mock_api_manage.call_count)
|
|
||||||
self.assertEqual('creating',
|
|
||||||
jsonutils.loads(res.body)['volume']['status'])
|
|
||||||
|
|
||||||
@ddt.data({'volume': {}}, None)
|
|
||||||
def test_manage_volume_with_invalid_body(self, body):
|
|
||||||
res = self._get_resp_post(body)
|
|
||||||
self.assertEqual(HTTPStatus.BAD_REQUEST, res.status_int)
|
|
||||||
|
@ -57,9 +57,9 @@ def fake_volume_get_all(*args, **kwargs):
|
|||||||
|
|
||||||
def app():
|
def app():
|
||||||
# no auth, just let environ['cinder.context'] pass through
|
# no auth, just let environ['cinder.context'] pass through
|
||||||
api = fakes.router.APIRouter()
|
api = fakes.router_v3.APIRouter()
|
||||||
mapper = fakes.urlmap.URLMap()
|
mapper = fakes.urlmap.URLMap()
|
||||||
mapper['/v2'] = api
|
mapper['/v3'] = api
|
||||||
return mapper
|
return mapper
|
||||||
|
|
||||||
|
|
||||||
@ -73,7 +73,7 @@ class VolumeMigStatusAttributeTest(test.TestCase):
|
|||||||
|
|
||||||
def test_get_volume_allowed(self):
|
def test_get_volume_allowed(self):
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s' % (
|
||||||
fake.PROJECT_ID, self.UUID))
|
fake.PROJECT_ID, self.UUID))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
@ -86,7 +86,7 @@ class VolumeMigStatusAttributeTest(test.TestCase):
|
|||||||
|
|
||||||
def test_get_volume_unallowed(self):
|
def test_get_volume_unallowed(self):
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, False)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, False)
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s' % (
|
||||||
fake.PROJECT_ID, self.UUID))
|
fake.PROJECT_ID, self.UUID))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
@ -97,7 +97,7 @@ class VolumeMigStatusAttributeTest(test.TestCase):
|
|||||||
|
|
||||||
def test_list_detail_volumes_allowed(self):
|
def test_list_detail_volumes_allowed(self):
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
||||||
req = webob.Request.blank('/v2/%s/volumes/detail' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/volumes/detail' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
res = req.get_response(app())
|
res = req.get_response(app())
|
||||||
@ -109,7 +109,7 @@ class VolumeMigStatusAttributeTest(test.TestCase):
|
|||||||
|
|
||||||
def test_list_detail_volumes_unallowed(self):
|
def test_list_detail_volumes_unallowed(self):
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, False)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, False)
|
||||||
req = webob.Request.blank('/v2/%s/volumes/detail' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/volumes/detail' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
res = req.get_response(app())
|
res = req.get_response(app())
|
||||||
@ -119,7 +119,7 @@ class VolumeMigStatusAttributeTest(test.TestCase):
|
|||||||
|
|
||||||
def test_list_simple_volumes_no_migration_status(self):
|
def test_list_simple_volumes_no_migration_status(self):
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
||||||
req = webob.Request.blank('/v2/%s/volumes' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/volumes' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
res = req.get_response(app())
|
res = req.get_response(app())
|
||||||
|
@ -47,9 +47,9 @@ def fake_volume_get_all(*args, **kwargs):
|
|||||||
|
|
||||||
def app():
|
def app():
|
||||||
# no auth, just let environ['cinder.context'] pass through
|
# no auth, just let environ['cinder.context'] pass through
|
||||||
api = fakes.router.APIRouter()
|
api = fakes.router_v3.APIRouter()
|
||||||
mapper = fakes.urlmap.URLMap()
|
mapper = fakes.urlmap.URLMap()
|
||||||
mapper['/v2'] = api
|
mapper['/v3'] = api
|
||||||
return mapper
|
return mapper
|
||||||
|
|
||||||
|
|
||||||
@ -68,7 +68,7 @@ class VolumeTenantAttributeTest(test.TestCase):
|
|||||||
allow_all = {TENANT_ATTRIBUTE_POLICY: oslo_policy._checks.TrueCheck()}
|
allow_all = {TENANT_ATTRIBUTE_POLICY: oslo_policy._checks.TrueCheck()}
|
||||||
policy._ENFORCER.set_rules(allow_all, overwrite=False)
|
policy._ENFORCER.set_rules(allow_all, overwrite=False)
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s' % (
|
||||||
fake.PROJECT_ID, self.UUID))
|
fake.PROJECT_ID, self.UUID))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
@ -82,7 +82,7 @@ class VolumeTenantAttributeTest(test.TestCase):
|
|||||||
oslo_policy._checks.FalseCheck()}
|
oslo_policy._checks.FalseCheck()}
|
||||||
policy._ENFORCER.set_rules(allow_none, overwrite=False)
|
policy._ENFORCER.set_rules(allow_none, overwrite=False)
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s' % (
|
req = webob.Request.blank('/v3/%s/volumes/%s' % (
|
||||||
fake.PROJECT_ID, self.UUID))
|
fake.PROJECT_ID, self.UUID))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
@ -95,7 +95,7 @@ class VolumeTenantAttributeTest(test.TestCase):
|
|||||||
allow_all = {TENANT_ATTRIBUTE_POLICY: oslo_policy._checks.TrueCheck()}
|
allow_all = {TENANT_ATTRIBUTE_POLICY: oslo_policy._checks.TrueCheck()}
|
||||||
policy._ENFORCER.set_rules(allow_all, overwrite=False)
|
policy._ENFORCER.set_rules(allow_all, overwrite=False)
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, False)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, False)
|
||||||
req = webob.Request.blank('/v2/%s/volumes/detail' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/volumes/detail' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
res = req.get_response(app())
|
res = req.get_response(app())
|
||||||
@ -107,7 +107,7 @@ class VolumeTenantAttributeTest(test.TestCase):
|
|||||||
oslo_policy._checks.FalseCheck()}
|
oslo_policy._checks.FalseCheck()}
|
||||||
policy._ENFORCER.set_rules(allow_none, overwrite=False)
|
policy._ENFORCER.set_rules(allow_none, overwrite=False)
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, False)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, False)
|
||||||
req = webob.Request.blank('/v2/%s/volumes/detail' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/volumes/detail' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
res = req.get_response(app())
|
res = req.get_response(app())
|
||||||
@ -119,7 +119,7 @@ class VolumeTenantAttributeTest(test.TestCase):
|
|||||||
allow_all = {TENANT_ATTRIBUTE_POLICY: oslo_policy._checks.TrueCheck()}
|
allow_all = {TENANT_ATTRIBUTE_POLICY: oslo_policy._checks.TrueCheck()}
|
||||||
policy._ENFORCER.set_rules(allow_all, overwrite=False)
|
policy._ENFORCER.set_rules(allow_all, overwrite=False)
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
||||||
req = webob.Request.blank('/v2/%s/volumes' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/volumes' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
res = req.get_response(app())
|
res = req.get_response(app())
|
||||||
@ -131,7 +131,7 @@ class VolumeTenantAttributeTest(test.TestCase):
|
|||||||
oslo_policy._checks.FalseCheck()}
|
oslo_policy._checks.FalseCheck()}
|
||||||
policy._ENFORCER.set_rules(allow_none, overwrite=False)
|
policy._ENFORCER.set_rules(allow_none, overwrite=False)
|
||||||
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
||||||
req = webob.Request.blank('/v2/%s/volumes' % fake.PROJECT_ID)
|
req = webob.Request.blank('/v3/%s/volumes' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.environ['cinder.context'] = ctx
|
req.environ['cinder.context'] = ctx
|
||||||
res = req.get_response(app())
|
res = req.get_response(app())
|
||||||
|
@ -28,14 +28,14 @@ from cinder import exception
|
|||||||
from cinder.objects import fields
|
from cinder.objects import fields
|
||||||
from cinder import quota
|
from cinder import quota
|
||||||
from cinder.tests.unit.api import fakes
|
from cinder.tests.unit.api import fakes
|
||||||
from cinder.tests.unit.api.v2 import fakes as v2_fakes
|
from cinder.tests.unit.api.v3 import fakes as v3_fakes
|
||||||
from cinder.tests.unit import fake_constants as fake
|
from cinder.tests.unit import fake_constants as fake
|
||||||
from cinder.tests.unit import test
|
from cinder.tests.unit import test
|
||||||
import cinder.transfer
|
import cinder.transfer
|
||||||
|
|
||||||
|
|
||||||
class VolumeTransferAPITestCase(test.TestCase):
|
class VolumeTransferAPITestCase(test.TestCase):
|
||||||
"""Test Case for transfers API."""
|
"""Test Case for the "old" transfers API, still valid in 3.0."""
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(VolumeTransferAPITestCase, self).setUp()
|
super(VolumeTransferAPITestCase, self).setUp()
|
||||||
@ -75,7 +75,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
def test_show_transfer(self):
|
def test_show_transfer(self):
|
||||||
volume_id = self._create_volume(size=5)
|
volume_id = self._create_volume(size=5)
|
||||||
transfer = self._create_transfer(volume_id)
|
transfer = self._create_transfer(volume_id)
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer/%s' % (
|
req = webob.Request.blank('/v3/%s/os-volume-transfer/%s' % (
|
||||||
fake.PROJECT_ID, transfer['id']))
|
fake.PROJECT_ID, transfer['id']))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -91,7 +91,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
db.volume_destroy(context.get_admin_context(), volume_id)
|
db.volume_destroy(context.get_admin_context(), volume_id)
|
||||||
|
|
||||||
def test_show_transfer_with_transfer_NotFound(self):
|
def test_show_transfer_with_transfer_NotFound(self):
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer/%s' % (
|
req = webob.Request.blank('/v3/%s/os-volume-transfer/%s' % (
|
||||||
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -112,7 +112,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
transfer1 = self._create_transfer(volume_id_1)
|
transfer1 = self._create_transfer(volume_id_1)
|
||||||
transfer2 = self._create_transfer(volume_id_2)
|
transfer2 = self._create_transfer(volume_id_2)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer' %
|
req = webob.Request.blank('/v3/%s/os-volume-transfer' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -138,7 +138,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
transfer1 = self._create_transfer(volume_id_1)
|
transfer1 = self._create_transfer(volume_id_1)
|
||||||
transfer2 = self._create_transfer(volume_id_2)
|
transfer2 = self._create_transfer(volume_id_2)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer/detail' %
|
req = webob.Request.blank('/v3/%s/os-volume-transfer/detail' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -171,7 +171,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
transfer1 = self._create_transfer(volume_id_1)
|
transfer1 = self._create_transfer(volume_id_1)
|
||||||
transfer2 = self._create_transfer(volume_id_2)
|
transfer2 = self._create_transfer(volume_id_2)
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/os-volume-transfer?'
|
req = fakes.HTTPRequest.blank('/v3/%s/os-volume-transfer?'
|
||||||
'all_tenants=1' % fake.PROJECT_ID,
|
'all_tenants=1' % fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
res_dict = self.controller.index(req)
|
res_dict = self.controller.index(req)
|
||||||
@ -192,7 +192,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
body = {"transfer": {"name": "transfer1",
|
body = {"transfer": {"name": "transfer1",
|
||||||
"volume_id": volume_id}}
|
"volume_id": volume_id}}
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer' %
|
req = webob.Request.blank('/v3/%s/os-volume-transfer' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -212,7 +212,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
db.volume_destroy(context.get_admin_context(), volume_id)
|
db.volume_destroy(context.get_admin_context(), volume_id)
|
||||||
|
|
||||||
def test_create_transfer_with_no_body(self):
|
def test_create_transfer_with_no_body(self):
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer' %
|
req = webob.Request.blank('/v3/%s/os-volume-transfer' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.body = jsonutils.dump_as_bytes(None)
|
req.body = jsonutils.dump_as_bytes(None)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
@ -228,7 +228,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_create_transfer_with_body_KeyError(self):
|
def test_create_transfer_with_body_KeyError(self):
|
||||||
body = {"transfer": {"name": "transfer1"}}
|
body = {"transfer": {"name": "transfer1"}}
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer' %
|
req = webob.Request.blank('/v3/%s/os-volume-transfer' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -245,7 +245,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
body = {"transfer": {"name": "transfer1",
|
body = {"transfer": {"name": "transfer1",
|
||||||
"volume_id": 1234}}
|
"volume_id": 1234}}
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer' %
|
req = webob.Request.blank('/v3/%s/os-volume-transfer' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -262,7 +262,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
volume_id = self._create_volume(status='attached')
|
volume_id = self._create_volume(status='attached')
|
||||||
body = {"transfer": {"name": "transfer1",
|
body = {"transfer": {"name": "transfer1",
|
||||||
"volume_id": volume_id}}
|
"volume_id": volume_id}}
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer' %
|
req = webob.Request.blank('/v3/%s/os-volume-transfer' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -284,7 +284,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
body = {"transfer": {"name": " transfer1 ",
|
body = {"transfer": {"name": " transfer1 ",
|
||||||
"volume_id": volume_id}}
|
"volume_id": volume_id}}
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer' %
|
req = webob.Request.blank('/v3/%s/os-volume-transfer' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -302,7 +302,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
def test_delete_transfer_awaiting_transfer(self):
|
def test_delete_transfer_awaiting_transfer(self):
|
||||||
volume_id = self._create_volume()
|
volume_id = self._create_volume()
|
||||||
transfer = self._create_transfer(volume_id)
|
transfer = self._create_transfer(volume_id)
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer/%s' % (
|
req = webob.Request.blank('/v3/%s/os-volume-transfer/%s' % (
|
||||||
fake.PROJECT_ID, transfer['id']))
|
fake.PROJECT_ID, transfer['id']))
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -312,7 +312,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
self.assertEqual(HTTPStatus.ACCEPTED, res.status_int)
|
self.assertEqual(HTTPStatus.ACCEPTED, res.status_int)
|
||||||
|
|
||||||
# verify transfer has been deleted
|
# verify transfer has been deleted
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer/%s' % (
|
req = webob.Request.blank('/v3/%s/os-volume-transfer/%s' % (
|
||||||
fake.PROJECT_ID, transfer['id']))
|
fake.PROJECT_ID, transfer['id']))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -331,7 +331,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
db.volume_destroy(context.get_admin_context(), volume_id)
|
db.volume_destroy(context.get_admin_context(), volume_id)
|
||||||
|
|
||||||
def test_delete_transfer_with_transfer_NotFound(self):
|
def test_delete_transfer_with_transfer_NotFound(self):
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer/%s' % (
|
req = webob.Request.blank('/v3/%s/os-volume-transfer/%s' % (
|
||||||
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -347,14 +347,14 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
res_dict['itemNotFound']['message'])
|
res_dict['itemNotFound']['message'])
|
||||||
|
|
||||||
@mock.patch.object(quota.QUOTAS, 'reserve')
|
@mock.patch.object(quota.QUOTAS, 'reserve')
|
||||||
@mock.patch.object(db, 'volume_type_get', v2_fakes.fake_volume_type_get)
|
@mock.patch.object(db, 'volume_type_get', v3_fakes.fake_volume_type_get)
|
||||||
def test_accept_transfer_volume_id_specified_json(self, type_get):
|
def test_accept_transfer_volume_id_specified_json(self, type_get):
|
||||||
volume_id = self._create_volume()
|
volume_id = self._create_volume()
|
||||||
transfer = self._create_transfer(volume_id)
|
transfer = self._create_transfer(volume_id)
|
||||||
|
|
||||||
svc = self.start_service('volume', host='fake_host')
|
svc = self.start_service('volume', host='fake_host')
|
||||||
body = {"accept": {"auth_key": transfer['auth_key']}}
|
body = {"accept": {"auth_key": transfer['auth_key']}}
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer/%s/accept' % (
|
req = webob.Request.blank('/v3/%s/os-volume-transfer/%s/accept' % (
|
||||||
fake.PROJECT_ID, transfer['id']))
|
fake.PROJECT_ID, transfer['id']))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -373,7 +373,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
volume_id = self._create_volume(size=5)
|
volume_id = self._create_volume(size=5)
|
||||||
transfer = self._create_transfer(volume_id)
|
transfer = self._create_transfer(volume_id)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer/%s/accept' % (
|
req = webob.Request.blank('/v3/%s/os-volume-transfer/%s/accept' % (
|
||||||
fake.PROJECT_ID, transfer['id']))
|
fake.PROJECT_ID, transfer['id']))
|
||||||
req.body = jsonutils.dump_as_bytes(None)
|
req.body = jsonutils.dump_as_bytes(None)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
@ -394,7 +394,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
volume_id = self._create_volume(size=5)
|
volume_id = self._create_volume(size=5)
|
||||||
transfer = self._create_transfer(volume_id)
|
transfer = self._create_transfer(volume_id)
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer/%s/accept' % (
|
req = webob.Request.blank('/v3/%s/os-volume-transfer/%s/accept' % (
|
||||||
fake.PROJECT_ID, transfer['id']))
|
fake.PROJECT_ID, transfer['id']))
|
||||||
body = {"": {}}
|
body = {"": {}}
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
@ -418,7 +418,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
transfer = self._create_transfer(volume_id)
|
transfer = self._create_transfer(volume_id)
|
||||||
|
|
||||||
body = {"accept": {"auth_key": 1}}
|
body = {"accept": {"auth_key": 1}}
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer/%s/accept' % (
|
req = webob.Request.blank('/v3/%s/os-volume-transfer/%s/accept' % (
|
||||||
fake.PROJECT_ID, transfer['id']))
|
fake.PROJECT_ID, transfer['id']))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -442,7 +442,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
transfer = self._create_transfer(volume_id)
|
transfer = self._create_transfer(volume_id)
|
||||||
|
|
||||||
body = {"accept": {"auth_key": 1}}
|
body = {"accept": {"auth_key": 1}}
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer/%s/accept' % (
|
req = webob.Request.blank('/v3/%s/os-volume-transfer/%s/accept' % (
|
||||||
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
fake.PROJECT_ID, fake.WILL_NOT_BE_FOUND_ID))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -478,7 +478,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
transfer = self._create_transfer(volume_id)
|
transfer = self._create_transfer(volume_id)
|
||||||
|
|
||||||
body = {"accept": {"auth_key": transfer['auth_key']}}
|
body = {"accept": {"auth_key": transfer['auth_key']}}
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer/%s/accept' % (
|
req = webob.Request.blank('/v3/%s/os-volume-transfer/%s/accept' % (
|
||||||
fake.PROJECT_ID, transfer['id']))
|
fake.PROJECT_ID, transfer['id']))
|
||||||
|
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
@ -513,7 +513,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
transfer = self._create_transfer(volume_id)
|
transfer = self._create_transfer(volume_id)
|
||||||
|
|
||||||
body = {"accept": {"auth_key": transfer['auth_key']}}
|
body = {"accept": {"auth_key": transfer['auth_key']}}
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer/%s/accept' % (
|
req = webob.Request.blank('/v3/%s/os-volume-transfer/%s/accept' % (
|
||||||
fake.PROJECT_ID, transfer['id']))
|
fake.PROJECT_ID, transfer['id']))
|
||||||
|
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
@ -537,7 +537,7 @@ class VolumeTransferAPITestCase(test.TestCase):
|
|||||||
transfer = self._create_transfer(volume_id)
|
transfer = self._create_transfer(volume_id)
|
||||||
body = {"accept": {"auth_key": None}}
|
body = {"accept": {"auth_key": None}}
|
||||||
|
|
||||||
req = webob.Request.blank('/v2/%s/os-volume-transfer/%s/accept' % (
|
req = webob.Request.blank('/v3/%s/os-volume-transfer/%s/accept' % (
|
||||||
fake.PROJECT_ID, transfer['id']))
|
fake.PROJECT_ID, transfer['id']))
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
|
@ -18,7 +18,7 @@ from unittest import mock
|
|||||||
import webob
|
import webob
|
||||||
|
|
||||||
from cinder.api.contrib import volume_type_access as type_access
|
from cinder.api.contrib import volume_type_access as type_access
|
||||||
from cinder.api.v2 import types as types_api_v2
|
from cinder.api.v3 import types
|
||||||
from cinder import context
|
from cinder import context
|
||||||
from cinder import db
|
from cinder import db
|
||||||
from cinder import exception
|
from cinder import exception
|
||||||
@ -113,7 +113,7 @@ class VolumeTypeAccessTest(test.TestCase):
|
|||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(VolumeTypeAccessTest, self).setUp()
|
super(VolumeTypeAccessTest, self).setUp()
|
||||||
self.type_controller_v2 = types_api_v2.VolumeTypesController()
|
self.type_controller = types.VolumeTypesController()
|
||||||
self.type_access_controller = type_access.VolumeTypeAccessController()
|
self.type_access_controller = type_access.VolumeTypeAccessController()
|
||||||
self.type_action_controller = type_access.VolumeTypeActionController()
|
self.type_action_controller = type_access.VolumeTypeActionController()
|
||||||
self.req = FakeRequest()
|
self.req = FakeRequest()
|
||||||
@ -132,7 +132,7 @@ class VolumeTypeAccessTest(test.TestCase):
|
|||||||
|
|
||||||
def test_list_type_access_public(self):
|
def test_list_type_access_public(self):
|
||||||
"""Querying os-volume-type-access on public type should return 404."""
|
"""Querying os-volume-type-access on public type should return 404."""
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/os-volume-type-access' %
|
req = fakes.HTTPRequest.blank('/v3/%s/types/os-volume-type-access' %
|
||||||
fake.PROJECT_ID,
|
fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
self.assertRaises(exception.VolumeTypeAccessNotFound,
|
self.assertRaises(exception.VolumeTypeAccessNotFound,
|
||||||
@ -150,7 +150,7 @@ class VolumeTypeAccessTest(test.TestCase):
|
|||||||
self.assertEqual(expected, result)
|
self.assertEqual(expected, result)
|
||||||
|
|
||||||
def test_list_with_no_context(self):
|
def test_list_with_no_context(self):
|
||||||
req = fakes.HTTPRequest.blank('/v2/flavors/%s/flavors' %
|
req = fakes.HTTPRequest.blank('/v3/flavors/%s/flavors' %
|
||||||
fake.PROJECT_ID)
|
fake.PROJECT_ID)
|
||||||
|
|
||||||
def fake_authorize(context, target=None, action=None):
|
def fake_authorize(context, target=None, action=None):
|
||||||
@ -164,10 +164,10 @@ class VolumeTypeAccessTest(test.TestCase):
|
|||||||
def test_list_type_with_admin_default_proj1(self):
|
def test_list_type_with_admin_default_proj1(self):
|
||||||
expected = {'volume_types': [{'id': fake.VOLUME_TYPE_ID},
|
expected = {'volume_types': [{'id': fake.VOLUME_TYPE_ID},
|
||||||
{'id': fake.VOLUME_TYPE2_ID}]}
|
{'id': fake.VOLUME_TYPE2_ID}]}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types' % fake.PROJECT_ID,
|
req = fakes.HTTPRequest.blank('/v3/%s/types' % fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
req.environ['cinder.context'].project_id = PROJ1_UUID
|
req.environ['cinder.context'].project_id = PROJ1_UUID
|
||||||
result = self.type_controller_v2.index(req)
|
result = self.type_controller.index(req)
|
||||||
self.assertVolumeTypeListEqual(expected['volume_types'],
|
self.assertVolumeTypeListEqual(expected['volume_types'],
|
||||||
result['volume_types'])
|
result['volume_types'])
|
||||||
|
|
||||||
@ -175,41 +175,41 @@ class VolumeTypeAccessTest(test.TestCase):
|
|||||||
expected = {'volume_types': [{'id': fake.VOLUME_TYPE_ID},
|
expected = {'volume_types': [{'id': fake.VOLUME_TYPE_ID},
|
||||||
{'id': fake.VOLUME_TYPE2_ID},
|
{'id': fake.VOLUME_TYPE2_ID},
|
||||||
{'id': fake.VOLUME_TYPE3_ID}]}
|
{'id': fake.VOLUME_TYPE3_ID}]}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types' % PROJ2_UUID,
|
req = fakes.HTTPRequest.blank('/v3/%s/types' % PROJ2_UUID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
req.environ['cinder.context'].project_id = PROJ2_UUID
|
req.environ['cinder.context'].project_id = PROJ2_UUID
|
||||||
result = self.type_controller_v2.index(req)
|
result = self.type_controller.index(req)
|
||||||
self.assertVolumeTypeListEqual(expected['volume_types'],
|
self.assertVolumeTypeListEqual(expected['volume_types'],
|
||||||
result['volume_types'])
|
result['volume_types'])
|
||||||
|
|
||||||
def test_list_type_with_admin_ispublic_true(self):
|
def test_list_type_with_admin_ispublic_true(self):
|
||||||
expected = {'volume_types': [{'id': fake.VOLUME_TYPE_ID},
|
expected = {'volume_types': [{'id': fake.VOLUME_TYPE_ID},
|
||||||
{'id': fake.VOLUME_TYPE2_ID}]}
|
{'id': fake.VOLUME_TYPE2_ID}]}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types?is_public=true' %
|
req = fakes.HTTPRequest.blank('/v3/%s/types?is_public=true' %
|
||||||
fake.PROJECT_ID,
|
fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
result = self.type_controller_v2.index(req)
|
result = self.type_controller.index(req)
|
||||||
self.assertVolumeTypeListEqual(expected['volume_types'],
|
self.assertVolumeTypeListEqual(expected['volume_types'],
|
||||||
result['volume_types'])
|
result['volume_types'])
|
||||||
|
|
||||||
def test_list_type_with_admin_ispublic_false(self):
|
def test_list_type_with_admin_ispublic_false(self):
|
||||||
expected = {'volume_types': [{'id': fake.VOLUME_TYPE3_ID},
|
expected = {'volume_types': [{'id': fake.VOLUME_TYPE3_ID},
|
||||||
{'id': fake.VOLUME_TYPE4_ID}]}
|
{'id': fake.VOLUME_TYPE4_ID}]}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types?is_public=false' %
|
req = fakes.HTTPRequest.blank('/v3/%s/types?is_public=false' %
|
||||||
fake.PROJECT_ID,
|
fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
result = self.type_controller_v2.index(req)
|
result = self.type_controller.index(req)
|
||||||
self.assertVolumeTypeListEqual(expected['volume_types'],
|
self.assertVolumeTypeListEqual(expected['volume_types'],
|
||||||
result['volume_types'])
|
result['volume_types'])
|
||||||
|
|
||||||
def test_list_type_with_admin_ispublic_false_proj2(self):
|
def test_list_type_with_admin_ispublic_false_proj2(self):
|
||||||
expected = {'volume_types': [{'id': fake.VOLUME_TYPE3_ID},
|
expected = {'volume_types': [{'id': fake.VOLUME_TYPE3_ID},
|
||||||
{'id': fake.VOLUME_TYPE4_ID}]}
|
{'id': fake.VOLUME_TYPE4_ID}]}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types?is_public=false' %
|
req = fakes.HTTPRequest.blank('/v3/%s/types?is_public=false' %
|
||||||
fake.PROJECT_ID,
|
fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
req.environ['cinder.context'].project_id = PROJ2_UUID
|
req.environ['cinder.context'].project_id = PROJ2_UUID
|
||||||
result = self.type_controller_v2.index(req)
|
result = self.type_controller.index(req)
|
||||||
self.assertVolumeTypeListEqual(expected['volume_types'],
|
self.assertVolumeTypeListEqual(expected['volume_types'],
|
||||||
result['volume_types'])
|
result['volume_types'])
|
||||||
|
|
||||||
@ -218,49 +218,49 @@ class VolumeTypeAccessTest(test.TestCase):
|
|||||||
{'id': fake.VOLUME_TYPE2_ID},
|
{'id': fake.VOLUME_TYPE2_ID},
|
||||||
{'id': fake.VOLUME_TYPE3_ID},
|
{'id': fake.VOLUME_TYPE3_ID},
|
||||||
{'id': fake.VOLUME_TYPE4_ID}]}
|
{'id': fake.VOLUME_TYPE4_ID}]}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types?is_public=none' %
|
req = fakes.HTTPRequest.blank('/v3/%s/types?is_public=none' %
|
||||||
fake.PROJECT_ID,
|
fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
result = self.type_controller_v2.index(req)
|
result = self.type_controller.index(req)
|
||||||
self.assertVolumeTypeListEqual(expected['volume_types'],
|
self.assertVolumeTypeListEqual(expected['volume_types'],
|
||||||
result['volume_types'])
|
result['volume_types'])
|
||||||
|
|
||||||
def test_list_type_with_no_admin_default(self):
|
def test_list_type_with_no_admin_default(self):
|
||||||
expected = {'volume_types': [{'id': fake.VOLUME_TYPE_ID},
|
expected = {'volume_types': [{'id': fake.VOLUME_TYPE_ID},
|
||||||
{'id': fake.VOLUME_TYPE2_ID}]}
|
{'id': fake.VOLUME_TYPE2_ID}]}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types' % fake.PROJECT_ID,
|
req = fakes.HTTPRequest.blank('/v3/%s/types' % fake.PROJECT_ID,
|
||||||
use_admin_context=False)
|
use_admin_context=False)
|
||||||
result = self.type_controller_v2.index(req)
|
result = self.type_controller.index(req)
|
||||||
self.assertVolumeTypeListEqual(expected['volume_types'],
|
self.assertVolumeTypeListEqual(expected['volume_types'],
|
||||||
result['volume_types'])
|
result['volume_types'])
|
||||||
|
|
||||||
def test_list_type_with_no_admin_ispublic_true(self):
|
def test_list_type_with_no_admin_ispublic_true(self):
|
||||||
expected = {'volume_types': [{'id': fake.VOLUME_TYPE_ID},
|
expected = {'volume_types': [{'id': fake.VOLUME_TYPE_ID},
|
||||||
{'id': fake.VOLUME_TYPE2_ID}]}
|
{'id': fake.VOLUME_TYPE2_ID}]}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types?is_public=true' %
|
req = fakes.HTTPRequest.blank('/v3/%s/types?is_public=true' %
|
||||||
fake.PROJECT_ID,
|
fake.PROJECT_ID,
|
||||||
use_admin_context=False)
|
use_admin_context=False)
|
||||||
result = self.type_controller_v2.index(req)
|
result = self.type_controller.index(req)
|
||||||
self.assertVolumeTypeListEqual(expected['volume_types'],
|
self.assertVolumeTypeListEqual(expected['volume_types'],
|
||||||
result['volume_types'])
|
result['volume_types'])
|
||||||
|
|
||||||
def test_list_type_with_no_admin_ispublic_false(self):
|
def test_list_type_with_no_admin_ispublic_false(self):
|
||||||
expected = {'volume_types': [{'id': fake.VOLUME_TYPE_ID},
|
expected = {'volume_types': [{'id': fake.VOLUME_TYPE_ID},
|
||||||
{'id': fake.VOLUME_TYPE2_ID}]}
|
{'id': fake.VOLUME_TYPE2_ID}]}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types?is_public=false' %
|
req = fakes.HTTPRequest.blank('/v3/%s/types?is_public=false' %
|
||||||
fake.PROJECT_ID,
|
fake.PROJECT_ID,
|
||||||
use_admin_context=False)
|
use_admin_context=False)
|
||||||
result = self.type_controller_v2.index(req)
|
result = self.type_controller.index(req)
|
||||||
self.assertVolumeTypeListEqual(expected['volume_types'],
|
self.assertVolumeTypeListEqual(expected['volume_types'],
|
||||||
result['volume_types'])
|
result['volume_types'])
|
||||||
|
|
||||||
def test_list_type_with_no_admin_ispublic_none(self):
|
def test_list_type_with_no_admin_ispublic_none(self):
|
||||||
expected = {'volume_types': [{'id': fake.VOLUME_TYPE_ID},
|
expected = {'volume_types': [{'id': fake.VOLUME_TYPE_ID},
|
||||||
{'id': fake.VOLUME_TYPE2_ID}]}
|
{'id': fake.VOLUME_TYPE2_ID}]}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types?is_public=none' %
|
req = fakes.HTTPRequest.blank('/v3/%s/types?is_public=none' %
|
||||||
fake.PROJECT_ID,
|
fake.PROJECT_ID,
|
||||||
use_admin_context=False)
|
use_admin_context=False)
|
||||||
result = self.type_controller_v2.index(req)
|
result = self.type_controller.index(req)
|
||||||
self.assertVolumeTypeListEqual(expected['volume_types'],
|
self.assertVolumeTypeListEqual(expected['volume_types'],
|
||||||
result['volume_types'])
|
result['volume_types'])
|
||||||
|
|
||||||
@ -295,7 +295,7 @@ class VolumeTypeAccessTest(test.TestCase):
|
|||||||
self.mock_object(db, 'volume_type_access_add',
|
self.mock_object(db, 'volume_type_access_add',
|
||||||
fake_add_volume_type_access)
|
fake_add_volume_type_access)
|
||||||
body = {'addProjectAccess': {'project': PROJ2_UUID}}
|
body = {'addProjectAccess': {'project': PROJ2_UUID}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s/action' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_TYPE3_ID),
|
fake.PROJECT_ID, fake.VOLUME_TYPE3_ID),
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
result = self.type_action_controller._addProjectAccess(
|
result = self.type_action_controller._addProjectAccess(
|
||||||
@ -303,7 +303,7 @@ class VolumeTypeAccessTest(test.TestCase):
|
|||||||
self.assertEqual(HTTPStatus.ACCEPTED, result.status_code)
|
self.assertEqual(HTTPStatus.ACCEPTED, result.status_code)
|
||||||
|
|
||||||
def test_add_project_access_with_no_admin_user(self):
|
def test_add_project_access_with_no_admin_user(self):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s/action' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_TYPE3_ID),
|
fake.PROJECT_ID, fake.VOLUME_TYPE3_ID),
|
||||||
use_admin_context=False)
|
use_admin_context=False)
|
||||||
body = {'addProjectAccess': {'project': PROJ2_UUID}}
|
body = {'addProjectAccess': {'project': PROJ2_UUID}}
|
||||||
@ -318,7 +318,7 @@ class VolumeTypeAccessTest(test.TestCase):
|
|||||||
self.mock_object(db, 'volume_type_access_add',
|
self.mock_object(db, 'volume_type_access_add',
|
||||||
fake_add_volume_type_access)
|
fake_add_volume_type_access)
|
||||||
body = {'addProjectAccess': {'project': PROJ2_UUID}}
|
body = {'addProjectAccess': {'project': PROJ2_UUID}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s/action' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_TYPE3_ID), use_admin_context=True)
|
fake.PROJECT_ID, fake.VOLUME_TYPE3_ID), use_admin_context=True)
|
||||||
self.assertRaises(webob.exc.HTTPConflict,
|
self.assertRaises(webob.exc.HTTPConflict,
|
||||||
self.type_action_controller._addProjectAccess,
|
self.type_action_controller._addProjectAccess,
|
||||||
@ -331,14 +331,14 @@ class VolumeTypeAccessTest(test.TestCase):
|
|||||||
self.mock_object(db, 'volume_type_access_remove',
|
self.mock_object(db, 'volume_type_access_remove',
|
||||||
fake_remove_volume_type_access)
|
fake_remove_volume_type_access)
|
||||||
body = {'removeProjectAccess': {'project': PROJ2_UUID}}
|
body = {'removeProjectAccess': {'project': PROJ2_UUID}}
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s/action' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_TYPE3_ID), use_admin_context=True)
|
fake.PROJECT_ID, fake.VOLUME_TYPE3_ID), use_admin_context=True)
|
||||||
self.assertRaises(exception.VolumeTypeAccessNotFound,
|
self.assertRaises(exception.VolumeTypeAccessNotFound,
|
||||||
self.type_action_controller._removeProjectAccess,
|
self.type_action_controller._removeProjectAccess,
|
||||||
req, fake.VOLUME_TYPE4_ID, body=body)
|
req, fake.VOLUME_TYPE4_ID, body=body)
|
||||||
|
|
||||||
def test_remove_project_access_with_no_admin_user(self):
|
def test_remove_project_access_with_no_admin_user(self):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s/action' % (
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s/action' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_TYPE3_ID), use_admin_context=False)
|
fake.PROJECT_ID, fake.VOLUME_TYPE3_ID), use_admin_context=False)
|
||||||
body = {'removeProjectAccess': {'project': PROJ2_UUID}}
|
body = {'removeProjectAccess': {'project': PROJ2_UUID}}
|
||||||
self.assertRaises(exception.PolicyNotAuthorized,
|
self.assertRaises(exception.PolicyNotAuthorized,
|
||||||
|
@ -49,12 +49,12 @@ class VolumeTypeEncryptionTest(test.TestCase):
|
|||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(VolumeTypeEncryptionTest, self).setUp()
|
super(VolumeTypeEncryptionTest, self).setUp()
|
||||||
self.flags(host='fake')
|
self.flags(host='fake')
|
||||||
self.api_path = '/v2/%s/os-volume-types/%s/encryption' % (
|
self.api_path = '/v3/%s/types/%s/encryption' % (
|
||||||
fake.PROJECT_ID, fake.VOLUME_TYPE_ID)
|
fake.PROJECT_ID, fake.VOLUME_TYPE_ID)
|
||||||
"""to reset notifier drivers left over from other api/contrib tests"""
|
"""to reset notifier drivers left over from other api/contrib tests"""
|
||||||
|
|
||||||
def _get_response(self, volume_type, admin=True,
|
def _get_response(self, volume_type, admin=True,
|
||||||
url='/v2/%s/types/%s/encryption',
|
url='/v3/%s/types/%s/encryption',
|
||||||
req_method='GET', req_body=None,
|
req_method='GET', req_body=None,
|
||||||
req_headers=None):
|
req_headers=None):
|
||||||
ctxt = context.RequestContext(fake.USER_ID, fake.PROJECT_ID,
|
ctxt = context.RequestContext(fake.USER_ID, fake.PROJECT_ID,
|
||||||
@ -113,7 +113,7 @@ class VolumeTypeEncryptionTest(test.TestCase):
|
|||||||
volume_type = self._default_volume_type
|
volume_type = self._default_volume_type
|
||||||
self._create_type_and_encryption(volume_type)
|
self._create_type_and_encryption(volume_type)
|
||||||
res = self._get_response(volume_type,
|
res = self._get_response(volume_type,
|
||||||
url='/v2/%s/types/%s/encryption/key_size')
|
url='/v3/%s/types/%s/encryption/key_size')
|
||||||
res_dict = jsonutils.loads(res.body)
|
res_dict = jsonutils.loads(res.body)
|
||||||
|
|
||||||
self.assertEqual(HTTPStatus.OK, res.status_code)
|
self.assertEqual(HTTPStatus.OK, res.status_code)
|
||||||
@ -126,7 +126,7 @@ class VolumeTypeEncryptionTest(test.TestCase):
|
|||||||
self._create_type_and_encryption(volume_type)
|
self._create_type_and_encryption(volume_type)
|
||||||
|
|
||||||
res = self._get_response(volume_type,
|
res = self._get_response(volume_type,
|
||||||
url='/v2/%s/types/%s/encryption/provider')
|
url='/v3/%s/types/%s/encryption/provider')
|
||||||
res_dict = jsonutils.loads(res.body)
|
res_dict = jsonutils.loads(res.body)
|
||||||
|
|
||||||
self.assertEqual(HTTPStatus.OK, res.status_code)
|
self.assertEqual(HTTPStatus.OK, res.status_code)
|
||||||
@ -138,7 +138,7 @@ class VolumeTypeEncryptionTest(test.TestCase):
|
|||||||
self._create_type_and_encryption(volume_type)
|
self._create_type_and_encryption(volume_type)
|
||||||
|
|
||||||
res = self._get_response(volume_type,
|
res = self._get_response(volume_type,
|
||||||
url='/v2/%s/types/%s/encryption/fake')
|
url='/v3/%s/types/%s/encryption/fake')
|
||||||
res_dict = jsonutils.loads(res.body)
|
res_dict = jsonutils.loads(res.body)
|
||||||
|
|
||||||
self.assertEqual(HTTPStatus.NOT_FOUND, res.status_code)
|
self.assertEqual(HTTPStatus.NOT_FOUND, res.status_code)
|
||||||
@ -364,7 +364,7 @@ class VolumeTypeEncryptionTest(test.TestCase):
|
|||||||
|
|
||||||
res = self._get_response(volume_type, req_method='GET',
|
res = self._get_response(volume_type, req_method='GET',
|
||||||
req_headers='application/json',
|
req_headers='application/json',
|
||||||
url='/v2/%s/types/%s/encryption')
|
url='/v3/%s/types/%s/encryption')
|
||||||
self.assertEqual(HTTPStatus.OK, res.status_code)
|
self.assertEqual(HTTPStatus.OK, res.status_code)
|
||||||
res_dict = jsonutils.loads(res.body)
|
res_dict = jsonutils.loads(res.body)
|
||||||
self.assertEqual(volume_type['id'], res_dict['volume_type_id'])
|
self.assertEqual(volume_type['id'], res_dict['volume_type_id'])
|
||||||
@ -372,12 +372,12 @@ class VolumeTypeEncryptionTest(test.TestCase):
|
|||||||
# Delete, and test that get returns nothing
|
# Delete, and test that get returns nothing
|
||||||
res = self._get_response(volume_type, req_method='DELETE',
|
res = self._get_response(volume_type, req_method='DELETE',
|
||||||
req_headers='application/json',
|
req_headers='application/json',
|
||||||
url='/v2/%s/types/%s/encryption/provider')
|
url='/v3/%s/types/%s/encryption/provider')
|
||||||
self.assertEqual(HTTPStatus.ACCEPTED, res.status_code)
|
self.assertEqual(HTTPStatus.ACCEPTED, res.status_code)
|
||||||
self.assertEqual(0, len(res.body))
|
self.assertEqual(0, len(res.body))
|
||||||
res = self._get_response(volume_type, req_method='GET',
|
res = self._get_response(volume_type, req_method='GET',
|
||||||
req_headers='application/json',
|
req_headers='application/json',
|
||||||
url='/v2/%s/types/%s/encryption')
|
url='/v3/%s/types/%s/encryption')
|
||||||
self.assertEqual(HTTPStatus.OK, res.status_code)
|
self.assertEqual(HTTPStatus.OK, res.status_code)
|
||||||
res_dict = jsonutils.loads(res.body)
|
res_dict = jsonutils.loads(res.body)
|
||||||
self.assertEqual({}, res_dict)
|
self.assertEqual({}, res_dict)
|
||||||
@ -401,7 +401,7 @@ class VolumeTypeEncryptionTest(test.TestCase):
|
|||||||
req_headers='application/json')
|
req_headers='application/json')
|
||||||
res = self._get_response(volume_type, req_method='GET',
|
res = self._get_response(volume_type, req_method='GET',
|
||||||
req_headers='application/json',
|
req_headers='application/json',
|
||||||
url='/v2/%s/types/%s/encryption')
|
url='/v3/%s/types/%s/encryption')
|
||||||
self.assertEqual(HTTPStatus.OK, res.status_code)
|
self.assertEqual(HTTPStatus.OK, res.status_code)
|
||||||
res_dict = jsonutils.loads(res.body)
|
res_dict = jsonutils.loads(res.body)
|
||||||
self.assertEqual(volume_type['id'], res_dict['volume_type_id'])
|
self.assertEqual(volume_type['id'], res_dict['volume_type_id'])
|
||||||
@ -428,7 +428,7 @@ class VolumeTypeEncryptionTest(test.TestCase):
|
|||||||
# Delete, and test that there is an error since volumes exist
|
# Delete, and test that there is an error since volumes exist
|
||||||
res = self._get_response(volume_type, req_method='DELETE',
|
res = self._get_response(volume_type, req_method='DELETE',
|
||||||
req_headers='application/json',
|
req_headers='application/json',
|
||||||
url='/v2/%s/types/%s/encryption/provider')
|
url='/v3/%s/types/%s/encryption/provider')
|
||||||
self.assertEqual(HTTPStatus.BAD_REQUEST, res.status_code)
|
self.assertEqual(HTTPStatus.BAD_REQUEST, res.status_code)
|
||||||
res_dict = jsonutils.loads(res.body)
|
res_dict = jsonutils.loads(res.body)
|
||||||
expected = {
|
expected = {
|
||||||
@ -447,12 +447,12 @@ class VolumeTypeEncryptionTest(test.TestCase):
|
|||||||
# Delete, and test that get returns nothing
|
# Delete, and test that get returns nothing
|
||||||
res = self._get_response(volume_type, req_method='DELETE',
|
res = self._get_response(volume_type, req_method='DELETE',
|
||||||
req_headers='application/json',
|
req_headers='application/json',
|
||||||
url='/v2/%s/types/%s/encryption/provider')
|
url='/v3/%s/types/%s/encryption/provider')
|
||||||
self.assertEqual(HTTPStatus.ACCEPTED, res.status_code)
|
self.assertEqual(HTTPStatus.ACCEPTED, res.status_code)
|
||||||
self.assertEqual(0, len(res.body))
|
self.assertEqual(0, len(res.body))
|
||||||
res = self._get_response(volume_type, req_method='GET',
|
res = self._get_response(volume_type, req_method='GET',
|
||||||
req_headers='application/json',
|
req_headers='application/json',
|
||||||
url='/v2/%s/types/%s/encryption')
|
url='/v3/%s/types/%s/encryption')
|
||||||
self.assertEqual(HTTPStatus.OK, res.status_code)
|
self.assertEqual(HTTPStatus.OK, res.status_code)
|
||||||
res_dict = jsonutils.loads(res.body)
|
res_dict = jsonutils.loads(res.body)
|
||||||
self.assertEqual({}, res_dict)
|
self.assertEqual({}, res_dict)
|
||||||
@ -468,7 +468,7 @@ class VolumeTypeEncryptionTest(test.TestCase):
|
|||||||
# and check if 404 is raised.
|
# and check if 404 is raised.
|
||||||
res = self._get_response(volume_type, req_method='DELETE',
|
res = self._get_response(volume_type, req_method='DELETE',
|
||||||
req_headers='application/json',
|
req_headers='application/json',
|
||||||
url='/v2/%s/types/%s/encryption/provider')
|
url='/v3/%s/types/%s/encryption/provider')
|
||||||
self.assertEqual(HTTPStatus.NOT_FOUND, res.status_code)
|
self.assertEqual(HTTPStatus.NOT_FOUND, res.status_code)
|
||||||
expected = {
|
expected = {
|
||||||
"itemNotFound": {
|
"itemNotFound": {
|
||||||
@ -498,7 +498,7 @@ class VolumeTypeEncryptionTest(test.TestCase):
|
|||||||
_get_response(volume_type, req_method='PUT',
|
_get_response(volume_type, req_method='PUT',
|
||||||
req_body=jsonutils.dump_as_bytes(update_body),
|
req_body=jsonutils.dump_as_bytes(update_body),
|
||||||
req_headers='application/json',
|
req_headers='application/json',
|
||||||
url='/v2/%s/types/%s/encryption/' +
|
url='/v3/%s/types/%s/encryption/' +
|
||||||
fake.ENCRYPTION_KEY_ID)
|
fake.ENCRYPTION_KEY_ID)
|
||||||
|
|
||||||
res_dict = jsonutils.loads(res.body)
|
res_dict = jsonutils.loads(res.body)
|
||||||
@ -525,7 +525,7 @@ class VolumeTypeEncryptionTest(test.TestCase):
|
|||||||
_get_response(volume_type, req_method='PUT',
|
_get_response(volume_type, req_method='PUT',
|
||||||
req_body=jsonutils.dump_as_bytes(update_body),
|
req_body=jsonutils.dump_as_bytes(update_body),
|
||||||
req_headers='application/json',
|
req_headers='application/json',
|
||||||
url='/v2/%s/types/%s/encryption/' +
|
url='/v3/%s/types/%s/encryption/' +
|
||||||
fake.ENCRYPTION_KEY_ID)
|
fake.ENCRYPTION_KEY_ID)
|
||||||
res_dict = jsonutils.loads(res.body)
|
res_dict = jsonutils.loads(res.body)
|
||||||
|
|
||||||
@ -584,7 +584,7 @@ class VolumeTypeEncryptionTest(test.TestCase):
|
|||||||
_get_response(volume_type, req_method='PUT',
|
_get_response(volume_type, req_method='PUT',
|
||||||
req_body=jsonutils.dump_as_bytes(update_body),
|
req_body=jsonutils.dump_as_bytes(update_body),
|
||||||
req_headers='application/json',
|
req_headers='application/json',
|
||||||
url='/v2/%s/types/%s/encryption/' +
|
url='/v3/%s/types/%s/encryption/' +
|
||||||
fake.ENCRYPTION_KEY_ID)
|
fake.ENCRYPTION_KEY_ID)
|
||||||
self.assertEqual(HTTPStatus.BAD_REQUEST, res.status_code)
|
self.assertEqual(HTTPStatus.BAD_REQUEST, res.status_code)
|
||||||
res_dict = jsonutils.loads(res.body)
|
res_dict = jsonutils.loads(res.body)
|
||||||
|
@ -46,13 +46,13 @@ class VolumeUnmanageTest(test.TestCase):
|
|||||||
super(VolumeUnmanageTest, self).setUp()
|
super(VolumeUnmanageTest, self).setUp()
|
||||||
self.ctxt = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
self.ctxt = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
|
||||||
|
|
||||||
api = fakes.router.APIRouter()
|
api = fakes.router_v3.APIRouter()
|
||||||
self.app = fakes.urlmap.URLMap()
|
self.app = fakes.urlmap.URLMap()
|
||||||
self.app['/v2'] = api
|
self.app['/v3'] = api
|
||||||
|
|
||||||
def _get_resp(self, volume_id):
|
def _get_resp(self, volume_id):
|
||||||
"""Helper to build an os-unmanage req for the specified volume_id."""
|
"""Helper to build an os-unmanage req for the specified volume_id."""
|
||||||
req = webob.Request.blank('/v2/%s/volumes/%s/action' %
|
req = webob.Request.blank('/v3/%s/volumes/%s/action' %
|
||||||
(self.ctxt.project_id, volume_id))
|
(self.ctxt.project_id, volume_id))
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
|
@ -27,8 +27,7 @@ from cinder.api.middleware import fault
|
|||||||
from cinder.api.openstack import api_version_request as api_version
|
from cinder.api.openstack import api_version_request as api_version
|
||||||
from cinder.api.openstack import wsgi as os_wsgi
|
from cinder.api.openstack import wsgi as os_wsgi
|
||||||
from cinder.api import urlmap
|
from cinder.api import urlmap
|
||||||
from cinder.api.v2 import limits
|
from cinder.api.v3 import limits
|
||||||
from cinder.api.v2 import router
|
|
||||||
from cinder.api.v3 import router as router_v3
|
from cinder.api.v3 import router as router_v3
|
||||||
from cinder.api import versions
|
from cinder.api import versions
|
||||||
from cinder import context
|
from cinder import context
|
||||||
@ -63,8 +62,6 @@ def fake_wsgi(self, req):
|
|||||||
def wsgi_app(inner_app_v2=None, fake_auth=True, fake_auth_context=None,
|
def wsgi_app(inner_app_v2=None, fake_auth=True, fake_auth_context=None,
|
||||||
use_no_auth=False, ext_mgr=None,
|
use_no_auth=False, ext_mgr=None,
|
||||||
inner_app_v3=None):
|
inner_app_v3=None):
|
||||||
if not inner_app_v2:
|
|
||||||
inner_app_v2 = router.APIRouter(ext_mgr)
|
|
||||||
|
|
||||||
if not inner_app_v3:
|
if not inner_app_v3:
|
||||||
inner_app_v3 = router_v3.APIRouter(ext_mgr)
|
inner_app_v3 = router_v3.APIRouter(ext_mgr)
|
||||||
@ -75,23 +72,16 @@ def wsgi_app(inner_app_v2=None, fake_auth=True, fake_auth_context=None,
|
|||||||
else:
|
else:
|
||||||
ctxt = context.RequestContext(fake.USER_ID, fake.PROJECT_ID,
|
ctxt = context.RequestContext(fake.USER_ID, fake.PROJECT_ID,
|
||||||
auth_token=True)
|
auth_token=True)
|
||||||
api_v2 = fault.FaultWrapper(auth.InjectContext(ctxt,
|
|
||||||
inner_app_v2))
|
|
||||||
api_v3 = fault.FaultWrapper(auth.InjectContext(ctxt,
|
api_v3 = fault.FaultWrapper(auth.InjectContext(ctxt,
|
||||||
inner_app_v3))
|
inner_app_v3))
|
||||||
elif use_no_auth:
|
elif use_no_auth:
|
||||||
api_v2 = fault.FaultWrapper(auth.NoAuthMiddleware(
|
|
||||||
limits.RateLimitingMiddleware(inner_app_v2)))
|
|
||||||
api_v3 = fault.FaultWrapper(auth.NoAuthMiddleware(
|
api_v3 = fault.FaultWrapper(auth.NoAuthMiddleware(
|
||||||
limits.RateLimitingMiddleware(inner_app_v3)))
|
limits.RateLimitingMiddleware(inner_app_v3)))
|
||||||
else:
|
else:
|
||||||
api_v2 = fault.FaultWrapper(auth.AuthMiddleware(
|
|
||||||
limits.RateLimitingMiddleware(inner_app_v2)))
|
|
||||||
api_v3 = fault.FaultWrapper(auth.AuthMiddleware(
|
api_v3 = fault.FaultWrapper(auth.AuthMiddleware(
|
||||||
limits.RateLimitingMiddleware(inner_app_v3)))
|
limits.RateLimitingMiddleware(inner_app_v3)))
|
||||||
|
|
||||||
mapper = urlmap.URLMap()
|
mapper = urlmap.URLMap()
|
||||||
mapper['/v2'] = api_v2
|
|
||||||
mapper['/v3'] = api_v3
|
mapper['/v3'] = api_v3
|
||||||
mapper['/'] = fault.FaultWrapper(versions.VersionsController())
|
mapper['/'] = fault.FaultWrapper(versions.VersionsController())
|
||||||
return mapper
|
return mapper
|
||||||
|
@ -61,8 +61,7 @@ class VersionsControllerTestCase(test.TestCase):
|
|||||||
response.headers[VERSION_HEADER_NAME])
|
response.headers[VERSION_HEADER_NAME])
|
||||||
self.assertEqual(VERSION_HEADER_NAME, response.headers['Vary'])
|
self.assertEqual(VERSION_HEADER_NAME, response.headers['Vary'])
|
||||||
|
|
||||||
@ddt.data('2.0', '3.0')
|
def test_versions_root(self):
|
||||||
def test_versions_root(self, version):
|
|
||||||
req = self.build_request(base_url='http://localhost')
|
req = self.build_request(base_url='http://localhost')
|
||||||
|
|
||||||
response = req.get_response(versions.Versions())
|
response = req.get_response(versions.Versions())
|
||||||
@ -71,11 +70,8 @@ class VersionsControllerTestCase(test.TestCase):
|
|||||||
version_list = body['versions']
|
version_list = body['versions']
|
||||||
|
|
||||||
ids = [v['id'] for v in version_list]
|
ids = [v['id'] for v in version_list]
|
||||||
self.assertEqual({'v2.0', 'v3.0'}, set(ids))
|
self.assertEqual(1, len(ids))
|
||||||
|
self.assertIn('v3.0', ids)
|
||||||
v2 = [v for v in version_list if v['id'] == 'v2.0'][0]
|
|
||||||
self.assertEqual('', v2.get('min_version'))
|
|
||||||
self.assertEqual('', v2.get('version'))
|
|
||||||
|
|
||||||
v3 = [v for v in version_list if v['id'] == 'v3.0'][0]
|
v3 = [v for v in version_list if v['id'] == 'v3.0'][0]
|
||||||
self.assertEqual(api_version_request._MAX_API_VERSION,
|
self.assertEqual(api_version_request._MAX_API_VERSION,
|
||||||
@ -83,53 +79,36 @@ class VersionsControllerTestCase(test.TestCase):
|
|||||||
self.assertEqual(api_version_request._MIN_API_VERSION,
|
self.assertEqual(api_version_request._MIN_API_VERSION,
|
||||||
v3.get('min_version'))
|
v3.get('min_version'))
|
||||||
|
|
||||||
@ddt.data('2.0', '3.0')
|
def test_all_versions_excludes_disabled(self):
|
||||||
def test_all_versions_excludes_disabled(self, version):
|
version = '3.0'
|
||||||
self.fixture = self.useFixture(config_fixture.Config(CONF))
|
self.fixture = self.useFixture(config_fixture.Config(CONF))
|
||||||
if version == '2.0':
|
|
||||||
self.fixture.config(enable_v2_api=False)
|
|
||||||
elif version == '3.0':
|
|
||||||
self.fixture.config(enable_v3_api=False)
|
self.fixture.config(enable_v3_api=False)
|
||||||
else:
|
|
||||||
return
|
|
||||||
vc = versions.VersionsController()
|
vc = versions.VersionsController()
|
||||||
req = self.build_request(base_url='http://localhost')
|
req = self.build_request(base_url='http://localhost')
|
||||||
resp = vc.all(req)
|
resp = vc.all(req)
|
||||||
all_versions = [x['id'] for x in resp['versions']]
|
all_versions = [x['id'] for x in resp['versions']]
|
||||||
self.assertNotIn('v' + version, all_versions)
|
self.assertNotIn('v' + version, all_versions)
|
||||||
|
|
||||||
def test_versions_v2_no_header(self):
|
def test_versions(self):
|
||||||
req = self.build_request(base_url='http://localhost/v2')
|
version = '3.0'
|
||||||
|
|
||||||
response = req.get_response(router.APIRouter())
|
|
||||||
self.assertEqual(HTTPStatus.OK, response.status_int)
|
|
||||||
|
|
||||||
@ddt.data('2.0', '3.0')
|
|
||||||
def test_versions(self, version):
|
|
||||||
req = self.build_request(
|
req = self.build_request(
|
||||||
base_url='http://localhost/v{}'.format(version[0]),
|
base_url='http://localhost/v{}'.format(version[0]),
|
||||||
header_version=version)
|
header_version=version)
|
||||||
|
|
||||||
if version is not None:
|
|
||||||
req.headers = {VERSION_HEADER_NAME: VOLUME_SERVICE + version}
|
|
||||||
|
|
||||||
response = req.get_response(router.APIRouter())
|
response = req.get_response(router.APIRouter())
|
||||||
self.assertEqual(HTTPStatus.OK, response.status_int)
|
self.assertEqual(HTTPStatus.OK, response.status_int)
|
||||||
body = jsonutils.loads(response.body)
|
body = jsonutils.loads(response.body)
|
||||||
version_list = body['versions']
|
version_list = body['versions']
|
||||||
|
|
||||||
ids = [v['id'] for v in version_list]
|
ids = [v['id'] for v in version_list]
|
||||||
self.assertEqual({'v{}'.format(version)}, set(ids))
|
self.assertEqual(1, len(ids))
|
||||||
|
self.assertIn('v{}'.format(version), ids)
|
||||||
|
|
||||||
if version == '3.0':
|
|
||||||
self.check_response(response, version)
|
self.check_response(response, version)
|
||||||
self.assertEqual(api_version_request._MAX_API_VERSION,
|
self.assertEqual(api_version_request._MAX_API_VERSION,
|
||||||
version_list[0].get('version'))
|
version_list[0].get('version'))
|
||||||
self.assertEqual(api_version_request._MIN_API_VERSION,
|
self.assertEqual(api_version_request._MIN_API_VERSION,
|
||||||
version_list[0].get('min_version'))
|
version_list[0].get('min_version'))
|
||||||
else:
|
|
||||||
self.assertEqual('', version_list[0].get('min_version'))
|
|
||||||
self.assertEqual('', version_list[0].get('version'))
|
|
||||||
|
|
||||||
def test_versions_version_latest(self):
|
def test_versions_version_latest(self):
|
||||||
req = self.build_request(header_version='latest')
|
req = self.build_request(header_version='latest')
|
||||||
@ -147,8 +126,8 @@ class VersionsControllerTestCase(test.TestCase):
|
|||||||
|
|
||||||
self.assertEqual(HTTPStatus.BAD_REQUEST, response.status_int)
|
self.assertEqual(HTTPStatus.BAD_REQUEST, response.status_int)
|
||||||
|
|
||||||
@ddt.data('2.0', '3.0')
|
def test_versions_response_fault(self):
|
||||||
def test_versions_response_fault(self, version):
|
version = '3.0'
|
||||||
req = self.build_request(header_version=version)
|
req = self.build_request(header_version=version)
|
||||||
req.api_version_request = (
|
req.api_version_request = (
|
||||||
api_version_request.APIVersionRequest(version))
|
api_version_request.APIVersionRequest(version))
|
||||||
@ -157,10 +136,7 @@ class VersionsControllerTestCase(test.TestCase):
|
|||||||
response = req.get_response(app)
|
response = req.get_response(app)
|
||||||
|
|
||||||
self.assertEqual(HTTPStatus.BAD_REQUEST, response.status_int)
|
self.assertEqual(HTTPStatus.BAD_REQUEST, response.status_int)
|
||||||
if version == '3.0':
|
|
||||||
self.check_response(response, '3.0')
|
self.check_response(response, '3.0')
|
||||||
else:
|
|
||||||
self.assertNotIn(VERSION_HEADER_NAME, response.headers)
|
|
||||||
|
|
||||||
def test_versions_inheritance_internals_of_non_base_controller(self):
|
def test_versions_inheritance_internals_of_non_base_controller(self):
|
||||||
"""Test ControllerMetaclass works inheriting from non base class."""
|
"""Test ControllerMetaclass works inheriting from non base class."""
|
||||||
|
@ -14,6 +14,7 @@ import datetime
|
|||||||
|
|
||||||
import iso8601
|
import iso8601
|
||||||
|
|
||||||
|
from cinder.objects import fields
|
||||||
from cinder.tests.unit import fake_constants as fake
|
from cinder.tests.unit import fake_constants as fake
|
||||||
from cinder.tests.unit import fake_volume
|
from cinder.tests.unit import fake_volume
|
||||||
from cinder import utils
|
from cinder import utils
|
||||||
@ -115,3 +116,46 @@ def fake_volume_create(self, context, size, name, description, snapshot=None,
|
|||||||
if group_id:
|
if group_id:
|
||||||
vol['group_id'] = group_id
|
vol['group_id'] = group_id
|
||||||
return vol
|
return vol
|
||||||
|
|
||||||
|
|
||||||
|
def fake_volume_type_get(context, id, *args, **kwargs):
|
||||||
|
return {'id': id,
|
||||||
|
'name': 'vol_type_name',
|
||||||
|
'description': 'A fake volume type',
|
||||||
|
'is_public': True,
|
||||||
|
'projects': [],
|
||||||
|
'extra_specs': {},
|
||||||
|
'created_at': None,
|
||||||
|
'deleted_at': None,
|
||||||
|
'updated_at': None,
|
||||||
|
'qos_specs_id': fake.QOS_SPEC_ID,
|
||||||
|
'deleted': False}
|
||||||
|
|
||||||
|
|
||||||
|
def fake_default_type_get(id=fake.VOLUME_TYPE_ID):
|
||||||
|
return {'id': id,
|
||||||
|
'name': 'vol_type_name',
|
||||||
|
'description': 'A fake volume type',
|
||||||
|
'is_public': True,
|
||||||
|
'projects': [],
|
||||||
|
'extra_specs': {},
|
||||||
|
'created_at': None,
|
||||||
|
'deleted_at': None,
|
||||||
|
'updated_at': None,
|
||||||
|
'qos_specs_id': fake.QOS_SPEC_ID,
|
||||||
|
'deleted': False}
|
||||||
|
|
||||||
|
|
||||||
|
def fake_snapshot(id, **kwargs):
|
||||||
|
snapshot = {'id': id,
|
||||||
|
'volume_id': fake.VOLUME_ID,
|
||||||
|
'status': fields.SnapshotStatus.AVAILABLE,
|
||||||
|
'volume_size': 100,
|
||||||
|
'created_at': None,
|
||||||
|
'display_name': 'Default name',
|
||||||
|
'display_description': 'Default description',
|
||||||
|
'project_id': fake.PROJECT_ID,
|
||||||
|
'snapshot_metadata': []}
|
||||||
|
|
||||||
|
snapshot.update(kwargs)
|
||||||
|
return snapshot
|
||||||
|
@ -259,7 +259,7 @@ class BackupsControllerAPITestCase(test.TestCase):
|
|||||||
|
|
||||||
# backup update call doesn't return 'description' in response so get
|
# backup update call doesn't return 'description' in response so get
|
||||||
# the updated backup to assert name and description
|
# the updated backup to assert name and description
|
||||||
req = webob.Request.blank('/v2/%s/backups/%s' % (
|
req = webob.Request.blank('/v3/%s/backups/%s' % (
|
||||||
fake.PROJECT_ID, backup.id))
|
fake.PROJECT_ID, backup.id))
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
|
@ -22,15 +22,15 @@ from oslo_serialization import jsonutils
|
|||||||
import webob
|
import webob
|
||||||
|
|
||||||
from cinder.api import extensions
|
from cinder.api import extensions
|
||||||
from cinder.api.v2 import snapshot_metadata
|
|
||||||
from cinder.api.v2 import snapshots
|
from cinder.api.v2 import snapshots
|
||||||
|
from cinder.api.v3 import snapshot_metadata
|
||||||
from cinder import context
|
from cinder import context
|
||||||
import cinder.db
|
import cinder.db
|
||||||
from cinder import exception
|
from cinder import exception
|
||||||
from cinder.objects import fields
|
from cinder.objects import fields
|
||||||
from cinder.scheduler import rpcapi as scheduler_rpcapi
|
from cinder.scheduler import rpcapi as scheduler_rpcapi
|
||||||
from cinder.tests.unit.api import fakes
|
from cinder.tests.unit.api import fakes
|
||||||
from cinder.tests.unit.api.v2 import fakes as v2_fakes
|
from cinder.tests.unit.api.v3 import fakes as v3_fakes
|
||||||
from cinder.tests.unit import fake_constants as fake
|
from cinder.tests.unit import fake_constants as fake
|
||||||
from cinder.tests.unit import fake_snapshot
|
from cinder.tests.unit import fake_snapshot
|
||||||
from cinder.tests.unit import fake_volume
|
from cinder.tests.unit import fake_volume
|
||||||
@ -116,7 +116,7 @@ class SnapshotMetaDataTest(test.TestCase):
|
|||||||
self.volume_api = cinder.volume.api.API()
|
self.volume_api = cinder.volume.api.API()
|
||||||
self.mock_object(volume.api.API, 'get', fake_get)
|
self.mock_object(volume.api.API, 'get', fake_get)
|
||||||
self.mock_object(cinder.db.sqlalchemy.api, 'volume_type_get',
|
self.mock_object(cinder.db.sqlalchemy.api, 'volume_type_get',
|
||||||
v2_fakes.fake_volume_type_get)
|
v3_fakes.fake_volume_type_get)
|
||||||
self.mock_object(scheduler_rpcapi.SchedulerAPI, 'create_snapshot')
|
self.mock_object(scheduler_rpcapi.SchedulerAPI, 'create_snapshot')
|
||||||
self.mock_object(cinder.db, 'snapshot_get', return_snapshot)
|
self.mock_object(cinder.db, 'snapshot_get', return_snapshot)
|
||||||
self.mock_object(self.volume_api, 'update_snapshot_metadata')
|
self.mock_object(self.volume_api, 'update_snapshot_metadata')
|
||||||
@ -128,7 +128,7 @@ class SnapshotMetaDataTest(test.TestCase):
|
|||||||
self.snapshot_controller = snapshots.SnapshotsController(self.ext_mgr)
|
self.snapshot_controller = snapshots.SnapshotsController(self.ext_mgr)
|
||||||
self.controller = snapshot_metadata.Controller()
|
self.controller = snapshot_metadata.Controller()
|
||||||
self.req_id = str(uuid.uuid4())
|
self.req_id = str(uuid.uuid4())
|
||||||
self.url = '/v2/%s/snapshots/%s/metadata' % (
|
self.url = '/v3/%s/snapshots/%s/metadata' % (
|
||||||
fake.PROJECT_ID, self.req_id)
|
fake.PROJECT_ID, self.req_id)
|
||||||
|
|
||||||
snap = {"volume_id": fake.VOLUME_ID,
|
snap = {"volume_id": fake.VOLUME_ID,
|
||||||
@ -136,7 +136,7 @@ class SnapshotMetaDataTest(test.TestCase):
|
|||||||
"description": "Volume Test Desc",
|
"description": "Volume Test Desc",
|
||||||
"metadata": {}}
|
"metadata": {}}
|
||||||
body = {"snapshot": snap}
|
body = {"snapshot": snap}
|
||||||
req = fakes.HTTPRequest.blank('/v2/snapshots')
|
req = fakes.HTTPRequest.blank('/v3/snapshots')
|
||||||
self.snapshot_controller.create(req, body=body)
|
self.snapshot_controller.create(req, body=body)
|
||||||
|
|
||||||
@mock.patch('cinder.objects.Snapshot.get_by_id')
|
@mock.patch('cinder.objects.Snapshot.get_by_id')
|
||||||
@ -286,7 +286,7 @@ class SnapshotMetaDataTest(test.TestCase):
|
|||||||
self.mock_object(cinder.db, 'snapshot_metadata_update',
|
self.mock_object(cinder.db, 'snapshot_metadata_update',
|
||||||
return_create_snapshot_metadata)
|
return_create_snapshot_metadata)
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank('/v2/snapshot_metadata')
|
req = fakes.HTTPRequest.blank('/v3/snapshot_metadata')
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = "application/json"
|
req.content_type = "application/json"
|
||||||
body = {"metadata": {"key1": "value1",
|
body = {"metadata": {"key1": "value1",
|
||||||
@ -313,7 +313,7 @@ class SnapshotMetaDataTest(test.TestCase):
|
|||||||
self.mock_object(cinder.db, 'snapshot_metadata_update',
|
self.mock_object(cinder.db, 'snapshot_metadata_update',
|
||||||
return_create_snapshot_metadata_insensitive)
|
return_create_snapshot_metadata_insensitive)
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank('/v2/snapshot_metadata')
|
req = fakes.HTTPRequest.blank('/v3/snapshot_metadata')
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = "application/json"
|
req.content_type = "application/json"
|
||||||
body = {"metadata": {"key1": "value1",
|
body = {"metadata": {"key1": "value1",
|
||||||
@ -371,7 +371,7 @@ class SnapshotMetaDataTest(test.TestCase):
|
|||||||
self.mock_object(cinder.db, 'snapshot_metadata_update',
|
self.mock_object(cinder.db, 'snapshot_metadata_update',
|
||||||
return_create_snapshot_metadata)
|
return_create_snapshot_metadata)
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank('/v2/snapshot_metadata')
|
req = fakes.HTTPRequest.blank('/v3/snapshot_metadata')
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = "application/json"
|
req.content_type = "application/json"
|
||||||
body = {"metadata": {"key9": "value9"}}
|
body = {"metadata": {"key9": "value9"}}
|
||||||
@ -534,7 +534,7 @@ class SnapshotMetaDataTest(test.TestCase):
|
|||||||
self.mock_object(cinder.db, 'snapshot_get',
|
self.mock_object(cinder.db, 'snapshot_get',
|
||||||
return_snapshot_nonexistent)
|
return_snapshot_nonexistent)
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/snapshots/asdf/metadata/key1' % fake.PROJECT_ID)
|
'/v3/%s/snapshots/asdf/metadata/key1' % fake.PROJECT_ID)
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
body = {"meta": {"key1": "value1"}}
|
body = {"meta": {"key1": "value1"}}
|
||||||
req.body = jsonutils.dump_as_bytes(body)
|
req.body = jsonutils.dump_as_bytes(body)
|
@ -11,7 +11,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from cinder.api import microversions as mv
|
from cinder.api import microversions as mv
|
||||||
from cinder.api.v2 import types
|
from cinder.api.v3 import types
|
||||||
from cinder import context
|
from cinder import context
|
||||||
from cinder import db
|
from cinder import db
|
||||||
from cinder import exception
|
from cinder import exception
|
||||||
|
@ -18,8 +18,8 @@ from unittest import mock
|
|||||||
from oslo_utils import timeutils
|
from oslo_utils import timeutils
|
||||||
import webob
|
import webob
|
||||||
|
|
||||||
from cinder.api.v2 import types
|
from cinder.api.v3 import types
|
||||||
from cinder.api.v2.views import types as views_types
|
from cinder.api.v3.views import types as views_types
|
||||||
from cinder import context
|
from cinder import context
|
||||||
from cinder import exception
|
from cinder import exception
|
||||||
from cinder.policies import volume_type as type_policy
|
from cinder.policies import volume_type as type_policy
|
||||||
@ -109,7 +109,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
self.mock_object(volume_types, 'get_all_types',
|
self.mock_object(volume_types, 'get_all_types',
|
||||||
return_volume_types_get_all_types)
|
return_volume_types_get_all_types)
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types' % fake.PROJECT_ID,
|
req = fakes.HTTPRequest.blank('/v3/%s/types' % fake.PROJECT_ID,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
res_dict = self.controller.index(req)
|
res_dict = self.controller.index(req)
|
||||||
|
|
||||||
@ -126,41 +126,41 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
self.mock_object(volume_types, 'get_all_types',
|
self.mock_object(volume_types, 'get_all_types',
|
||||||
return_empty_volume_types_get_all_types)
|
return_empty_volume_types_get_all_types)
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/types' % fake.PROJECT_ID)
|
||||||
res_dict = self.controller.index(req)
|
res_dict = self.controller.index(req)
|
||||||
|
|
||||||
self.assertEqual(0, len(res_dict['volume_types']))
|
self.assertEqual(0, len(res_dict['volume_types']))
|
||||||
|
|
||||||
def test_volume_types_index_with_limit(self):
|
def test_volume_types_index_with_limit(self):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types?limit=1' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/types?limit=1' % fake.PROJECT_ID)
|
||||||
req.environ['cinder.context'] = self.ctxt
|
req.environ['cinder.context'] = self.ctxt
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
|
|
||||||
self.assertEqual(1, len(res['volume_types']))
|
self.assertEqual(1, len(res['volume_types']))
|
||||||
self.assertEqual(self.type_id3, res['volume_types'][0]['id'])
|
self.assertEqual(self.type_id3, res['volume_types'][0]['id'])
|
||||||
|
|
||||||
expect_next_link = ('http://localhost/v2/%s/types?limit=1'
|
expect_next_link = ('http://localhost/v3/%s/types?limit=1'
|
||||||
'&marker=%s' %
|
'&marker=%s' %
|
||||||
(fake.PROJECT_ID, res['volume_types'][0]['id']))
|
(fake.PROJECT_ID, res['volume_types'][0]['id']))
|
||||||
self.assertEqual(expect_next_link, res['volume_type_links'][0]['href'])
|
self.assertEqual(expect_next_link, res['volume_type_links'][0]['href'])
|
||||||
|
|
||||||
def test_volume_types_index_with_offset(self):
|
def test_volume_types_index_with_offset(self):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/types?offset=1' % fake.PROJECT_ID)
|
'/v3/%s/types?offset=1' % fake.PROJECT_ID)
|
||||||
req.environ['cinder.context'] = self.ctxt
|
req.environ['cinder.context'] = self.ctxt
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
|
|
||||||
self.assertEqual(3, len(res['volume_types']))
|
self.assertEqual(3, len(res['volume_types']))
|
||||||
|
|
||||||
def test_volume_types_index_with_offset_out_of_range(self):
|
def test_volume_types_index_with_offset_out_of_range(self):
|
||||||
url = '/v2/%s/types?offset=424366766556787' % fake.PROJECT_ID
|
url = '/v3/%s/types?offset=424366766556787' % fake.PROJECT_ID
|
||||||
req = fakes.HTTPRequest.blank(url)
|
req = fakes.HTTPRequest.blank(url)
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller.index, req)
|
self.controller.index, req)
|
||||||
|
|
||||||
def test_volume_types_index_with_limit_and_offset(self):
|
def test_volume_types_index_with_limit_and_offset(self):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/types?limit=2&offset=1' % fake.PROJECT_ID)
|
'/v3/%s/types?limit=2&offset=1' % fake.PROJECT_ID)
|
||||||
req.environ['cinder.context'] = self.ctxt
|
req.environ['cinder.context'] = self.ctxt
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
|
|
||||||
@ -169,7 +169,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
self.assertEqual(self.type_id1, res['volume_types'][1]['id'])
|
self.assertEqual(self.type_id1, res['volume_types'][1]['id'])
|
||||||
|
|
||||||
def test_volume_types_index_with_limit_and_marker(self):
|
def test_volume_types_index_with_limit_and_marker(self):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types?limit=1'
|
req = fakes.HTTPRequest.blank('/v3/%s/types?limit=1'
|
||||||
'&marker=%s' %
|
'&marker=%s' %
|
||||||
(fake.PROJECT_ID,
|
(fake.PROJECT_ID,
|
||||||
self.type_id2))
|
self.type_id2))
|
||||||
@ -181,7 +181,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
|
|
||||||
def test_volume_types_index_with_valid_filter(self):
|
def test_volume_types_index_with_valid_filter(self):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/types?is_public=True' % fake.PROJECT_ID)
|
'/v3/%s/types?is_public=True' % fake.PROJECT_ID)
|
||||||
req.environ['cinder.context'] = self.ctxt
|
req.environ['cinder.context'] = self.ctxt
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
|
|
||||||
@ -192,7 +192,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
|
|
||||||
def test_volume_types_index_with_invalid_filter(self):
|
def test_volume_types_index_with_invalid_filter(self):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/types?id=%s' % (fake.PROJECT_ID, self.type_id1))
|
'/v3/%s/types?id=%s' % (fake.PROJECT_ID, self.type_id1))
|
||||||
req.environ['cinder.context'] = context.RequestContext(
|
req.environ['cinder.context'] = context.RequestContext(
|
||||||
user_id=fake.USER_ID, project_id=fake.PROJECT_ID, is_admin=False)
|
user_id=fake.USER_ID, project_id=fake.PROJECT_ID, is_admin=False)
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
@ -200,7 +200,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
self.assertEqual(4, len(res['volume_types']))
|
self.assertEqual(4, len(res['volume_types']))
|
||||||
|
|
||||||
def test_volume_types_index_with_sort_keys(self):
|
def test_volume_types_index_with_sort_keys(self):
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types?sort=id' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/types?sort=id' % fake.PROJECT_ID)
|
||||||
req.environ['cinder.context'] = self.ctxt
|
req.environ['cinder.context'] = self.ctxt
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
expect_result = [self.default_type, self.type_id1,
|
expect_result = [self.default_type, self.type_id1,
|
||||||
@ -215,7 +215,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
|
|
||||||
def test_volume_types_index_with_sort_and_limit(self):
|
def test_volume_types_index_with_sort_and_limit(self):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/types?sort=id&limit=2' % fake.PROJECT_ID)
|
'/v3/%s/types?sort=id&limit=2' % fake.PROJECT_ID)
|
||||||
req.environ['cinder.context'] = self.ctxt
|
req.environ['cinder.context'] = self.ctxt
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
|
|
||||||
@ -229,7 +229,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
|
|
||||||
def test_volume_types_index_with_sort_keys_and_sort_dirs(self):
|
def test_volume_types_index_with_sort_keys_and_sort_dirs(self):
|
||||||
req = fakes.HTTPRequest.blank(
|
req = fakes.HTTPRequest.blank(
|
||||||
'/v2/%s/types?sort=id:asc' % fake.PROJECT_ID)
|
'/v3/%s/types?sort=id:asc' % fake.PROJECT_ID)
|
||||||
req.environ['cinder.context'] = self.ctxt
|
req.environ['cinder.context'] = self.ctxt
|
||||||
res = self.controller.index(req)
|
res = self.controller.index(req)
|
||||||
expect_result = [self.default_type, self.type_id1,
|
expect_result = [self.default_type, self.type_id1,
|
||||||
@ -247,7 +247,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
return_volume_types_get_volume_type)
|
return_volume_types_get_volume_type)
|
||||||
|
|
||||||
type_id = fake.VOLUME_TYPE_ID
|
type_id = fake.VOLUME_TYPE_ID
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/' % fake.PROJECT_ID
|
req = fakes.HTTPRequest.blank('/v3/%s/types/' % fake.PROJECT_ID
|
||||||
+ type_id)
|
+ type_id)
|
||||||
res_dict = self.controller.show(req, type_id)
|
res_dict = self.controller.show(req, type_id)
|
||||||
|
|
||||||
@ -262,7 +262,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
self.mock_object(volume_types, 'get_volume_type',
|
self.mock_object(volume_types, 'get_volume_type',
|
||||||
return_volume_types_get_volume_type)
|
return_volume_types_get_volume_type)
|
||||||
|
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/%s' %
|
req = fakes.HTTPRequest.blank('/v3/%s/types/%s' %
|
||||||
(fake.PROJECT_ID,
|
(fake.PROJECT_ID,
|
||||||
fake.WILL_NOT_BE_FOUND_ID))
|
fake.WILL_NOT_BE_FOUND_ID))
|
||||||
self.assertRaises(exception.VolumeTypeNotFound, self.controller.show,
|
self.assertRaises(exception.VolumeTypeNotFound, self.controller.show,
|
||||||
@ -271,7 +271,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
def test_get_default(self):
|
def test_get_default(self):
|
||||||
self.mock_object(volume_types, 'get_default_volume_type',
|
self.mock_object(volume_types, 'get_default_volume_type',
|
||||||
return_volume_types_get_default)
|
return_volume_types_get_default)
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/default' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/types/default' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
res_dict = self.controller.show(req, 'default')
|
res_dict = self.controller.show(req, 'default')
|
||||||
self.assertEqual(1, len(res_dict))
|
self.assertEqual(1, len(res_dict))
|
||||||
@ -282,7 +282,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
def test_get_default_not_found(self):
|
def test_get_default_not_found(self):
|
||||||
self.mock_object(volume_types, 'get_default_volume_type',
|
self.mock_object(volume_types, 'get_default_volume_type',
|
||||||
return_value={})
|
return_value={})
|
||||||
req = fakes.HTTPRequest.blank('/v2/%s/types/default' % fake.PROJECT_ID)
|
req = fakes.HTTPRequest.blank('/v3/%s/types/default' % fake.PROJECT_ID)
|
||||||
req.method = 'GET'
|
req.method = 'GET'
|
||||||
|
|
||||||
self.assertRaises(exception.VolumeTypeNotFound,
|
self.assertRaises(exception.VolumeTypeNotFound,
|
||||||
@ -305,7 +305,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
id=42,
|
id=42,
|
||||||
)
|
)
|
||||||
|
|
||||||
request = fakes.HTTPRequest.blank("/v2")
|
request = fakes.HTTPRequest.blank("/v3")
|
||||||
output = view_builder.show(request, raw_volume_type)
|
output = view_builder.show(request, raw_volume_type)
|
||||||
|
|
||||||
self.assertIn('volume_type', output)
|
self.assertIn('volume_type', output)
|
||||||
@ -334,7 +334,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
id=42,
|
id=42,
|
||||||
)
|
)
|
||||||
|
|
||||||
request = fakes.HTTPRequest.blank("/v2", use_admin_context=True)
|
request = fakes.HTTPRequest.blank("/v3", use_admin_context=True)
|
||||||
output = view_builder.show(request, raw_volume_type)
|
output = view_builder.show(request, raw_volume_type)
|
||||||
|
|
||||||
self.assertIn('volume_type', output)
|
self.assertIn('volume_type', output)
|
||||||
@ -366,7 +366,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
id=42,
|
id=42,
|
||||||
)
|
)
|
||||||
|
|
||||||
request = fakes.HTTPRequest.blank("/v2")
|
request = fakes.HTTPRequest.blank("/v3")
|
||||||
output = view_builder.show(request, raw_volume_type)
|
output = view_builder.show(request, raw_volume_type)
|
||||||
|
|
||||||
self.assertIn('volume_type', output)
|
self.assertIn('volume_type', output)
|
||||||
@ -397,7 +397,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
id=42,
|
id=42,
|
||||||
)
|
)
|
||||||
|
|
||||||
request = fakes.HTTPRequest.blank("/v2")
|
request = fakes.HTTPRequest.blank("/v3")
|
||||||
output = view_builder.show(request, raw_volume_type)
|
output = view_builder.show(request, raw_volume_type)
|
||||||
|
|
||||||
self.assertIn('volume_type', output)
|
self.assertIn('volume_type', output)
|
||||||
@ -427,7 +427,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
id=42,
|
id=42,
|
||||||
)
|
)
|
||||||
|
|
||||||
request = fakes.HTTPRequest.blank("/v2")
|
request = fakes.HTTPRequest.blank("/v3")
|
||||||
output = view_builder.show(request, raw_volume_type)
|
output = view_builder.show(request, raw_volume_type)
|
||||||
|
|
||||||
self.assertIn('volume_type', output)
|
self.assertIn('volume_type', output)
|
||||||
@ -457,7 +457,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
id=42,
|
id=42,
|
||||||
)
|
)
|
||||||
|
|
||||||
request = fakes.HTTPRequest.blank("/v2")
|
request = fakes.HTTPRequest.blank("/v3")
|
||||||
output = view_builder.show(request, raw_volume_type)
|
output = view_builder.show(request, raw_volume_type)
|
||||||
|
|
||||||
self.assertIn('volume_type', output)
|
self.assertIn('volume_type', output)
|
||||||
@ -492,7 +492,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
request = fakes.HTTPRequest.blank("/v2")
|
request = fakes.HTTPRequest.blank("/v3")
|
||||||
output = view_builder.index(request, raw_volume_types)
|
output = view_builder.index(request, raw_volume_types)
|
||||||
|
|
||||||
self.assertIn('volume_types', output)
|
self.assertIn('volume_types', output)
|
||||||
@ -527,7 +527,7 @@ class VolumeTypesApiTest(test.TestCase):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
request = fakes.HTTPRequest.blank("/v2", use_admin_context=True)
|
request = fakes.HTTPRequest.blank("/v3", use_admin_context=True)
|
||||||
output = view_builder.index(request, raw_volume_types)
|
output = view_builder.index(request, raw_volume_types)
|
||||||
|
|
||||||
self.assertIn('volume_types', output)
|
self.assertIn('volume_types', output)
|
@ -5,15 +5,8 @@
|
|||||||
[composite:osapi_volume]
|
[composite:osapi_volume]
|
||||||
use = call:cinder.api:root_app_factory
|
use = call:cinder.api:root_app_factory
|
||||||
/: apiversions
|
/: apiversions
|
||||||
/v2: openstack_volume_api_v2
|
|
||||||
/v3: openstack_volume_api_v3
|
/v3: openstack_volume_api_v3
|
||||||
|
|
||||||
[composite:openstack_volume_api_v2]
|
|
||||||
use = call:cinder.api.middleware.auth:pipeline_factory
|
|
||||||
noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv2
|
|
||||||
keystone = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv2
|
|
||||||
keystone_nolimit = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv2
|
|
||||||
|
|
||||||
[composite:openstack_volume_api_v3]
|
[composite:openstack_volume_api_v3]
|
||||||
use = call:cinder.api.middleware.auth:pipeline_factory
|
use = call:cinder.api.middleware.auth:pipeline_factory
|
||||||
noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv3
|
noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv3
|
||||||
@ -42,9 +35,6 @@ paste.filter_factory = cinder.api.middleware.auth:NoAuthMiddleware.factory
|
|||||||
[filter:sizelimit]
|
[filter:sizelimit]
|
||||||
paste.filter_factory = oslo_middleware.sizelimit:RequestBodySizeLimiter.factory
|
paste.filter_factory = oslo_middleware.sizelimit:RequestBodySizeLimiter.factory
|
||||||
|
|
||||||
[app:apiv2]
|
|
||||||
paste.app_factory = cinder.api.v2.router:APIRouter.factory
|
|
||||||
|
|
||||||
[app:apiv3]
|
[app:apiv3]
|
||||||
paste.app_factory = cinder.api.v3.router:APIRouter.factory
|
paste.app_factory = cinder.api.v3.router:APIRouter.factory
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ API request:
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
GET /v2/{tenant_id}/capabilities/{hostname}
|
GET /v3/{tenant_id}/capabilities/{hostname}
|
||||||
|
|
||||||
Example of return value:
|
Example of return value:
|
||||||
|
|
||||||
|
@ -441,7 +441,7 @@ Force detach volume from all hosts
|
|||||||
The user could use `os-force_detach` action to detach a volume from all its
|
The user could use `os-force_detach` action to detach a volume from all its
|
||||||
attached hosts.
|
attached hosts.
|
||||||
For more detail, please refer to
|
For more detail, please refer to
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/?expanded=force-detach-volume-detail#force-detach-volume
|
https://docs.openstack.org/api-ref/block-storage/v3/?expanded=force-detach-a-volume-detail#force-detach-a-volume
|
||||||
|
|
||||||
Consistent group support
|
Consistent group support
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -620,7 +620,7 @@ Force detach
|
|||||||
|
|
||||||
The user could use `os-force_detach` action to detach a volume from all its
|
The user could use `os-force_detach` action to detach a volume from all its
|
||||||
attached hosts. For more detail, please refer to
|
attached hosts. For more detail, please refer to
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/?expanded=force-detach-volume-detail#force-detach-volume
|
https://docs.openstack.org/api-ref/block-storage/v3/?expanded=force-detach-a-volume-detail#force-detach-a-volume
|
||||||
|
|
||||||
|
|
||||||
Advanced features
|
Advanced features
|
||||||
|
@ -5,15 +5,8 @@
|
|||||||
[composite:osapi_volume]
|
[composite:osapi_volume]
|
||||||
use = call:cinder.api:root_app_factory
|
use = call:cinder.api:root_app_factory
|
||||||
/: apiversions
|
/: apiversions
|
||||||
/v2: openstack_volume_api_v2
|
|
||||||
/v3: openstack_volume_api_v3
|
/v3: openstack_volume_api_v3
|
||||||
|
|
||||||
[composite:openstack_volume_api_v2]
|
|
||||||
use = call:cinder.api.middleware.auth:pipeline_factory
|
|
||||||
noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv2
|
|
||||||
keystone = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv2
|
|
||||||
keystone_nolimit = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv2
|
|
||||||
|
|
||||||
[composite:openstack_volume_api_v3]
|
[composite:openstack_volume_api_v3]
|
||||||
use = call:cinder.api.middleware.auth:pipeline_factory
|
use = call:cinder.api.middleware.auth:pipeline_factory
|
||||||
noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv3
|
noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv3
|
||||||
@ -42,9 +35,6 @@ paste.filter_factory = cinder.api.middleware.auth:NoAuthMiddleware.factory
|
|||||||
[filter:sizelimit]
|
[filter:sizelimit]
|
||||||
paste.filter_factory = oslo_middleware.sizelimit:RequestBodySizeLimiter.factory
|
paste.filter_factory = oslo_middleware.sizelimit:RequestBodySizeLimiter.factory
|
||||||
|
|
||||||
[app:apiv2]
|
|
||||||
paste.app_factory = cinder.api.v2.router:APIRouter.factory
|
|
||||||
|
|
||||||
[app:apiv3]
|
[app:apiv3]
|
||||||
paste.app_factory = cinder.api.v3.router:APIRouter.factory
|
paste.app_factory = cinder.api.v3.router:APIRouter.factory
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ Controllers and actions
|
|||||||
Controllers live in ``cinder/api/openstack``, and inherit from
|
Controllers live in ``cinder/api/openstack``, and inherit from
|
||||||
cinder.wsgi.Controller.
|
cinder.wsgi.Controller.
|
||||||
|
|
||||||
See ``cinder/api/v2/volumes.py`` for an example.
|
See ``cinder/api/v3/volumes.py`` for an example.
|
||||||
|
|
||||||
Action methods take parameters that are sucked out of the URL by
|
Action methods take parameters that are sucked out of the URL by
|
||||||
mapper.connect() or .resource(). The first two parameters are self and the
|
mapper.connect() or .resource(). The first two parameters are self and the
|
||||||
|
@ -78,22 +78,7 @@ must create a database, service credentials, and API endpoints.
|
|||||||
|
|
||||||
This command provides no output.
|
This command provides no output.
|
||||||
|
|
||||||
#. Create the ``cinderv2`` and ``cinderv3`` service entities:
|
#. Create the ``cinderv3`` service entity:
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ openstack service create --name cinderv2 \
|
|
||||||
--description "OpenStack Block Storage" volumev2
|
|
||||||
|
|
||||||
+-------------+----------------------------------+
|
|
||||||
| Field | Value |
|
|
||||||
+-------------+----------------------------------+
|
|
||||||
| description | OpenStack Block Storage |
|
|
||||||
| enabled | True |
|
|
||||||
| id | eb9fd245bdbc414695952e93f29fe3ac |
|
|
||||||
| name | cinderv2 |
|
|
||||||
| type | volumev2 |
|
|
||||||
+-------------+----------------------------------+
|
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@ -112,63 +97,12 @@ must create a database, service credentials, and API endpoints.
|
|||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
The Block Storage services require two service entities.
|
Beginning with the Xena release, the Block Storage services
|
||||||
|
require only one service entity. For prior releases, please
|
||||||
|
consult the documentation for that specific release.
|
||||||
|
|
||||||
#. Create the Block Storage service API endpoints:
|
#. Create the Block Storage service API endpoints:
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ openstack endpoint create --region RegionOne \
|
|
||||||
volumev2 public http://controller:8776/v2/%\(project_id\)s
|
|
||||||
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| Field | Value |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| enabled | True |
|
|
||||||
| id | 513e73819e14460fb904163f41ef3759 |
|
|
||||||
| interface | public |
|
|
||||||
| region | RegionOne |
|
|
||||||
| region_id | RegionOne |
|
|
||||||
| service_id | eb9fd245bdbc414695952e93f29fe3ac |
|
|
||||||
| service_name | cinderv2 |
|
|
||||||
| service_type | volumev2 |
|
|
||||||
| url | http://controller:8776/v2/%(project_id)s |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
|
|
||||||
$ openstack endpoint create --region RegionOne \
|
|
||||||
volumev2 internal http://controller:8776/v2/%\(project_id\)s
|
|
||||||
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| Field | Value |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| enabled | True |
|
|
||||||
| id | 6436a8a23d014cfdb69c586eff146a32 |
|
|
||||||
| interface | internal |
|
|
||||||
| region | RegionOne |
|
|
||||||
| region_id | RegionOne |
|
|
||||||
| service_id | eb9fd245bdbc414695952e93f29fe3ac |
|
|
||||||
| service_name | cinderv2 |
|
|
||||||
| service_type | volumev2 |
|
|
||||||
| url | http://controller:8776/v2/%(project_id)s |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
|
|
||||||
$ openstack endpoint create --region RegionOne \
|
|
||||||
volumev2 admin http://controller:8776/v2/%\(project_id\)s
|
|
||||||
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| Field | Value |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| enabled | True |
|
|
||||||
| id | e652cf84dd334f359ae9b045a2c91d96 |
|
|
||||||
| interface | admin |
|
|
||||||
| region | RegionOne |
|
|
||||||
| region_id | RegionOne |
|
|
||||||
| service_id | eb9fd245bdbc414695952e93f29fe3ac |
|
|
||||||
| service_name | cinderv2 |
|
|
||||||
| service_type | volumev2 |
|
|
||||||
| url | http://controller:8776/v2/%(project_id)s |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ openstack endpoint create --region RegionOne \
|
$ openstack endpoint create --region RegionOne \
|
||||||
@ -222,10 +156,6 @@ must create a database, service credentials, and API endpoints.
|
|||||||
| url | http://controller:8776/v3/%(project_id)s |
|
| url | http://controller:8776/v3/%(project_id)s |
|
||||||
+--------------+------------------------------------------+
|
+--------------+------------------------------------------+
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
The Block Storage services require endpoints for each service
|
|
||||||
entity.
|
|
||||||
|
|
||||||
Install and configure components
|
Install and configure components
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
@ -78,22 +78,7 @@ must create a database, service credentials, and API endpoints.
|
|||||||
|
|
||||||
This command provides no output.
|
This command provides no output.
|
||||||
|
|
||||||
#. Create the ``cinderv2`` and ``cinderv3`` service entities:
|
#. Create the ``cinderv3`` service entity:
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ openstack service create --name cinderv2 \
|
|
||||||
--description "OpenStack Block Storage" volumev2
|
|
||||||
|
|
||||||
+-------------+----------------------------------+
|
|
||||||
| Field | Value |
|
|
||||||
+-------------+----------------------------------+
|
|
||||||
| description | OpenStack Block Storage |
|
|
||||||
| enabled | True |
|
|
||||||
| id | eb9fd245bdbc414695952e93f29fe3ac |
|
|
||||||
| name | cinderv2 |
|
|
||||||
| type | volumev2 |
|
|
||||||
+-------------+----------------------------------+
|
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@ -112,63 +97,12 @@ must create a database, service credentials, and API endpoints.
|
|||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
The Block Storage services require two service entities.
|
Beginning with the Xena release, the Block Storage services
|
||||||
|
require only one service entity. For prior releases, please
|
||||||
|
consult the documentation for that specific release.
|
||||||
|
|
||||||
#. Create the Block Storage service API endpoints:
|
#. Create the Block Storage service API endpoints:
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ openstack endpoint create --region RegionOne \
|
|
||||||
volumev2 public http://controller:8776/v2/%\(project_id\)s
|
|
||||||
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| Field | Value |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| enabled | True |
|
|
||||||
| id | 513e73819e14460fb904163f41ef3759 |
|
|
||||||
| interface | public |
|
|
||||||
| region | RegionOne |
|
|
||||||
| region_id | RegionOne |
|
|
||||||
| service_id | eb9fd245bdbc414695952e93f29fe3ac |
|
|
||||||
| service_name | cinderv2 |
|
|
||||||
| service_type | volumev2 |
|
|
||||||
| url | http://controller:8776/v2/%(project_id)s |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
|
|
||||||
$ openstack endpoint create --region RegionOne \
|
|
||||||
volumev2 internal http://controller:8776/v2/%\(project_id\)s
|
|
||||||
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| Field | Value |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| enabled | True |
|
|
||||||
| id | 6436a8a23d014cfdb69c586eff146a32 |
|
|
||||||
| interface | internal |
|
|
||||||
| region | RegionOne |
|
|
||||||
| region_id | RegionOne |
|
|
||||||
| service_id | eb9fd245bdbc414695952e93f29fe3ac |
|
|
||||||
| service_name | cinderv2 |
|
|
||||||
| service_type | volumev2 |
|
|
||||||
| url | http://controller:8776/v2/%(project_id)s |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
|
|
||||||
$ openstack endpoint create --region RegionOne \
|
|
||||||
volumev2 admin http://controller:8776/v2/%\(project_id\)s
|
|
||||||
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| Field | Value |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| enabled | True |
|
|
||||||
| id | e652cf84dd334f359ae9b045a2c91d96 |
|
|
||||||
| interface | admin |
|
|
||||||
| region | RegionOne |
|
|
||||||
| region_id | RegionOne |
|
|
||||||
| service_id | eb9fd245bdbc414695952e93f29fe3ac |
|
|
||||||
| service_name | cinderv2 |
|
|
||||||
| service_type | volumev2 |
|
|
||||||
| url | http://controller:8776/v2/%(project_id)s |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ openstack endpoint create --region RegionOne \
|
$ openstack endpoint create --region RegionOne \
|
||||||
@ -222,10 +156,6 @@ must create a database, service credentials, and API endpoints.
|
|||||||
| url | http://controller:8776/v3/%(project_id)s |
|
| url | http://controller:8776/v3/%(project_id)s |
|
||||||
+--------------+------------------------------------------+
|
+--------------+------------------------------------------+
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
The Block Storage services require endpoints for each service
|
|
||||||
entity.
|
|
||||||
|
|
||||||
Install and configure components
|
Install and configure components
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
@ -79,22 +79,7 @@ must create a database, service credentials, and API endpoints.
|
|||||||
|
|
||||||
This command provides no output.
|
This command provides no output.
|
||||||
|
|
||||||
#. Create the ``cinderv2`` and ``cinderv3`` service entities:
|
#. Create the ``cinderv3`` service entity:
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ openstack service create --name cinderv2 \
|
|
||||||
--description "OpenStack Block Storage" volumev2
|
|
||||||
|
|
||||||
+-------------+----------------------------------+
|
|
||||||
| Field | Value |
|
|
||||||
+-------------+----------------------------------+
|
|
||||||
| description | OpenStack Block Storage |
|
|
||||||
| enabled | True |
|
|
||||||
| id | eb9fd245bdbc414695952e93f29fe3ac |
|
|
||||||
| name | cinderv2 |
|
|
||||||
| type | volumev2 |
|
|
||||||
+-------------+----------------------------------+
|
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
@ -113,63 +98,12 @@ must create a database, service credentials, and API endpoints.
|
|||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
The Block Storage services require two service entities.
|
Beginning with the Xena release, the Block Storage services
|
||||||
|
require only one service entity. For prior releases, please
|
||||||
|
consult the documentation for that specific release.
|
||||||
|
|
||||||
#. Create the Block Storage service API endpoints:
|
#. Create the Block Storage service API endpoints:
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ openstack endpoint create --region RegionOne \
|
|
||||||
volumev2 public http://controller:8776/v2/%\(project_id\)s
|
|
||||||
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| Field | Value |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| enabled | True |
|
|
||||||
| id | 513e73819e14460fb904163f41ef3759 |
|
|
||||||
| interface | public |
|
|
||||||
| region | RegionOne |
|
|
||||||
| region_id | RegionOne |
|
|
||||||
| service_id | eb9fd245bdbc414695952e93f29fe3ac |
|
|
||||||
| service_name | cinderv2 |
|
|
||||||
| service_type | volumev2 |
|
|
||||||
| url | http://controller:8776/v2/%(project_id)s |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
|
|
||||||
$ openstack endpoint create --region RegionOne \
|
|
||||||
volumev2 internal http://controller:8776/v2/%\(project_id\)s
|
|
||||||
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| Field | Value |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| enabled | True |
|
|
||||||
| id | 6436a8a23d014cfdb69c586eff146a32 |
|
|
||||||
| interface | internal |
|
|
||||||
| region | RegionOne |
|
|
||||||
| region_id | RegionOne |
|
|
||||||
| service_id | eb9fd245bdbc414695952e93f29fe3ac |
|
|
||||||
| service_name | cinderv2 |
|
|
||||||
| service_type | volumev2 |
|
|
||||||
| url | http://controller:8776/v2/%(project_id)s |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
|
|
||||||
$ openstack endpoint create --region RegionOne \
|
|
||||||
volumev2 admin http://controller:8776/v2/%\(project_id\)s
|
|
||||||
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| Field | Value |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
| enabled | True |
|
|
||||||
| id | e652cf84dd334f359ae9b045a2c91d96 |
|
|
||||||
| interface | admin |
|
|
||||||
| region | RegionOne |
|
|
||||||
| region_id | RegionOne |
|
|
||||||
| service_id | eb9fd245bdbc414695952e93f29fe3ac |
|
|
||||||
| service_name | cinderv2 |
|
|
||||||
| service_type | volumev2 |
|
|
||||||
| url | http://controller:8776/v2/%(project_id)s |
|
|
||||||
+--------------+------------------------------------------+
|
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ openstack endpoint create --region RegionOne \
|
$ openstack endpoint create --region RegionOne \
|
||||||
@ -223,10 +157,6 @@ must create a database, service credentials, and API endpoints.
|
|||||||
| url | http://controller:8776/v3/%(project_id)s |
|
| url | http://controller:8776/v3/%(project_id)s |
|
||||||
+--------------+------------------------------------------+
|
+--------------+------------------------------------------+
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
The Block Storage services require endpoints for each service
|
|
||||||
entity.
|
|
||||||
|
|
||||||
Install and configure components
|
Install and configure components
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
@ -6,15 +6,8 @@
|
|||||||
use = call:cinder.api:root_app_factory
|
use = call:cinder.api:root_app_factory
|
||||||
/: apiversions
|
/: apiversions
|
||||||
/healthcheck: healthcheck
|
/healthcheck: healthcheck
|
||||||
/v2: openstack_volume_api_v2
|
|
||||||
/v3: openstack_volume_api_v3
|
/v3: openstack_volume_api_v3
|
||||||
|
|
||||||
[composite:openstack_volume_api_v2]
|
|
||||||
use = call:cinder.api.middleware.auth:pipeline_factory
|
|
||||||
noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv2
|
|
||||||
keystone = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv2
|
|
||||||
keystone_nolimit = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv2
|
|
||||||
|
|
||||||
[composite:openstack_volume_api_v3]
|
[composite:openstack_volume_api_v3]
|
||||||
use = call:cinder.api.middleware.auth:pipeline_factory
|
use = call:cinder.api.middleware.auth:pipeline_factory
|
||||||
noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv3
|
noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv3
|
||||||
@ -43,9 +36,6 @@ paste.filter_factory = cinder.api.middleware.auth:NoAuthMiddleware.factory
|
|||||||
[filter:sizelimit]
|
[filter:sizelimit]
|
||||||
paste.filter_factory = oslo_middleware.sizelimit:RequestBodySizeLimiter.factory
|
paste.filter_factory = oslo_middleware.sizelimit:RequestBodySizeLimiter.factory
|
||||||
|
|
||||||
[app:apiv2]
|
|
||||||
paste.app_factory = cinder.api.v2.router:APIRouter.factory
|
|
||||||
|
|
||||||
[app:apiv3]
|
[app:apiv3]
|
||||||
paste.app_factory = cinder.api.v3.router:APIRouter.factory
|
paste.app_factory = cinder.api.v3.router:APIRouter.factory
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{% set image_name = "^(cirros.*-disk|TestVM)$" %}
|
{% set image_name = "^(cirros.*-disk|TestVM)$" %}
|
||||||
---
|
---
|
||||||
version: 2
|
version: 2
|
||||||
title: Rally task for gate-rally-dsvm-cinder-ubuntu-xenial-nv job
|
title: Rally task for cinder-rally-task check job (non-voting)
|
||||||
subtasks:
|
subtasks:
|
||||||
-
|
-
|
||||||
title: Validate cinder client
|
title: Validate cinder client
|
||||||
@ -31,8 +31,8 @@
|
|||||||
users_per_tenant: 2
|
users_per_tenant: 2
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
title: Update cinder Quotas
|
title: Update cinder Quotas
|
||||||
scenario:
|
scenario:
|
||||||
@ -48,8 +48,8 @@
|
|||||||
users_per_tenant: 2
|
users_per_tenant: 2
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
title: Create and Delete Volume
|
title: Create and Delete Volume
|
||||||
workloads:
|
workloads:
|
||||||
@ -67,8 +67,8 @@
|
|||||||
users_per_tenant: 2
|
users_per_tenant: 2
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
scenario:
|
scenario:
|
||||||
CinderVolumes.create_and_delete_volume:
|
CinderVolumes.create_and_delete_volume:
|
||||||
@ -85,8 +85,8 @@
|
|||||||
users_per_tenant: 2
|
users_per_tenant: 2
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
scenario:
|
scenario:
|
||||||
CinderVolumes.create_and_delete_volume:
|
CinderVolumes.create_and_delete_volume:
|
||||||
@ -103,8 +103,8 @@
|
|||||||
users_per_tenant: 2
|
users_per_tenant: 2
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
title: Create and List Volume
|
title: Create and List Volume
|
||||||
workloads:
|
workloads:
|
||||||
@ -123,8 +123,8 @@
|
|||||||
users_per_tenant: 1
|
users_per_tenant: 1
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
scenario:
|
scenario:
|
||||||
CinderVolumes.create_and_list_volume:
|
CinderVolumes.create_and_list_volume:
|
||||||
@ -142,8 +142,8 @@
|
|||||||
users_per_tenant: 1
|
users_per_tenant: 1
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
scenario:
|
scenario:
|
||||||
CinderVolumes.create_and_list_volume:
|
CinderVolumes.create_and_list_volume:
|
||||||
@ -161,8 +161,8 @@
|
|||||||
users_per_tenant: 1
|
users_per_tenant: 1
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
title: List volumes
|
title: List volumes
|
||||||
scenario:
|
scenario:
|
||||||
@ -181,8 +181,8 @@
|
|||||||
volumes_per_tenant: 2
|
volumes_per_tenant: 2
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
title: Create volume
|
title: Create volume
|
||||||
workloads:
|
workloads:
|
||||||
@ -200,8 +200,8 @@
|
|||||||
users_per_tenant: 2
|
users_per_tenant: 2
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
scenario:
|
scenario:
|
||||||
CinderVolumes.create_volume:
|
CinderVolumes.create_volume:
|
||||||
@ -218,8 +218,8 @@
|
|||||||
users_per_tenant: 2
|
users_per_tenant: 2
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
scenario:
|
scenario:
|
||||||
CinderVolumes.create_volume:
|
CinderVolumes.create_volume:
|
||||||
@ -236,8 +236,8 @@
|
|||||||
users_per_tenant: 2
|
users_per_tenant: 2
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
title: Create and Extend volume
|
title: Create and Extend volume
|
||||||
workloads:
|
workloads:
|
||||||
@ -256,8 +256,8 @@
|
|||||||
users_per_tenant: 1
|
users_per_tenant: 1
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
scenario:
|
scenario:
|
||||||
CinderVolumes.create_and_extend_volume:
|
CinderVolumes.create_and_extend_volume:
|
||||||
@ -277,8 +277,8 @@
|
|||||||
users_per_tenant: 1
|
users_per_tenant: 1
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
title: Create and attach volume
|
title: Create and attach volume
|
||||||
scenario:
|
scenario:
|
||||||
@ -298,8 +298,8 @@
|
|||||||
users_per_tenant: 2
|
users_per_tenant: 2
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
title: Create volume and snapshot attach and detach volume and delete them
|
title: Create volume and snapshot attach and detach volume and delete them
|
||||||
workloads:
|
workloads:
|
||||||
@ -326,8 +326,8 @@
|
|||||||
- "test"
|
- "test"
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
scenario:
|
scenario:
|
||||||
CinderVolumes.create_snapshot_and_attach_volume:
|
CinderVolumes.create_snapshot_and_attach_volume:
|
||||||
@ -351,8 +351,8 @@
|
|||||||
- "test"
|
- "test"
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
title: Create volume from volume and then delete it
|
title: Create volume from volume and then delete it
|
||||||
workloads:
|
workloads:
|
||||||
@ -372,8 +372,8 @@
|
|||||||
size: 1
|
size: 1
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
scenario:
|
scenario:
|
||||||
CinderVolumes.create_from_volume_and_delete_volume:
|
CinderVolumes.create_from_volume_and_delete_volume:
|
||||||
@ -392,8 +392,8 @@
|
|||||||
size: 1
|
size: 1
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
title: Create and delete snapshot
|
title: Create and delete snapshot
|
||||||
scenario:
|
scenario:
|
||||||
@ -411,8 +411,8 @@
|
|||||||
size: 1
|
size: 1
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
title: Create and list snapshots
|
title: Create and list snapshots
|
||||||
scenario:
|
scenario:
|
||||||
@ -431,8 +431,8 @@
|
|||||||
size: 1
|
size: 1
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
-
|
-
|
||||||
title: Create and upload a volume to image
|
title: Create and upload a volume to image
|
||||||
scenario:
|
scenario:
|
||||||
@ -448,5 +448,5 @@
|
|||||||
users_per_tenant: 1
|
users_per_tenant: 1
|
||||||
api_versions:
|
api_versions:
|
||||||
cinder:
|
cinder:
|
||||||
version: 2
|
version: 3
|
||||||
service_name: cinderv2
|
service_name: cinderv3
|
||||||
|
14
releasenotes/notes/remove-api-v2-dadd877ee5457f79.yaml
Normal file
14
releasenotes/notes/remove-api-v2-dadd877ee5457f79.yaml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
upgrade:
|
||||||
|
- |
|
||||||
|
The Block Storage API v2, which was deprecated in the Pike release,
|
||||||
|
has been removed. If upgrading from a previous OpenStack release, it
|
||||||
|
is recommended that you edit your ``/etc/cinder/api-paste.ini`` file
|
||||||
|
to remove all references to v2. Additionally, the deprecated
|
||||||
|
configuration option ``enable_v2_api`` has been removed. If present
|
||||||
|
in a configuration file, it will be silently ignored.
|
||||||
|
deprecations:
|
||||||
|
- |
|
||||||
|
The configuration option ``enable_v3_api`` is deprecated in this
|
||||||
|
release due to the fact that v3 is the only version of the Block
|
||||||
|
Storage API available. It will be removed in the next release.
|
Loading…
Reference in New Issue
Block a user