]>
Commit | Line | Data |
---|---|---|
31f18b77 FG |
1 | """ |
2 | rgw multisite testing | |
3 | """ | |
4 | import logging | |
5 | import sys | |
6 | import nose.core | |
7 | import nose.config | |
8 | ||
9 | from teuthology.exceptions import ConfigError | |
10 | from teuthology.task import Task | |
11 | from teuthology import misc | |
12 | ||
13 | from rgw_multi import multisite, tests | |
14 | ||
15 | log = logging.getLogger(__name__) | |
16 | ||
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) | |
66 | result = nose.run(defaultTest=tests.__name__, argv=argv, config=conf) | |
67 | if not result: | |
68 | raise RuntimeError('rgw multisite test failures') | |
69 | ||
70 | def get_log_stream(): | |
71 | """ return a log stream for nose output """ | |
72 | # XXX: this is a workaround for IOErrors when nose writes to stderr, | |
73 | # copied from vstart_runner.py | |
74 | class LogStream(object): | |
75 | def __init__(self): | |
76 | self.buffer = "" | |
77 | ||
78 | def write(self, data): | |
79 | self.buffer += data | |
80 | if "\n" in self.buffer: | |
81 | lines = self.buffer.split("\n") | |
82 | for line in lines[:-1]: | |
83 | log.info(line) | |
84 | self.buffer = lines[-1] | |
85 | ||
86 | def flush(self): | |
87 | pass | |
88 | ||
89 | return LogStream() | |
90 | ||
91 | task = RGWMultisiteTests |