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:
Brian Rosmaita 2021-05-19 14:57:17 -04:00
parent d5f0e51879
commit e05b261af7
65 changed files with 720 additions and 1155 deletions

View File

@ -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:

View File

@ -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"
} }
] ]

View File

@ -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"
} }
] ]

View File

@ -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)

View File

@ -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)

View File

@ -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))

View File

@ -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)

View File

@ -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)

View File

@ -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'

View File

@ -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.

View File

@ -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)

View File

@ -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']})

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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')

View File

@ -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')

View File

@ -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,

View File

@ -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",

View File

@ -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'

View File

@ -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'

View File

@ -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'

View File

@ -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'

View File

@ -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

View File

@ -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)

View File

@ -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},

View File

@ -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,

View File

@ -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, {})

View File

@ -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)

View File

@ -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'

View File

@ -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'

View File

@ -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'

View File

@ -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)

View File

@ -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'

View File

@ -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))

View File

@ -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())

View File

@ -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)

View File

@ -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)

View File

@ -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())

View File

@ -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())

View File

@ -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'

View File

@ -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,

View File

@ -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)

View File

@ -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'

View File

@ -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

View File

@ -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."""

View File

@ -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

View File

@ -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'

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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:

View File

@ -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
~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
@ -110,65 +95,14 @@ must create a database, service credentials, and API endpoints.
| type | volumev3 | | type | volumev3 |
+-------------+----------------------------------+ +-------------+----------------------------------+
.. 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
-------------------------------- --------------------------------

View File

@ -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
-------------------------------- --------------------------------

View File

@ -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
-------------------------------- --------------------------------

View File

@ -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

View File

@ -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

View 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.