[Kimchi-devel] [kimchi-devel][PATCHv4 7/7] A test script against real model server

lvroyce at linux.vnet.ibm.com lvroyce at linux.vnet.ibm.com
Wed Apr 22 08:02:59 UTC 2015


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

This is a test script against real model server,
you can use it to verify the logic of upload.
NOTE: pls change the username/password/file path
to a valid one.

Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
---
 tests/test_api.py | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 108 insertions(+)
 create mode 100644 tests/test_api.py

diff --git a/tests/test_api.py b/tests/test_api.py
new file mode 100644
index 0000000..953716a
--- /dev/null
+++ b/tests/test_api.py
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*-
+#
+# Project Kimchi
+#
+# Copyright IBM, Corp. 2013-2014
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
+
+import base64
+import json
+import os
+import requests
+import unittest
+import time
+
+from functools import partial
+
+from utils import request
+
+
+host = None
+ssl_port = None
+
+
+def setUpModule():
+    global host, ssl_port
+
+    host = '127.0.0.1'
+    ssl_port = 8001
+
+
+class RestTests(unittest.TestCase):
+    def setUp(self):
+        self.request = partial(request, host, ssl_port)
+
+    def assertHTTPStatus(self, code, *args):
+        resp = self.request(*args)
+        self.assertEquals(code, resp.status)
+
+    def assertValidJSON(self, txt):
+        try:
+            json.loads(txt)
+        except ValueError:
+            self.fail("Invalid JSON: %s" % txt)
+
+    def test_upload(self):
+        # If we use self.request, we may encode multipart formdata by ourselves
+        # requests lib take care of encode part, so use this lib instead
+        def fake_auth_header():
+            headers = {'Accept': 'application/json'}
+            user, pw = ('this is your user', 'this is your password')
+            hdr = "Basic " + base64.b64encode("%s:%s" % (user, pw))
+            headers['AUTHORIZATION'] = hdr
+            return headers
+
+        def do_upload(vol_path, url):
+            index = 0
+            chunk_size = 2 * 1000 * 1000
+            with open(vol_path, 'rb') as fd:
+                while True:
+                    with open(vol_path + '.tmp', 'wb') as tmp_fd:
+                    #  make sure it is truncated
+                        fd.seek(index*chunk_size)
+                        data = fd.read(chunk_size)
+                        tmp_fd.write(data)
+
+                    with open(vol_path + '.tmp', 'rb') as tmp_fd:
+                        print "size of data %s" % len(data)
+                        r = requests.put(url,
+                                data={"index": str(index), "chunk_size": str(chunk_size)},
+                                files={"chunk": tmp_fd},
+                                verify=False,
+                                headers=fake_auth_header())
+                        self.assertEquals(r.status_code, 200)
+                        index = index + 1
+                        print "index is %s" % index
+                    if len(data) < chunk_size:
+                            return index
+
+        def do_thousands(url):
+            for i in range(1000):
+                self.request(url, headers=fake_auth_header())
+
+        vol_path = os.path.join('/home/royce/upload/vm2.qcow2')
+        file_len = os.path.getsize(vol_path)
+        url = "https://%s:%s/storagepools/default/storagevolumes/" % \
+                (host, ssl_port)
+        body = json.dumps({'capacity': file_len, 'name': os.path.basename(vol_path), 'format': 'raw'})
+        r = requests.post(url,
+                          data=body,
+                          verify=False,
+                          headers=fake_auth_header())
+        time.sleep(1)
+        print r.text
+        url = url + os.path.basename(vol_path)
+        do_upload(vol_path, url)
-- 
2.1.0




More information about the Kimchi-devel mailing list