diff --git a/cinder/db/sqlalchemy/api.py b/cinder/db/sqlalchemy/api.py index e7037b5682b..9cd5b0fa2e4 100644 --- a/cinder/db/sqlalchemy/api.py +++ b/cinder/db/sqlalchemy/api.py @@ -754,12 +754,11 @@ def _dict_with_extra_specs_if_authorized(context, inst_type_query): """ inst_type_dict = dict(inst_type_query) - if not is_admin_context(context): - del(inst_type_dict['extra_specs']) - else: - extra_specs = {x['key']: x['value'] - for x in inst_type_query['extra_specs']} - inst_type_dict['extra_specs'] = extra_specs + + extra_specs = {x['key']: x['value'] + for x in inst_type_query['extra_specs']} + inst_type_dict['extra_specs'] = extra_specs + return inst_type_dict diff --git a/cinder/tests/unit/api/v2/test_types.py b/cinder/tests/unit/api/v2/test_types.py index 58aeb8b0c52..df50b835fae 100644 --- a/cinder/tests/unit/api/v2/test_types.py +++ b/cinder/tests/unit/api/v2/test_types.py @@ -397,6 +397,36 @@ class VolumeTypesApiTest(test.TestCase): ) self.assertDictEqual(expected_volume_type, output['volume_type']) + with mock.patch.object(common, + 'validate_policy', + side_effect=[False, False]): + view_builder = views_types.ViewBuilder() + now = timeutils.utcnow().isoformat() + raw_volume_type = dict( + name='new_type', + description='new_type_desc', + qos_specs_id='new_id', + is_public=True, + deleted=False, + created_at=now, + updated_at=now, + extra_specs={}, + deleted_at=None, + id=42, + ) + + request = fakes.HTTPRequest.blank("/v2") + output = view_builder.show(request, raw_volume_type) + + self.assertIn('volume_type', output) + expected_volume_type = dict( + name='new_type', + description='new_type_desc', + is_public=True, + id=42, + ) + self.assertDictEqual(expected_volume_type, output['volume_type']) + def test_view_builder_show_pass_all_policy(self): with mock.patch.object(common, 'validate_policy', diff --git a/cinder/tests/unit/test_volume_types.py b/cinder/tests/unit/test_volume_types.py index 34e022c1f7b..d51a6aaf668 100644 --- a/cinder/tests/unit/test_volume_types.py +++ b/cinder/tests/unit/test_volume_types.py @@ -496,15 +496,15 @@ class VolumeTypeTestCase(test.TestCase): self.assertFalse(volume_types.is_public_volume_type(self.ctxt, volume_type_id)) - def test_ensure_no_extra_specs_for_non_admin(self): - # non-admin users shouldn't get extra-specs back in type-get/list etc + def test_ensure__extra_specs_for_non_admin(self): + # non-admin users get extra-specs back in type-get/list etc at DB layer ctxt = context.RequestContext('average-joe', 'd802f078-0af1-4e6b-8c02-7fac8d4339aa', auth_token='token', is_admin=False) volume_types.create(self.ctxt, "type-test", is_public=False) vtype = volume_types.get_volume_type_by_name(ctxt, 'type-test') - self.assertIsNone(vtype.get('extra_specs', None)) + self.assertIsNotNone(vtype.get('extra_specs', None)) def test_ensure_extra_specs_for_admin(self): # admin users should get extra-specs back in type-get/list etc