Move get_by_id to CinderObject

Currently each Versioned Object needs to implement its own get_by_id,
with this patch they don't need anymore, since it will be included in
the base class CinderObject and it will work for all the objects.

This will help for other things like having a refresh method or
conditional updates in the objects.

Related-Bug: #1490944
Related-Bug: #1238093
Related-Bug: #1490946
Related-Bug: #1469659
Change-Id: I355dc8eaefed93003533ee083f74acd1315f057e
This commit is contained in:
Gorka Eguileor 2015-08-28 01:14:02 +02:00
parent f38e70031a
commit 938cb0c5ab
30 changed files with 294 additions and 177 deletions

View File

@ -1078,3 +1078,14 @@ def image_volume_cache_get_by_volume_id(context, volume_id):
def image_volume_cache_get_all_for_host(context, host):
"""Query for all image volume cache entry for a host."""
return IMPL.image_volume_cache_get_all_for_host(context, host)
###################
def get_model_for_versioned_object(versioned_object):
return IMPL.get_model_for_versioned_object(versioned_object)
def get_by_id(context, model, id, *args, **kwargs):
return IMPL.get_by_id(context, model, id, *args, **kwargs)

View File

@ -21,6 +21,7 @@
import datetime as dt
import functools
import re
import sys
import threading
import time
@ -2595,6 +2596,12 @@ def volume_type_get(context, id, inactive=False, expected_fields=None):
expected_fields=expected_fields)
def _volume_type_get_full(context, id):
"""Return dict for a specific volume_type with extra_specs and projects."""
return _volume_type_get(context, id, session=None, inactive=False,
expected_fields=('extra_specs', 'projects'))
@require_context
def _volume_type_ref_get(context, id, session=None, inactive=False):
read_deleted = "yes" if inactive else "no"
@ -4126,3 +4133,52 @@ def image_volume_cache_get_all_for_host(context, host):
filter_by(host=host).\
order_by(desc(models.ImageVolumeCacheEntry.last_used)).\
all()
###############################
def get_model_for_versioned_object(versioned_object):
# Exceptions to model mapping, in general Versioned Objects have the same
# name as their ORM models counterparts, but there are some that diverge
VO_TO_MODEL_EXCEPTIONS = {
'BackupImport': models.Backup,
'VolumeType': models.VolumeTypes,
'CGSnapshot': models.Cgsnapshot,
}
model_name = versioned_object.obj_name()
return (VO_TO_MODEL_EXCEPTIONS.get(model_name) or
getattr(models, model_name))
def _get_get_method(model):
# Exceptions to model to get methods, in general method names are a simple
# conversion changing ORM name from camel case to snake format and adding
# _get to the string
GET_EXCEPTIONS = {
models.ConsistencyGroup: consistencygroup_get,
models.VolumeTypes: _volume_type_get_full,
}
if model in GET_EXCEPTIONS:
return GET_EXCEPTIONS[model]
# General conversion
# Convert camel cased model name to snake format
s = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', model.__name__)
# Get method must be snake formatted model name concatenated with _get
method_name = re.sub('([a-z0-9])([A-Z])', r'\1_\2', s).lower() + '_get'
return globals().get(method_name)
_GET_METHODS = {}
@require_context
def get_by_id(context, model, id, *args, **kwargs):
# Add get method to cache dictionary if it's not already there
if not _GET_METHODS.get(model):
_GET_METHODS[model] = _get_get_method(model)
return _GET_METHODS[model](context, id, *args, **kwargs)

View File

