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
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)
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)
"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'])
"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)