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

Aline Manera alinefm at linux.vnet.ibm.com
Mon May 4 20:28:33 UTC 2015



On 22/04/2015 05:02, lvroyce at linux.vnet.ibm.com wrote:
> 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)

This test should be added to the Kimchi test cases suite.




More information about the Kimchi-devel mailing list