@ -101,12 +101,6 @@ class Backup(base.CinderPersistentObject, base.CinderObject,
backup.obj_reset_changes()
return backup
@base.remotable_classmethod
def get_by_id(cls, context, id, read_deleted=None, project_only=None):
db_backup = db.backup_get(context, id, read_deleted=read_deleted,
project_only=project_only)
return cls._from_db_object(context, cls(context), db_backup)
@base.remotable
def create(self):
if self.obj_attr_is_set('id'):

View File

@ -21,7 +21,9 @@ from oslo_log import log as logging
from oslo_versionedobjects import base
from oslo_versionedobjects import fields
from cinder import db
from cinder import exception
from cinder.i18n import _
from cinder import objects
@ -69,6 +71,22 @@ class CinderObject(base.VersionedObject):
# Return modified dict
return changes
@base.remotable_classmethod
def get_by_id(cls, context, id, *args, **kwargs):
# To get by id we need to have a model and for the model to
# have an id field
if 'id' not in cls.fields:
msg = (_('VersionedObject %s cannot retrieve object by id.') %
(cls.obj_name()))
raise NotImplementedError(msg)
model = db.get_model_for_versioned_object(cls)
orm_obj = db.get_by_id(context, model, id, *args, **kwargs)
kargs = {}
if hasattr(cls, 'DEFAULT_EXPECTED_ATTR'):
kargs = {'expected_attrs': getattr(cls, 'DEFAULT_EXPECTED_ATTR')}
return cls._from_db_object(context, cls(context), orm_obj, **kargs)
class CinderObjectDictCompat(base.VersionedObjectDictCompat):
"""Mix-in to provide dictionary key access compat.

View File

@ -68,11 +68,6 @@ class CGSnapshot(base.CinderPersistentObject, base.CinderObject,
cgsnapshot.obj_reset_changes()
return cgsnapshot
@base.remotable_classmethod
def get_by_id(cls, context, id):
db_cgsnapshots = db.cgsnapshot_get(context, id)
return cls._from_db_object(context, cls(context), db_cgsnapshots)
@base.remotable
def create(self):
if self.obj_attr_is_set('id'):

View File

@ -49,12 +49,6 @@ class ConsistencyGroup(base.CinderPersistentObject, base.CinderObject,
consistencygroup.obj_reset_changes()
return consistencygroup
@base.remotable_classmethod
def get_by_id(cls, context, id):
db_consistencygroup = db.consistencygroup_get(context, id)
return cls._from_db_object(context, cls(context),
db_consistencygroup)
@base.remotable
def create(self):
if self.obj_attr_is_set('id'):

View File

@ -66,11 +66,6 @@ class Service(base.CinderPersistentObject, base.CinderObject,
service.obj_reset_changes()
return service
@base.remotable_classmethod
def get_by_id(cls, context, id):
db_service = db.service_get(context, id)
return cls._from_db_object(context, cls(context), db_service)
@base.remotable_classmethod
def get_by_host_and_topic(cls, context, host, topic):
db_service = db.service_get_by_host_and_topic(context, host, topic)

View File

@ -36,6 +36,8 @@ class Snapshot(base.CinderPersistentObject, base.CinderObject,
# Version 1.0: Initial version
VERSION = '1.0'
DEFAULT_EXPECTED_ATTR = ('metadata',)
fields = {
'id': fields.UUIDField(),
@ -133,12 +135,6 @@ class Snapshot(base.CinderPersistentObject, base.CinderObject,
snapshot.obj_reset_changes()
return snapshot
@base.remotable_classmethod
def get_by_id(cls, context, id):
db_snapshot = db.snapshot_get(context, id)
return cls._from_db_object(context, cls(context), db_snapshot,
expected_attrs=['metadata'])
@base.remotable
def create(self):
if self.obj_attr_is_set('id'):

View File

@ -37,6 +37,8 @@ class Volume(base.CinderPersistentObject, base.CinderObject,
# volume_type
VERSION = '1.1'
DEFAULT_EXPECTED_ATTR = ('admin_metadata', 'metadata')
fields = {
'id': fields.UUIDField(),
'_name_id': fields.UUIDField(nullable=True),
@ -182,13 +184,6 @@ class Volume(base.CinderPersistentObject, base.CinderObject,
volume.obj_reset_changes()
return volume
@base.remotable_classmethod
def get_by_id(cls, context, id):
db_volume = db.volume_get(context, id)
expected_attrs = ['admin_metadata', 'metadata']
return cls._from_db_object(context, cls(context), db_volume,
expected_attrs=expected_attrs)
@base.remotable
def create(self):
if self.obj_attr_is_set('id'):

View File

@ -57,11 +57,6 @@ class VolumeAttachment(base.CinderPersistentObject, base.CinderObject,
attachment.obj_reset_changes()
return attachment
@base.remotable_classmethod
def get_by_id(cls, context, id):
db_attach = db.volume_attachment_get(context, id)
return cls._from_db_object(context, cls(context), db_attach)
@base.remotable
def save(self):
updates = self.cinder_obj_get_changes()

View File

@ -33,6 +33,8 @@ class VolumeType(base.CinderPersistentObject, base.CinderObject,
# Version 1.0: Initial version
VERSION = '1.0'
DEFAULT_EXPECTED_ATTR = ('extra_specs', 'projects')
fields = {
'id': fields.UUIDField(),
'name': fields.StringField(nullable=True),
@ -71,14 +73,6 @@ class VolumeType(base.CinderPersistentObject, base.CinderObject,
type.obj_reset_changes()
return type
@base.remotable_classmethod
def get_by_id(cls, context, id):
db_volume_type = volume_types.get_volume_type(
context, id, expected_fields=['extra_specs', 'projects'])
expected_attrs = ['extra_specs', 'projects']
return cls._from_db_object(context, cls(context), db_volume_type,
expected_attrs=expected_attrs)
@base.remotable
def create(self):
if self.obj_attr_is_set('id'):

View File

@ -252,6 +252,12 @@ class TestCase(testtools.TestCase):
self._disable_osprofiler()
# NOTE(geguileo): This is required because common get_by_id method in
# cinder.db.sqlalchemy.api caches get methods and if we use a mocked
# get method in one test it would carry on to the next test. So we
# clear out the cache.
sqla_api._GET_METHODS = {}
def _restore_obj_registry(self):
objects_base.CinderObjectRegistry._registry._obj_classes = \
self._base_test_obj_backup

View File

@ -22,16 +22,30 @@ from cinder.tests.unit.api import fakes
from cinder.tests.unit.api.v2 import stubs
def stub_snapshot_get(context, snapshot_id):
snapshot = stubs.stub_snapshot(snapshot_id)
if snapshot_id == 3:
snapshot['status'] = 'error'
elif snapshot_id == 1:
snapshot['status'] = 'creating'
elif snapshot_id == 7:
snapshot['status'] = 'available'
else:
snapshot['status'] = 'creating'
return snapshot
class SnapshotActionsTest(test.TestCase):
def setUp(self):
super(SnapshotActionsTest, self).setUp()
@mock.patch('cinder.db.snapshot_update', autospec=True)
@mock.patch('cinder.db.sqlalchemy.api._snapshot_get',
side_effect=stub_snapshot_get)
@mock.patch('cinder.db.snapshot_metadata_get', return_value=dict())
def test_update_snapshot_status(self, metadata_get):
self.stubs.Set(db, 'snapshot_get', stub_snapshot_get)
self.stubs.Set(db, 'snapshot_update', stub_snapshot_update)
def test_update_snapshot_status(self, metadata_get, *args):
body = {'os-update_snapshot_status': {'status': 'available'}}
req = webob.Request.blank('/v2/fake/snapshots/1/action')
req.method = "POST"
@ -41,9 +55,10 @@ class SnapshotActionsTest(test.TestCase):
res = req.get_response(fakes.wsgi_app())
self.assertEqual(202, res.status_int)
@mock.patch('cinder.db.sqlalchemy.api._snapshot_get',
side_effect=stub_snapshot_get)
@mock.patch('cinder.db.snapshot_metadata_get', return_value=dict())
def test_update_snapshot_status_invalid_status(self, metadata_get):
self.stubs.Set(db, 'snapshot_get', stub_snapshot_get)
def test_update_snapshot_status_invalid_status(self, metadata_get, *args):
body = {'os-update_snapshot_status': {'status': 'in-use'}}
req = webob.Request.blank('/v2/fake/snapshots/1/action')
req.method = "POST"
@ -63,21 +78,3 @@ class SnapshotActionsTest(test.TestCase):
res = req.get_response(fakes.wsgi_app())
self.assertEqual(400, res.status_int)
def stub_snapshot_get(context, snapshot_id):
snapshot = stubs.stub_snapshot(snapshot_id)
if snapshot_id == 3:
snapshot['status'] = 'error'
elif snapshot_id == 1:
snapshot['status'] = 'creating'
elif snapshot_id == 7:
snapshot['status'] = 'available'
else:
snapshot['status'] = 'creating'
return snapshot
def stub_snapshot_update(self, context, id, **kwargs):
pass

View File

@ -483,9 +483,10 @@ class SnapshotMetaDataTest(test.TestCase):
self.controller.update_all, req, self.req_id,
expected)
def test_update_all_malformed_data(self):
self.stubs.Set(cinder.db, 'snapshot_metadata_update',
return_create_snapshot_metadata)
@mock.patch('cinder.db.sqlalchemy.api._snapshot_get')
@mock.patch('cinder.db.snapshot_metadata_update', autospec=True)
def test_update_all_malformed_data(self, metadata_update, snapshot_get):
snapshot_get.return_value = stub_get
req = fakes.HTTPRequest.blank(self.url)
req.method = 'PUT'
req.content_type = "application/json"
@ -554,9 +555,10 @@ class SnapshotMetaDataTest(test.TestCase):
self.controller.update, req, self.req_id, 'key1',
None)
def test_update_item_empty_key(self):
self.stubs.Set(cinder.db, 'snapshot_metadata_update',
return_create_snapshot_metadata)
@mock.patch('cinder.db.sqlalchemy.api._snapshot_get')
@mock.patch('cinder.db.snapshot_metadata_update', autospec=True)
def test_update_item_empty_key(self, metadata_update, snapshot_get):
snapshot_get.return_value = stub_get
req = fakes.HTTPRequest.blank(self.url + '/key1')
req.method = 'PUT'
body = {"meta": {"": "value1"}}

View File

@ -73,7 +73,8 @@ class VolumeApiTest(test.TestCase):
def test_volume_create(self):
self.stubs.Set(volume_api.API, "create", stubs.stub_volume_api_create)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
vol = {"size": 100,
"display_name": "Volume Test Name",
@ -161,7 +162,8 @@ class VolumeApiTest(test.TestCase):
def test_volume_create_with_image_id(self):
self.stubs.Set(volume_api.API, "create", stubs.stub_volume_api_create)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
self.ext_mgr.extensions = {'os-image-create': 'fake'}
test_id = "c905cedb-7281-47e4-8a62-f26bc5fc4c77"
@ -241,7 +243,7 @@ class VolumeApiTest(test.TestCase):
@mock.patch.object(db, 'volume_admin_metadata_get',
return_value={'attached_mode': 'rw',
'readonly': 'False'})
@mock.patch.object(db, 'volume_type_get',
@mock.patch.object(db.sqlalchemy.api, '_volume_type_get_full',
side_effect=stubs.stub_volume_type_get)
@mock.patch.object(volume_api.API, 'get',
side_effect=stubs.stub_volume_api_get, autospec=True)
@ -280,7 +282,7 @@ class VolumeApiTest(test.TestCase):
return_value={"qos_max_iops": 2000,
"readonly": "False",
"attached_mode": "rw"})
@mock.patch.object(db, 'volume_type_get',
@mock.patch.object(db.sqlalchemy.api, '_volume_type_get_full',
side_effect=stubs.stub_volume_type_get)
@mock.patch.object(volume_api.API, 'get',
side_effect=stubs.stub_volume_api_get, autospec=True)
@ -411,7 +413,8 @@ class VolumeApiTest(test.TestCase):
self.stubs.Set(db, 'volume_get', stubs.stub_volume_get_db)
self.stubs.Set(volume_api.API, 'get_all',
stubs.stub_volume_api_get_all_by_project)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v1/volumes')
res_dict = self.controller.index(req)
@ -489,7 +492,8 @@ class VolumeApiTest(test.TestCase):
def test_volume_list_detail(self, *args):
self.stubs.Set(volume_api.API, 'get_all',
stubs.stub_volume_api_get_all_by_project)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v1/volumes/detail')
res_dict = self.controller.index(req)
@ -566,7 +570,7 @@ class VolumeApiTest(test.TestCase):
'readonly': 'False'})
@mock.patch.object(volume_api.API, 'get',
side_effect=stubs.stub_volume_api_get, autospec=True)
@mock.patch.object(db, 'volume_type_get',
@mock.patch.object(db.sqlalchemy.api, '_volume_type_get_full',
side_effect=stubs.stub_volume_type_get, autospec=True)
def test_volume_show(self, *args):
req = fakes.HTTPRequest.blank('/v1/volumes/1')
@ -599,7 +603,8 @@ class VolumeApiTest(test.TestCase):
return fake_volume.fake_volume_obj(context, **vol)
self.stubs.Set(volume_api.API, 'get', stub_volume_get)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v1/volumes/1')
res_dict = self.controller.show(req, '1')
@ -629,7 +634,8 @@ class VolumeApiTest(test.TestCase):
return fake_volume.fake_volume_obj(context, **vol)
self.stubs.Set(volume_api.API, 'get', stub_volume_get)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v1/volumes/1')
res_dict = self.controller.show(req, '1')
@ -679,7 +685,8 @@ class VolumeApiTest(test.TestCase):
self.stubs.Set(db, 'volume_get_all_by_project',
stub_volume_get_all_by_project)
self.stubs.Set(db, 'volume_get', stubs.stub_volume_get_db)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v1/volumes/detail?limit=2\
&offset=1',
@ -746,7 +753,8 @@ class VolumeApiTest(test.TestCase):
return fake_volume.fake_volume_obj(context, **vol)
self.stubs.Set(volume_api.API, 'get', stub_volume_get)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v1/volumes/1')
res_dict = self.controller.show(req, 1)
@ -754,14 +762,16 @@ class VolumeApiTest(test.TestCase):
def test_volume_show_with_unencrypted_volume(self):
self.stubs.Set(volume_api.API, 'get', stubs.stub_volume_api_get)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v1/volumes/1')
res_dict = self.controller.show(req, 1)
self.assertEqual(False, res_dict['volume']['encrypted'])
def test_volume_delete(self):
self.stubs.Set(db, 'volume_get', stubs.stub_volume_get_db)
self.stubs.Set(db.sqlalchemy.api, 'volume_get',
stubs.stub_volume_get_db)
req = fakes.HTTPRequest.blank('/v1/volumes/1')
resp = self.controller.delete(req, 1)
@ -779,7 +789,8 @@ class VolumeApiTest(test.TestCase):
def test_admin_list_volumes_limited_to_project(self):
self.stubs.Set(db, 'volume_get_all_by_project',
stubs.stub_volume_get_all_by_project)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v1/fake/volumes',
use_admin_context=True)
@ -789,7 +800,8 @@ class VolumeApiTest(test.TestCase):
self.assertEqual(1, len(res['volumes']))
def test_admin_list_volumes_all_tenants(self):
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v1/fake/volumes?all_tenants=1',
use_admin_context=True)
res = self.controller.index(req)
@ -800,7 +812,8 @@ class VolumeApiTest(test.TestCase):
self.stubs.Set(db, 'volume_get_all_by_project',
stubs.stub_volume_get_all_by_project)
self.stubs.Set(db, 'volume_get', stubs.stub_volume_get_db)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v1/fake/volumes?all_tenants=1')
res = self.controller.index(req)
@ -811,7 +824,8 @@ class VolumeApiTest(test.TestCase):
self.stubs.Set(db, 'volume_get_all_by_project',
stubs.stub_volume_get_all_by_project)
self.stubs.Set(db, 'volume_get', stubs.stub_volume_get_db)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v1/fake/volumes')
res = self.controller.index(req)

View File

@ -555,9 +555,10 @@ class SnapshotMetaDataTest(test.TestCase):
self.controller.update, req, self.req_id, 'key1',
None)
def test_update_item_empty_key(self):
self.stubs.Set(cinder.db, 'snapshot_metadata_update',
return_create_snapshot_metadata)
@mock.patch('cinder.db.sqlalchemy.api._snapshot_get')
@mock.patch('cinder.db.snapshot_metadata_update', autospec=True)
def test_update_item_empty_key(self, metadata_update, snapshot_get):
snapshot_get.return_value = stub_get
req = fakes.HTTPRequest.blank(self.url + '/key1')
req.method = 'PUT'
body = {"meta": {"": "value1"}}

View File

@ -72,7 +72,8 @@ class VolumeApiTest(test.TestCase):
def test_volume_create(self, mock_validate):
self.stubs.Set(volume_api.API, 'get', stubs.stub_volume_get)
self.stubs.Set(volume_api.API, "create", stubs.stub_volume_api_create)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
vol = self._vol_in_request_body()
body = {"volume": vol}
@ -120,7 +121,11 @@ class VolumeApiTest(test.TestCase):
self.stubs.Set(volume_api.API, 'get_all',
lambda *args, **kwargs:
objects.VolumeList(objects=[vol_obj]))
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
# NOTE(geguileo): This is required because common get_by_id method in
# cinder.db.sqlalchemy.api caches the real get method.
db.sqlalchemy.api._GET_METHODS = {}
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v2/volumes/detail')
res_dict = self.controller.detail(req)
self.assertTrue(mock_validate.called)
@ -217,7 +222,8 @@ class VolumeApiTest(test.TestCase):
'multiattach': False,
}
@mock.patch.object(db, 'volume_type_get', autospec=True)
@mock.patch.object(db.sqlalchemy.api, '_volume_type_get_full',
autospec=True)
@mock.patch.object(volume_api.API, 'get_snapshot', autospec=True)
@mock.patch.object(volume_api.API, 'create', autospec=True)
def test_volume_creation_from_snapshot(self, create, get_snapshot,
@ -262,7 +268,8 @@ class VolumeApiTest(test.TestCase):
get_snapshot.assert_called_once_with(self.controller.volume_api,
context, snapshot_id)
@mock.patch.object(db, 'volume_type_get', autospec=True)
@mock.patch.object(db.sqlalchemy.api, '_volume_type_get_full',
autospec=True)
@mock.patch.object(volume_api.API, 'get_volume', autospec=True)
@mock.patch.object(volume_api.API, 'create', autospec=True)
def test_volume_creation_from_source_volume(self, create, get_volume,
@ -386,7 +393,8 @@ class VolumeApiTest(test.TestCase):
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_volume_create_with_image_ref(self, mock_validate):
self.stubs.Set(volume_api.API, "create", stubs.stub_volume_api_create)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
self.ext_mgr.extensions = {'os-image-create': 'fake'}
vol = self._vol_in_request_body(
@ -439,7 +447,8 @@ class VolumeApiTest(test.TestCase):
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_volume_create_with_image_id(self, mock_validate):
self.stubs.Set(volume_api.API, "create", stubs.stub_volume_api_create)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
self.ext_mgr.extensions = {'os-image-create': 'fake'}
vol = self._vol_in_request_body(
@ -492,7 +501,8 @@ class VolumeApiTest(test.TestCase):
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_volume_create_with_image_name(self, mock_validate):
self.stubs.Set(volume_api.API, "create", stubs.stub_volume_api_create)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
self.stubs.Set(fake_image._FakeImageService,
"detail",
stubs.stub_image_service_detail)
@ -549,7 +559,8 @@ class VolumeApiTest(test.TestCase):
def test_volume_update(self, mock_validate):
self.stubs.Set(volume_api.API, 'get', stubs.stub_volume_api_get)
self.stubs.Set(volume_api.API, "update", stubs.stub_volume_update)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
updates = {
"name": "Updated Test Name",
@ -570,7 +581,8 @@ class VolumeApiTest(test.TestCase):
def test_volume_update_deprecation(self, mock_validate):
self.stubs.Set(volume_api.API, 'get', stubs.stub_volume_api_get)
self.stubs.Set(volume_api.API, "update", stubs.stub_volume_update)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
updates = {
"display_name": "Updated Test Name",
@ -594,7 +606,8 @@ class VolumeApiTest(test.TestCase):
"""Test current update keys have priority over deprecated keys."""
self.stubs.Set(volume_api.API, 'get', stubs.stub_volume_api_get)
self.stubs.Set(volume_api.API, "update", stubs.stub_volume_update)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
updates = {
"name": "New Name",
@ -619,7 +632,8 @@ class VolumeApiTest(test.TestCase):
def test_volume_update_metadata(self, mock_validate):
self.stubs.Set(volume_api.API, 'get', stubs.stub_volume_api_get)
self.stubs.Set(volume_api.API, "update", stubs.stub_volume_update)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
updates = {
"metadata": {"qos_max_iops": 2000}
@ -717,7 +731,8 @@ class VolumeApiTest(test.TestCase):
def test_volume_list_summary(self):
self.stubs.Set(volume_api.API, 'get_all',
stubs.stub_volume_api_get_all_by_project)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v2/volumes')
res_dict = self.controller.index(req)
@ -747,7 +762,8 @@ class VolumeApiTest(test.TestCase):
def test_volume_list_detail(self):
self.stubs.Set(volume_api.API, 'get_all',
stubs.stub_volume_api_get_all_by_project)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v2/volumes/detail')
res_dict = self.controller.detail(req)
@ -910,7 +926,8 @@ class VolumeApiTest(test.TestCase):
]
self.stubs.Set(db, 'volume_get_all_by_project',
stub_volume_get_all_by_project)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v2/volumes/detail?marker=1')
res_dict = self.controller.detail(req)
@ -922,7 +939,8 @@ class VolumeApiTest(test.TestCase):
def test_volume_detail_limit(self):
self.stubs.Set(db, 'volume_get_all_by_project',
stubs.stub_volume_get_all_by_project)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v2/volumes/detail?limit=1')
res_dict = self.controller.detail(req)
@ -953,7 +971,8 @@ class VolumeApiTest(test.TestCase):
def test_volume_detail_limit_marker(self):
self.stubs.Set(db, 'volume_get_all_by_project',
stubs.stub_volume_get_all_by_project)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v2/volumes/detail?marker=1&limit=1')
res_dict = self.controller.detail(req)
@ -1150,7 +1169,8 @@ class VolumeApiTest(test.TestCase):
def test_volume_show(self):
self.stubs.Set(volume_api.API, 'get', stubs.stub_volume_api_get)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v2/volumes/1')
res_dict = self.controller.show(req, '1')
@ -1173,7 +1193,8 @@ class VolumeApiTest(test.TestCase):
self.stubs.Set(volume_api.API, 'get', stub_volume_get)
self.stubs.Set(db, 'volume_admin_metadata_get',
stub_volume_admin_metadata_get)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v2/volumes/1')
res_dict = self.controller.show(req, '1')
@ -1238,7 +1259,8 @@ class VolumeApiTest(test.TestCase):
return fake_volume.fake_volume_obj(context, **vol)
self.stubs.Set(volume_api.API, 'get', stub_volume_get)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v2/volumes/1')
res_dict = self.controller.show(req, 1)
@ -1246,7 +1268,8 @@ class VolumeApiTest(test.TestCase):
def test_volume_show_with_unencrypted_volume(self):
self.stubs.Set(volume_api.API, 'get', stubs.stub_volume_api_get)
self.stubs.Set(db, 'volume_type_get', stubs.stub_volume_type_get)
self.stubs.Set(db.sqlalchemy.api, '_volume_type_get_full',
stubs.stub_volume_type_get)
req = fakes.HTTPRequest.blank('/v2/volumes/1')
res_dict = self.controller.show(req, 1)

View File

@ -14,6 +14,7 @@
import mock
from cinder.db.sqlalchemy import models
from cinder import exception
from cinder import objects
from cinder.tests.unit import fake_volume
@ -37,10 +38,21 @@ fake_backup = {
class TestBackup(test_objects.BaseObjectsTestCase):
@mock.patch('cinder.db.backup_get', return_value=fake_backup)
@mock.patch('cinder.db.get_by_id', return_value=fake_backup)
def test_get_by_id(self, backup_get):
backup = objects.Backup.get_by_id(self.context, 1)
self._compare(self, fake_backup, backup)
backup_get.assert_called_once_with(self.context, models.Backup, 1)
@mock.patch('cinder.db.sqlalchemy.api.model_query')
def test_get_by_id_no_existing_id(self, model_query):
query = mock.Mock()
filter_by = mock.Mock()
filter_by.first.return_value = None
query.filter_by.return_value = filter_by
model_query.return_value = query
self.assertRaises(exception.BackupNotFound, objects.Backup.get_by_id,
self.context, 123)
@mock.patch('cinder.db.backup_create', return_value=fake_backup)
def test_create(self, backup_create):

View File

@ -33,7 +33,7 @@ fake_cgsnapshot = {
class TestCGSnapshot(test_objects.BaseObjectsTestCase):
@mock.patch('cinder.db.cgsnapshot_get',
@mock.patch('cinder.db.sqlalchemy.api.cgsnapshot_get',
return_value=fake_cgsnapshot)
def test_get_by_id(self, cgsnapshot_get):
cgsnapshot = objects.CGSnapshot.get_by_id(self.context, 1)

View File

@ -35,19 +35,16 @@ fake_consistencygroup = {
class TestConsistencyGroup(test_objects.BaseObjectsTestCase):
@mock.patch('cinder.db.consistencygroup_get',
@mock.patch('cinder.db.sqlalchemy.api.consistencygroup_get',
return_value=fake_consistencygroup)
def test_get_by_id(self, consistencygroup_get):
consistencygroup = objects.ConsistencyGroup.get_by_id(self.context, 1)
self._compare(self, fake_consistencygroup, consistencygroup)
consistencygroup_get.assert_called_once_with(self.context, 1)
@mock.patch('cinder.db.sqlalchemy.api.model_query')
def test_get_by_id_no_existing_id(self, model_query):
query = mock.Mock()
filter_by = mock.Mock()
filter_by.first.return_value = None
query.filter_by.return_value = filter_by
model_query.return_value = query
model_query().filter_by().first.return_value = None
self.assertRaises(exception.ConsistencyGroupNotFound,
objects.ConsistencyGroup.get_by_id, self.context,
123)

View File

@ -21,23 +21,23 @@ from cinder import test
# NOTE: The hashes in this list should only be changed if they come with a
# corresponding version bump in the affected objects.
object_data = {
'Backup': '1.1-f2e7befd20d3bb388700f17c4f386b28',
'BackupImport': '1.1-f2e7befd20d3bb388700f17c4f386b28',
'BackupList': '1.0-db44728c8d21bb23bba601a5499550f8',
'CGSnapshot': '1.0-d50e9480cee2abcb2222997f2bb85656',
'CGSnapshotList': '1.0-3361be608f396c5ae045b6d94f901346',
'ConsistencyGroup': '1.0-98714c3d8f83914fd7a17317c3c29e01',
'ConsistencyGroupList': '1.0-a906318d3e69d847f31df561d12540b3',
'Service': '1.0-b81a04373ce0ad2d07de525eb534afd6',
'ServiceList': '1.0-1911175eadd43fb6eafbefd18c802f2c',
'Snapshot': '1.0-54a2726a282cbdb47ddd326107e821ce',
'SnapshotList': '1.0-46abf2a1e65ef55dad4f36fe787f9a78',
'Volume': '1.1-adc26d52b646723bd0633b0771ad2598',
'VolumeAttachment': '1.0-4fd93dbfa57d048a4859f5bb1ca66bed',
'VolumeAttachmentList': '1.0-829c18b1d929ea1f8a451b3c4e0a0289',
'VolumeList': '1.1-d41f3a850be5fbaa94eb4cc955c7ca60',
'VolumeType': '1.0-8cb7daad27570133543c2c359d85c658',
'VolumeTypeList': '1.0-980f0b518aed9df0beb55cc533eff632'
'Backup': '1.1-cd077ec037f5ad1f5409fd660bd59f53',
'BackupImport': '1.1-cd077ec037f5ad1f5409fd660bd59f53',
'BackupList': '1.0-24591dabe26d920ce0756fe64cd5f3aa',
'CGSnapshot': '1.0-190da2a2aa9457edc771d888f7d225c4',
'CGSnapshotList': '1.0-e8c3f4078cd0ee23487b34d173eec776',
'ConsistencyGroup': '1.0-b9bad093daee0b259edddb3993c60c31',
'ConsistencyGroupList': '1.0-09d0aad5491e762ecfdf66bef02ceb8d',
'Service': '1.0-64baeb4911dbab1153064dd1c87edb9f',
'ServiceList': '1.0-d242d3384b68e5a5a534e090ff1d5161',
'Snapshot': '1.0-a6c33eefeadefb324d79f72f66c54e9a',
'SnapshotList': '1.0-71661e7180ef6cc51501704a9bea4bf1',
'Volume': '1.1-6037de222b09c330b33b419a0c1b10c6',
'VolumeAttachment': '1.0-f14a7c03ffc5b93701d496251a5263aa',
'VolumeAttachmentList': '1.0-307d2b6c8dd55ef854f6386898e9e98e',
'VolumeList': '1.1-03ba6cb8c546683e64e15c50042cb1a3',
'VolumeType': '1.0-bf8abbbea2e852ed2e9bac5a9f5f70f2',
'VolumeTypeList': '1.0-09b01f4526266c1a58cb206ba509d6d2',
}

View File

@ -21,7 +21,7 @@ from cinder.tests.unit import objects as test_objects
class TestService(test_objects.BaseObjectsTestCase):
@mock.patch('cinder.db.service_get')
@mock.patch('cinder.db.sqlalchemy.api.service_get')
def test_get_by_id(self, service_get):
db_service = fake_service.fake_db_service()
service_get.return_value = db_service

View File

@ -17,6 +17,7 @@ import mock
from oslo_log import log as logging
from cinder.db.sqlalchemy import models
from cinder import exception
from cinder import objects
from cinder.tests.unit import fake_snapshot
@ -48,10 +49,18 @@ fake_snapshot_obj = {
class TestSnapshot(test_objects.BaseObjectsTestCase):
@mock.patch('cinder.db.snapshot_get', return_value=fake_db_snapshot)
@mock.patch('cinder.db.get_by_id', return_value=fake_db_snapshot)
def test_get_by_id(self, snapshot_get):
snapshot = objects.Snapshot.get_by_id(self.context, 1)
self._compare(self, fake_snapshot_obj, snapshot)
snapshot_get.assert_called_once_with(self.context, models.Snapshot, 1)
@mock.patch('cinder.db.sqlalchemy.api.model_query')
def test_get_by_id_no_existing_id(self, model_query):
query = model_query().options().options().filter_by().first
query.return_value = None
self.assertRaises(exception.SnapshotNotFound,
objects.Snapshot.get_by_id, self.context, 123)
def test_reset_changes(self):
snapshot = objects.Snapshot()

View File

@ -15,6 +15,7 @@
import mock
from cinder import context
from cinder import exception
from cinder import objects
from cinder.tests.unit import fake_volume
from cinder.tests.unit import objects as test_objects
@ -23,12 +24,20 @@ from cinder.tests.unit import objects as test_objects
class TestVolume(test_objects.BaseObjectsTestCase):
@mock.patch('cinder.db.volume_glance_metadata_get', return_value={})
@mock.patch('cinder.db.volume_get')
@mock.patch('cinder.db.sqlalchemy.api.volume_get')
def test_get_by_id(self, volume_get, volume_glance_metadata_get):
db_volume = fake_volume.fake_db_volume()
volume_get.return_value = db_volume
volume = objects.Volume.get_by_id(self.context, 1)
self._compare(self, db_volume, volume)
volume_get.assert_called_once_with(self.context, 1)
@mock.patch('cinder.db.sqlalchemy.api.model_query')
def test_get_by_id_no_existing_id(self, model_query):
pf = model_query().options().options().options().options().options()
pf.filter_by().first.return_value = None
self.assertRaises(exception.VolumeNotFound,
objects.Volume.get_by_id, self.context, 123)
@mock.patch('cinder.db.volume_create')
def test_create(self, volume_create):

View File

@ -21,7 +21,7 @@ from cinder.tests.unit import objects as test_objects
class TestVolumeAttachment(test_objects.BaseObjectsTestCase):
@mock.patch('cinder.db.volume_attachment_get')
@mock.patch('cinder.db.sqlalchemy.api.volume_attachment_get')
def test_get_by_id(self, volume_attachment_get):
db_attachment = fake_volume.fake_db_volume_attachment()
volume_attachment_get.return_value = db_attachment

View File

@ -21,7 +21,7 @@ from cinder.tests.unit import objects as test_objects
class TestVolumeType(test_objects.BaseObjectsTestCase):
@mock.patch('cinder.db.volume_type_get')
@mock.patch('cinder.db.sqlalchemy.api._volume_type_get_full')
def test_get_by_id(self, volume_type_get):
db_volume_type = fake_volume.fake_db_volume_type()
volume_type_get.return_value = db_volume_type

View File

@ -462,7 +462,7 @@ class TestCinderManageCmd(test.TestCase):
serializer=object_serializer())
self.assertEqual(mock_rpc_client, rpc_client)
@mock.patch('cinder.db.volume_get')
@mock.patch('cinder.db.sqlalchemy.api.volume_get')
@mock.patch('cinder.context.get_admin_context')
@mock.patch('cinder.rpc.get_client')
@mock.patch('cinder.rpc.init')
@ -492,7 +492,7 @@ class TestCinderManageCmd(test.TestCase):
volume=volume_obj)
@mock.patch('cinder.db.volume_destroy')
@mock.patch('cinder.db.volume_get')
@mock.patch('cinder.db.sqlalchemy.api.volume_get')
@mock.patch('cinder.context.get_admin_context')
@mock.patch('cinder.rpc.init')
def test_volume_commands_delete_no_host(self, rpc_init, get_admin_context,
@ -519,7 +519,7 @@ class TestCinderManageCmd(test.TestCase):
self.assertEqual(expected_out, fake_out.getvalue())
@mock.patch('cinder.db.volume_destroy')
@mock.patch('cinder.db.volume_get')
@mock.patch('cinder.db.sqlalchemy.api.volume_get')
@mock.patch('cinder.context.get_admin_context')
@mock.patch('cinder.rpc.init')
def test_volume_commands_delete_volume_in_use(self, rpc_init,

View File

@ -180,10 +180,11 @@ class ServiceTestCase(test.TestCase):
'report_count': 0,
'availability_zone': 'nova',
'id': 1}
with mock.patch.object(objects.service, 'db') as mock_db:
with mock.patch.object(objects.service, 'db') as mock_db,\
mock.patch('cinder.db.sqlalchemy.api.get_by_id') as get_by_id:
mock_db.service_get_by_args.side_effect = exception.NotFound()
mock_db.service_create.return_value = service_ref
mock_db.service_get.return_value = service_ref
get_by_id.return_value = service_ref
serv = service.Service(
self.host,

View File

@ -1131,8 +1131,9 @@ class VolumeTestCase(BaseVolumeTestCase):
self.assertRaises(exception.NotFound, db.volume_get,
self.context, volume['id'])
@mock.patch.object(db, 'volume_get', side_effect=exception.VolumeNotFound(
volume_id='12345678-1234-5678-1234-567812345678'))
@mock.patch.object(db.sqlalchemy.api, 'volume_get',
side_effect=exception.VolumeNotFound(
volume_id='12345678-1234-5678-1234-567812345678'))
def test_delete_volume_not_found(self, mock_get_volume):
"""Test delete volume moves on if the volume does not exist."""
volume_id = '12345678-1234-5678-1234-567812345678'
@ -2026,7 +2027,7 @@ class VolumeTestCase(BaseVolumeTestCase):
@mock.patch.object(cinder.volume.targets.iscsi.ISCSITarget,
'_get_target_chap_auth')
@mock.patch.object(db, 'volume_admin_metadata_get')
@mock.patch.object(db, 'volume_get')
@mock.patch.object(db.sqlalchemy.api, 'volume_get')
@mock.patch.object(db, 'volume_update')
def test_initialize_connection_fetchqos(self,
_mock_volume_update,
@ -2085,7 +2086,7 @@ class VolumeTestCase(BaseVolumeTestCase):
self.assertIsNone(conn_info['data']['qos_specs'])
@mock.patch.object(fake_driver.FakeISCSIDriver, 'create_export')
@mock.patch.object(db, 'volume_get')
@mock.patch.object(db.sqlalchemy.api, 'volume_get')
@mock.patch.object(db, 'volume_update')
def test_initialize_connection_export_failure(self,
_mock_volume_update,
@ -2115,7 +2116,7 @@ class VolumeTestCase(BaseVolumeTestCase):
'_get_target_chap_auth')
@mock.patch.object(db, 'volume_admin_metadata_get')
@mock.patch.object(db, 'volume_update')
@mock.patch.object(db, 'volume_get')
@mock.patch.object(db.sqlalchemy.api, 'volume_get')
@mock.patch.object(fake_driver.FakeISCSIDriver, 'initialize_connection')
@mock.patch.object(db, 'driver_initiator_data_get')
@mock.patch.object(db, 'driver_initiator_data_update')
@ -2918,7 +2919,7 @@ class VolumeTestCase(BaseVolumeTestCase):
self.assertEqual("detached", vol['attach_status'])
@mock.patch.object(cinder.volume.api.API, 'update')
@mock.patch.object(db, 'volume_get')
@mock.patch.object(db.sqlalchemy.api, 'volume_get')
def test_reserve_volume_success(self, volume_get, volume_update):
fake_volume = {
'id': self.FAKE_UUID,
@ -2948,15 +2949,15 @@ class VolumeTestCase(BaseVolumeTestCase):
'status': status
}
with mock.patch.object(db, 'volume_get') as mock_volume_get:
mock_volume_get.return_value = fake_volume
with mock.patch.object(db.sqlalchemy.api, 'volume_get') as mock_get:
mock_get.return_value = fake_volume
self.assertRaises(exception.InvalidVolume,
cinder.volume.api.API().reserve_volume,
self.context,
fake_volume)
self.assertTrue(mock_volume_get.called)
self.assertTrue(mock_get.called)
@mock.patch.object(db, 'volume_get')
@mock.patch.object(db.sqlalchemy.api, 'volume_get')
@mock.patch.object(db, 'volume_attachment_get_used_by_volume_id')
@mock.patch.object(cinder.volume.api.API, 'update')
def test_unreserve_volume_success(self, volume_get,
@ -3807,7 +3808,7 @@ class VolumeTestCase(BaseVolumeTestCase):
'name',
'description')
@mock.patch.object(db, 'volume_get')
@mock.patch.object(db.sqlalchemy.api, 'volume_get')
def test_begin_detaching_fails_available(self, volume_get):
volume_api = cinder.volume.api.API()
volume = tests_utils.create_volume(self.context, **self.volume_params)
@ -4360,7 +4361,7 @@ class VolumeMigrationTestCase(VolumeTestCase):
@mock.patch('cinder.compute.API')
@mock.patch('cinder.volume.manager.VolumeManager.'
'migrate_volume_completion')
@mock.patch('cinder.db.volume_get')
@mock.patch('cinder.db.sqlalchemy.api.volume_get')
def test_migrate_volume_generic(self, volume_get,
migrate_volume_completion,
nova_api):
@ -4387,7 +4388,7 @@ class VolumeMigrationTestCase(VolumeTestCase):
@mock.patch('cinder.compute.API')
@mock.patch('cinder.volume.manager.VolumeManager.'
'migrate_volume_completion')
@mock.patch('cinder.db.volume_get')
@mock.patch('cinder.db.sqlalchemy.api.volume_get')
def test_migrate_volume_generic_attached_volume(self, volume_get,
migrate_volume_completion,
nova_api):
@ -4783,8 +4784,8 @@ class VolumeMigrationTestCase(VolumeTestCase):
with mock.patch.object(self.volume.driver, 'retype') as _retype,\
mock.patch.object(volume_types, 'volume_types_diff') as _diff,\
mock.patch.object(self.volume, 'migrate_volume') as _mig,\
mock.patch.object(db, 'volume_get') as get_volume:
get_volume.return_value = volume
mock.patch.object(db.sqlalchemy.api, 'volume_get') as mock_get:
mock_get.return_value = volume
_retype.return_value = driver
_diff.return_value = ({}, diff_equal)
if migrate_exc:
@ -6114,7 +6115,7 @@ class GenericVolumeDriverTestCase(DriverTestCase):
@mock.patch('six.moves.builtins.open')
@mock.patch.object(os_brick.initiator.connector,
'get_connector_properties')
@mock.patch.object(db, 'volume_get')
@mock.patch.object(db.sqlalchemy.api, 'volume_get')
def test_backup_volume_available(self, mock_volume_get,
mock_get_connector_properties,
mock_file_open,
@ -6151,7 +6152,7 @@ class GenericVolumeDriverTestCase(DriverTestCase):
@mock.patch('six.moves.builtins.open')
@mock.patch.object(os_brick.initiator.connector,
'get_connector_properties')
@mock.patch.object(db, 'volume_get')
@mock.patch.object(db.sqlalchemy.api, 'volume_get')
def test_backup_volume_inuse_temp_volume(self, mock_volume_get,
mock_get_connector_properties,
mock_file_open,
@ -6205,7 +6206,7 @@ class GenericVolumeDriverTestCase(DriverTestCase):
@mock.patch.object(os_brick.initiator.connector,
'get_connector_properties',
return_value={})
@mock.patch.object(db, 'volume_get')
@mock.patch.object(db.sqlalchemy.api, 'volume_get')
def test_backup_volume_inuse_temp_snapshot(self, mock_volume_get,
mock_get_connector_properties,
mock_check_device,
@ -6809,8 +6810,9 @@ class LVMISCSIVolumeDriverTestCase(DriverTestCase):
self.stubs.Set(self.volume.driver.vg, 'get_volume',
self._get_manage_existing_lvs)
@mock.patch.object(db, 'volume_get', side_effect=exception.VolumeNotFound(
volume_id='d8cd1feb-2dcc-404d-9b15-b86fe3bec0a1'))
@mock.patch.object(db.sqlalchemy.api, 'volume_get',
side_effect=exception.VolumeNotFound(
volume_id='d8cd1feb-2dcc-404d-9b15-b86fe3bec0a1'))
def test_lvm_manage_existing_not_found(self, mock_vol_get):
self._setup_stubs_for_manage_existing()
@ -6822,7 +6824,7 @@ class LVMISCSIVolumeDriverTestCase(DriverTestCase):
model_update = self.volume.driver.manage_existing(vol, ref)
self.assertIsNone(model_update)
@mock.patch.object(db, 'volume_get')
@mock.patch.object(db.sqlalchemy.api, 'volume_get')
def test_lvm_manage_existing_already_managed(self, mock_conf):
self._setup_stubs_for_manage_existing()
@ -7070,7 +7072,7 @@ class LVMVolumeDriverTestCase(DriverTestCase):
@mock.patch('six.moves.builtins.open')
@mock.patch.object(os_brick.initiator.connector,
'get_connector_properties')
@mock.patch.object(db, 'volume_get')
@mock.patch.object(db.sqlalchemy.api, 'volume_get')
def test_backup_volume(self, mock_volume_get,
mock_get_connector_properties,
mock_file_open,
@ -7143,7 +7145,7 @@ class LVMVolumeDriverTestCase(DriverTestCase):
@mock.patch('six.moves.builtins.open')
@mock.patch.object(os_brick.initiator.connector,
'get_connector_properties')
@mock.patch.object(db, 'volume_get')
@mock.patch.object(db.sqlalchemy.api, 'volume_get')
def test_backup_volume_inuse(self, mock_volume_get,
mock_get_connector_properties,
mock_file_open,

View File

@ -45,7 +45,8 @@ class TestCreateSnapShot(scaleio.TestScaleIODriver):
self.snapshot = fake_snapshot.fake_snapshot_obj(
ctx, **{'volume': self.fake_volume})
self.mock_object(db, 'volume_get', self.return_fake_volume)
self.mock_object(db.sqlalchemy.api, 'volume_get',
self.return_fake_volume)
snap_vol_id = self.snapshot.volume_id
self.volume_name_2x_enc = urllib.parse.quote(