[Kimchi-devel] [kimchi-devel][PATCHv3 6/6] update test case for storage volume upload

lvroyce at linux.vnet.ibm.com lvroyce at linux.vnet.ibm.com
Wed Jan 28 13:20:31 UTC 2015


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

Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
---
 src/kimchi/mockmodel.py |  8 ++----
 tests/test_model.py     | 67 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 69 insertions(+), 6 deletions(-)

diff --git a/src/kimchi/mockmodel.py b/src/kimchi/mockmodel.py
index 413ac5d..3d9a919 100644
--- a/src/kimchi/mockmodel.py
+++ b/src/kimchi/mockmodel.py
@@ -274,17 +274,13 @@ class MockModel(Model):
         conn.storagePoolDefineXML(ET.tostring(root), 0)
 
     def _mock_storagevolumes_create(self, pool, params):
-        vol_source = ['file', 'url', 'capacity']
+        vol_source = ['url', 'capacity']
         index_list = list(i for i in range(len(vol_source))
                           if vol_source[i] in params)
         create_param = vol_source[index_list[0]]
         name = params.get('name')
         if name is None:
-            if create_param == 'file':
-                name = os.path.basename(params['file'].filename)
-                del params['file']
-                params['capacity'] = 1024
-            elif create_param == 'url':
+            if create_param == 'url':
                 name = os.path.basename(params['url'])
                 del params['url']
                 params['capacity'] = 1024
diff --git a/tests/test_model.py b/tests/test_model.py
index a1aa612..a153d03 100644
--- a/tests/test_model.py
+++ b/tests/test_model.py
@@ -18,6 +18,7 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
 
+from cherrypy._cpreqbody import Entity
 import grp
 import os
 import platform
@@ -1613,6 +1614,72 @@ class ModelTests(unittest.TestCase):
         # remove files creates
         inst.repository_delete(repo_id)
 
+    @unittest.skipUnless(utils.running_as_root(), 'Must be run as root')
+    def test_volume_upload(self):
+        class fake_header(object):
+            def elements(self, key):
+                return None
+
+            def __getattr__(self, key):
+                try:
+                    return self.__getattribute__(key)
+                except AttributeError:
+                    return lambda x, y: None
+
+        inst = model.Model(objstore_loc=self.tmp_store)
+        vol_path = os.path.abspath('./run_tests.sh')
+
+        def do_upload(tmp_file, vol_path, url):
+            index = 0
+            chunk_size = 2 * 1000
+            with open(vol_path, 'rb') as fd:
+                while True:
+                    with open(tmp_file, 'wb') as tmp_fd:
+                        fd.seek(index * chunk_size)
+                        data = fd.read(chunk_size)
+                        tmp_fd.write(data)
+
+                    # only file open for read can be handled by cherrypy
+                    with open(tmp_file, 'rb') as tmp_fd:
+                        # Hack cherrypy entity object and pass it to volume upload
+                        entity = Entity(None, fake_header())
+                        entity.file = tmp_fd
+                        param = {'index': str(index),
+                                 'chunk_size': str(chunk_size),
+                                 'chunk': entity}
+                        inst.storagevolume_update(pool, params['name'], param)
+                        vol_info = inst.storagevolume_lookup(pool, params['name'])
+                        index = index + 1
+                    if len(data) < chunk_size:
+                        return vol_info
+
+        # Create a volume with raw format first, following upload will override it.
+        params = {'capacity': os.path.getsize(vol_path),
+                  'format': 'raw',
+                  'name': os.path.basename(vol_path)}
+        pool = 'default'
+
+        with RollbackContext() as rollback:
+            task_response = inst.storagevolumes_create(pool, params)
+            rollback.prependDefer(inst.storagevolume_delete, pool,
+                                  params['name'])
+            taskid = task_response['id']
+            vol_uri = task_response['target_uri']
+            inst.task_wait(taskid)
+            self.assertEquals('finished', inst.task_lookup(taskid)['status'])
+
+            f = tempfile.NamedTemporaryFile(delete=False)
+            rollback.prependDefer(os.remove, f.name)
+            resp = do_upload(f.name, vol_path, vol_uri)
+
+            with open(vol_path) as vol_file:
+                vol_content = vol_file.read()
+
+            with open(resp['path']) as copy_file:
+                cp_content = copy_file.read()
+
+            self.assertEquals(vol_content, cp_content)
+
 
 class BaseModelTests(unittest.TestCase):
     class FoosModel(object):
-- 
2.1.0




More information about the Kimchi-devel mailing list