]>
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
27 def get_command_descriptions(what
):
28 CEPH_BIN
= os
.environ
['CEPH_BIN']
31 return os
.popen(CEPH_BIN
+ "/get_command_descriptions " + "--" + what
).read()
33 def test_parse_json_funcsigs():
34 commands
= get_command_descriptions("all")
35 cmd_json
= parse_json_funcsigs(commands
, 'cli')
37 # syntax error https://github.com/ceph/ceph/pull/585
38 commands
= get_command_descriptions("pull585")
39 assert_raises(TypeError, parse_json_funcsigs
, commands
, 'cli')
41 sigdict
= parse_json_funcsigs(get_command_descriptions("all"), 'cli')
46 def assert_valid_command(self
, args
):
47 result
= validate_command(sigdict
, args
)
48 assert_not_equal(result
,None)
49 assert_not_equal(result
,{})
51 def check_1_natural_arg(self
, prefix
, command
):
52 self
.assert_valid_command([prefix
, command
, '1'])
53 assert_equal({}, validate_command(sigdict
, [prefix
, command
]))
54 assert_equal({}, validate_command(sigdict
, [prefix
, command
, '-1']))
55 assert_equal({}, validate_command(sigdict
, [prefix
, command
, '1',
58 def check_0_or_1_natural_arg(self
, prefix
, command
):
59 self
.assert_valid_command([prefix
, command
, '1'])
60 self
.assert_valid_command([prefix
, command
])
61 assert_equal({}, validate_command(sigdict
, [prefix
, command
, '-1']))
62 assert_equal({}, validate_command(sigdict
, [prefix
, command
, '1',
65 def check_1_string_arg(self
, prefix
, command
):
66 assert_equal({}, validate_command(sigdict
, [prefix
, command
]))
67 self
.assert_valid_command([prefix
, command
, 'string'])
68 assert_equal({}, validate_command(sigdict
, [prefix
,
73 def check_1_or_more_string_args(self
, prefix
, command
):
74 assert_equal({}, validate_command(sigdict
, [prefix
,
76 self
.assert_valid_command([prefix
,
79 self
.assert_valid_command([prefix
,
84 def check_no_arg(self
, prefix
, command
):
85 self
.assert_valid_command([prefix
,
87 assert_equal({}, validate_command(sigdict
, [prefix
,
94 def test_non_ascii_in_non_options(self
):
95 # ArgumentPrefix("no match for {0}".format(s)) is not able to convert
96 # unicode str parameter into str. and validate_command() should not
98 assert_is_none(validate_command(sigdict
, [u
'章鱼和鱿鱼']))
99 assert_is_none(validate_command(sigdict
, [u
'–w']))
100 # actually we always pass unicode strings to validate_command() in "ceph"
101 # CLI, but we also use bytestrings in our tests, so make sure it does not
103 assert_is_none(validate_command(sigdict
, ['章鱼和鱿鱼']))
104 assert_is_none(validate_command(sigdict
, ['–w']))
107 class TestPG(TestArgparse
):
110 self
.assert_valid_command(['pg', 'stat'])
112 def test_getmap(self
):
113 self
.assert_valid_command(['pg', 'getmap'])
116 self
.assert_valid_command(['pg', 'dump'])
117 self
.assert_valid_command(['pg', 'dump',
126 assert_equal({}, validate_command(sigdict
, ['pg', 'dump', 'invalid']))
128 def test_dump_json(self
):
129 self
.assert_valid_command(['pg', 'dump_json'])
130 self
.assert_valid_command(['pg', 'dump_json',
137 assert_equal({}, validate_command(sigdict
, ['pg', 'dump_json',
140 def test_dump_pools_json(self
):
141 self
.assert_valid_command(['pg', 'dump_pools_json'])
143 def test_dump_pools_stuck(self
):
144 self
.assert_valid_command(['pg', 'dump_stuck'])
145 self
.assert_valid_command(['pg', 'dump_stuck',
149 assert_equal({}, validate_command(sigdict
, ['pg', 'dump_stuck',
151 self
.assert_valid_command(['pg', 'dump_stuck',
155 def one_pgid(self
, command
):
156 self
.assert_valid_command(['pg', command
, '1.1'])
157 assert_equal({}, validate_command(sigdict
, ['pg', command
]))
158 assert_equal({}, validate_command(sigdict
, ['pg', command
, '1']))
163 def test_scrub(self
):
164 self
.one_pgid('scrub')
166 def test_deep_scrub(self
):
167 self
.one_pgid('deep-scrub')
169 def test_repair(self
):
170 self
.one_pgid('repair')
172 def test_debug(self
):
173 self
.assert_valid_command(['pg',
175 'unfound_objects_exist'])
176 self
.assert_valid_command(['pg',
178 'degraded_pgs_exist'])
179 assert_equal({}, validate_command(sigdict
, ['pg', 'debug']))
180 assert_equal({}, validate_command(sigdict
, ['pg', 'debug',
184 class TestAuth(TestArgparse
):
186 def test_export(self
):
187 self
.assert_valid_command(['auth', 'export'])
188 self
.assert_valid_command(['auth',
191 assert_equal({}, validate_command(sigdict
, ['auth',
197 self
.check_1_string_arg('auth', 'get')
199 def test_get_key(self
):
200 self
.check_1_string_arg('auth', 'get-key')
202 def test_print_key(self
):
203 self
.check_1_string_arg('auth', 'print-key')
204 self
.check_1_string_arg('auth', 'print_key')
207 self
.check_no_arg('auth', 'list')
209 def test_import(self
):
210 self
.check_no_arg('auth', 'import')
213 self
.check_1_or_more_string_args('auth', 'add')
215 def test_get_or_create_key(self
):
216 self
.check_1_or_more_string_args('auth', 'get-or-create-key')
218 def test_get_or_create(self
):
219 self
.check_1_or_more_string_args('auth', 'get-or-create')
222 assert_equal({}, validate_command(sigdict
, ['auth',
224 assert_equal({}, validate_command(sigdict
, ['auth',
227 self
.assert_valid_command(['auth',
233 self
.check_1_string_arg('auth', 'del')
236 class TestMonitor(TestArgparse
):
238 def test_compact(self
):
239 self
.assert_valid_command(['compact'])
241 def test_scrub(self
):
242 self
.assert_valid_command(['scrub'])
245 self
.assert_valid_command(['fsid'])
248 assert_equal({}, validate_command(sigdict
, ['log']))
249 self
.assert_valid_command(['log', 'a logtext'])
250 self
.assert_valid_command(['log', 'a logtext', 'and another'])
252 def test_injectargs(self
):
253 assert_equal({}, validate_command(sigdict
, ['injectargs']))
254 self
.assert_valid_command(['injectargs', 'one'])
255 self
.assert_valid_command(['injectargs', 'one', 'two'])
257 def test_status(self
):
258 self
.assert_valid_command(['status'])
260 def test_health(self
):
261 self
.assert_valid_command(['health'])
262 self
.assert_valid_command(['health', 'detail'])
263 assert_equal({}, validate_command(sigdict
, ['health', 'invalid']))
264 assert_equal({}, validate_command(sigdict
, ['health', 'detail',
268 self
.assert_valid_command(['df'])
269 self
.assert_valid_command(['df', 'detail'])
270 assert_equal({}, validate_command(sigdict
, ['df', 'invalid']))
271 assert_equal({}, validate_command(sigdict
, ['df', 'detail',
274 def test_report(self
):
275 self
.assert_valid_command(['report'])
276 self
.assert_valid_command(['report', 'tag1'])
277 self
.assert_valid_command(['report', 'tag1', 'tag2'])
279 def test_quorum_status(self
):
280 self
.assert_valid_command(['quorum_status'])
282 def test_mon_status(self
):
283 self
.assert_valid_command(['mon_status'])
285 def test_sync_force(self
):
286 self
.assert_valid_command(['sync',
288 '--yes-i-really-mean-it',
289 '--i-know-what-i-am-doing'])
290 self
.assert_valid_command(['sync',
292 '--yes-i-really-mean-it'])
293 self
.assert_valid_command(['sync',
295 assert_equal({}, validate_command(sigdict
, ['sync']))
296 assert_equal({}, validate_command(sigdict
, ['sync',
298 '--yes-i-really-mean-it',
299 '--i-know-what-i-am-doing',
303 assert_equal({}, validate_command(sigdict
, ['heap']))
304 assert_equal({}, validate_command(sigdict
, ['heap', 'invalid']))
305 self
.assert_valid_command(['heap', 'dump'])
306 self
.assert_valid_command(['heap', 'start_profiler'])
307 self
.assert_valid_command(['heap', 'stop_profiler'])
308 self
.assert_valid_command(['heap', 'release'])
309 self
.assert_valid_command(['heap', 'stats'])
311 def test_quorum(self
):
312 assert_equal({}, validate_command(sigdict
, ['quorum']))
313 assert_equal({}, validate_command(sigdict
, ['quorum', 'invalid']))
314 self
.assert_valid_command(['quorum', 'enter'])
315 self
.assert_valid_command(['quorum', 'exit'])
316 assert_equal({}, validate_command(sigdict
, ['quorum',
321 assert_equal({}, validate_command(sigdict
, ['tell']))
322 assert_equal({}, validate_command(sigdict
, ['tell', 'invalid']))
323 for name
in ('osd', 'mon', 'client', 'mds'):
324 assert_equal({}, validate_command(sigdict
, ['tell', name
]))
325 assert_equal({}, validate_command(sigdict
, ['tell',
327 self
.assert_valid_command(['tell', name
+ ".42", 'something'])
328 self
.assert_valid_command(['tell', name
+ ".42",
333 class TestMDS(TestArgparse
):
336 self
.check_no_arg('mds', 'stat')
339 self
.check_0_or_1_natural_arg('mds', 'dump')
342 self
.assert_valid_command(['mds', 'tell',
345 self
.assert_valid_command(['mds', 'tell',
349 assert_equal({}, validate_command(sigdict
, ['mds', 'tell']))
350 assert_equal({}, validate_command(sigdict
, ['mds', 'tell',
353 def test_compat_show(self
):
354 self
.assert_valid_command(['mds', 'compat', 'show'])
355 assert_equal({}, validate_command(sigdict
, ['mds', 'compat']))
356 assert_equal({}, validate_command(sigdict
, ['mds', 'compat',
360 self
.assert_valid_command(['mds', 'stop', 'someone'])
361 assert_equal({}, validate_command(sigdict
, ['mds', 'stop']))
362 assert_equal({}, validate_command(sigdict
, ['mds', 'stop',
363 'someone', 'toomany']))
365 def test_deactivate(self
):
366 self
.assert_valid_command(['mds', 'deactivate', 'someone'])
367 assert_equal({}, validate_command(sigdict
, ['mds', 'deactivate']))
368 assert_equal({}, validate_command(sigdict
, ['mds', 'deactivate',
369 'someone', 'toomany']))
371 def test_set_max_mds(self
):
372 self
.check_1_natural_arg('mds', 'set_max_mds')
374 def test_set_state(self
):
375 self
.assert_valid_command(['mds', 'set_state', '1', '2'])
376 assert_equal({}, validate_command(sigdict
, ['mds', 'set_state']))
377 assert_equal({}, validate_command(sigdict
, ['mds', 'set_state', '-1']))
378 assert_equal({}, validate_command(sigdict
, ['mds', 'set_state',
380 assert_equal({}, validate_command(sigdict
, ['mds', 'set_state',
384 self
.check_1_string_arg('mds', 'fail')
387 # Valid: single GID argument present
388 self
.assert_valid_command(['mds', 'rm', '1'])
390 # Missing GID arg: invalid
391 assert_equal({}, validate_command(sigdict
, ['mds', 'rm']))
393 assert_equal({}, validate_command(sigdict
, ['mds', 'rm', '1', 'mds.42']))
395 def test_rmfailed(self
):
396 self
.assert_valid_command(['mds', 'rmfailed', '0'])
397 self
.assert_valid_command(['mds', 'rmfailed', '0', '--yes-i-really-mean-it'])
398 assert_equal({}, validate_command(sigdict
, ['mds', 'rmfailed', '0',
399 '--yes-i-really-mean-it',
402 def test_cluster_down(self
):
403 self
.check_no_arg('mds', 'cluster_down')
405 def test_cluster_up(self
):
406 self
.check_no_arg('mds', 'cluster_up')
408 def test_compat_rm_compat(self
):
409 self
.assert_valid_command(['mds', 'compat', 'rm_compat', '1'])
410 assert_equal({}, validate_command(sigdict
, ['mds',
413 assert_equal({}, validate_command(sigdict
, ['mds',
416 assert_equal({}, validate_command(sigdict
, ['mds',
418 'rm_compat', '1', '1']))
420 def test_incompat_rm_incompat(self
):
421 self
.assert_valid_command(['mds', 'compat', 'rm_incompat', '1'])
422 assert_equal({}, validate_command(sigdict
, ['mds',
425 assert_equal({}, validate_command(sigdict
, ['mds',
427 'rm_incompat', '-1']))
428 assert_equal({}, validate_command(sigdict
, ['mds',
430 'rm_incompat', '1', '1']))
432 def test_mds_set(self
):
433 self
.assert_valid_command(['mds', 'set', 'max_mds', '2'])
434 self
.assert_valid_command(['mds', 'set', 'max_file_size', '2'])
435 self
.assert_valid_command(['mds', 'set', 'allow_new_snaps', 'no'])
436 assert_equal({}, validate_command(sigdict
, ['mds',
440 def test_add_data_pool(self
):
441 self
.assert_valid_command(['mds', 'add_data_pool', '1'])
442 self
.assert_valid_command(['mds', 'add_data_pool', 'foo'])
444 def test_remove_data_pool(self
):
445 self
.assert_valid_command(['mds', 'remove_data_pool', '1'])
446 self
.assert_valid_command(['mds', 'remove_data_pool', 'foo'])
448 def test_newfs(self
):
449 self
.assert_valid_command(['mds', 'newfs', '1', '2',
450 '--yes-i-really-mean-it'])
451 self
.assert_valid_command(['mds', 'newfs', '1', '2'])
452 assert_equal({}, validate_command(sigdict
, ['mds', 'newfs']))
453 assert_equal({}, validate_command(sigdict
, ['mds', 'newfs', '1']))
454 assert_equal({}, validate_command(sigdict
, ['mds',
458 '--yes-i-really-mean-it',
460 assert_equal({}, validate_command(sigdict
, ['mds',
464 '--yes-i-really-mean-it']))
465 assert_equal({}, validate_command(sigdict
, ['mds',
469 '--yes-i-really-mean-it']))
472 class TestFS(TestArgparse
):
475 self
.check_0_or_1_natural_arg('fs', 'dump')
477 def test_fs_new(self
):
478 self
.assert_valid_command(['fs', 'new', 'default', 'metadata', 'data'])
480 def test_fs_rm(self
):
481 self
.assert_valid_command(['fs', 'rm', 'default'])
482 self
.assert_valid_command(['fs', 'rm', 'default', '--yes-i-really-mean-it'])
483 assert_equal({}, validate_command(sigdict
, ['fs', 'rm', 'default', '--yes-i-really-mean-it', 'toomany']))
485 def test_fs_ls(self
):
486 self
.assert_valid_command(['fs', 'ls'])
487 assert_equal({}, validate_command(sigdict
, ['fs', 'ls', 'toomany']))
489 def test_fs_set_default(self
):
490 self
.assert_valid_command(['fs', 'set-default', 'cephfs'])
491 assert_equal({}, validate_command(sigdict
, ['fs', 'set-default']))
492 assert_equal({}, validate_command(sigdict
, ['fs', 'set-default', 'cephfs', 'toomany']))
494 class TestMon(TestArgparse
):
497 self
.check_0_or_1_natural_arg('mon', 'dump')
500 self
.check_no_arg('mon', 'stat')
502 def test_getmap(self
):
503 self
.check_0_or_1_natural_arg('mon', 'getmap')
506 self
.assert_valid_command(['mon', 'add', 'name', '1.2.3.4:1234'])
507 assert_equal({}, validate_command(sigdict
, ['mon', 'add']))
508 assert_equal({}, validate_command(sigdict
, ['mon', 'add', 'name']))
509 assert_equal({}, validate_command(sigdict
, ['mon', 'add',
512 assert_equal({}, validate_command(sigdict
, ['mon', 'add', 'name',
516 def test_remove(self
):
517 self
.assert_valid_command(['mon', 'remove', 'name'])
518 assert_equal({}, validate_command(sigdict
, ['mon', 'remove']))
519 assert_equal({}, validate_command(sigdict
, ['mon', 'remove',
523 class TestOSD(TestArgparse
):
526 self
.check_no_arg('osd', 'stat')
529 self
.check_0_or_1_natural_arg('osd', 'dump')
531 def test_osd_tree(self
):
532 self
.check_0_or_1_natural_arg('osd', 'tree')
534 def test_osd_ls(self
):
535 self
.check_0_or_1_natural_arg('osd', 'ls')
537 def test_osd_getmap(self
):
538 self
.check_0_or_1_natural_arg('osd', 'getmap')
540 def test_osd_getcrushmap(self
):
541 self
.check_0_or_1_natural_arg('osd', 'getcrushmap')
544 self
.check_no_arg('osd', 'perf')
546 def test_getmaxosd(self
):
547 self
.check_no_arg('osd', 'getmaxosd')
550 self
.check_1_natural_arg('osd', 'find')
553 self
.assert_valid_command(['osd', 'map', 'poolname', 'objectname'])
554 self
.assert_valid_command(['osd', 'map', 'poolname', 'objectname', 'nspace'])
555 assert_equal({}, validate_command(sigdict
, ['osd', 'map']))
556 assert_equal({}, validate_command(sigdict
, ['osd', 'map', 'poolname']))
557 assert_equal({}, validate_command(sigdict
, ['osd', 'map',
558 'poolname', 'objectname', 'nspace',
561 def test_metadata(self
):
562 self
.check_0_or_1_natural_arg('osd', 'metadata')
564 def test_scrub(self
):
565 self
.check_1_string_arg('osd', 'scrub')
567 def test_deep_scrub(self
):
568 self
.check_1_string_arg('osd', 'deep-scrub')
570 def test_repair(self
):
571 self
.check_1_string_arg('osd', 'repair')
573 def test_lspools(self
):
574 self
.assert_valid_command(['osd', 'lspools'])
575 self
.assert_valid_command(['osd', 'lspools', '1'])
576 self
.assert_valid_command(['osd', 'lspools', '-1'])
577 assert_equal({}, validate_command(sigdict
, ['osd', 'lspools',
580 def test_blacklist_ls(self
):
581 self
.assert_valid_command(['osd', 'blacklist', 'ls'])
582 assert_equal({}, validate_command(sigdict
, ['osd', 'blacklist']))
583 assert_equal({}, validate_command(sigdict
, ['osd', 'blacklist',
586 def test_crush_rule(self
):
587 assert_equal({}, validate_command(sigdict
, ['osd', 'crush']))
588 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule']))
589 for subcommand
in ('list', 'ls'):
590 self
.assert_valid_command(['osd', 'crush', 'rule', subcommand
])
591 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
595 def test_crush_rule_dump(self
):
596 self
.assert_valid_command(['osd', 'crush', 'rule', 'dump'])
597 self
.assert_valid_command(['osd', 'crush', 'rule', 'dump', 'RULE'])
598 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
603 def test_crush_dump(self
):
604 self
.assert_valid_command(['osd', 'crush', 'dump'])
605 assert_equal({}, validate_command(sigdict
, ['osd', 'crush']))
606 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
610 def test_setcrushmap(self
):
611 self
.check_no_arg('osd', 'setcrushmap')
613 def test_crush_add_bucket(self
):
614 self
.assert_valid_command(['osd', 'crush', 'add-bucket',
616 assert_equal({}, validate_command(sigdict
, ['osd', 'crush']))
617 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
619 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
620 'add-bucket', 'name',
623 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
627 def test_crush_rename_bucket(self
):
628 self
.assert_valid_command(['osd', 'crush', 'rename-bucket',
629 'srcname', 'dstname'])
630 assert_equal({}, validate_command(sigdict
, ['osd', 'crush']))
631 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
633 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
636 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
637 'rename-bucket', 'srcname',
640 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
641 'rename-bucket', '^^^',
643 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
644 'rename-bucket', 'srcname',
647 def check_crush_setter(self
, setter
):
648 self
.assert_valid_command(['osd', 'crush', setter
,
649 '*', '2.3', 'AZaz09-_.='])
650 self
.assert_valid_command(['osd', 'crush', setter
,
651 'osd.0', '2.3', 'AZaz09-_.='])
652 self
.assert_valid_command(['osd', 'crush', setter
,
653 '0', '2.3', 'AZaz09-_.='])
654 self
.assert_valid_command(['osd', 'crush', setter
,
655 '0', '2.3', 'AZaz09-_.=', 'AZaz09-_.='])
656 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
659 ret
= validate_command(sigdict
, ['osd', 'crush',
663 assert ret
in [None, {}]
664 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
670 def test_crush_set(self
):
671 assert_equal({}, validate_command(sigdict
, ['osd', 'crush']))
672 self
.check_crush_setter('set')
674 def test_crush_add(self
):
675 assert_equal({}, validate_command(sigdict
, ['osd', 'crush']))
676 self
.check_crush_setter('add')
678 def test_crush_create_or_move(self
):
679 assert_equal({}, validate_command(sigdict
, ['osd', 'crush']))
680 self
.check_crush_setter('create-or-move')
682 def test_crush_move(self
):
683 self
.assert_valid_command(['osd', 'crush', 'move',
684 'AZaz09-_.', 'AZaz09-_.='])
685 self
.assert_valid_command(['osd', 'crush', 'move',
686 '0', 'AZaz09-_.=', 'AZaz09-_.='])
687 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
689 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
690 'move', 'AZaz09-_.']))
691 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
694 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
698 def test_crush_link(self
):
699 self
.assert_valid_command(['osd', 'crush', 'link',
700 'name', 'AZaz09-_.='])
701 self
.assert_valid_command(['osd', 'crush', 'link',
702 'name', 'AZaz09-_.=', 'AZaz09-_.='])
703 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
705 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
709 def test_crush_rm(self
):
710 for alias
in ('rm', 'remove', 'unlink'):
711 self
.assert_valid_command(['osd', 'crush', alias
, 'AZaz09-_.'])
712 self
.assert_valid_command(['osd', 'crush', alias
,
713 'AZaz09-_.', 'AZaz09-_.'])
714 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
716 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
722 def test_crush_reweight(self
):
723 self
.assert_valid_command(['osd', 'crush', 'reweight',
725 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
727 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
730 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
734 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
739 def test_crush_tunables(self
):
740 for tunable
in ('legacy', 'argonaut', 'bobtail', 'firefly',
741 'optimal', 'default'):
742 self
.assert_valid_command(['osd', 'crush', 'tunables',
744 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
746 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
748 'default', 'toomany']))
750 def test_crush_rule_create_simple(self
):
751 self
.assert_valid_command(['osd', 'crush', 'rule', 'create-simple',
752 'AZaz09-_.', 'AZaz09-_.', 'AZaz09-_.'])
753 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
755 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
758 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
762 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
767 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
772 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
777 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
784 def test_crush_rule_create_erasure(self
):
785 self
.assert_valid_command(['osd', 'crush', 'rule', 'create-erasure',
787 self
.assert_valid_command(['osd', 'crush', 'rule', 'create-erasure',
788 'AZaz09-_.', 'whatever'])
789 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
791 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
794 assert_equal({}, validate_command(sigdict
, ['osd', 'crush', 'rule',
798 def test_crush_rule_rm(self
):
799 self
.assert_valid_command(['osd', 'crush', 'rule', 'rm', 'AZaz09-_.'])
800 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
802 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
805 assert_equal({}, validate_command(sigdict
, ['osd', 'crush',
810 def test_setmaxosd(self
):
811 self
.check_1_natural_arg('osd', 'setmaxosd')
813 def test_pause(self
):
814 self
.check_no_arg('osd', 'pause')
816 def test_unpause(self
):
817 self
.check_no_arg('osd', 'unpause')
819 def test_erasure_code_profile_set(self
):
820 self
.assert_valid_command(['osd', 'erasure-code-profile', 'set',
822 self
.assert_valid_command(['osd', 'erasure-code-profile', 'set',
824 self
.assert_valid_command(['osd', 'erasure-code-profile', 'set',
825 'name', 'A=B', 'C=D'])
826 assert_equal({}, validate_command(sigdict
, ['osd',
827 'erasure-code-profile',
829 assert_equal({}, validate_command(sigdict
, ['osd',
830 'erasure-code-profile',
834 def test_erasure_code_profile_get(self
):
835 self
.assert_valid_command(['osd', 'erasure-code-profile', 'get',
837 assert_equal({}, validate_command(sigdict
, ['osd',
838 'erasure-code-profile',
840 assert_equal({}, validate_command(sigdict
, ['osd',
841 'erasure-code-profile',
845 def test_erasure_code_profile_rm(self
):
846 self
.assert_valid_command(['osd', 'erasure-code-profile', 'rm',
848 assert_equal({}, validate_command(sigdict
, ['osd',
849 'erasure-code-profile',
851 assert_equal({}, validate_command(sigdict
, ['osd',
852 'erasure-code-profile',
856 def test_erasure_code_profile_ls(self
):
857 self
.assert_valid_command(['osd', 'erasure-code-profile', 'ls'])
858 assert_equal({}, validate_command(sigdict
, ['osd',
859 'erasure-code-profile',
863 def test_set_unset(self
):
864 for action
in ('set', 'unset'):
865 for flag
in ('pause', 'noup', 'nodown', 'noout', 'noin',
866 'nobackfill', 'norecover', 'noscrub', 'nodeep-scrub'):
867 self
.assert_valid_command(['osd', action
, flag
])
868 assert_equal({}, validate_command(sigdict
, ['osd', action
]))
869 assert_equal({}, validate_command(sigdict
, ['osd', action
,
871 assert_equal({}, validate_command(sigdict
, ['osd', action
,
872 'pause', 'toomany']))
874 def test_cluster_snap(self
):
875 assert_equal(None, validate_command(sigdict
, ['osd', 'cluster_snap']))
878 self
.check_1_or_more_string_args('osd', 'down')
881 self
.check_1_or_more_string_args('osd', 'out')
884 self
.check_1_or_more_string_args('osd', 'in')
887 self
.check_1_or_more_string_args('osd', 'rm')
889 def test_reweight(self
):
890 self
.assert_valid_command(['osd', 'reweight', '1', '0.1'])
891 assert_equal({}, validate_command(sigdict
, ['osd', 'reweight']))
892 assert_equal({}, validate_command(sigdict
, ['osd', 'reweight',
894 assert_equal({}, validate_command(sigdict
, ['osd', 'reweight',
896 assert_equal({}, validate_command(sigdict
, ['osd', 'reweight',
898 assert_equal({}, validate_command(sigdict
, ['osd', 'reweight',
903 self
.assert_valid_command(['osd', 'lost', '1',
904 '--yes-i-really-mean-it'])
905 self
.assert_valid_command(['osd', 'lost', '1'])
906 assert_equal({}, validate_command(sigdict
, ['osd', 'lost']))
907 assert_equal({}, validate_command(sigdict
, ['osd', 'lost',
910 assert_equal({}, validate_command(sigdict
, ['osd', 'lost',
912 '--yes-i-really-mean-it']))
913 assert_equal({}, validate_command(sigdict
, ['osd', 'lost',
915 '--yes-i-really-mean-it',
918 def test_create(self
):
919 uuid
= '12345678123456781234567812345678'
920 self
.assert_valid_command(['osd', 'create'])
921 self
.assert_valid_command(['osd', 'create',
923 assert_equal({}, validate_command(sigdict
, ['osd', 'create',
925 assert_equal({}, validate_command(sigdict
, ['osd', 'create',
929 def test_blacklist(self
):
930 for action
in ('add', 'rm'):
931 self
.assert_valid_command(['osd', 'blacklist', action
,
933 self
.assert_valid_command(['osd', 'blacklist', action
,
935 self
.assert_valid_command(['osd', 'blacklist', action
,
936 '1.2.3.4/567', '600.40'])
937 self
.assert_valid_command(['osd', 'blacklist', action
,
938 '1.2.3.4', '600.40'])
939 assert_equal({}, validate_command(sigdict
, ['osd', 'blacklist',
943 assert_equal({}, validate_command(sigdict
, ['osd', 'blacklist',
947 assert_equal({}, validate_command(sigdict
, ['osd', 'blacklist',
953 def test_pool_mksnap(self
):
954 self
.assert_valid_command(['osd', 'pool', 'mksnap',
955 'poolname', 'snapname'])
956 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'mksnap']))
957 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'mksnap',
959 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'mksnap',
960 'poolname', 'snapname',
963 def test_pool_rmsnap(self
):
964 self
.assert_valid_command(['osd', 'pool', 'rmsnap',
965 'poolname', 'snapname'])
966 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'rmsnap']))
967 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'rmsnap',
969 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'rmsnap',
970 'poolname', 'snapname',
973 def test_pool_create(self
):
974 self
.assert_valid_command(['osd', 'pool', 'create',
976 self
.assert_valid_command(['osd', 'pool', 'create',
977 'poolname', '128', '128'])
978 self
.assert_valid_command(['osd', 'pool', 'create',
979 'poolname', '128', '128',
981 self
.assert_valid_command(['osd', 'pool', 'create',
982 'poolname', '128', '128',
983 'erasure', 'A-Za-z0-9-_.', 'ruleset^^'])
984 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'create']))
985 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'create',
987 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'create',
989 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'create',
994 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'create',
997 'erasure', 'profile',
1000 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'create',
1003 'INVALID', 'profile',
1006 def test_pool_delete(self
):
1007 self
.assert_valid_command(['osd', 'pool', 'delete',
1008 'poolname', 'poolname',
1009 '--yes-i-really-really-mean-it'])
1010 self
.assert_valid_command(['osd', 'pool', 'delete',
1011 'poolname', 'poolname'])
1012 self
.assert_valid_command(['osd', 'pool', 'delete',
1014 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'delete']))
1015 assert_equal({}, validate_command(sigdict
,
1016 ['osd', 'pool', 'delete',
1017 'poolname', 'poolname',
1018 '--yes-i-really-really-mean-it',
1021 def test_pool_rename(self
):
1022 self
.assert_valid_command(['osd', 'pool', 'rename',
1023 'poolname', 'othername'])
1024 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'rename']))
1025 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'rename',
1027 assert_equal({}, validate_command(sigdict
, ['osd', 'pool', 'rename',
1028 'poolname', 'othername',
1031 def test_pool_get(self
):
1032 for var
in ('size', 'min_size', 'crash_replay_interval',
1033 'pg_num', 'pgp_num', 'crush_rule', 'auid', 'fast_read',
1034 'scrub_min_interval', 'scrub_max_interval',
1035 'deep_scrub_interval', 'recovery_priority',
1036 'recovery_op_priority'):
1037 self
.assert_valid_command(['osd', 'pool', 'get', 'poolname', var
])
1038 assert_equal({}, validate_command(sigdict
, ['osd', 'pool']))
1039 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1041 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1042 'get', 'poolname']))
1043 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1045 'size', 'toomany']))
1046 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1050 def test_pool_set(self
):
1051 for var
in ('size', 'min_size', 'crash_replay_interval',
1052 'pg_num', 'pgp_num', 'crush_rule',
1053 'hashpspool', 'auid', 'fast_read',
1054 'scrub_min_interval', 'scrub_max_interval',
1055 'deep_scrub_interval', 'recovery_priority',
1056 'recovery_op_priority'):
1057 self
.assert_valid_command(['osd', 'pool',
1058 'set', 'poolname', var
, 'value'])
1059 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1061 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1062 'set', 'poolname']))
1063 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1068 def test_pool_set_quota(self
):
1069 for field
in ('max_objects', 'max_bytes'):
1070 self
.assert_valid_command(['osd', 'pool', 'set-quota',
1071 'poolname', field
, '10K'])
1072 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1074 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1077 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1081 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1086 assert_equal({}, validate_command(sigdict
, ['osd', 'pool',
1093 def test_reweight_by_utilization(self
):
1094 self
.assert_valid_command(['osd', 'reweight-by-utilization'])
1095 self
.assert_valid_command(['osd', 'reweight-by-utilization', '100'])
1096 self
.assert_valid_command(['osd', 'reweight-by-utilization', '100', '.1'])
1097 self
.assert_valid_command(['osd', 'reweight-by-utilization', '--no-increasing'])
1098 assert_equal({}, validate_command(sigdict
, ['osd',
1099 'reweight-by-utilization',
1103 def test_tier_op(self
):
1104 for op
in ('add', 'remove', 'set-overlay'):
1105 self
.assert_valid_command(['osd', 'tier', op
,
1106 'poolname', 'othername'])
1107 assert_equal({}, validate_command(sigdict
, ['osd', 'tier', op
]))
1108 assert_equal({}, validate_command(sigdict
, ['osd', 'tier', op
,
1110 assert_equal({}, validate_command(sigdict
, ['osd', 'tier', op
,
1115 def test_tier_cache_mode(self
):
1116 for mode
in ('none', 'writeback', 'forward', 'readonly', 'readforward', 'readproxy'):
1117 self
.assert_valid_command(['osd', 'tier', 'cache-mode',
1119 assert_equal({}, validate_command(sigdict
, ['osd', 'tier',
1121 assert_equal({}, validate_command(sigdict
, ['osd', 'tier',
1125 def test_tier_remove_overlay(self
):
1126 self
.assert_valid_command(['osd', 'tier', 'remove-overlay',
1128 assert_equal({}, validate_command(sigdict
, ['osd', 'tier',
1130 assert_equal({}, validate_command(sigdict
, ['osd', 'tier',
1135 def set_ratio(self
, command
):
1136 self
.assert_valid_command(['osd',
1139 assert_equal({}, validate_command(sigdict
, ['osd', command
]))
1140 assert_equal({}, validate_command(sigdict
, ['osd',
1144 def test_set_full_ratio(self
):
1145 self
.set_ratio('set-full-ratio')
1147 def test_set_backfillfull_ratio(self
):
1148 self
.set_ratio('set-backfillfull-ratio')
1150 def test_set_nearfull_ratio(self
):
1151 self
.set_ratio('set-nearfull-ratio')
1154 class TestConfigKey(TestArgparse
):
1157 self
.check_1_string_arg('config-key', 'get')
1160 self
.assert_valid_command(['config-key', 'put',
1162 self
.assert_valid_command(['config-key', 'put',
1164 assert_equal({}, validate_command(sigdict
, ['config-key', 'put']))
1165 assert_equal({}, validate_command(sigdict
, ['config-key', 'put',
1170 self
.check_1_string_arg('config-key', 'del')
1172 def test_exists(self
):
1173 self
.check_1_string_arg('config-key', 'exists')
1175 def test_dump(self
):
1176 self
.check_no_arg('config-key', 'dump')
1178 def test_list(self
):
1179 self
.check_no_arg('config-key', 'list')
1181 # compile-command: "cd ../.. ; make -j4 &&
1182 # PYTHONPATH=pybind nosetests --stop \
1183 # test/pybind/test_ceph_argparse.py # test_ceph_argparse.py:TestOSD.test_rm"