Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / qa / tasks / rgw_multisite_tests.py
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