From e6918187568dbd01842d8d1d2c808ce16a894239 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 21 Apr 2024 13:54:28 +0200 Subject: Adding upstream version 18.2.2. Signed-off-by: Daniel Baumann --- qa/tasks/rgw_multisite_tests.py | 120 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 qa/tasks/rgw_multisite_tests.py (limited to 'qa/tasks/rgw_multisite_tests.py') diff --git a/qa/tasks/rgw_multisite_tests.py b/qa/tasks/rgw_multisite_tests.py new file mode 100644 index 000000000..888a37181 --- /dev/null +++ b/qa/tasks/rgw_multisite_tests.py @@ -0,0 +1,120 @@ +""" +rgw multisite testing +""" +import importlib.util +import logging +import nose.core +import nose.config +import sys + +from nose.plugins.manager import DefaultPluginManager +from teuthology.config import config as teuth_config +from teuthology.exceptions import ConfigError +from teuthology.repo_utils import fetch_repo +from teuthology.task import Task +from teuthology import misc + +log = logging.getLogger(__name__) + + +class RGWMultisiteTests(Task): + """ + Runs the rgw_multi tests against a multisite configuration created by the + rgw-multisite task. Tests are run with nose, using any additional 'args' + provided. Overrides for tests.Config can be set in 'config'. The 'branch' + and 'repo' can be overridden to clone the rgw_multi tests from another + release. + + - rgw-multisite-tests: + args: + - tests.py:test_object_sync + config: + reconfigure_delay: 60 + branch: octopus + repo: https://github.com/ceph/ceph.git + + """ + def __init__(self, ctx, config): + super(RGWMultisiteTests, self).__init__(ctx, config) + + def setup(self): + super(RGWMultisiteTests, self).setup() + + overrides = self.ctx.config.get('overrides', {}) + misc.deep_merge(self.config, overrides.get('rgw-multisite-tests', {})) + + if not self.ctx.rgw_multisite: + raise ConfigError('rgw-multisite-tests must run after the rgw-multisite task') + realm = self.ctx.rgw_multisite.realm + master_zone = realm.meta_master_zone() + + branch = self.config.get('branch') + if not branch: + # run from suite_path + suite_path = self.ctx.config.get('suite_path') + self.module_path = suite_path + '/../src/test/rgw/rgw_multi' + else: + # clone the qa branch + repo = self.config.get('repo', teuth_config.get_ceph_qa_suite_git_url()) + log.info("cloning suite branch %s from %s...", branch, repo) + clonedir = fetch_repo(repo, branch) + # import its version of rgw_multi + self.module_path = clonedir + '/src/test/rgw/rgw_multi' + + log.info("importing tests from %s", self.module_path) + spec = importlib.util.spec_from_file_location('rgw_multi', self.module_path + '/__init__.py') + module = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = module + spec.loader.exec_module(module) + + from rgw_multi import multisite, tests + + # create the test user + log.info('creating test user..') + user = multisite.User('rgw-multisite-test-user') + user.create(master_zone, ['--display-name', 'Multisite Test User', + '--gen-access-key', '--gen-secret', '--caps', 'roles=*']) + + config = self.config.get('config', {}) + tests.init_multi(realm, user, tests.Config(**config)) + tests.realm_meta_checkpoint(realm) + + def begin(self): + # extra arguments for nose can be passed as a string or list + extra_args = self.config.get('args', []) + if not isinstance(extra_args, list): + extra_args = [extra_args] + argv = [__name__] + extra_args + + log.info("running rgw multisite tests on '%s' with args=%r", + self.module_path, extra_args) + + # run nose tests in the module path + conf = nose.config.Config(stream=get_log_stream(), verbosity=2, workingDir=self.module_path) + conf.plugins = DefaultPluginManager() # overrides default = NoPlugins() + assert nose.run(argv=argv, config=conf), 'rgw multisite test failures' + + +def get_log_stream(): + """ return a log stream for nose output """ + # XXX: this is a workaround for IOErrors when nose writes to stderr, + # copied from vstart_runner.py + class LogStream(object): + def __init__(self): + self.buffer = "" + + def write(self, data): + self.buffer += data + if "\n" in self.buffer: + lines = self.buffer.split("\n") + for line in lines[:-1]: + log.info(line) + self.buffer = lines[-1] + + def flush(self): + pass + + return LogStream() + + +task = RGWMultisiteTests -- cgit v1.2.3