Allow v2 Volume API to create volume with type name
v2 API only accepts volume type ID when creating volume, while v1 API allows both volume type name and ID (volume type name is unique in Cinder). This patch enables v2 API to accept volume type name as create() parameter. Aslo volume type validation code block in v1 API create() is refactored to a slimmer version. Change-Id: I4ee98b67a0a0e98ff4d402749e12b1335d45f64d Close-bug: 1228835
This commit is contained in:
parent
180513d5e4
commit
64f24b9323
|
@ -357,21 +357,17 @@ class VolumeController(wsgi.Controller):
|
|||
|
||||
req_volume_type = volume.get('volume_type', None)
|
||||
if req_volume_type:
|
||||
if not uuidutils.is_uuid_like(req_volume_type):
|
||||
try:
|
||||
try:
|
||||
if not uuidutils.is_uuid_like(req_volume_type):
|
||||
kwargs['volume_type'] = \
|
||||
volume_types.get_volume_type_by_name(
|
||||
context, req_volume_type)
|
||||
except exception.VolumeTypeNotFound:
|
||||
explanation = 'Volume type not found.'
|
||||
raise exc.HTTPNotFound(explanation=explanation)
|
||||
else:
|
||||
try:
|
||||
else:
|
||||
kwargs['volume_type'] = volume_types.get_volume_type(
|
||||
context, req_volume_type)
|
||||
except exception.VolumeTypeNotFound:
|
||||
explanation = 'Volume type not found.'
|
||||
raise exc.HTTPNotFound(explanation=explanation)
|
||||
except exception.VolumeTypeNotFound:
|
||||
explanation = 'Volume type not found.'
|
||||
raise exc.HTTPNotFound(explanation=explanation)
|
||||
|
||||
kwargs['metadata'] = volume.get('metadata', None)
|
||||
|
||||
|
|
|
@ -330,10 +330,15 @@ class VolumeController(wsgi.Controller):
|
|||
req_volume_type = volume.get('volume_type', None)
|
||||
if req_volume_type:
|
||||
try:
|
||||
kwargs['volume_type'] = volume_types.get_volume_type(
|
||||
context, req_volume_type)
|
||||
if not uuidutils.is_uuid_like(req_volume_type):
|
||||
kwargs['volume_type'] = \
|
||||
volume_types.get_volume_type_by_name(
|
||||
context, req_volume_type)
|
||||
else:
|
||||
kwargs['volume_type'] = volume_types.get_volume_type(
|
||||
context, req_volume_type)
|
||||
except exception.VolumeTypeNotFound:
|
||||
msg = _("Volume type not found")
|
||||
msg = _("Volume type not found.")
|
||||
raise exc.HTTPNotFound(explanation=msg)
|
||||
|
||||
kwargs['metadata'] = volume.get('metadata', None)
|
||||
|
|
|
@ -108,10 +108,27 @@ class VolumeApiTest(test.TestCase):
|
|||
"display_name": "Volume Test Name",
|
||||
"display_description": "Volume Test Desc",
|
||||
"availability_zone": "zone1:host1",
|
||||
"volume_type": db_vol_type['name'], }
|
||||
"volume_type": "FakeTypeName"}
|
||||
body = {"volume": vol}
|
||||
req = fakes.HTTPRequest.blank('/v1/volumes')
|
||||
# Raise 404 when type name isn't valid
|
||||
self.assertRaises(webob.exc.HTTPNotFound, self.controller.create,
|
||||
req, body)
|
||||
# Use correct volume type name
|
||||
vol.update(dict(volume_type=CONF.default_volume_type))
|
||||
body.update(dict(volume=vol))
|
||||
res_dict = self.controller.create(req, body)
|
||||
volume_id = res_dict['volume']['id']
|
||||
self.assertEqual(len(res_dict), 1)
|
||||
self.assertEqual(res_dict['volume']['volume_type'],
|
||||
db_vol_type['name'])
|
||||
|
||||
# Use correct volume type id
|
||||
vol.update(dict(volume_type=db_vol_type['id']))
|
||||
body.update(dict(volume=vol))
|
||||
res_dict = self.controller.create(req, body)
|
||||
volume_id = res_dict['volume']['id']
|
||||
self.assertEqual(len(res_dict), 1)
|
||||
self.assertEqual(res_dict['volume']['volume_type'],
|
||||
db_vol_type['name'])
|
||||
|
||||
|
|
|
@ -114,10 +114,24 @@ class VolumeApiTest(test.TestCase):
|
|||
"name": "Volume Test Name",
|
||||
"description": "Volume Test Desc",
|
||||
"availability_zone": "zone1:host1",
|
||||
"volume_type": db_vol_type['id'],
|
||||
"volume_type": "FakeTypeName",
|
||||
}
|
||||
body = {"volume": vol}
|
||||
req = fakes.HTTPRequest.blank('/v2/volumes')
|
||||
# Raise 404 when type name isn't valid
|
||||
self.assertRaises(webob.exc.HTTPNotFound, self.controller.create,
|
||||
req, body)
|
||||
|
||||
# Use correct volume type name
|
||||
vol.update(dict(volume_type=CONF.default_volume_type))
|
||||
body.update(dict(volume=vol))
|
||||
res_dict = self.controller.create(req, body)
|
||||
volume_id = res_dict['volume']['id']
|
||||
self.assertEqual(len(res_dict), 1)
|
||||
|
||||
# Use correct volume type id
|
||||
vol.update(dict(volume_type=db_vol_type['id']))
|
||||
body.update(dict(volume=vol))
|
||||
res_dict = self.controller.create(req, body)
|
||||
volume_id = res_dict['volume']['id']
|
||||
self.assertEqual(len(res_dict), 1)
|
||||
|
|
Loading…
Reference in New Issue