]> git.proxmox.com Git - ceph.git/blob - ceph/qa/tasks/rgw_multisite_tests.py
dee6bfaa303966cd9569fe660433b6e81b6362d8
[ceph.git] / ceph / qa / tasks / rgw_multisite_tests.py
1 """
2 rgw multisite testing
3 """
4 import logging
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
12 from rgw_multi import multisite, tests, tests_ps
13
14 log = logging.getLogger(__name__)
15
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 error_msg = ''
67 result = nose.run(defaultTest=tests.__name__, argv=argv, config=conf)
68 if not result:
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
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
98
99 task = RGWMultisiteTests