From: Royce Lv <lvroyce(a)linux.vnet.ibm.com>
Signed-off-by: Royce Lv <lvroyce(a)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