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

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



On 22/04/2015 05:02, lvroyce at linux.vnet.ibm.com wrote:
> From: Royce Lv <lvroyce at linux.vnet.ibm.com>
>
> Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
> ---
>   tests/test_model_storagevolume.py | 95 +++++++++++++++++++++++++++++----------
>   1 file changed, 72 insertions(+), 23 deletions(-)
>
> diff --git a/tests/test_model_storagevolume.py b/tests/test_model_storagevolume.py
> index a3c3ce3..6433a1f 100644
> --- a/tests/test_model_storagevolume.py
> +++ b/tests/test_model_storagevolume.py
> @@ -20,17 +20,18 @@
>
>   import json
>   import os
> -import requests
> +import tempfile
>   import unittest
>
> +from cherrypy._cpreqbody import Entity
>   from functools import partial
>
> -from kimchi.config import paths, READONLY_POOL_TYPE
> +from kimchi.config import READONLY_POOL_TYPE
>   from kimchi.model.model import Model
>   from kimchi.mockmodel import MockModel
>   from kimchi.rollbackcontext import RollbackContext
> -from utils import fake_auth_header, get_free_port, patch_auth, request
> -from utils import rollback_wrapper, run_server, wait_task
> +from utils import get_free_port, patch_auth, request
> +from utils import rollback_wrapper, run_server, wait_task, running_as_root
>
>
>   model = None
> @@ -149,25 +150,6 @@ def _do_volume_test(self, model, host, ssl_port, pool_name):
>               resp = self.request(vol_uri)
>               self.assertEquals(404, resp.status)

> -        # Create storage volume with 'file'
> -        filepath = os.path.join(paths.get_prefix(), 'COPYING.LGPL')
> -        url = 'https://%s:%s' % (host, ssl_port) + uri
> -        with open(filepath, 'rb') as fd:
> -            r = requests.post(url, files={'file': fd},
> -                              verify=False,
> -                              headers=fake_auth_header())
> -
> -        if pool_info['type'] in READONLY_POOL_TYPE:
> -            self.assertEquals(r.status_code, 400)
> -        else:
> -            rollback.prependDefer(model.storagevolume_delete, pool_name,
> -                                  'COPYING.LGPL')
> -            self.assertEquals(r.status_code, 202)
> -            task = r.json()
> -            wait_task(_task_lookup, task['id'])
> -            resp = self.request(uri + '/COPYING.LGPL')
> -            self.assertEquals(200, resp.status)
> -

This should be added to the first patch of this series.

>           # Create storage volume with 'url'
>           url = 'https://github.com/kimchi-project/kimchi/raw/master/COPYING'
>           req = json.dumps({'url': url})
> @@ -189,6 +171,73 @@ class StorageVolumeTests(unittest.TestCase):
>       def setUp(self):
>           self.request = partial(request, host, ssl_port)
>
> +    @unittest.skipUnless(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
> +

For what is this for?

> +        #inst = Model(objstore_loc=self.tmp_store)

You can remove this comment.

> +        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}

> +                        model.storagevolume_update(pool, params['name'], param)
> +                        vol_info = model.storagevolume_lookup(pool, params['name'])

We have agreed to always do the tests using the REST API instead of the 
model instances.

So please, change it to request the data using the REST API

> +                        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 = model.storagevolumes_create(pool, params)
> +            rollback.prependDefer(model.storagevolume_delete, pool,
> +                                  params['name'])
> +            taskid = task_response['id']
> +            vol_uri = task_response['target_uri']
> +            model.task_wait(taskid)
> +            self.assertEquals('finished', model.task_lookup(taskid)['status'])
> +

Same I commented above related to use the REST API instead of the model 
instance.

> +            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)
> +
> +
>       def test_get_storagevolume(self):
>           uri = '/storagepools/default/storagevolumes'
>           resp = self.request(uri)




More information about the Kimchi-devel mailing list