]> git.proxmox.com Git - ceph.git/blame - ceph/qa/tasks/notification_tests.py
import ceph quincy 17.2.4
[ceph.git] / ceph / qa / tasks / notification_tests.py
CommitLineData
20effc67
TL
1"""
2Run a set of bucket notification tests on rgw.
3"""
4from io import BytesIO
5from configobj import ConfigObj
6import base64
7import contextlib
8import logging
9import os
10import random
11import string
12
13from teuthology import misc as teuthology
14from teuthology import contextutil
15from teuthology.orchestra import run
16
17log = logging.getLogger(__name__)
18
19
20@contextlib.contextmanager
21def download(ctx, config):
22 assert isinstance(config, dict)
23 log.info('Downloading bucket-notifications-tests...')
24 testdir = teuthology.get_testdir(ctx)
25 branch = ctx.config.get('suite_branch')
26 repo = ctx.config.get('suite_repo')
27 log.info('Using branch %s from %s for bucket notifications tests', branch, repo)
28 for (client, client_config) in config.items():
29 ctx.cluster.only(client).run(
30 args=['git', 'clone', '-b', branch, repo, '{tdir}/ceph'.format(tdir=testdir)],
31 )
32
33 sha1 = client_config.get('sha1')
34
35 if sha1 is not None:
36 ctx.cluster.only(client).run(
37 args=[
38 'cd', '{tdir}/ceph'.format(tdir=testdir),
39 run.Raw('&&'),
40 'git', 'reset', '--hard', sha1,
41 ],
42 )
43
44 try:
45 yield
46 finally:
47 log.info('Removing bucket-notifications-tests...')
48 testdir = teuthology.get_testdir(ctx)
49 for client in config:
50 ctx.cluster.only(client).run(
51 args=[
52 'rm',
53 '-rf',
54 '{tdir}/ceph'.format(tdir=testdir),
55 ],
56 )
57
58def _config_user(bntests_conf, section, user):
59 """
60 Configure users for this section by stashing away keys, ids, and
61 email addresses.
62 """
63 bntests_conf[section].setdefault('user_id', user)
64 bntests_conf[section].setdefault('email', '{user}+test@test.test'.format(user=user))
65 bntests_conf[section].setdefault('display_name', 'Mr. {user}'.format(user=user))
66 bntests_conf[section].setdefault('access_key',
67 ''.join(random.choice(string.ascii_uppercase) for i in range(20)))
68 bntests_conf[section].setdefault('secret_key',
69 base64.b64encode(os.urandom(40)).decode())
70
71
72@contextlib.contextmanager
73def pre_process(ctx, config):
74 """
75 This function creates a directory which is required to run some AMQP tests.
76 """
77 assert isinstance(config, dict)
78 log.info('Pre-processing...')
79
80 for (client, _) in config.items():
81 (remote,) = ctx.cluster.only(client).remotes.keys()
82 test_dir=teuthology.get_testdir(ctx)
83
84 ctx.cluster.only(client).run(
85 args=[
86 'mkdir', '-p', '/home/ubuntu/.aws/models/s3/2006-03-01/',
87 ],
88 )
89
90 ctx.cluster.only(client).run(
91 args=[
92 'cd', '/home/ubuntu/.aws/models/s3/2006-03-01/', run.Raw('&&'), 'cp', '{tdir}/ceph/examples/boto3/service-2.sdk-extras.json'.format(tdir=test_dir), 'service-2.sdk-extras.json'
93 ],
94 )
95
96 try:
97 yield
98 finally:
99 log.info('Pre-processing completed...')
100 test_dir = teuthology.get_testdir(ctx)
101 for (client, _) in config.items():
102 (remote,) = ctx.cluster.only(client).remotes.keys()
103
104 ctx.cluster.only(client).run(
105 args=[
106 'rm', '-rf', '/home/ubuntu/.aws/models/s3/2006-03-01/service-2.sdk-extras.json',
107 ],
108 )
109
110 ctx.cluster.only(client).run(
111 args=[
112 'cd', '/home/ubuntu/', run.Raw('&&'), 'rmdir', '-p', '.aws/models/s3/2006-03-01/',
113 ],
114 )
115
116
117@contextlib.contextmanager
118def create_users(ctx, config):
119 """
120 Create a main and an alternate s3 user.
121 """
122 assert isinstance(config, dict)
123 log.info('Creating rgw user...')
124 testdir = teuthology.get_testdir(ctx)
125
126 users = {'s3 main': 'foo'}
127 for client in config['clients']:
128 bntests_conf = config['bntests_conf'][client]
129 for section, user in users.items():
130 _config_user(bntests_conf, section, '{user}.{client}'.format(user=user, client=client))
131 log.debug('Creating user {user} on {host}'.format(user=bntests_conf[section]['user_id'], host=client))
132 cluster_name, daemon_type, client_id = teuthology.split_role(client)
133 client_with_id = daemon_type + '.' + client_id
134 ctx.cluster.only(client).run(
135 args=[
136 'adjust-ulimits',
137 'ceph-coverage',
138 '{tdir}/archive/coverage'.format(tdir=testdir),
139 'radosgw-admin',
140 '-n', client_with_id,
141 'user', 'create',
142 '--uid', bntests_conf[section]['user_id'],
143 '--display-name', bntests_conf[section]['display_name'],
144 '--access-key', bntests_conf[section]['access_key'],
145 '--secret', bntests_conf[section]['secret_key'],
146 '--cluster', cluster_name,
147 ],
148 )
149
150 try:
151 yield
152 finally:
153 for client in config['clients']:
154 for user in users.values():
155 uid = '{user}.{client}'.format(user=user, client=client)
156 cluster_name, daemon_type, client_id = teuthology.split_role(client)
157 client_with_id = daemon_type + '.' + client_id
158 ctx.cluster.only(client).run(
159 args=[
160 'adjust-ulimits',
161 'ceph-coverage',
162 '{tdir}/archive/coverage'.format(tdir=testdir),
163 'radosgw-admin',
164 '-n', client_with_id,
165 'user', 'rm',
166 '--uid', uid,
167 '--purge-data',
168 '--cluster', cluster_name,
169 ],
170 )
171
172@contextlib.contextmanager
173def configure(ctx, config):
174 assert isinstance(config, dict)
175 log.info('Configuring bucket-notifications-tests...')
176 testdir = teuthology.get_testdir(ctx)
177 for client, properties in config['clients'].items():
178 (remote,) = ctx.cluster.only(client).remotes.keys()
179 bntests_conf = config['bntests_conf'][client]
180
181 conf_fp = BytesIO()
182 bntests_conf.write(conf_fp)
183 remote.write_file(
184 path='{tdir}/ceph/src/test/rgw/bucket_notification/bn-tests.{client}.conf'.format(tdir=testdir, client=client),
185 data=conf_fp.getvalue(),
186 )
187
188 remote.run(
189 args=[
190 'cd',
191 '{tdir}/ceph/src/test/rgw/bucket_notification'.format(tdir=testdir),
192 run.Raw('&&'),
193 './bootstrap',
194 ],
195 )
196
197 try:
198 yield
199 finally:
200 log.info('Removing bn-tests.conf file...')
201 testdir = teuthology.get_testdir(ctx)
202 for client, properties in config['clients'].items():
203 (remote,) = ctx.cluster.only(client).remotes.keys()
204 remote.run(
205 args=['rm', '-f',
206 '{tdir}/ceph/src/test/rgw/bucket_notification/bn-tests.{client}.conf'.format(tdir=testdir,client=client),
207 ],
208 )
209
210@contextlib.contextmanager
211def run_tests(ctx, config):
212 """
213 Run the bucket notifications tests after everything is set up.
214 :param ctx: Context passed to task
215 :param config: specific configuration information
216 """
217 assert isinstance(config, dict)
218 log.info('Running bucket-notifications-tests...')
219 testdir = teuthology.get_testdir(ctx)
220 for client, client_config in config.items():
221 (remote,) = ctx.cluster.only(client).remotes.keys()
222
223 attr = ["!kafka_test", "!amqp_test", "!amqp_ssl_test", "!modification_required", "!manual_test"]
224
225 if 'extra_attr' in client_config:
226 attr = client_config.get('extra_attr')
227
228 args = [
229 'BNTESTS_CONF={tdir}/ceph/src/test/rgw/bucket_notification/bn-tests.{client}.conf'.format(tdir=testdir, client=client),
230 '{tdir}/ceph/src/test/rgw/bucket_notification/virtualenv/bin/python'.format(tdir=testdir),
231 '-m', 'nose',
232 '-s',
233 '{tdir}/ceph/src/test/rgw/bucket_notification/test_bn.py'.format(tdir=testdir),
234 '-v',
235 '-a', ','.join(attr),
236 ]
237
238 remote.run(
239 args=args,
240 label="bucket notification tests against different endpoints"
241 )
242 yield
243
244@contextlib.contextmanager
245def task(ctx,config):
246 """
247 To run bucket notification tests under Kafka endpoint the prerequisite is to run the kafka server. Also you need to pass the
248 'extra_attr' to the notification tests. Following is the way how to run kafka and finally bucket notification tests::
249
250 tasks:
251 - kafka:
252 client.0:
253 kafka_version: 2.6.0
254 - notification_tests:
255 client.0:
256 extra_attr: ["kafka_test"]
257
258 To run bucket notification tests under AMQP endpoint the prerequisite is to run the rabbitmq server. Also you need to pass the
259 'extra_attr' to the notification tests. Following is the way how to run rabbitmq and finally bucket notification tests::
260
261 tasks:
262 - rabbitmq:
263 client.0:
264 - notification_tests:
265 client.0:
266 extra_attr: ["amqp_test"]
267
268 If you want to run the tests against your changes pushed to your remote repo you can provide 'suite_branch' and 'suite_repo'
269 parameters in your teuthology-suite command. Example command for this is as follows::
270
271 teuthology-suite --ceph-repo https://github.com/ceph/ceph-ci.git -s rgw:notifications --ceph your_ceph_branch_name -m smithi --suite-repo https://github.com/your_name/ceph.git --suite-branch your_branch_name
272
273 """
274 assert config is None or isinstance(config, list) \
275 or isinstance(config, dict), \
276 "task kafka only supports a list or dictionary for configuration"
277
278 all_clients = ['client.{id}'.format(id=id_)
279 for id_ in teuthology.all_roles_of_type(ctx.cluster, 'client')]
280 if config is None:
281 config = all_clients
282 if isinstance(config, list):
283 config = dict.fromkeys(config)
284 clients=config.keys()
285
286 log.debug('Notifications config is %s', config)
287
288 bntests_conf = {}
289
290 for client in clients:
291 endpoint = ctx.rgw.role_endpoints.get(client)
292 assert endpoint, 'bntests: no rgw endpoint for {}'.format(client)
293
294 bntests_conf[client] = ConfigObj(
295 indent_type='',
296 infile={
297 'DEFAULT':
298 {
299 'port':endpoint.port,
300 'host':endpoint.dns_name,
301 },
302 's3 main':{}
303 }
304 )
305
306 with contextutil.nested(
307 lambda: download(ctx=ctx, config=config),
308 lambda: pre_process(ctx=ctx, config=config),
309 lambda: create_users(ctx=ctx, config=dict(
310 clients=clients,
311 bntests_conf=bntests_conf,
312 )),
313 lambda: configure(ctx=ctx, config=dict(
314 clients=config,
315 bntests_conf=bntests_conf,
316 )),
317 lambda: run_tests(ctx=ctx, config=config),
318 ):
319 pass
320 yield