Merge "Don't use context.elevated to get volume"

This commit is contained in:
Jenkins 2015-08-14 22:55:39 +00:00 committed by Gerrit Code Review
commit 4bba79d2f2
5 changed files with 63 additions and 22 deletions

View File

@ -235,10 +235,13 @@ class VolumeApiTest(test.TestCase):
req,
body)
def test_volume_update(self):
self.stubs.Set(db, 'volume_get', stubs.stub_volume_get_db)
self.stubs.Set(volume_api.API, "update", stubs.stub_volume_update)
@mock.patch.object(db, 'volume_admin_metadata_get',
return_value={'attached_mode': 'rw',
'readonly': 'False'})
@mock.patch.object(db, 'volume_get', side_effect=stubs.stub_volume_get_db)
@mock.patch.object(volume_api.API, 'update',
side_effect=stubs.stub_volume_update)
def test_volume_update(self, *args):
updates = {
"display_name": "Updated Test Name",
}
@ -266,10 +269,14 @@ class VolumeApiTest(test.TestCase):
self.assertEqual(expected, res_dict)
self.assertEqual(2, len(self.notifier.notifications))
def test_volume_update_metadata(self):
self.stubs.Set(db, 'volume_get', stubs.stub_volume_get_db)
self.stubs.Set(volume_api.API, "update", stubs.stub_volume_update)
@mock.patch.object(db, 'volume_admin_metadata_get',
return_value={"qos_max_iops": 2000,
"readonly": "False",
"attached_mode": "rw"})
@mock.patch.object(db, 'volume_get', side_effect=stubs.stub_volume_get_db)
@mock.patch.object(volume_api.API, 'update',
side_effect=stubs.stub_volume_update)
def test_volume_update_metadata(self, *args):
updates = {
"metadata": {"qos_max_iops": 2000}
}
@ -300,6 +307,11 @@ class VolumeApiTest(test.TestCase):
self.assertEqual(2, len(self.notifier.notifications))
def test_volume_update_with_admin_metadata(self):
def stubs_volume_admin_metadata_get(context, volume_id):
return {'key': 'value',
'readonly': 'True'}
self.stubs.Set(db, 'volume_admin_metadata_get',
stubs_volume_admin_metadata_get)
self.stubs.Set(volume_api.API, "update", stubs.stub_volume_update)
volume = stubs.stub_volume("1")
@ -379,6 +391,11 @@ class VolumeApiTest(test.TestCase):
req, '1', body)
def test_volume_list(self):
def stubs_volume_admin_metadata_get(context, volume_id):
return {'attached_mode': 'rw',
'readonly': 'False'}
self.stubs.Set(db, 'volume_admin_metadata_get',
stubs_volume_admin_metadata_get)
self.stubs.Set(db, 'volume_get', stubs.stub_volume_get_db)
self.stubs.Set(volume_api.API, 'get_all',
stubs.stub_volume_get_all_by_project)
@ -524,9 +541,11 @@ class VolumeApiTest(test.TestCase):
'size': 1}]}
self.assertEqual(expected, res_dict)
def test_volume_show(self):
self.stubs.Set(db, 'volume_get', stubs.stub_volume_get_db)
@mock.patch.object(db, 'volume_admin_metadata_get',
return_value={'attached_mode': 'rw',
'readonly': 'False'})
@mock.patch.object(db, 'volume_get', side_effect=stubs.stub_volume_get_db)
def test_volume_show(self, *args):
req = fakes.HTTPRequest.blank('/v1/volumes/1')
res_dict = self.controller.show(req, '1')
expected = {'volume': {'status': 'fakestatus',

View File

@ -125,7 +125,12 @@ def stub_volume_delete(self, context, *args, **param):
def stub_volume_get(self, context, volume_id, viewable_admin_meta=False):
return stub_volume(volume_id)
if viewable_admin_meta:
return stub_volume(volume_id)
else:
volume = stub_volume(volume_id)
del volume['volume_admin_metadata']
return volume
def stub_volume_get_notfound(self, context,
@ -134,7 +139,12 @@ def stub_volume_get_notfound(self, context,
def stub_volume_get_db(context, volume_id):
return stub_volume(volume_id)
if context.is_admin:
return stub_volume(volume_id)
else:
volume = stub_volume(volume_id)
del volume['volume_admin_metadata']
return volume
def stub_volume_get_all(context, search_opts=None, marker=None, limit=None,
@ -150,7 +160,7 @@ def stub_volume_get_all_by_project(self, context, marker, limit,
filters=None,
viewable_admin_meta=False):
filters = filters or {}
return [stub_volume_get(self, context, '1')]
return [stub_volume_get(self, context, '1', viewable_admin_meta=True)]
def stub_snapshot(id, **kwargs):

View File

@ -15,6 +15,7 @@
import datetime
import functools
from lxml import etree
import mock
@ -245,7 +246,8 @@ class VolumeApiTest(test.TestCase):
@mock.patch.object(volume_api.API, 'create', autospec=True)
def test_volume_creation_from_source_volume(self, create, get_volume):
get_volume.side_effect = stubs.stub_volume_get
get_volume.side_effect = functools.partial(stubs.stub_volume_get,
viewable_admin_meta=True)
create.side_effect = stubs.stub_volume_create
source_volid = '2f49aa3a-6aae-488d-8b99-a43271605af6'

View File

@ -705,9 +705,15 @@ def add_visible_admin_metadata(volume):
visible_admin_meta = {}
if volume.get('volume_admin_metadata'):
for item in volume['volume_admin_metadata']:
if item['key'] in _visible_admin_metadata_keys:
visible_admin_meta[item['key']] = item['value']
if isinstance(volume['volume_admin_metadata'], dict):
volume_admin_metadata = volume['volume_admin_metadata']
for key in volume_admin_metadata:
if key in _visible_admin_metadata_keys:
visible_admin_meta[key] = volume_admin_metadata[key]
else:
for item in volume['volume_admin_metadata']:
if item['key'] in _visible_admin_metadata_keys:
visible_admin_meta[item['key']] = item['value']
# avoid circular ref when volume is a Volume instance
elif (volume.get('admin_metadata') and
isinstance(volume.get('admin_metadata'), dict)):

View File

@ -401,12 +401,16 @@ class API(base.Base):
LOG.info(_LI("Volume updated successfully."), resource=vref)
def get(self, context, volume_id, viewable_admin_meta=False):
rv = self.db.volume_get(context, volume_id)
volume = dict(rv)
if viewable_admin_meta:
ctxt = context.elevated()
else:
ctxt = context
rv = self.db.volume_get(ctxt, volume_id)
volume = dict(rv)
admin_metadata = self.db.volume_admin_metadata_get(ctxt,
volume_id)
volume['volume_admin_metadata'] = admin_metadata
try:
check_policy(context, 'get', volume)
except exception.PolicyNotAuthorized: