From f3c569ee23a2afbcba152ab17c4085dc4ceddeac Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 16 Nov 2011 16:00:01 -0800 Subject: [PATCH] rgw: add swift task still not completely working (for some reason it skips all the tests) --- teuthology/task/testswift.py | 213 +++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 teuthology/task/testswift.py diff --git a/teuthology/task/testswift.py b/teuthology/task/testswift.py new file mode 100644 index 0000000000000..b1775f96c1673 --- /dev/null +++ b/teuthology/task/testswift.py @@ -0,0 +1,213 @@ +from cStringIO import StringIO +from configobj import ConfigObj +import base64 +import contextlib +import logging +import os + +from teuthology import misc as teuthology +from teuthology import contextutil +from ..orchestra import run +from ..orchestra.connection import split_user + +log = logging.getLogger(__name__) + + +@contextlib.contextmanager +def download(ctx, config): + assert isinstance(config, list) + log.info('Downloading swift...') + for client in config: + ctx.cluster.only(client).run( + args=[ + 'git', 'clone', + 'https://github.com/NewDreamNetwork/swift.git', + '/tmp/cephtest/swift', + ], + ) + try: + yield + finally: + log.info('Removing swift...') + for client in config: + ctx.cluster.only(client).run( + args=[ + 'rm', + '-rf', + '/tmp/cephtest/swift', + ], + ) + +def _config_user(testswift_conf, account, user, suffix): + testswift_conf['func_test'].setdefault('account{s}'.format(s=suffix), account); + testswift_conf['func_test'].setdefault('email{s}'.format(s=suffix), '{account}+test@test.test'.format(account=account)) + testswift_conf['func_test'].setdefault('display_name{s}'.format(s=suffix), 'Mr. {account} {user}'.format(account=account, user=user)) + testswift_conf['func_test'].setdefault('secret_key{s}'.format(s=suffix), base64.b64encode(os.urandom(40))) + +@contextlib.contextmanager +def create_users(ctx, config): + assert isinstance(config, dict) + log.info('Creating rgw users...') + for client in config['clients']: + testswift_conf = config['testswift_conf'][client] + for user, suffix in [('foo', ''), ('bar', '2')]: + _config_user(testswift_conf, '{user}.{client}'.format(user=user, client=client), user, suffix) + ctx.cluster.only(client).run( + args=[ + 'LD_LIBRARY_PATH=/tmp/cephtest/binary/usr/local/lib', + '/tmp/cephtest/enable-coredump', + '/tmp/cephtest/binary/usr/local/bin/ceph-coverage', + '/tmp/cephtest/archive/coverage', + '/tmp/cephtest/binary/usr/local/bin/radosgw-admin', + '-c', '/tmp/cephtest/ceph.conf', + 'user', 'create', + '--subuser', '{account}:{user}'.format(account=testswift_conf['func_test']['account{s}'.format(s=suffix)],user=user), + '--display-name', testswift_conf['func_test']['display_name{s}'.format(s=suffix)], + '--secret', testswift_conf['func_test']['secret_key{s}'.format(s=suffix)], + '--email', testswift_conf['func_test']['email{s}'.format(s=suffix)], + '--key-type', 'swift', + ], + ) + yield + + +@contextlib.contextmanager +def configure(ctx, config): + assert isinstance(config, dict) + log.info('Configuring testswift...') + for client, properties in config['clients'].iteritems(): + print 'client={c}'.format(c=client) + print 'config={c}'.format(c=config) + testswift_conf = config['testswift_conf'][client] + if properties is not None and 'rgw_server' in properties: + host = None + for target, roles in zip(ctx.config['targets'].iterkeys(), ctx.config['roles']): + log.info('roles: ' + str(roles)) + log.info('target: ' + str(target)) + if properties['rgw_server'] in roles: + _, host = split_user(target) + assert host is not None, "Invalid client specified as the rgw_server" + testswift_conf['func_test']['auth_host'] = host + else: + testswift_conf['func_test']['auth_host'] = 'localhost' + + print client + (remote,) = ctx.cluster.only(client).remotes.keys() + remote.run( + args=[ + 'cd', + '/tmp/cephtest/swift', + run.Raw('&&'), + './bootstrap', + ], + ) + conf_fp = StringIO() + testswift_conf.write(conf_fp) + teuthology.write_file( + remote=remote, + path='/tmp/cephtest/archive/testswift.{client}.conf'.format(client=client), + data=conf_fp.getvalue(), + ) + yield + + +@contextlib.contextmanager +def run_tests(ctx, config): + assert isinstance(config, dict) + for client, client_config in config.iteritems(): + args = [ + 'SWIFT_TEST_CONFIG_FILE=/tmp/cephtest/archive/testswift.{client}.conf'.format(client=client), + '/tmp/cephtest/swift/virtualenv/bin/nosetests', + '-w', + '/tmp/cephtest/swift/test/functional', + '-v', + '-a', '!fails_on_rgw', + ] + if client_config is not None and 'extra_args' in client_config: + args.extend(client_config['extra_args']) + + ctx.cluster.only(client).run( + args=args, + ) + yield + + +@contextlib.contextmanager +def task(ctx, config): + """ + Run the testswift suite against rgw. + + To run all tests on all clients:: + + tasks: + - ceph: + - rgw: + - testswift: + + To restrict testing to particular clients:: + + tasks: + - ceph: + - rgw: [client.0] + - testswift: [client.0] + + To run against a server on client.1:: + + tasks: + - ceph: + - rgw: [client.1] + - testswift: + client.0: + rgw_server: client.1 + + To pass extra arguments to nose (e.g. to run a certain test):: + + tasks: + - ceph: + - rgw: [client.0] + - testswift: + client.0: + extra_args: ['test.functional.tests:TestFileUTF8', '-m', 'testCopy'] + client.1: + extra_args: ['--exclude', 'TestFile'] + """ + assert config is None or isinstance(config, list) \ + or isinstance(config, dict), \ + "task testswift only supports a list or dictionary for configuration" + all_clients = ['client.{id}'.format(id=id_) + for id_ in teuthology.all_roles_of_type(ctx.cluster, 'client')] + if config is None: + config = all_clients + if isinstance(config, list): + config = dict.fromkeys(config) + clients = config.keys() + + print 'clients={c}'.format(c=clients) + + testswift_conf = {} + for client in clients: + testswift_conf[client] = ConfigObj( + indent_type='', + infile={ + 'func_test': + { + 'auth_port' : 7280, + 'auth_ssl' : 'no', + 'auth_prefix' : '/auth/', + }, + } + ) + + with contextutil.nested( + lambda: download(ctx=ctx, config=clients), + lambda: create_users(ctx=ctx, config=dict( + clients=clients, + testswift_conf=testswift_conf, + )), + lambda: configure(ctx=ctx, config=dict( + clients=config, + testswift_conf=testswift_conf, + )), + lambda: run_tests(ctx=ctx, config=config), + ): + yield -- 2.39.5