[Kimchi-devel] [PATCHv1 4/5] Storage volume upload: Support file based upload

lvroyce0210 at gmail.com lvroyce0210 at gmail.com
Mon Sep 1 11:50:53 UTC 2014


From: Royce Lv <lvroyce at linux.vnet.ibm.com>

Start a task to upload storage volume, limit the upload size to 4G.

Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
---
 src/kimchi/i18n.py                 |  1 +
 src/kimchi/model/storagevolumes.py | 37 +++++++++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git a/src/kimchi/i18n.py b/src/kimchi/i18n.py
index bbec591..eded027 100644
--- a/src/kimchi/i18n.py
+++ b/src/kimchi/i18n.py
@@ -187,6 +187,7 @@ messages = {
     "KCHVOL0017E": _("Unable to update database with storage volume information due error: %(err)s"),
     "KCHVOL0018E": _("Only one of %(param)s can be specified"),
     "KCHVOL0019E": _("Creating volume from %(param)s is not supported"),
+    "KCHVOL0020E": _("Upload volume can not be larger than 4G"),
 
     "KCHIFACE0001E": _("Interface %(name)s does not exist"),
 
diff --git a/src/kimchi/model/storagevolumes.py b/src/kimchi/model/storagevolumes.py
index 203d5e1..44279a2 100644
--- a/src/kimchi/model/storagevolumes.py
+++ b/src/kimchi/model/storagevolumes.py
@@ -19,6 +19,7 @@
 
 import os
 
+import cherrypy
 import libvirt
 
 from kimchi import xmlutils
@@ -61,6 +62,42 @@ class StorageVolumesModel(object):
                 taskid = add_task('', create_func, self.objstore, params)
                 return self.task.lookup(taskid)
 
+    def _create_volume_with_file(self, cb, params):
+        lcHDRS = {}
+        for key, val in cherrypy.request.headers.iteritems():
+            lcHDRS[key.lower()] = val
+
+        incomingBytes = int(lcHDRS['content-length'])
+        if incomingBytes > (2 << 31):
+            raise InvalidParameter("KCHVOL0020E")
+
+        pool_name = params.pop('pool')
+        dir_path = StoragePoolModel(conn=self.conn,
+                objstore=self.objstore).lookup(pool_name)['path']
+        file_path = os.path.join(dir_path, params['name'])
+        if os.path.exists(file_path):
+            raise InvalidParameter('KCHVOL0001E', {'name': params['name']})
+
+        upload_file = params['file']
+        try:
+            f = open(file_path, 'wb')
+            while True:
+                data = upload_file.file.read(8192)
+                if not data:
+                        break
+                f.write(data)
+            f.close()
+        except Exception as e:
+            raise OperationFailed('KCHVOL0007E',
+                                  {'name': params['name'],
+                                   'pool': pool_name,
+                                   'err': e.message})
+
+        # Refresh to make sure volume can be found in following lookup
+        pool = StoragePoolModel.get_storagepool(pool_name, self.conn)
+        pool.refresh()
+        cb('', True)
+
     def _create_volume_with_capacity(self, cb, params):
         pool_name = params.pop('pool')
         vol_xml = """
-- 
1.8.3.2




More information about the Kimchi-devel mailing list