[Kimchi-devel] [PATCH v2 3/3] issue #543: Generate unique names when creating volumes without name
Crístian Viana
vianac at linux.vnet.ibm.com
Wed Dec 10 17:12:58 UTC 2014
If the user creates a volume without setting its name, Kimchi generates a
default value. However, another volume with that generated name may
already exist and the volume creation may fail.
The following commands demonstrate the issue:
$ kimchi_rest /storagepools/default/storagevolumes | grep name
"name":"60f46fdc-8ecc-4601-90d6-b3b44d35c337-0.img",
"name":"bdd22e7c-7794-4bdf-8d2b-0089242c8b16-0.img",
"name":"c16a7e02-6dcf-48c5-83de-1bb2d8a110a8-0.img",
$ kimchi_rest -m POST /storagepools/default/storagevolumes '{"url": "http://www.google.com/index.html"}'
{
"status":"running",
"message":"OK",
"id":"2",
"target_uri":"/storagepools/default/storagevolumes/index.html"
}
$ kimchi_rest -m POST /storagepools/default/storagevolumes '{"url": "http://www.google.com/index.html"}'
{
"reason":"KCHVOL0001E: Storage volume index.html already exists",
"code":"400 Bad Request",
"call_stack":"Traceback (most recent call last):\n File \"/usr/lib/python2.7/site-packages/cherrypy/_cprequest.py\", line 656, in respond\n response.body = self.handler()\n File \"/usr/lib/python2.7/site-packages/cherrypy/lib/encoding.py\", line 188, in __call__\n self.body = self.oldhandler(*args, **kwargs)\n File \"/usr/lib/python2.7/site-packages/cherrypy/_cpdispatch.py\", line 34, in __call__\n return self.callable(*self.args, **self.kwargs)\n File \"/home/vianac/LTC/kimchi/src/kimchi/control/base.py\", line 331, in index\n raise cherrypy.HTTPError(400, e.message)\nHTTPError: (400, u'KCHVOL0001E: Storage volume index.html already exists')\n"
Generate a unique name when creating a storage volume without a name.
The following commands demonstrate the bug fix:
$ kimchi_rest /storagepools/default/storagevolumes | grep name
"name":"60f46fdc-8ecc-4601-90d6-b3b44d35c337-0.img",
"name":"bdd22e7c-7794-4bdf-8d2b-0089242c8b16-0.img",
"name":"c16a7e02-6dcf-48c5-83de-1bb2d8a110a8-0.img",
$ kimchi_rest -m POST /storagepools/default/storagevolumes '{"url": "http://www.google.com/index.html"}'
{
"status":"running",
"message":"OK",
"id":"1",
"target_uri":"/storagepools/default/storagevolumes/index.html"
}
$ kimchi_rest -m POST /storagepools/default/storagevolumes '{"url": "http://www.google.com/index.html"}'
{
"status":"running",
"message":"OK",
"id":"2",
"target_uri":"/storagepools/default/storagevolumes/index-1.html"
}
$ kimchi_rest -m POST /storagepools/default/storagevolumes '{"url": "http://www.google.com/index.html"}'
{
"status":"running",
"message":"OK",
"id":"3",
"target_uri":"/storagepools/default/storagevolumes/index-2.html"
Fix issue #543 ("Download a volume with same basename will result
error").
Signed-off-by: Crístian Viana <vianac at linux.vnet.ibm.com>
---
src/kimchi/model/storagevolumes.py | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/kimchi/model/storagevolumes.py b/src/kimchi/model/storagevolumes.py
index 406b38b..c33ac8e 100644
--- a/src/kimchi/model/storagevolumes.py
+++ b/src/kimchi/model/storagevolumes.py
@@ -76,6 +76,8 @@ class StorageVolumesModel(object):
except:
raise InvalidParameter('KCHVOL0022E', {'url': url})
+ all_vol_names = self.get_list(pool_name)
+
if name is None:
# the methods listed in 'REQUIRE_NAME_PARAMS' cannot have
# 'name' == None
@@ -91,6 +93,11 @@ class StorageVolumesModel(object):
name = os.path.basename(params['url'])
else:
name = 'upload-%s' % int(time.time())
+
+ if name in all_vol_names:
+ basename, ext = os.path.splitext(name)
+ name = get_next_clone_name(all_vol_names, basename, ext, '')
+
params['name'] = name
try:
@@ -106,7 +113,7 @@ class StorageVolumesModel(object):
if pool_info['state'] == 'inactive':
raise InvalidParameter('KCHVOL0003E', {'pool': pool_name,
'volume': name})
- if name in self.get_list(pool_name):
+ if name in all_vol_names:
raise InvalidParameter('KCHVOL0001E', {'name': name})
params['pool'] = pool_name
--
1.9.3
More information about the Kimchi-devel
mailing list