From: Jason Dillaman Date: Mon, 21 Jan 2019 22:29:19 +0000 (-0500) Subject: rbd: simplify pool namespace positional argument handling X-Git-Tag: v14.1.0~266^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=04747272940922d507e9837a056fe9c27d3e3fc3;p=ceph.git rbd: simplify pool namespace positional argument handling The pool and namespace can now be specified as in a [/] format as positional arguments. Signed-off-by: Jason Dillaman --- diff --git a/qa/workunits/rbd/cli_generic.sh b/qa/workunits/rbd/cli_generic.sh index dc6cdb39c4c59..8f2a25a8e9551 100755 --- a/qa/workunits/rbd/cli_generic.sh +++ b/qa/workunits/rbd/cli_generic.sh @@ -631,10 +631,10 @@ test_namespace() { remove_images rbd namespace ls | wc -l | grep '^0$' - rbd namespace create rbd test1 - rbd namespace create --pool rbd test2 + rbd namespace create rbd/test1 + rbd namespace create --pool rbd --namespace test2 rbd namespace create --namespace test3 - expect_fail rbd namespace create rbd test3 + expect_fail rbd namespace create rbd/test3 rbd namespace list | grep 'test' | wc -l | grep '^3$' @@ -662,7 +662,7 @@ test_namespace() { rbd rm rbd/image2 rbd create $RBD_CREATE_ARGS --size 1G --namespace test1 image2 - expect_fail rbd namespace remove --pool rbd test1 + expect_fail rbd namespace remove rbd/test1 rbd group create rbd/test1/group1 rbd group image add rbd/test1/group1 rbd/test1/image1 @@ -674,11 +674,11 @@ test_namespace() { rbd remove rbd/test1/image2 - rbd namespace remove --pool rbd test1 + rbd namespace remove --pool rbd --namespace test1 rbd namespace remove --namespace test3 rbd namespace list | grep 'test' | wc -l | grep '^1$' - rbd namespace remove rbd test2 + rbd namespace remove rbd/test2 } get_migration_state() { @@ -725,8 +725,8 @@ test_migration() { rbd migration commit test1 # Migration to other namespace - rbd namespace create rbd2 ns1 - rbd namespace create rbd2 ns2 + rbd namespace create rbd2/ns1 + rbd namespace create rbd2/ns2 rbd migration prepare rbd2/test1 rbd2/ns1/test1 test "$(get_migration_state rbd2/ns1/test1)" = prepared rbd migration execute rbd2/test1 diff --git a/qa/workunits/rbd/rbd-ggate.sh b/qa/workunits/rbd/rbd-ggate.sh index 5c17590610fdf..9b60158d8f908 100755 --- a/qa/workunits/rbd/rbd-ggate.sh +++ b/qa/workunits/rbd/rbd-ggate.sh @@ -79,7 +79,7 @@ setup() dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE} ceph osd pool create ${POOL} 32 - rbd namespace create ${POOL} ${NS} + rbd namespace create ${POOL}/${NS} for ns in '' ${NS}; do rbd --dest-pool ${POOL} --dest-namespace "${ns}" --no-progress import \ ${DATA} ${IMAGE} diff --git a/qa/workunits/rbd/rbd-nbd.sh b/qa/workunits/rbd/rbd-nbd.sh index eebfe93e35295..30a20438ff648 100755 --- a/qa/workunits/rbd/rbd-nbd.sh +++ b/qa/workunits/rbd/rbd-nbd.sh @@ -53,7 +53,7 @@ setup() DATA=${TEMPDIR}/data dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE} - rbd namespace create ${POOL} ${NS} + rbd namespace create ${POOL}/${NS} for ns in '' ${NS}; do rbd --dest-pool ${POOL} --dest-namespace "${ns}" --no-progress import \ @@ -83,7 +83,7 @@ function cleanup() rbd -p ${POOL} --namespace "${ns}" remove ${IMAGE} fi done - rbd namespace remove ${POOL} ${NS} + rbd namespace remove ${POOL}/${NS} } function expect_false() diff --git a/src/test/cli/rbd/help.t b/src/test/cli/rbd/help.t index 4f28b67438f0c..63d8716e43e4c 100644 --- a/src/test/cli/rbd/help.t +++ b/src/test/cli/rbd/help.t @@ -851,9 +851,14 @@ rbd help group list usage: rbd group list [--pool ] [--namespace ] [--format ] [--pretty-format] + List rbd groups. + Positional arguments + pool specification + (example: [/] + Optional arguments -p [ --pool ] arg pool name --namespace arg namespace name @@ -1319,13 +1324,13 @@ rbd help list usage: rbd list [--long] [--pool ] [--namespace ] [--format ] [--pretty-format] - + List rbd images. Positional arguments - pool name - namespace name + pool specification + (example: [/] Optional arguments -l [ --long ] long listing format @@ -1744,13 +1749,13 @@ rbd help namespace create usage: rbd namespace create [--pool ] [--namespace ] - + Create an RBD image namespace. Positional arguments - pool name - namespace name + pool specification + (example: [/] Optional arguments -p [ --pool ] arg pool name @@ -1772,13 +1777,13 @@ rbd help namespace remove usage: rbd namespace remove [--pool ] [--namespace ] - + Remove an RBD image namespace. Positional arguments - pool name - namespace name + pool specification + (example: [/] Optional arguments -p [ --pool ] arg pool name @@ -1841,12 +1846,13 @@ rbd help pool stats usage: rbd pool stats [--pool ] [--namespace ] [--format ] [--pretty-format] - + Display pool statistics. Positional arguments - pool name + pool specification + (example: [/] Optional arguments -p [ --pool ] arg pool name @@ -2141,13 +2147,13 @@ rbd help trash list usage: rbd trash list [--pool ] [--namespace ] [--all] [--long] [--format ] [--pretty-format] - + List trash images. Positional arguments - pool name - namespace name + pool specification + (example: [/] Optional arguments -p [ --pool ] arg pool name @@ -2180,13 +2186,13 @@ usage: rbd trash purge [--pool ] [--namespace ] [--no-progress] [--expired-before ] [--threshold ] - + Remove all expired images from trash. Positional arguments - pool name - namespace name + pool specification + (example: [/] Optional arguments -p [ --pool ] arg pool name diff --git a/src/tools/rbd/ArgumentTypes.cc b/src/tools/rbd/ArgumentTypes.cc index 62039200bb333..036c8e00e15ca 100644 --- a/src/tools/rbd/ArgumentTypes.cc +++ b/src/tools/rbd/ArgumentTypes.cc @@ -166,20 +166,19 @@ void add_snap_id_option(po::options_description *opt) { } void add_pool_options(boost::program_options::options_description *pos, - boost::program_options::options_description *opt) { - pos->add_options() - ("pool-name", "pool name"); + boost::program_options::options_description *opt, + bool namespaces_supported) { opt->add_options() ((POOL_NAME + ",p").c_str(), po::value(), "pool name"); -} - -void add_namespace_options(boost::program_options::options_description *pos, - boost::program_options::options_description *opt) { - if (pos != nullptr) { + if (namespaces_supported) { + add_namespace_option(opt, ARGUMENT_MODIFIER_NONE); + pos->add_options() + ("pool-spec", "pool specification\n" + "(example: [/]"); + } else { pos->add_options() - ("namespace-name", "namespace name"); + ("pool-name", "pool name"); } - add_namespace_option(opt, ARGUMENT_MODIFIER_NONE); } void add_image_spec_options(po::options_description *pos, diff --git a/src/tools/rbd/ArgumentTypes.h b/src/tools/rbd/ArgumentTypes.h index 12de0341e68ea..23bb02b9cd0ce 100644 --- a/src/tools/rbd/ArgumentTypes.h +++ b/src/tools/rbd/ArgumentTypes.h @@ -143,9 +143,8 @@ void add_snap_option(boost::program_options::options_description *opt, void add_snap_id_option(boost::program_options::options_description *opt); void add_pool_options(boost::program_options::options_description *pos, - boost::program_options::options_description *opt); -void add_namespace_options(boost::program_options::options_description *pos, - boost::program_options::options_description *opt); + boost::program_options::options_description *opt, + bool namespaces_supported); void add_image_spec_options(boost::program_options::options_description *pos, boost::program_options::options_description *opt, diff --git a/src/tools/rbd/Utils.cc b/src/tools/rbd/Utils.cc index 0170be5bb8702..90725387908c3 100644 --- a/src/tools/rbd/Utils.cc +++ b/src/tools/rbd/Utils.cc @@ -168,36 +168,50 @@ std::string get_default_pool_name() { return g_ceph_context->_conf.get_val("rbd_default_pool"); } -std::string get_pool_name(const po::variables_map &vm, size_t *arg_index) { - std::string pool_name; +int get_pool_and_namespace_names( + const boost::program_options::variables_map &vm, + bool default_empty_pool_name, bool validate_pool_name, + std::string* pool_name, std::string* namespace_name, size_t *arg_index) { + if (namespace_name != nullptr && vm.count(at::NAMESPACE_NAME)) { + *namespace_name = vm[at::NAMESPACE_NAME].as(); + } + if (vm.count(at::POOL_NAME)) { - pool_name = vm[at::POOL_NAME].as(); + *pool_name = vm[at::POOL_NAME].as(); } else { - pool_name = get_positional_argument(vm, *arg_index); - if (!pool_name.empty()) { - ++(*arg_index); + *pool_name = get_positional_argument(vm, *arg_index); + if (!pool_name->empty()) { + if (namespace_name != nullptr) { + auto slash_pos = pool_name->find_last_of('/'); + if (slash_pos != std::string::npos) { + *namespace_name = pool_name->substr(slash_pos + 1); + } + *pool_name = pool_name->substr(0, slash_pos); + } + ++(*arg_index); } } - if (pool_name.empty()) { - pool_name = get_default_pool_name(); + if (default_empty_pool_name && pool_name->empty()) { + *pool_name = get_default_pool_name(); } - return pool_name; -} -std::string get_namespace_name(const boost::program_options::variables_map &vm, - size_t *arg_index) { - std::string namespace_name; - if (vm.count(at::NAMESPACE_NAME)) { - namespace_name = vm[at::NAMESPACE_NAME].as(); - } else if (arg_index != nullptr) { - namespace_name = get_positional_argument(vm, *arg_index); - if (!namespace_name.empty()) { - ++(*arg_index); - } + if (!g_ceph_context->_conf.get_val("rbd_validate_names")) { + validate_pool_name = false; + } + + if (validate_pool_name && + pool_name->find_first_of("/@") != std::string::npos) { + std::cerr << "rbd: invalid pool '" << *pool_name << "'" << std::endl; + return -EINVAL; + } else if (namespace_name != nullptr && + namespace_name->find_first_of("/@") != std::string::npos) { + std::cerr << "rbd: invalid namespace '" << *namespace_name << "'" + << std::endl; + return -EINVAL; } - return namespace_name; + return 0; } int get_pool_image_id(const po::variables_map &vm, diff --git a/src/tools/rbd/Utils.h b/src/tools/rbd/Utils.h index 8f78d24361465..e848051d9e044 100644 --- a/src/tools/rbd/Utils.h +++ b/src/tools/rbd/Utils.h @@ -99,10 +99,10 @@ std::string get_positional_argument( const boost::program_options::variables_map &vm, size_t index); std::string get_default_pool_name(); -std::string get_pool_name(const boost::program_options::variables_map &vm, - size_t *arg_index); -std::string get_namespace_name(const boost::program_options::variables_map &vm, - size_t *arg_index); +int get_pool_and_namespace_names( + const boost::program_options::variables_map &vm, + bool default_empty_pool_name, bool validate_pool_name, + std::string* pool_name, std::string* namespace_name, size_t *arg_index); int get_pool_image_snapshot_names( const boost::program_options::variables_map &vm, diff --git a/src/tools/rbd/action/Group.cc b/src/tools/rbd/action/Group.cc index 4a5b6a21ffdaa..d671c7e3a2e3f 100644 --- a/src/tools/rbd/action/Group.cc +++ b/src/tools/rbd/action/Group.cc @@ -120,13 +120,17 @@ int execute_create(const po::variables_map &vm, int execute_list(const po::variables_map &vm, const std::vector &ceph_global_init_args) { - + std::string pool_name; + std::string namespace_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); - std::string namespace_name = utils::get_namespace_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, false, &pool_name, + &namespace_name, &arg_index); + if (r < 0) { + return r; + } at::Format::Formatter formatter; - int r = utils::get_formatter(vm, &formatter); + r = utils::get_formatter(vm, &formatter); if (r < 0) { return r; } @@ -748,8 +752,7 @@ void get_remove_arguments(po::options_description *positional, void get_list_arguments(po::options_description *positional, po::options_description *options) { - at::add_pool_option(options, at::ARGUMENT_MODIFIER_NONE); - at::add_namespace_options(nullptr, options); + at::add_pool_options(positional, options, true); at::add_format_options(options); } diff --git a/src/tools/rbd/action/List.cc b/src/tools/rbd/action/List.cc index 56c14a9016098..9028a57066505 100644 --- a/src/tools/rbd/action/List.cc +++ b/src/tools/rbd/action/List.cc @@ -299,19 +299,23 @@ void get_arguments(po::options_description *positional, po::options_description *options) { options->add_options() ("long,l", po::bool_switch(), "long listing format"); - at::add_pool_options(positional, options); - at::add_namespace_options(positional, options); + at::add_pool_options(positional, options, true); at::add_format_options(options); } int execute(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; + std::string namespace_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); - std::string namespace_name = utils::get_namespace_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, false, &pool_name, + &namespace_name, &arg_index); + if (r < 0) { + return r; + } at::Format::Formatter formatter; - int r = utils::get_formatter(vm, &formatter); + r = utils::get_formatter(vm, &formatter); if (r < 0) { return r; } @@ -320,7 +324,8 @@ int execute(const po::variables_map &vm, g_conf().get_val("rbd_concurrent_management_ops"), formatter.get()); if (r < 0) { - std::cerr << "rbd: listing images failed : " << cpp_strerror(r) << std::endl; + std::cerr << "rbd: listing images failed : " << cpp_strerror(r) + << std::endl; return r; } diff --git a/src/tools/rbd/action/MirrorPool.cc b/src/tools/rbd/action/MirrorPool.cc index 9a26cdbe3c30a..b7dfa6d57f311 100644 --- a/src/tools/rbd/action/MirrorPool.cc +++ b/src/tools/rbd/action/MirrorPool.cc @@ -654,7 +654,7 @@ private: void get_peer_add_arguments(po::options_description *positional, po::options_description *options) { - at::add_pool_options(positional, options); + at::add_pool_options(positional, options, false); positional->add_options() ("remote-cluster-spec", "remote cluster spec\n" "(example: [@])"); @@ -668,13 +668,18 @@ void get_peer_add_arguments(po::options_description *positional, int execute_peer_add(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, true, &pool_name, + nullptr, &arg_index); + if (r < 0) { + return r; + } std::string remote_client_name = g_ceph_context->_conf->name.to_str(); std::string remote_cluster; std::map attributes; - int r = get_remote_cluster_spec( + r = get_remote_cluster_spec( vm, utils::get_positional_argument(vm, arg_index), &remote_client_name, &remote_cluster, &attributes); if (r < 0) { @@ -728,17 +733,22 @@ int execute_peer_add(const po::variables_map &vm, void get_peer_remove_arguments(po::options_description *positional, po::options_description *options) { - at::add_pool_options(positional, options); + at::add_pool_options(positional, options, false); add_uuid_option(positional); } int execute_peer_remove(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, true, &pool_name, + nullptr, &arg_index); + if (r < 0) { + return r; + } std::string uuid; - int r = get_uuid(vm, arg_index, &uuid); + r = get_uuid(vm, arg_index, &uuid); if (r < 0) { return r; } @@ -767,7 +777,7 @@ int execute_peer_remove(const po::variables_map &vm, void get_peer_set_arguments(po::options_description *positional, po::options_description *options) { - at::add_pool_options(positional, options); + at::add_pool_options(positional, options, false); add_uuid_option(positional); positional->add_options() ("key", "peer parameter [client, cluster, mon-host, key-file]") @@ -776,11 +786,16 @@ void get_peer_set_arguments(po::options_description *positional, int execute_peer_set(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, true, &pool_name, + nullptr, &arg_index); + if (r < 0) { + return r; + } std::string uuid; - int r = get_uuid(vm, arg_index++, &uuid); + r = get_uuid(vm, arg_index++, &uuid); if (r < 0) { return r; } @@ -847,12 +862,12 @@ int execute_peer_set(const po::variables_map &vm, void get_disable_arguments(po::options_description *positional, po::options_description *options) { - at::add_pool_options(positional, options); + at::add_pool_options(positional, options, false); } void get_enable_arguments(po::options_description *positional, po::options_description *options) { - at::add_pool_options(positional, options); + at::add_pool_options(positional, options, false); positional->add_options() ("mode", "mirror mode [image or pool]"); } @@ -905,8 +920,13 @@ int execute_enable_disable(const std::string &pool_name, int execute_disable(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, true, &pool_name, + nullptr, &arg_index); + if (r < 0) { + return r; + } return execute_enable_disable(pool_name, RBD_MIRROR_MODE_DISABLED, "disabled"); @@ -914,8 +934,13 @@ int execute_disable(const po::variables_map &vm, int execute_enable(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, true, &pool_name, + nullptr, &arg_index); + if (r < 0) { + return r; + } rbd_mirror_mode_t mirror_mode; std::string mode = utils::get_positional_argument(vm, arg_index++); @@ -933,7 +958,7 @@ int execute_enable(const po::variables_map &vm, void get_info_arguments(po::options_description *positional, po::options_description *options) { - at::add_pool_options(positional, options); + at::add_pool_options(positional, options, false); at::add_format_options(options); options->add_options() (ALL_NAME.c_str(), po::bool_switch(), "list all attributes"); @@ -941,11 +966,16 @@ void get_info_arguments(po::options_description *positional, int execute_info(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, false, &pool_name, + nullptr, &arg_index); + if (r < 0) { + return r; + } at::Format::Formatter formatter; - int r = utils::get_formatter(vm, &formatter); + r = utils::get_formatter(vm, &formatter); if (r < 0) { return r; } @@ -1010,18 +1040,23 @@ int execute_info(const po::variables_map &vm, void get_status_arguments(po::options_description *positional, po::options_description *options) { - at::add_pool_options(positional, options); + at::add_pool_options(positional, options, false); at::add_format_options(options); at::add_verbose_option(options); } int execute_status(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, false, &pool_name, + nullptr, &arg_index); + if (r < 0) { + return r; + } at::Format::Formatter formatter; - int r = utils::get_formatter(vm, &formatter); + r = utils::get_formatter(vm, &formatter); if (r < 0) { return r; } @@ -1150,18 +1185,23 @@ void get_promote_arguments(po::options_description *positional, options->add_options() ("force", po::bool_switch(), "promote even if not cleanly demoted by remote cluster"); - at::add_pool_options(positional, options); + at::add_pool_options(positional, options, false); } int execute_promote(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, true, &pool_name, + nullptr, &arg_index); + if (r < 0) { + return r; + } // TODO support namespaces librados::Rados rados; librados::IoCtx io_ctx; - int r = utils::init(pool_name, "", &rados, &io_ctx); + r = utils::init(pool_name, "", &rados, &io_ctx); if (r < 0) { return r; } @@ -1184,18 +1224,23 @@ int execute_promote(const po::variables_map &vm, void get_demote_arguments(po::options_description *positional, po::options_description *options) { - at::add_pool_options(positional, options); + at::add_pool_options(positional, options, false); } int execute_demote(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, true, &pool_name, + nullptr, &arg_index); + if (r < 0) { + return r; + } // TODO support namespaces librados::Rados rados; librados::IoCtx io_ctx; - int r = utils::init(pool_name, "", &rados, &io_ctx); + r = utils::init(pool_name, "", &rados, &io_ctx); if (r < 0) { return r; } diff --git a/src/tools/rbd/action/Namespace.cc b/src/tools/rbd/action/Namespace.cc index 7930bfd6999b9..746ab40c2b26c 100644 --- a/src/tools/rbd/action/Namespace.cc +++ b/src/tools/rbd/action/Namespace.cc @@ -22,16 +22,20 @@ namespace po = boost::program_options; void get_create_arguments(po::options_description *positional, po::options_description *options) { - at::add_pool_options(positional, options); - at::add_namespace_options(positional, options); + at::add_pool_options(positional, options, true); } int execute_create(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; + std::string namespace_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, true, &pool_name, + &namespace_name, &arg_index); + if (r < 0) { + return r; + } - std::string namespace_name = utils::get_namespace_name(vm, &arg_index); if (namespace_name.empty()) { std::cerr << "rbd: namespace name was not specified" << std::endl; return -EINVAL; @@ -39,7 +43,7 @@ int execute_create(const po::variables_map &vm, librados::Rados rados; librados::IoCtx io_ctx; - int r = utils::init(pool_name, "", &rados, &io_ctx); + r = utils::init(pool_name, "", &rados, &io_ctx); if (r < 0) { return r; } @@ -57,16 +61,20 @@ int execute_create(const po::variables_map &vm, void get_remove_arguments(po::options_description *positional, po::options_description *options) { - at::add_pool_options(positional, options); - at::add_namespace_options(positional, options); + at::add_pool_options(positional, options, true); } int execute_remove(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; + std::string namespace_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, true, &pool_name, + &namespace_name, &arg_index); + if (r < 0) { + return r; + } - std::string namespace_name = utils::get_namespace_name(vm, &arg_index); if (namespace_name.empty()) { std::cerr << "rbd: namespace name was not specified" << std::endl; return -EINVAL; @@ -74,7 +82,7 @@ int execute_remove(const po::variables_map &vm, librados::Rados rados; librados::IoCtx io_ctx; - int r = utils::init(pool_name, "", &rados, &io_ctx); + r = utils::init(pool_name, "", &rados, &io_ctx); if (r < 0) { return r; } @@ -99,17 +107,22 @@ int execute_remove(const po::variables_map &vm, void get_list_arguments(po::options_description *positional, po::options_description *options) { - at::add_pool_options(positional, options); + at::add_pool_options(positional, options, false); at::add_format_options(options); } int execute_list(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, true, &pool_name, + nullptr, &arg_index); + if (r < 0) { + return r; + } at::Format::Formatter formatter; - int r = utils::get_formatter(vm, &formatter); + r = utils::get_formatter(vm, &formatter); if (r < 0) { return r; } diff --git a/src/tools/rbd/action/Pool.cc b/src/tools/rbd/action/Pool.cc index 0445ee3903253..f1718eb1e1325 100644 --- a/src/tools/rbd/action/Pool.cc +++ b/src/tools/rbd/action/Pool.cc @@ -19,7 +19,7 @@ namespace po = boost::program_options; void get_arguments_init(po::options_description *positional, po::options_description *options) { - at::add_pool_options(positional, options); + at::add_pool_options(positional, options, false); options->add_options() ("force", po::bool_switch(), "force initialize pool for RBD use if registered by another application"); @@ -27,12 +27,17 @@ void get_arguments_init(po::options_description *positional, int execute_init(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, false, &pool_name, + nullptr, &arg_index); + if (r < 0) { + return r; + } librados::Rados rados; librados::IoCtx io_ctx; - int r = utils::init(pool_name, "", &rados, &io_ctx); + r = utils::init(pool_name, "", &rados, &io_ctx); if (r < 0) { return r; } @@ -54,19 +59,23 @@ int execute_init(const po::variables_map &vm, void get_arguments_stats(po::options_description *positional, po::options_description *options) { - at::add_pool_options(positional, options); - at::add_namespace_option(options, at::ARGUMENT_MODIFIER_NONE); + at::add_pool_options(positional, options, true); at::add_format_options(options); } int execute_stats(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; + std::string namespace_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); - std::string namespace_name = utils::get_namespace_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, false, &pool_name, + &namespace_name, &arg_index); + if (r < 0) { + return r; + } at::Format::Formatter formatter; - int r = utils::get_formatter(vm, &formatter); + r = utils::get_formatter(vm, &formatter); if (r < 0) { return r; } diff --git a/src/tools/rbd/action/Trash.cc b/src/tools/rbd/action/Trash.cc index dfefc7e848bae..ba93cd9115175 100644 --- a/src/tools/rbd/action/Trash.cc +++ b/src/tools/rbd/action/Trash.cc @@ -330,8 +330,7 @@ int do_list(librbd::RBD &rbd, librados::IoCtx& io_ctx, bool long_flag, void get_list_arguments(po::options_description *positional, po::options_description *options) { - at::add_pool_options(positional, options); - at::add_namespace_options(positional, options); + at::add_pool_options(positional, options, true); options->add_options() ("all,a", po::bool_switch(), "list images from all sources"); options->add_options() @@ -341,12 +340,17 @@ void get_list_arguments(po::options_description *positional, int execute_list(const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; + std::string namespace_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); - std::string namespace_name = utils::get_namespace_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, false, &pool_name, + &namespace_name, &arg_index); + if (r < 0) { + return r; + } at::Format::Formatter formatter; - int r = utils::get_formatter(vm, &formatter); + r = utils::get_formatter(vm, &formatter); if (r < 0) { return r; } @@ -373,8 +377,7 @@ int execute_list(const po::variables_map &vm, void get_purge_arguments(po::options_description *positional, po::options_description *options) { - at::add_pool_options(positional, options); - at::add_namespace_options(positional, options); + at::add_pool_options(positional, options, true); at::add_no_progress_option(options); options->add_options() @@ -388,9 +391,14 @@ void get_purge_arguments(po::options_description *positional, int execute_purge (const po::variables_map &vm, const std::vector &ceph_global_init_args) { + std::string pool_name; + std::string namespace_name; size_t arg_index = 0; - std::string pool_name = utils::get_pool_name(vm, &arg_index); - std::string namespace_name = utils::get_namespace_name(vm, &arg_index); + int r = utils::get_pool_and_namespace_names(vm, true, false, &pool_name, + &namespace_name, &arg_index); + if (r < 0) { + return r; + } utils::disable_cache(); @@ -398,7 +406,7 @@ int execute_purge (const po::variables_map &vm, librados::Rados rados; librados::IoCtx io_ctx; - int r = utils::init(pool_name, namespace_name, &rados, &io_ctx); + r = utils::init(pool_name, namespace_name, &rados, &io_ctx); if (r < 0) { return r; }