]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/pybind/test_ceph_argparse.py
1 #!/usr/bin/env nosetests
2 # -*- mode:python; tab-width:4; indent-tabs-mode:t; coding:utf-8 -*-
3 # vim: ts=4 sw=4 smarttab expandtab fileencoding=utf-8
5 # Ceph - scalable distributed file system
7 # Copyright (C) 2013,2014 Cloudwatt <libre.licensing@cloudwatt.com>
8 # Copyright (C) 2014 Red Hat <contact@redhat.com>
10 # Author: Loic Dachary <loic@dachary.org>
12 # This library is free software; you can redistribute it and/or
13 # modify it under the terms of the GNU Lesser General Public
14 # License as published by the Free Software Foundation; either
15 # version 2.1 of the License, or (at your option) any later version.
18 from nose
.tools
import eq_
as eq
19 from nose
.tools
import *
21 from ceph_argparse
import validate_command
, parse_json_funcsigs
28 from StringIO
import StringIO
30 from io
import StringIO
32 def get_command_descriptions(what
):
33 CEPH_BIN
= os
.environ
['CEPH_BIN']
36 return os
.popen(CEPH_BIN
+ "/get_command_descriptions " + "--" + what
).read()
38 def test_parse_json_funcsigs():
39 commands
= get_command_descriptions("all")
40 cmd_json
= parse_json_funcsigs(commands
, 'cli')
42 # syntax error https://github.com/ceph/ceph/pull/585
43 commands
= get_command_descriptions("pull585")
44 assert_raises(TypeError, parse_json_funcsigs
, commands
, 'cli')
46 sigdict
= parse_json_funcsigs(get_command_descriptions("all"), 'cli')
51 def assert_valid_command(self
, args
):
52 result
= validate_command(sigdict
, args
)
53 assert_not_in(result
, [{}, None])
55 def check_1_natural_arg(self
, prefix
, command
):
56 self
.assert_valid_command([prefix
, command
, '1'])
57 assert_equal({}, validate_command(sigdict
, [prefix
, command
]))
58 assert_equal({}, validate_command(sigdict
, [prefix
, command
, '-1']))
59 assert_equal({}, validate_command(sigdict
, [prefix
, command
, '1',
62 def check_0_or_1_natural_arg(self
, prefix
, command
):
63 self
.assert_valid_command([prefix
, command
, '1'])
64 self
.assert_valid_command([prefix
, command
])
65 assert_equal({}, validate_command(sigdict
, [prefix
, command
, '-1']))
66 assert_equal({}, validate_command(sigdict
, [prefix
, command
, '1',
69 def check_1_string_arg(self
, prefix
, command
):
70 assert_equal({}, validate_command(sigdict
, [prefix
, command
]))
71 self
.assert_valid_command([prefix
, command
, 'string'])
72 assert_equal({}, validate_command(sigdict
, [prefix
,
77 def check_1_or_more_string_args(self
, prefix
, command
):
78 assert_equal({}, validate_command(sigdict
, [prefix
,
80 self
.assert_valid_command([prefix
,
83 self
.assert_valid_command([prefix
,
88 def check_no_arg(self
, prefix
, command
):
89 self
.assert_valid_command([prefix
,
91 assert_equal({}, validate_command(sigdict
, [prefix
,
95 def capture_output(self
, args
, stdout
=None, stderr
=None):
102 ret
= validate_command(sigdict
, args
)
104 stdout
= stdout
.getvalue().strip()
106 stderr
= stderr
.getvalue().strip()
107 return ret
, stdout
, stderr
112 def test_non_ascii_in_non_options(self
):
113 # ArgumentPrefix("no match for {0}".format(s)) is not able to convert
114 # unicode str parameter into str. and validate_command() should not
116 assert_equal({}, validate_command(sigdict
, [u
'章鱼和鱿鱼']))
117 assert_equal({}, validate_command(sigdict
, [u
'–w']))
118 # actually we always pass unicode strings to validate_command() in "ceph"
119 # CLI, but we also use bytestrings in our tests, so make sure it does not
121 assert_equal({}, validate_command(sigdict
, ['章鱼和鱿鱼']))
122 assert_equal({}, validate_command(sigdict
, ['–w']))
125 class TestPG(TestArgparse
):
128 self
.assert_valid_command(['pg', 'stat'])
130 def test_getmap(self
):
131 self
.assert_valid_command(['pg', 'getmap'])
134 self
.assert_valid_command(['pg', 'dump'])
135 self
.assert_valid_command(['pg', 'dump',
144 assert_equal({}, validate_command(sigdict
, ['pg', 'dump', 'invalid']))
146 def test_dump_json(self
):
147 self
.assert_valid_command(['pg', 'dump_json'])
148 self
.assert_valid_command(['pg', 'dump_json',
155 assert_equal({}, validate_command(sigdict
, ['pg', 'dump_json',
158 def test_dump_pools_json(self
):
159 self
.assert_valid_command(['pg', 'dump_pools_json'])
161 def test_dump_pools_stuck(self
):
162 self
.assert_valid_command(['pg', 'dump_stuck'])
163 self
.assert_valid_command(['pg', 'dump_stuck',
167 assert_equal({}, validate_command(sigdict
, ['pg', 'dump_stuck',
169 self
.assert_valid_command(['pg', 'dump_stuck',
173 def one_pgid(self
, command
):
174 self
.assert_valid_command(['pg', command
, '1.1'])
175 assert_equal({}, validate_command(sigdict
, ['pg', command
]))
176 assert_equal({}, validate_command(sigdict
, ['pg', command
, '1']))
181 def test_scrub(self
):
182 self
.one_pgid('scrub')
184 def test_deep_scrub(self
):
185 self
.one_pgid('deep-scrub')
187 def test_repair(self
):
188 self
.one_pgid('repair')
190 def test_debug(self
):
191 self
.assert_valid_command(['pg',
193 'unfound_objects_exist'])
194 self
.assert_valid_command(['pg',
196 'degraded_pgs_exist'])
197 assert_equal({}, validate_command(sigdict
, ['pg', 'debug']))
198 assert_equal({}, validate_command(sigdict
, ['pg', 'debug',
201 def test_pg_missing_args_output(self
):
202 ret
, _
, stderr
= self
.capture_output(['pg'], stderr
=True)
203 assert_equal({}, ret
)
204 assert_regexp_matches(stderr
, re
.compile('no valid command found.* closest matches'))
206 def test_pg_wrong_arg_output(self
):
207 ret
, _
, stderr
= self
.capture_output(['pg', 'map', 'bad-pgid'],
209 assert_equal({}, ret
)
210 assert_in("Invalid command", stderr
)
213 class TestAuth(TestArgparse
):
215 def test_export(self
):
216 self
.assert_valid_command(['auth', 'export'])
217 self
.assert_valid_command(['auth',
220 assert_equal({}, validate_command(sigdict
, ['auth',
226 self
.check_1_string_arg('auth', 'get')
228 def test_get_key(self
):
229 self
.check_1_string_arg('auth', 'get-key')
231 def test_print_key(self
):
232 self
.check_1_string_arg('auth', 'print-key')
233 self
.check_1_string_arg('auth', 'print_key')
236 self
.check_no_arg('auth', 'list')
238 def test_import(self
):
239 self
.check_no_arg('auth', 'import')
242 self
.check_1_or_more_string_args('auth', 'add')
244 def test_get_or_create_key(self
):
245 self
.check_1_or_more_string_args('auth', 'get-or-create-key')
247 def test_get_or_create(self
):
248 self
.check_1_or_more_string_args('auth', 'get-or-create')
251 assert_equal({}, validate_command(sigdict
, ['auth',
253 assert_equal({}, validate_command(sigdict
, ['auth',
256 self
.assert_valid_command(['auth',
262 self
.check_1_string_arg('auth', 'del')
265 class TestMonitor(TestArgparse
):
267 def test_compact(self
):
268 self
.assert_valid_command(['compact'])
270 def test_scrub(self
):
271 self
.assert_valid_command(['scrub'])
274 self
.assert_valid_command(['fsid'])
277 assert_equal({}, validate_command(sigdict
, ['log']))
278 self
.assert_valid_command(['log', 'a logtext'])
279 self
.assert_valid_command(['log', 'a logtext', 'and another'])
281 def test_injectargs(self
):
282 assert_equal({}, validate_command(sigdict
, ['injectargs']))
283 self
.assert_valid_command(['injectargs', 'one'])
284 self
.assert_valid_command(['injectargs', 'one', 'two'])
286 def test_status(self
):
287 self
.assert_valid_command(['status'])
289 def test_health(self
):
290 self
.assert_valid_command(['health'])
291 self
.assert_valid_command(['health', 'detail'])
292 assert_equal({}, validate_command(sigdict
, ['health', 'invalid']))
293 assert_equal({}, validate_command(sigdict
, ['health', 'detail',
297 self
.assert_valid_command(['df'])
298 self
.assert_valid_command(['df', 'detail'])
299 assert_equal({}, validate_command(sigdict
, ['df', 'invalid']))
300 assert_equal({}, validate_command(sigdict
, ['df', 'detail',
303 def test_report(self
):
304 self
.assert_valid_command(['report'])
305 self
.assert_valid_command(['report', 'tag1'])
306 self
.assert_valid_command(['report', 'tag1', 'tag2'])
308 def test_quorum_status(self
):
309 self
.assert_valid_command(['quorum_status'])
311 def test_mon_status(self
):
312 self
.assert_valid_command(['mon_status'])
314 def test_sync_force(self
):
315 self
.assert_valid_command(['sync',
317 '--yes-i-really-mean-it',
318 '--i-know-what-i-am-doing'])
319 self
.assert_valid_command(['sync',
321 '--yes-i-really-mean-it'])
322 self
.assert_valid_command(['sync',
324 assert_equal({}, validate_command(sigdict
, ['sync']))
325 assert_equal({}, validate_command(sigdict
, ['sync',
327 '--yes-i-really-mean-it',
328 '--i-know-what-i-am-doing',
332 assert_equal({}, validate_command(sigdict
, ['heap']))
333 assert_equal({}, validate_command(sigdict
, ['heap', 'invalid']))
334 self
.assert_valid_command(['heap', 'dump'])
335 self
.assert_valid_command(['heap', 'start_profiler'])
336 self
.assert_valid_command(['heap', 'stop_profiler'])
337 self
.assert_valid_command(['heap', 'release'])
338 self
.assert_valid_command(['heap', 'stats'])
340 def test_quorum(self
):
341 assert_equal({}, validate_command(sigdict
, ['quorum']))
342 assert_equal({}, validate_command(sigdict
, ['quorum', 'invalid']))
343 self
.assert_valid_command(['quorum', 'enter'])
344 self
.assert_valid_command(['quorum', 'exit'])
345 assert_equal({}, validate_command(sigdict
, ['quorum',
350 assert_equal({}, validate_command(sigdict
, ['tell']))
351 assert_equal({}, validate_command(sigdict
, ['tell', 'invalid']))
352 for name
in ('osd', 'mon', 'client', 'mds'):
353 assert_equal({}, validate_command(sigdict
, ['tell', name
]))
354 assert_equal({}, validate_command(sigdict
, ['tell',
356 self
.assert_valid_command(['tell', name
+ ".42", 'something'])
357 self
.assert_valid_command(['tell', name
+ ".42",
362 class TestMDS(TestArgparse
):
365 self
.check_no_arg('mds', 'stat')
368 self
.check_0_or_1_natural_arg('mds', 'dump')
371 self
.assert_valid_command(['mds', 'tell',
374 self
.assert_valid_command(['mds', 'tell',
378 assert_equal({}, validate_command(sigdict
, ['mds', 'tell']))
379 assert_equal({}, validate_command(sigdict
, ['mds', 'tell',
382 def test_compat_show(self
):
383 self
.assert_valid_command(['mds', 'compat', 'show'])
384 assert_equal({}, validate_command(sigdict
, ['mds', 'compat']))
385 assert_equal({}, validate_command(sigdict
, ['mds', 'compat',
389 self
.assert_valid_command(['mds', 'stop', 'someone'])
390 assert_equal({}, validate_command(sigdict
, ['mds', 'stop']))
391 assert_equal({}, validate_command(sigdict
, ['mds', 'stop',
392 'someone', 'toomany']))
394 def test_deactivate(self
):
395 self
.assert_valid_command(['mds', 'deactivate', 'someone'])
396 assert_equal({}, validate_command(sigdict
, ['mds', 'deactivate']))
397 assert_equal({}, validate_command(sigdict
, ['mds', 'deactivate',
398 'someone', 'toomany']))
400 def test_set_max_mds(self
):
401 self
.check_1_natural_arg('mds', 'set_max_mds')
403 def test_set_state(self
):
404 self
.assert_valid_command(['mds', 'set_state', '1', '2'])
405 assert_equal({}, validate_command(sigdict
, ['mds', 'set_state']))
406 assert_equal({}, validate_command(sigdict
, ['mds', 'set_state', '-1']))
407 assert_equal({}, validate_command(sigdict
, ['mds', 'set_state',
409 assert_equal({}, validate_command(sigdict
, ['mds', 'set_state',
413 self
.check_1_string_arg('mds', 'fail')
416 # Valid: single GID argument present
417 self
.assert_valid_command(['mds', 'rm', '1'])
419 # Missing GID arg: invalid
420 assert_equal({}, validate_command(sigdict
, ['mds', 'rm']))
422 assert_equal({}, validate_command(sigdict
, ['mds', 'rm', '1', 'mds.42']))
424 def test_rmfailed(self
):
425 self
.assert_valid_command(['mds', 'rmfailed', '0'])
426 self
.assert_valid_command(['mds', 'rmfailed', '0', '--yes-i-really-mean-it'])
427 assert_equal({}, validate_command(sigdict
, ['mds', 'rmfailed', '0',
428 '--yes-i-really-mean-it',
431 def test_cluster_down(self
):
432 self
.check_no_arg('mds', 'cluster_down')
434 def test_cluster_up(self
):
435 self
.check_no_arg('mds', 'cluster_up')
437 def test_compat_rm_compat(self
):
438 self
.assert_valid_command(['mds', 'compat', 'rm_compat', '1'])
439 assert_equal({}, validate_command(sigdict
, ['mds',
442 assert_equal({}, validate_command(sigdict
, ['mds',
445 assert_equal({}, validate_command(sigdict
, ['mds',
447 'rm_compat', '1', '1']))
449 def test_incompat_rm_incompat(self
):
450 self
.assert_valid_command(['mds', 'compat', 'rm_incompat', '1'])
451 assert_equal({}, validate_command(sigdict
, ['mds',
454 assert_equal({}, validate_command(sigdict
, ['mds',
456 'rm_incompat', '-1']))
457 assert_equal({}, validate_command(sigdict
, ['mds',
459 'rm_incompat', '1', '1']))
461 def test_mds_set(self
):
462 self
.assert_valid_command(['mds', 'set', 'max_mds', '2'])
463 self
.assert_valid_command(['mds', 'set', 'max_file_size', '2'])
464 self
.assert_valid_command(['mds', 'set', 'allow_new_snaps', 'no'])
465 assert_equal({}, validate_command(sigdict
, ['mds',
469 def test_add_data_pool(self
):
470 self
.assert_valid_command(['mds', 'add_data_pool', '1'])
471 self
.assert_valid_command(['mds', 'add_data_pool', 'foo'])
473 def test_remove_data_pool(self
):
474 self
.assert_valid_command(['mds', 'remove_data_pool', '1'])
475 self
.assert_valid_command(['mds', 'remove_data_pool', 'foo'])
477 def test_newfs(self
):
478 self
.assert_valid_command(['mds', 'newfs', '1', '2',
479 '--yes-i-really-mean-it'])
480 self
.assert_valid_command(['mds', 'newfs', '1', '2'])
481 assert_equal({}, validate_command(sigdict
, ['mds', 'newfs']))
482 assert_equal({}, validate_command(sigdict
, ['mds', 'newfs', '1']))
483 assert_equal({}, validate_command(sigdict
, ['mds',
487 '--yes-i-really-mean-it',
489 assert_equal({}, validate_command(sigdict
, ['mds',
493 '--yes-i-really-mean-it']))
494 assert_equal({}, validate_command(sigdict
, ['mds',
498 '--yes-i-really-mean-it']))
501 class TestFS(TestArgparse
):
504 self
.check_0_or_1_natural_arg('fs', 'dump')
506 def test_fs_new(self
):
507 self
.assert_valid_command(['fs', 'new', 'default', 'metadata', 'data'])
509 def test_fs_rm(self
):
510 self
.assert_valid_command(['fs', 'rm', 'default'])
511 self
.assert_valid_command(['fs', 'rm', 'default', '--yes-i-really-mean-it'])
512 assert_equal({}, validate_command(sigdict
, ['fs', 'rm', 'default', '--yes-i-really-mean-it', 'toomany']))
514 def test_fs_ls(self
):
515 self
.assert_valid_command(['fs', 'ls'])
516 assert_equal({}, validate_command(sigdict
, ['fs', 'ls', 'toomany']))
518 def test_fs_set_default(self
):
519 self
.assert_valid_command(['fs', 'set-default', 'cephfs'])
520 assert_equal({}, validate_command(sigdict
, ['fs', 'set-default']))
521 assert_equal({}, validate_command(sigdict
, ['fs', 'set-default', 'cephfs', 'toomany']))
523 class TestMon(TestArgparse
):
526 self
.check_0_or_1_natural_arg('mon', 'dump')
529 self
.check_no_arg('mon', 'stat')
531 def test_getmap(self
):
532 self
.check_0_or_1_natural_arg('mon', 'getmap')
535 self
.assert_valid_command(['mon', 'add', 'name', '1.2.3.4:1234'])
536 assert_equal({}, validate_command(sigdict
, ['mon', 'add']))
537 assert_equal({}, validate_command(sigdict
, ['mon', 'add', 'name']))
538 assert_equal({}, validate_command(sigdict
, ['mon', 'add',
541 assert_equal({}, validate_command(sigdict
, ['mon', 'add', 'name',
545 def test_remove(self
):
546 self
.assert_valid_command(['mon', 'remove', 'name'])
547 assert_equal({}, validate_command(sigdict
, ['mon', 'remove']))
548 assert_equal({}, validate_command(sigdict
, ['mon', 'remove',
552 class TestOSD(TestArgparse
):
555 self
.check_no_arg('osd', 'stat')
558 self
.check_0_or_1_natural_arg('osd', 'dump')
560 def test_osd_tree(self
):
561 self
.check_0_or_1_natural_arg('osd', 'tree')
563 def test_osd_ls(self
):
564 self
.check_0_or_1_natural_arg('osd', 'ls')
566 def test_osd_getmap(self
):
567 self
.check_0_or_1_natural_arg('osd', 'getmap')
569 def test_osd_getcrushmap(self
):
570 self
.check_0_or_1_natural_arg('osd', 'getcrushmap')
573 self
.check_no_arg('osd', 'perf')
575 def test_getmaxosd(self
):
576 self
.check_no_arg('osd', 'getmaxosd')
579 self
.check_1_natural_arg('osd', 'find')
582 self
.assert_valid_command(['osd', 'map', 'poolname', 'objectname'])
583 self
.assert_valid_command(['osd', 'map', 'poolname', 'objectname', 'nspace'])
584 assert_equal({}, validate_command(sigdict
, ['osd', 'map']))
585 assert_equal({}, validate_command(sigdict
, ['osd', 'map', 'poolname']))
586 assert_equal({}, validate_command(sigdict
, ['osd', 'map',
587 'poolname', 'objectname', 'nspace',
590 def test_metadata(self
):
591 self
.check_0_or_1_natural_arg('osd', 'metadata')
593 def test_scrub(self
):
594 self
.check_1_string_arg('osd', 'scrub')
596 def test_deep_scrub(self
):
597 self
.check_1_string_arg('osd', 'deep-scrub')
599 def test_repair(self
):
600 self
.check_1_string_arg('osd', 'repair')
602 def test_lspools(self
):
603 self
.assert_valid_command(['osd', 'lspools'])
604 self
.assert_valid_command(['osd', 'lspools', '1'])
605 self
.assert_valid_command(['osd', 'lspools', '-1'])
606 assert_equal({}, validate_command(sigdict
, ['osd', 'lspools',
609 def test_blacklist_ls(self
):
610 self
.assert_valid_command(['osd', 'blacklist', 'ls'])
611 assert_equal({}, validate_command(sigdict
, ['osd', 'blacklist']))
612 assert_equal({}, validate_command(sigdict
, ['osd', 'blacklist',
615 def test_crush_rule(self
):
616 assert_equal({}, validate_command(sigdict
, ['osd', 'crush']))
617 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule']))
618 for subcommand
in ('list', 'ls'):
619 self
.assert_valid_command(['osd', 'crush', 'rule', subcommand
])
620 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
624 def test_crush_rule_dump(self
):
625 self
.assert_valid_command(['osd', 'crush', 'rule', 'dump'])
626 self
.assert_valid_command(['osd', 'crush', 'rule', 'dump', 'RULE'])
627 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
632 def test_crush_dump(self
):
633 self
.assert_valid_command(['osd', 'crush', 'dump'])
634 assert_equal({}, validate_command(sigdict
, ['osd', 'crush']))
635 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
639 def test_setcrushmap(self
):
640 self
.check_no_arg('osd', 'setcrushmap')
642 def test_crush_add_bucket(self
):
643 self
.assert_valid_command(['osd', 'crush', 'add-bucket',
645 assert_equal({}, validate_command(sigdict
, ['osd', 'crush']))
646 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
648 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
649 'add-bucket', 'name',
652 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
656 def test_crush_rename_bucket(self
):
657 self
.assert_valid_command(['osd', 'crush', 'rename-bucket',
658 'srcname', 'dstname'])
659 assert_equal({}, validate_command(sigdict
, ['osd', 'crush']))
660 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
662 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
665 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
666 'rename-bucket', 'srcname',
669 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
670 'rename-bucket', '^^^',
672 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
673 'rename-bucket', 'srcname',
676 def check_crush_setter(self
, setter
):
677 self
.assert_valid_command(['osd', 'crush', setter
,
678 '*', '2.3', 'AZaz09-_.='])
679 self
.assert_valid_command(['osd', 'crush', setter
,
680 'osd.0', '2.3', 'AZaz09-_.='])
681 self
.assert_valid_command(['osd', 'crush', setter
,
682 '0', '2.3', 'AZaz09-_.='])
683 self
.assert_valid_command(['osd', 'crush', setter
,
684 '0', '2.3', 'AZaz09-_.=', 'AZaz09-_.='])
685 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
688 ret
= validate_command(sigdict
, ['osd', 'crush',
692 assert ret
in [None, {}]
693 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
699 def test_crush_set(self
):
700 assert_equal({}, validate_command(sigdict
, ['osd', 'crush']))
701 self
.check_crush_setter('set')
703 def test_crush_add(self
):
704 assert_equal({}, validate_command(sigdict
, ['osd', 'crush']))
705 self
.check_crush_setter('add')
707 def test_crush_create_or_move(self
):
708 assert_equal({}, validate_command(sigdict
, ['osd', 'crush']))
709 self
.check_crush_setter('create-or-move')
711 def test_crush_move(self
):
712 self
.assert_valid_command(['osd', 'crush', 'move',
713 'AZaz09-_.', 'AZaz09-_.='])
714 self
.assert_valid_command(['osd', 'crush', 'move',
715 '0', 'AZaz09-_.=', 'AZaz09-_.='])
716 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
718 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
719 'move', 'AZaz09-_.']))
720 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
723 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
727 def test_crush_link(self
):
728 self
.assert_valid_command(['osd', 'crush', 'link',
729 'name', 'AZaz09-_.='])
730 self
.assert_valid_command(['osd', 'crush', 'link',
731 'name', 'AZaz09-_.=', 'AZaz09-_.='])
732 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
734 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
738 def test_crush_rm(self
):
739 for alias
in ('rm', 'remove', 'unlink'):
740 self
.assert_valid_command(['osd', 'crush', alias
, 'AZaz09-_.'])
741 self
.assert_valid_command(['osd', 'crush', alias
,
742 'AZaz09-_.', 'AZaz09-_.'])
743 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
745 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
751 def test_crush_reweight(self
):
752 self
.assert_valid_command(['osd', 'crush', 'reweight',
754 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
756 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
759 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
763 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
768 def test_crush_tunables(self
):
769 for tunable
in ('legacy', 'argonaut', 'bobtail', 'firefly',
770 'optimal', 'default'):
771 self
.assert_valid_command(['osd', 'crush', 'tunables',
773 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
775 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
777 'default', 'toomany']))
779 def test_crush_rule_create_simple(self
):
780 self
.assert_valid_command(['osd', 'crush', 'rule', 'create-simple',
781 'AZaz09-_.', 'AZaz09-_.', 'AZaz09-_.'])
782 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
784 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
787 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
791 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
796 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
801 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
806 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
813 def test_crush_rule_create_erasure(self
):
814 self
.assert_valid_command(['osd', 'crush', 'rule', 'create-erasure',
816 self
.assert_valid_command(['osd', 'crush', 'rule', 'create-erasure',
817 'AZaz09-_.', 'whatever'])
818 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
820 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
823 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
827 def test_crush_rule_rm(self
):
828 self
.assert_valid_command(['osd', 'crush', 'rule', 'rm', 'AZaz09-_.'])
829 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
831 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
834 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
839 def test_setmaxosd(self
):
840 self
.check_1_natural_arg('osd', 'setmaxosd')
842 def test_pause(self
):
843 self
.check_no_arg('osd', 'pause')
845 def test_unpause(self
):
846 self
.check_no_arg('osd', 'unpause')
848 def test_erasure_code_profile_set(self
):
849 self
.assert_valid_command(['osd', 'erasure-code-profile', 'set',
851 self
.assert_valid_command(['osd', 'erasure-code-profile', 'set',
853 self
.assert_valid_command(['osd', 'erasure-code-profile', 'set',
854 'name', 'A=B', 'C=D'])
855 assert_equal({}, validate_command(sigdict
, ['osd',
856 'erasure-code-profile',
858 assert_equal({}, validate_command(sigdict
, ['osd',
859 'erasure-code-profile',
863 def test_erasure_code_profile_get(self
):
864 self
.assert_valid_command(['osd', 'erasure-code-profile', 'get',
866 assert_equal({}, validate_command(sigdict
, ['osd',
867 'erasure-code-profile',
869 assert_equal({}, validate_command(sigdict
, ['osd',
870 'erasure-code-profile',
874 def test_erasure_code_profile_rm(self
):
875 self
.assert_valid_command(['osd', 'erasure-code-profile', 'rm',
877 assert_equal({}, validate_command(sigdict
, ['osd',
878 'erasure-code-profile',
880 assert_equal({}, validate_command(sigdict
, ['osd',
881 'erasure-code-profile',
885 def test_erasure_code_profile_ls(self
):
886 self
.assert_valid_command(['osd', 'erasure-code-profile', 'ls'])
887 assert_equal({}, validate_command(sigdict
, ['osd',
888 'erasure-code-profile',
892 def test_set_unset(self
):
893 for action
in ('set', 'unset'):
894 for flag
in ('pause', 'noup', 'nodown', 'noout', 'noin',
895 'nobackfill', 'norecover', 'noscrub', 'nodeep-scrub'):
896 self
.assert_valid_command(['osd', action
, flag
])
897 assert_equal({}, validate_command(sigdict
, ['osd', action
]))
898 assert_equal({}, validate_command(sigdict
, ['osd', action
,
900 assert_equal({}, validate_command(sigdict
, ['osd', action
,
901 'pause', 'toomany']))
903 def test_cluster_snap(self
):
904 assert_equal({}, validate_command(sigdict
, ['osd', 'cluster_snap']))
907 self
.check_1_or_more_string_args('osd', 'down')
910 self
.check_1_or_more_string_args('osd', 'out')
913 self
.check_1_or_more_string_args('osd', 'in')
916 self
.check_1_or_more_string_args('osd', 'rm')
918 def test_reweight(self
):
919 self
.assert_valid_command(['osd', 'reweight', '1', '0.1'])
920 assert_equal({}, validate_command(sigdict
, ['osd', 'reweight']))
921 assert_equal({}, validate_command(sigdict
, ['osd', 'reweight',
923 assert_equal({}, validate_command(sigdict
, ['osd', 'reweight',
925 assert_equal({}, validate_command(sigdict
, ['osd', 'reweight',
927 assert_equal({}, validate_command(sigdict
, ['osd', 'reweight',
932 self
.assert_valid_command(['osd', 'lost', '1',
933 '--yes-i-really-mean-it'])
934 self
.assert_valid_command(['osd', 'lost', '1'])
935 assert_equal({}, validate_command(sigdict
, ['osd', 'lost']))
936 assert_equal({}, validate_command(sigdict
, ['osd', 'lost',
939 assert_equal({}, validate_command(sigdict
, ['osd', 'lost',
941 '--yes-i-really-mean-it']))
942 assert_equal({}, validate_command(sigdict
, ['osd', 'lost',
944 '--yes-i-really-mean-it',
947 def test_create(self
):
948 uuid
= '12345678123456781234567812345678'
949 self
.assert_valid_command(['osd', 'create'])
950 self
.assert_valid_command(['osd', 'create',
952 assert_equal({}, validate_command(sigdict
, ['osd', 'create',
954 assert_equal({}, validate_command(sigdict
, ['osd', 'create',
958 def test_blacklist(self
):
959 for action
in ('add', 'rm'):
960 self
.assert_valid_command(['osd', 'blacklist', action
,
962 self
.assert_valid_command(['osd', 'blacklist', action
,
964 self
.assert_valid_command(['osd', 'blacklist', action
,
965 '1.2.3.4/567', '600.40'])
966 self
.assert_valid_command(['osd', 'blacklist', action
,
967 '1.2.3.4', '600.40'])
968 assert_equal({}, validate_command(sigdict
, ['osd', 'blacklist',
972 assert_equal({}, validate_command(sigdict
, ['osd', 'blacklist',
976 assert_equal({}, validate_command(sigdict
, ['osd', 'blacklist',
982 def test_pool_mksnap(self
):
983 self
.assert_valid_command(['osd', 'pool', 'mksnap',
984 'poolname', 'snapname'])
985 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'mksnap']))
986 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'mksnap',
988 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'mksnap',
989 'poolname', 'snapname',
992 def test_pool_rmsnap(self
):
993 self
.assert_valid_command(['osd', 'pool', 'rmsnap',
994 'poolname', 'snapname'])
995 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'rmsnap']))
996 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'rmsnap',
998 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'rmsnap',
999 'poolname', 'snapname',
1002 def test_pool_create(self
):
1003 self
.assert_valid_command(['osd', 'pool', 'create',
1005 self
.assert_valid_command(['osd', 'pool', 'create',
1006 'poolname', '128', '128'])
1007 self
.assert_valid_command(['osd', 'pool', 'create',
1008 'poolname', '128', '128',
1010 self
.assert_valid_command(['osd', 'pool', 'create',
1011 'poolname', '128', '128',
1012 'erasure', 'A-Za-z0-9-_.', 'ruleset^^'])
1013 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'create']))
1014 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'create',
1016 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'create',
1018 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'create',
1023 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'create',
1026 'erasure', 'profile',
1029 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'create',
1032 'INVALID', 'profile',
1035 def test_pool_delete(self
):
1036 self
.assert_valid_command(['osd', 'pool', 'delete',
1037 'poolname', 'poolname',
1038 '--yes-i-really-really-mean-it'])
1039 self
.assert_valid_command(['osd', 'pool', 'delete',
1040 'poolname', 'poolname'])
1041 self
.assert_valid_command(['osd', 'pool', 'delete',
1043 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'delete']))
1044 assert_equal({}, validate_command(sigdict
,
1045 ['osd', 'pool', 'delete',
1046 'poolname', 'poolname',
1047 '--yes-i-really-really-mean-it',
1050 def test_pool_rename(self
):
1051 self
.assert_valid_command(['osd', 'pool', 'rename',
1052 'poolname', 'othername'])
1053 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'rename']))
1054 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'rename',
1056 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'rename',
1057 'poolname', 'othername',
1060 def test_pool_get(self
):
1061 for var
in ('size', 'min_size', 'crash_replay_interval',
1062 'pg_num', 'pgp_num', 'crush_rule', 'auid', 'fast_read',
1063 'scrub_min_interval', 'scrub_max_interval',
1064 'deep_scrub_interval', 'recovery_priority',
1065 'recovery_op_priority'):
1066 self
.assert_valid_command(['osd', 'pool', 'get', 'poolname', var
])
1067 assert_equal({}, validate_command(sigdict
, ['osd', 'pool']))
1068 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1070 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1071 'get', 'poolname']))
1072 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1074 'size', 'toomany']))
1075 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1079 def test_pool_set(self
):
1080 for var
in ('size', 'min_size', 'crash_replay_interval',
1081 'pg_num', 'pgp_num', 'crush_rule',
1082 'hashpspool', 'auid', 'fast_read',
1083 'scrub_min_interval', 'scrub_max_interval',
1084 'deep_scrub_interval', 'recovery_priority',
1085 'recovery_op_priority'):
1086 self
.assert_valid_command(['osd', 'pool',
1087 'set', 'poolname', var
, 'value'])
1088 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1090 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1091 'set', 'poolname']))
1092 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1097 def test_pool_set_quota(self
):
1098 for field
in ('max_objects', 'max_bytes'):
1099 self
.assert_valid_command(['osd', 'pool', 'set-quota',
1100 'poolname', field
, '10K'])
1101 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1103 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1106 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1110 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1115 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1122 def test_reweight_by_utilization(self
):
1123 self
.assert_valid_command(['osd', 'reweight-by-utilization'])
1124 self
.assert_valid_command(['osd', 'reweight-by-utilization', '100'])
1125 self
.assert_valid_command(['osd', 'reweight-by-utilization', '100', '.1'])
1126 self
.assert_valid_command(['osd', 'reweight-by-utilization', '--no-increasing'])
1127 assert_equal({}, validate_command(sigdict
, ['osd',
1128 'reweight-by-utilization',
1132 def test_tier_op(self
):
1133 for op
in ('add', 'remove', 'set-overlay'):
1134 self
.assert_valid_command(['osd', 'tier', op
,
1135 'poolname', 'othername'])
1136 assert_equal({}, validate_command(sigdict
, ['osd', 'tier', op
]))
1137 assert_equal({}, validate_command(sigdict
, ['osd', 'tier', op
,
1139 assert_equal({}, validate_command(sigdict
, ['osd', 'tier', op
,
1144 def test_tier_cache_mode(self
):
1145 for mode
in ('none', 'writeback', 'forward', 'readonly', 'readforward', 'readproxy'):
1146 self
.assert_valid_command(['osd', 'tier', 'cache-mode',
1148 assert_equal({}, validate_command(sigdict
, ['osd', 'tier',
1150 assert_equal({}, validate_command(sigdict
, ['osd', 'tier',
1154 def test_tier_remove_overlay(self
):
1155 self
.assert_valid_command(['osd', 'tier', 'remove-overlay',
1157 assert_equal({}, validate_command(sigdict
, ['osd', 'tier',
1159 assert_equal({}, validate_command(sigdict
, ['osd', 'tier',
1164 def set_ratio(self
, command
):
1165 self
.assert_valid_command(['osd',
1168 assert_equal({}, validate_command(sigdict
, ['osd', command
]))
1169 assert_equal({}, validate_command(sigdict
, ['osd',
1173 def test_set_full_ratio(self
):
1174 self
.set_ratio('set-full-ratio')
1176 def test_set_backfillfull_ratio(self
):
1177 self
.set_ratio('set-backfillfull-ratio')
1179 def test_set_nearfull_ratio(self
):
1180 self
.set_ratio('set-nearfull-ratio')
1183 class TestConfigKey(TestArgparse
):
1186 self
.check_1_string_arg('config-key', 'get')
1189 self
.assert_valid_command(['config-key', 'put',
1191 self
.assert_valid_command(['config-key', 'put',
1193 assert_equal({}, validate_command(sigdict
, ['config-key', 'put']))
1194 assert_equal({}, validate_command(sigdict
, ['config-key', 'put',
1199 self
.check_1_string_arg('config-key', 'del')
1201 def test_exists(self
):
1202 self
.check_1_string_arg('config-key', 'exists')
1204 def test_dump(self
):
1205 self
.check_no_arg('config-key', 'dump')
1207 def test_list(self
):
1208 self
.check_no_arg('config-key', 'list')
1210 # compile-command: "cd ../.. ; make -j4 &&
1211 # PYTHONPATH=pybind nosetests --stop \
1212 # test/pybind/test_ceph_argparse.py # test_ceph_argparse.py:TestOSD.test_rm"