]>
Commit | Line | Data |
---|---|---|
31f18b77 FG |
1 | """ |
2 | rgw multisite testing | |
3 | """ | |
4 | import logging | |
31f18b77 FG |
5 | import nose.core |
6 | import nose.config | |
7 | ||
8 | from teuthology.exceptions import ConfigError | |
9 | from teuthology.task import Task | |
10 | from teuthology import misc | |
11 | ||
e306af50 | 12 | from tasks.rgw_multi import multisite, tests, tests_ps |
31f18b77 FG |
13 | |
14 | log = logging.getLogger(__name__) | |
15 | ||
eafe8130 | 16 | |
31f18b77 FG |
17 | class RGWMultisiteTests(Task): |
18 | """ | |
19 | Runs the rgw_multi tests against a multisite configuration created by the | |
20 | rgw-multisite task. Tests are run with nose, using any additional 'args' | |
21 | provided. Overrides for tests.Config can be set in 'config'. | |
22 | ||
23 | - rgw-multisite-tests: | |
24 | args: | |
25 | - tasks.rgw_multi.tests:test_object_sync | |
26 | config: | |
27 | reconfigure_delay: 60 | |
28 | ||
29 | """ | |
30 | def __init__(self, ctx, config): | |
31 | super(RGWMultisiteTests, self).__init__(ctx, config) | |
32 | ||
33 | def setup(self): | |
34 | super(RGWMultisiteTests, self).setup() | |
35 | ||
36 | overrides = self.ctx.config.get('overrides', {}) | |
37 | misc.deep_merge(self.config, overrides.get('rgw-multisite-tests', {})) | |
38 | ||
39 | if not self.ctx.rgw_multisite: | |
40 | raise ConfigError('rgw-multisite-tests must run after the rgw-multisite task') | |
41 | realm = self.ctx.rgw_multisite.realm | |
42 | master_zone = realm.meta_master_zone() | |
43 | ||
44 | # create the test user | |
45 | log.info('creating test user..') | |
46 | user = multisite.User('rgw-multisite-test-user') | |
47 | user.create(master_zone, ['--display-name', 'Multisite Test User', | |
48 | '--gen-access-key', '--gen-secret']) | |
49 | ||
50 | config = self.config.get('config', {}) | |
51 | tests.init_multi(realm, user, tests.Config(**config)) | |
52 | tests.realm_meta_checkpoint(realm) | |
53 | ||
54 | def begin(self): | |
55 | # extra arguments for nose can be passed as a string or list | |
56 | extra_args = self.config.get('args', []) | |
57 | if not isinstance(extra_args, list): | |
58 | extra_args = [extra_args] | |
59 | argv = [__name__] + extra_args | |
60 | ||
61 | log.info("running rgw multisite tests on '%s' with args=%r", | |
62 | tests.__name__, extra_args) | |
63 | ||
64 | # run nose tests in the rgw_multi.tests module | |
65 | conf = nose.config.Config(stream=get_log_stream(), verbosity=2) | |
eafe8130 | 66 | error_msg = '' |
31f18b77 FG |
67 | result = nose.run(defaultTest=tests.__name__, argv=argv, config=conf) |
68 | if not result: | |
eafe8130 TL |
69 | error_msg += 'rgw multisite, ' |
70 | result = nose.run(defaultTest=tests_ps.__name__, argv=argv, config=conf) | |
71 | if not result: | |
72 | error_msg += 'rgw multisite pubsub, ' | |
73 | if error_msg: | |
74 | raise RuntimeError(error_msg + 'test failures') | |
75 | ||
31f18b77 FG |
76 | |
77 | def get_log_stream(): | |
78 | """ return a log stream for nose output """ | |
79 | # XXX: this is a workaround for IOErrors when nose writes to stderr, | |
80 | # copied from vstart_runner.py | |
81 | class LogStream(object): | |
82 | def __init__(self): | |
83 | self.buffer = "" | |
84 | ||
85 | def write(self, data): | |
86 | self.buffer += data | |
87 | if "\n" in self.buffer: | |
88 | lines = self.buffer.split("\n") | |
89 | for line in lines[:-1]: | |
90 | log.info(line) | |
91 | self.buffer = lines[-1] | |
92 | ||
93 | def flush(self): | |
94 | pass | |
95 | ||
96 | return LogStream() | |
97 | ||
eafe8130 | 98 | |
31f18b77 | 99 | task = RGWMultisiteTests |