api: Remove unnecessary validation helpers

Now that we have JSON schemas for all APIs that accept a body, we no
longer need to do this validation in the method.

Change-Id: Ie09de58bd1b01edea916d7e43e32eb81e7877fae
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
Stephen Finucane
2024-04-24 12:20:30 +01:00
parent 1d41db9f89
commit bd04e532fc
14 changed files with 44 additions and 197 deletions

View File

@@ -161,7 +161,7 @@ class BackupsController(wsgi.Controller):
container = backup.get('container', None)
volume_id = backup['volume_id']
self.validate_name_and_description(backup, check_length=False)
self.clean_name_and_description(backup)
name = backup.get('name', None)
description = backup.get('description', None)
incremental = strutils.bool_from_string(backup.get(

View File

@@ -124,21 +124,12 @@ class CgsnapshotsController(wsgi.Controller):
"""Create a new cgsnapshot."""
versionutils.report_deprecated_feature(LOG, DEPRECATE_CGSNAP_API_MSG)
LOG.debug('Creating new cgsnapshot %s', body)
self.assert_valid_body(body, 'cgsnapshot')
context = req.environ['cinder.context']
cgsnapshot = body['cgsnapshot']
self.validate_name_and_description(cgsnapshot)
try:
group_id = cgsnapshot['consistencygroup_id']
except KeyError:
msg = _("'consistencygroup_id' must be specified")
raise exc.HTTPBadRequest(explanation=msg)
# Not found exception will be handled at the wsgi level
group = self._get_cg(context, group_id)
group_id = cgsnapshot['consistencygroup_id']
self.clean_name_and_description(cgsnapshot)
name = cgsnapshot.get('name', None)
description = cgsnapshot.get('description', None)
@@ -146,6 +137,9 @@ class CgsnapshotsController(wsgi.Controller):
{'name': name},
context=context)
# Not found exception will be handled at the wsgi level
group = self._get_cg(context, group_id)
try:
new_cgsnapshot = self.group_snapshot_api.create_group_snapshot(
context, group, name, description)

View File

@@ -68,9 +68,9 @@ class ConsistencyGroupsController(wsgi.Controller):
context = req.environ['cinder.context']
force = False
if body:
self.assert_valid_body(body, 'consistencygroup')
cg_body = body['consistencygroup']
# We wrap this in a try-except "to be sure to be sure" but the
# schema will ensure we never get unexpected values here
try:
force = strutils.bool_from_string(cg_body.get('force', False),
strict=True)
@@ -142,12 +142,12 @@ class ConsistencyGroupsController(wsgi.Controller):
"""Create a new consistency group."""
versionutils.report_deprecated_feature(LOG, DEPRECATE_CG_API_MSG)
LOG.debug('Creating new consistency group %s', body)
self.assert_valid_body(body, 'consistencygroup')
context = req.environ['cinder.context']
context.authorize(group_policy.CREATE_POLICY)
consistencygroup = body['consistencygroup']
self.validate_name_and_description(consistencygroup)
self.clean_name_and_description(consistencygroup)
name = consistencygroup.get('name', None)
description = consistencygroup.get('description', None)
volume_types = consistencygroup.get('volume_types', None)
@@ -194,12 +194,12 @@ class ConsistencyGroupsController(wsgi.Controller):
"""
versionutils.report_deprecated_feature(LOG, DEPRECATE_CG_API_MSG)
LOG.debug('Creating new consistency group %s.', body)
self.assert_valid_body(body, 'consistencygroup-from-src')
context = req.environ['cinder.context']
context.authorize(group_policy.CREATE_POLICY)
consistencygroup = body['consistencygroup-from-src']
self.validate_name_and_description(consistencygroup)
self.clean_name_and_description(consistencygroup)
name = consistencygroup.get('name', None)
description = consistencygroup.get('description', None)
cgsnapshot_id = consistencygroup.get('cgsnapshot_id', None)
@@ -288,12 +288,12 @@ class ConsistencyGroupsController(wsgi.Controller):
msg = _("Missing request body.")
raise exc.HTTPBadRequest(explanation=msg)
self.assert_valid_body(body, 'consistencygroup')
context = req.environ['cinder.context']
group = self._get(context, id)
context.authorize(group_policy.UPDATE_POLICY, target_obj=group)
consistencygroup = body.get('consistencygroup', None)
self.validate_name_and_description(consistencygroup)
consistencygroup = body['consistencygroup']
self.clean_name_and_description(consistencygroup)
name = consistencygroup.get('name', None)
description = consistencygroup.get('description', None)
add_volumes = consistencygroup.get('add_volumes', None)

View File

@@ -1239,37 +1239,14 @@ class Controller(object, metaclass=ControllerMetaclass):
return decorator
@staticmethod
def assert_valid_body(body, entity_name):
fail_msg = _(
"Missing required element '%s' in request body.") % entity_name
if not (body and entity_name in body):
raise webob.exc.HTTPBadRequest(explanation=fail_msg)
def is_dict(d):
try:
d.get(None)
return True
except AttributeError:
return False
if not is_dict(body[entity_name]):
raise webob.exc.HTTPBadRequest(explanation=fail_msg)
@staticmethod
def validate_name_and_description(body, check_length=True):
def clean_name_and_description(body):
"""Strip whitespace from name and description fields."""
for attribute in ['name', 'description',
'display_name', 'display_description']:
value = body.get(attribute)
if value is not None:
if isinstance(value, str):
body[attribute] = value.strip()
if check_length:
try:
utils.check_string_length(body[attribute], attribute,
min_length=0, max_length=255)
except exception.InvalidInput as error:
raise webob.exc.HTTPBadRequest(explanation=error.msg)
@staticmethod
def validate_string_length(value, entity_name, min_length=0,

View File

@@ -45,7 +45,7 @@ class BackupsController(backups.BackupsController):
backup_update = body['backup']
self.validate_name_and_description(backup_update, check_length=False)
self.clean_name_and_description(backup_update)
update_dict = {}
if 'name' in backup_update:
update_dict['display_name'] = backup_update.pop('name')

View File

@@ -76,12 +76,12 @@ class ConsistencyGroupsController(
msg = _("Missing request body.")
raise exc.HTTPBadRequest(explanation=msg)
self.assert_valid_body(body, 'consistencygroup')
context = req.environ['cinder.context']
group = self._get(context, id)
context.authorize(group_policy.UPDATE_POLICY, target_obj=group)
consistencygroup = body.get('consistencygroup', None)
self.validate_name_and_description(consistencygroup)
consistencygroup = body['consistencygroup']
self.clean_name_and_description(consistencygroup)
name = consistencygroup.get('name', None)
description = consistencygroup.get('description', None)
add_volumes = consistencygroup.get('add_volumes', None)

View File

@@ -48,7 +48,6 @@ class SnapshotMetadataController(wsgi.Controller):
@validation.schema(schema.create)
def create(self, req, snapshot_id, body):
self.assert_valid_body(body, 'metadata')
context = req.environ['cinder.context']
metadata = body['metadata']
@@ -61,7 +60,6 @@ class SnapshotMetadataController(wsgi.Controller):
@validation.schema(schema.update)
def update(self, req, snapshot_id, id, body):
self.assert_valid_body(body, 'meta')
meta_item = body['meta']
if id not in meta_item:
@@ -82,7 +80,6 @@ class SnapshotMetadataController(wsgi.Controller):
@validation.schema(schema.update_all)
def update_all(self, req, snapshot_id, body):
self.assert_valid_body(body, 'metadata')
context = req.environ['cinder.context']
metadata = body['metadata']

View File

@@ -207,7 +207,7 @@ class SnapshotsController(wsgi.Controller):
LOG.info("Create snapshot from volume %s", volume_id)
self.validate_name_and_description(snapshot, check_length=False)
self.clean_name_and_description(snapshot)
if 'name' in snapshot:
snapshot['display_name'] = snapshot.pop('name')
@@ -237,8 +237,8 @@ class SnapshotsController(wsgi.Controller):
"""Update a snapshot."""
context = req.environ['cinder.context']
snapshot_body = body['snapshot']
self.validate_name_and_description(snapshot_body, check_length=False)
self.clean_name_and_description(snapshot_body)
if 'name' in snapshot_body:
snapshot_body['display_name'] = snapshot_body.pop('name')

View File

@@ -250,9 +250,8 @@ class VolumeController(wsgi.Controller):
@validation.schema(schema.revert)
def revert(self, req, id, body):
"""revert a volume to a snapshot"""
context = req.environ['cinder.context']
self.assert_valid_body(body, 'revert')
snapshot_id = body['revert'].get('snapshot_id')
volume = self.volume_api.get_volume(context, id)
try:
@@ -380,7 +379,7 @@ class VolumeController(wsgi.Controller):
volume = body['volume']
kwargs = {}
self.validate_name_and_description(volume, check_length=False)
self.clean_name_and_description(volume)
# NOTE: it's 'name'/'description' in the REST API, but
# 'display_name'/display_description' in the database layer,
@@ -484,8 +483,7 @@ class VolumeController(wsgi.Controller):
"""Update a volume."""
context = req.environ['cinder.context']
update_dict = body['volume']
self.validate_name_and_description(update_dict, check_length=False)
self.clean_name_and_description(update_dict)
# NOTE(thingee): v2 API allows name instead of display_name
if 'name' in update_dict:

View File

@@ -214,9 +214,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
db.volume_destroy(context.get_admin_context(), volume_id)
consistencygroup.destroy()
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_create_cgsnapshot_json(self, mock_validate):
def test_create_cgsnapshot_json(self):
vol_type = utils.create_volume_type(context.get_admin_context(),
self, name='my_vol_type')
consistencygroup = utils.create_group(
@@ -243,7 +241,6 @@ class CgsnapshotsAPITestCase(test.TestCase):
self.assertEqual(HTTPStatus.ACCEPTED, res.status_int)
self.assertIn('id', res_dict['cgsnapshot'])
self.assertTrue(mock_validate.called)
cgsnapshot = objects.GroupSnapshot.get_by_id(
context.get_admin_context(), res_dict['cgsnapshot']['id'])
@@ -251,10 +248,7 @@ class CgsnapshotsAPITestCase(test.TestCase):
db.volume_destroy(context.get_admin_context(), volume_id)
consistencygroup.destroy()
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_create_cgsnapshot_when_volume_in_error_status(self,
mock_validate):
def test_create_cgsnapshot_when_volume_in_error_status(self):
vol_type = utils.create_volume_type(context.get_admin_context(),
self, name='my_vol_type')
consistencygroup = utils.create_group(
@@ -286,7 +280,6 @@ class CgsnapshotsAPITestCase(test.TestCase):
"is in error status.",
res_dict['badRequest']['message']
)
self.assertTrue(mock_validate.called)
db.volume_destroy(context.get_admin_context(), volume_id)
consistencygroup.destroy()

View File

@@ -427,9 +427,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
for vol_type_id in res_dict['consistencygroups'][2]['volume_types']:
self.assertIn(vol_type_id, vol_type_ids)
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_create_consistencygroup_json(self, mock_validate):
def test_create_consistencygroup_json(self):
group_id = fake.CONSISTENCY_GROUP_ID
# Create volume type
@@ -451,7 +449,6 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
self.assertEqual(HTTPStatus.ACCEPTED, res.status_int)
self.assertIn('id', res_dict['consistencygroup'])
self.assertTrue(mock_validate.called)
group_id = res_dict['consistencygroup']['id']
cg = objects.Group.get_by_id(self.ctxt, group_id)
@@ -780,9 +777,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
res_dict['badRequest']['code'])
self.assertIsNotNone(res_dict['badRequest']['message'])
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_update_consistencygroup_success(self, mock_validate):
def test_update_consistencygroup_success(self):
volume_type_id = utils.create_volume_type(
context.get_admin_context(), self, name='my_vol_type')['id']
fake_grp_type = {'id': fake.GROUP_TYPE_ID, 'name': 'fake_grp_type'}
@@ -858,16 +853,13 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
consistencygroup = objects.Group.get_by_id(
self.ctxt, consistencygroup.id)
self.assertEqual(HTTPStatus.ACCEPTED, res.status_int)
self.assertTrue(mock_validate.called)
self.assertEqual(fields.ConsistencyGroupStatus.UPDATING,
consistencygroup.status)
consistencygroup.destroy()
cg2.destroy()
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_update_consistencygroup_sourcing_cg(self, mock_validate):
def test_update_consistencygroup_sourcing_cg(self):
volume_type_id = fake.VOLUME_TYPE_ID
consistencygroup = self._create_consistencygroup(
status=fields.ConsistencyGroupStatus.AVAILABLE,
@@ -909,9 +901,7 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
consistencygroup.destroy()
cg2.destroy()
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_update_consistencygroup_creating_cgsnapshot(self, mock_validate):
def test_update_consistencygroup_creating_cgsnapshot(self):
volume_type_id = fake.VOLUME_TYPE_ID
consistencygroup = self._create_consistencygroup(
status=fields.ConsistencyGroupStatus.AVAILABLE,
@@ -1143,11 +1133,8 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
consistencygroup.destroy()
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
@mock.patch('cinder.scheduler.rpcapi.SchedulerAPI.validate_host_capacity')
def test_create_consistencygroup_from_src_snap(self, mock_validate_host,
mock_validate):
def test_create_consistencygroup_from_src_snap(self, mock_validate_host):
self.mock_object(volume_api.API, "create", v3_fakes.fake_volume_create)
consistencygroup = utils.create_group(
@@ -1184,7 +1171,6 @@ class ConsistencyGroupsAPITestCase(test.TestCase):
self.assertEqual(HTTPStatus.ACCEPTED, res.status_int)
self.assertIn('id', res_dict['consistencygroup'])
self.assertEqual(test_cg_name, res_dict['consistencygroup']['name'])
self.assertTrue(mock_validate.called)
cg_ref = objects.Group.get_by_id(
self.ctxt.elevated(), res_dict['consistencygroup']['id'])

View File

@@ -14,7 +14,6 @@ from http import HTTPStatus
import inspect
from unittest import mock
import ddt
from oslo_utils import encodeutils
import webob
@@ -881,70 +880,3 @@ class ResponseObjectTest(test.TestCase):
def test_default_serializers(self):
robj = wsgi.ResponseObject({})
self.assertEqual({}, robj.serializers)
@ddt.data
class ValidBodyTest(test.TestCase):
def setUp(self):
super(ValidBodyTest, self).setUp()
self.controller = wsgi.Controller()
def test_assert_valid_body(self):
body = {'foo': {}}
self.controller.assert_valid_body(body, 'foo')
def test_assert_valid_body_none(self):
self.assertRaises(webob.exc.HTTPBadRequest,
self.controller.assert_valid_body(None, 'foo'))
def test_assert_valid_body_empty(self):
self.assertRaises(webob.exc.HTTPBadRequest,
self.controller.assert_valid_body({}, 'foo'))
def test_assert_valid_body_no_entity(self):
body = {'bar': {}}
self.assertRaises(webob.exc.HTTPBadRequest,
self.controller.assert_valid_body(body, 'foo'))
def test_assert_valid_body_malformed_entity(self):
body = {'foo': 'bar'}
self.assertRaises(webob.exc.HTTPBadRequest,
self.controller.assert_valid_body(body, 'foo'))
def test_validate_string_length_with_name_too_long(self):
name = 'a' * 256
self.assertRaises(webob.exc.HTTPBadRequest,
self.controller.validate_string_length,
name, 'Name', min_length=1, max_length=255,
remove_whitespaces=False)
@ddt.data('name', 'display_name', 'description', 'display_description')
def test_validate_name_and_description_with_name_too_long(self, attribute):
body = {attribute: 'a' * 256}
self.assertRaises(webob.exc.HTTPBadRequest,
self.controller.validate_name_and_description,
body)
@ddt.data('name', 'display_name', 'description', 'display_description')
def test_validate_name_and_description_with_name_as_int(self, attribute):
body = {attribute: 1234}
self.assertRaises(webob.exc.HTTPBadRequest,
self.controller.validate_name_and_description,
body)
@ddt.data('name', 'display_name', 'description', 'display_description')
def test_validate_name_and_description_with_name_zero_length(self,
attribute):
# NOTE(jdg): We allow zero length names currently, particularly
# from Nova, changes to this require an API version bump
body = {attribute: ""}
self.controller.validate_name_and_description(body)
self.assertEqual('', body[attribute])
@ddt.data('name', 'display_name', 'description', 'display_description')
def test_validate_name_and_description_with_name_contains_white_spaces(
self, attribute):
body = {attribute: 'a' * 255 + " "}
self.controller.validate_name_and_description(body)
self.assertEqual('a' * 255, body[attribute])

View File

@@ -74,9 +74,7 @@ class VolumeManageTest(test.TestCase):
@mock.patch('cinder.volume.api.API.manage_existing',
wraps=test_contrib.api_manage)
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_manage_volume_route(self, mock_validate, mock_api_manage):
def test_manage_volume_route(self, mock_api_manage):
"""Test call to manage volume.
There is currently no change between the API in contrib and the API in

View File

@@ -459,9 +459,7 @@ class VolumeApiTest(BaseVolumeTest):
autospec=True)
@mock.patch.object(volume_api.API, 'get_snapshot', autospec=True)
@mock.patch.object(volume_api.API, 'create', autospec=True)
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_volume_create_with_snapshot_image(self, mock_validate, create,
def test_volume_create_with_snapshot_image(self, create,
get_snapshot, volume_type_get):
create.side_effect = v3_fakes.fake_volume_api_create
get_snapshot.side_effect = v3_fakes.fake_snapshot_get
@@ -1275,9 +1273,7 @@ class VolumeApiTestNoMicroversion(BaseVolumeTest):
'qos_specs_id': fake.QOS_SPEC_ID,
'deleted': False}
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_volume_create(self, mock_validate):
def test_volume_create(self):
self.mock_object(volume_api.API, 'get', v3_fakes.fake_volume_get)
self.mock_object(volume_api.API, "create",
v3_fakes.fake_volume_api_create)
@@ -1290,16 +1286,13 @@ class VolumeApiTestNoMicroversion(BaseVolumeTest):
res_dict = self.controller.create(req, body=body)
ex = self._expected_vol_from_controller()
self.assertEqual(ex, res_dict)
self.assertTrue(mock_validate.called)
@mock.patch.object(db, 'volume_get_all', v3_fakes.fake_volume_get_all)
@mock.patch.object(db, 'service_get_all',
return_value=v3_fakes.fake_service_get_all_by_topic(
None, None),
autospec=True)
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_volume_create_with_type(self, mock_validate, mock_service_get):
def test_volume_create_with_type(self, mock_service_get):
db_vol_type = db.volume_type_get_by_name(context.get_admin_context(),
'__DEFAULT__')
@@ -1338,7 +1331,6 @@ class VolumeApiTestNoMicroversion(BaseVolumeTest):
v3_fakes.fake_volume_type_get)
req = fakes.HTTPRequest.blank('/v3/volumes/detail')
res_dict = self.controller.detail(req)
self.assertTrue(mock_validate.called)
@classmethod
def _vol_in_request_body(cls,
@@ -1592,9 +1584,7 @@ class VolumeApiTestNoMicroversion(BaseVolumeTest):
self.controller.create,
req, body=body)
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_volume_create_with_image_ref(self, mock_validate):
def test_volume_create_with_image_ref(self):
self.mock_object(volume_api.API, "create",
v3_fakes.fake_volume_api_create)
self.mock_object(db.sqlalchemy.api, '_volume_type_get_full',
@@ -1608,7 +1598,6 @@ class VolumeApiTestNoMicroversion(BaseVolumeTest):
req = fakes.HTTPRequest.blank('/v3/volumes')
res_dict = self.controller.create(req, body=body)
self.assertEqual(ex, res_dict)
self.assertTrue(mock_validate.called)
def test_volume_create_with_image_ref_is_integer(self):
self.mock_object(volume_api.API, "create", v3_fakes.fake_volume_create)
@@ -1649,9 +1638,7 @@ class VolumeApiTestNoMicroversion(BaseVolumeTest):
req,
body=body)
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_volume_create_with_image_id(self, mock_validate):
def test_volume_create_with_image_id(self):
self.mock_object(volume_api.API, "create",
v3_fakes.fake_volume_api_create)
self.mock_object(db.sqlalchemy.api, '_volume_type_get_full',
@@ -1665,7 +1652,6 @@ class VolumeApiTestNoMicroversion(BaseVolumeTest):
req = fakes.HTTPRequest.blank('/v3/volumes')
res_dict = self.controller.create(req, body=body)
self.assertEqual(ex, res_dict)
self.assertTrue(mock_validate.called)
def test_volume_create_with_image_id_is_integer(self):
self.mock_object(volume_api.API, "create", v3_fakes.fake_volume_create)
@@ -1706,9 +1692,7 @@ class VolumeApiTestNoMicroversion(BaseVolumeTest):
req,
body=body)
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_volume_create_with_image_name(self, mock_validate):
def test_volume_create_with_image_name(self):
self.mock_object(volume_api.API, "create",
v3_fakes.fake_volume_api_create)
self.mock_object(db.sqlalchemy.api, '_volume_type_get_full',
@@ -1801,9 +1785,7 @@ class VolumeApiTestNoMicroversion(BaseVolumeTest):
self.assertEqual(expected, res_dict)
self.assertEqual(2, len(self.notifier.notifications))
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_volume_update_deprecation(self, mock_validate):
def test_volume_update_deprecation(self):
self.mock_object(volume_api.API, 'get', v3_fakes.fake_volume_api_get)
self.mock_object(volume_api.API, "update", v3_fakes.fake_volume_update)
self.mock_object(db.sqlalchemy.api, '_volume_type_get_full',
@@ -1823,11 +1805,8 @@ class VolumeApiTestNoMicroversion(BaseVolumeTest):
metadata={'attached_mode': 'rw', 'readonly': 'False'})
self.assertEqual(expected, res_dict)
self.assertEqual(2, len(self.notifier.notifications))
self.assertTrue(mock_validate.called)
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_volume_update_deprecation_key_priority(self, mock_validate):
def test_volume_update_deprecation_key_priority(self):
"""Test current update keys have priority over deprecated keys."""
self.mock_object(volume_api.API, 'get', v3_fakes.fake_volume_api_get)
self.mock_object(volume_api.API, "update", v3_fakes.fake_volume_update)
@@ -1850,11 +1829,8 @@ class VolumeApiTestNoMicroversion(BaseVolumeTest):
metadata={'attached_mode': 'rw', 'readonly': 'False'})
self.assertEqual(expected, res_dict)
self.assertEqual(2, len(self.notifier.notifications))
self.assertTrue(mock_validate.called)
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_volume_update_metadata(self, mock_validate):
def test_volume_update_metadata(self):
self.mock_object(volume_api.API, 'get', v3_fakes.fake_volume_api_get)
self.mock_object(volume_api.API, "update", v3_fakes.fake_volume_update)
self.mock_object(db.sqlalchemy.api, '_volume_type_get_full',
@@ -1873,11 +1849,8 @@ class VolumeApiTestNoMicroversion(BaseVolumeTest):
'qos_max_iops': '2000'})
self.assertEqual(expected, res_dict)
self.assertEqual(2, len(self.notifier.notifications))
self.assertTrue(mock_validate.called)
@mock.patch(
'cinder.api.openstack.wsgi.Controller.validate_name_and_description')
def test_volume_update_with_admin_metadata(self, mock_validate):
def test_volume_update_with_admin_metadata(self):
self.mock_object(volume_api.API, "update", v3_fakes.fake_volume_update)
volume = v3_fakes.create_volume(fake.VOLUME_ID)
@@ -1926,7 +1899,6 @@ class VolumeApiTestNoMicroversion(BaseVolumeTest):
tzinfo=iso8601.UTC)
self.assertEqual(expected, res_dict)
self.assertEqual(2, len(self.notifier.notifications))
self.assertTrue(mock_validate.called)
@ddt.data({'a' * 256: 'a'},
{'a': 'a' * 256},