]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd: simplify pool namespace positional argument handling
authorJason Dillaman <dillaman@redhat.com>
Mon, 21 Jan 2019 22:29:19 +0000 (17:29 -0500)
committerJason Dillaman <dillaman@redhat.com>
Mon, 28 Jan 2019 19:36:44 +0000 (14:36 -0500)
The pool and namespace can now be specified as in a
<pool-name>[/<namespace-name>] format as positional
arguments.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
14 files changed:
qa/workunits/rbd/cli_generic.sh
qa/workunits/rbd/rbd-ggate.sh
qa/workunits/rbd/rbd-nbd.sh
src/test/cli/rbd/help.t
src/tools/rbd/ArgumentTypes.cc
src/tools/rbd/ArgumentTypes.h
src/tools/rbd/Utils.cc
src/tools/rbd/Utils.h
src/tools/rbd/action/Group.cc
src/tools/rbd/action/List.cc
src/tools/rbd/action/MirrorPool.cc
src/tools/rbd/action/Namespace.cc
src/tools/rbd/action/Pool.cc
src/tools/rbd/action/Trash.cc

index dc6cdb39c4c591d5ff68e982a100092807b76191..8f2a25a8e955105793b26c9d9aaed7136907a579 100755 (executable)
@@ -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
index 5c17590610fdf692225fc49111a5a7e6b468663f..9b60158d8f908e6eef40086e52de3c53d14d89dd 100755 (executable)
@@ -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}
index eebfe93e35295226825ef80cc3c616da864e2f4a..30a20438ff6482ffc1e5b304e055961c4d5fa064 100755 (executable)
@@ -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()
index 4f28b67438f0c71e6a83260ab12a807419f5e273..63d8716e43e4c5bc96f371a6bdc45545bfb5f787 100644 (file)
   rbd help group list
   usage: rbd group list [--pool <pool>] [--namespace <namespace>] 
                         [--format <format>] [--pretty-format] 
+                        <pool-spec> 
   
   List rbd groups.
   
+  Positional arguments
+    <pool-spec>          pool specification
+                         (example: <pool-name>[/<namespace-name>]
+  
   Optional arguments
     -p [ --pool ] arg    pool name
     --namespace arg      namespace name
   rbd help list
   usage: rbd list [--long] [--pool <pool>] [--namespace <namespace>] 
                   [--format <format>] [--pretty-format] 
-                  <pool-name> <namespace-name
+                  <pool-spec
   
   List rbd images.
   
   Positional arguments
-    <pool-name>          pool name
-    <namespace-name>     namespace name
+    <pool-spec>          pool specification
+                         (example: <pool-name>[/<namespace-name>]
   
   Optional arguments
     -l [ --long ]        long listing format
   
   rbd help namespace create
   usage: rbd namespace create [--pool <pool>] [--namespace <namespace>] 
-                              <pool-name> <namespace-name
+                              <pool-spec
   
   Create an RBD image namespace.
   
   Positional arguments
-    <pool-name>          pool name
-    <namespace-name>     namespace name
+    <pool-spec>          pool specification
+                         (example: <pool-name>[/<namespace-name>]
   
   Optional arguments
     -p [ --pool ] arg    pool name
   
   rbd help namespace remove
   usage: rbd namespace remove [--pool <pool>] [--namespace <namespace>] 
-                              <pool-name> <namespace-name
+                              <pool-spec
   
   Remove an RBD image namespace.
   
   Positional arguments
-    <pool-name>          pool name
-    <namespace-name>     namespace name
+    <pool-spec>          pool specification
+                         (example: <pool-name>[/<namespace-name>]
   
   Optional arguments
     -p [ --pool ] arg    pool name
   rbd help pool stats
   usage: rbd pool stats [--pool <pool>] [--namespace <namespace>] 
                         [--format <format>] [--pretty-format] 
-                        <pool-name
+                        <pool-spec
   
   Display pool statistics.
   
   Positional arguments
-    <pool-name>          pool name
+    <pool-spec>          pool specification
+                         (example: <pool-name>[/<namespace-name>]
   
   Optional arguments
     -p [ --pool ] arg    pool name
   rbd help trash list
   usage: rbd trash list [--pool <pool>] [--namespace <namespace>] [--all] 
                         [--long] [--format <format>] [--pretty-format] 
-                        <pool-name> <namespace-name
+                        <pool-spec
   
   List trash images.
   
   Positional arguments
-    <pool-name>          pool name
-    <namespace-name>     namespace name
+    <pool-spec>          pool specification
+                         (example: <pool-name>[/<namespace-name>]
   
   Optional arguments
     -p [ --pool ] arg    pool name
   usage: rbd trash purge [--pool <pool>] [--namespace <namespace>] 
                          [--no-progress] [--expired-before <expired-before>] 
                          [--threshold <threshold>] 
-                         <pool-name> <namespace-name
+                         <pool-spec
   
   Remove all expired images from trash.
   
   Positional arguments
-    <pool-name>           pool name
-    <namespace-name>      namespace name
+    <pool-spec>           pool specification
+                          (example: <pool-name>[/<namespace-name>]
   
   Optional arguments
     -p [ --pool ] arg     pool name
index 62039200bb3339bcafded2825417836f80e6d173..036c8e00e15caf3795b9840be23a0102a322c5b9 100644 (file)
@@ -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<std::string>(), "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: <pool-name>[/<namespace-name>]");
+  } 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,
index 12de0341e68ea9beddaa80d76c33a3b27267ccd5..23bb02b9cd0ce9c2526c1c14d86f940c4f425c64 100644 (file)
@@ -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,
index 0170be5bb87027da32ae0f3faa9df82cc7768485..90725387908c387b6519a998e5a1517c0db28604 100644 (file)
@@ -168,36 +168,50 @@ std::string get_default_pool_name() {
   return g_ceph_context->_conf.get_val<std::string>("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<std::string>();
+  }
+
   if (vm.count(at::POOL_NAME)) {
-    pool_name = vm[at::POOL_NAME].as<std::string>();
+    *pool_name = vm[at::POOL_NAME].as<std::string>();
   } 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<std::string>();
-  } 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<bool>("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,
index 8f78d243614652334f820eee24405fb62e1f1b11..e848051d9e04418581a087db9452ffd2ae9ccd29 100644 (file)
@@ -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,
index 4a5b6a21ffdaab2afa67d1936098cd8ae0420ee9..d671c7e3a2e3f16b00294f6d6f540e6181e985a0 100644 (file)
@@ -120,13 +120,17 @@ int execute_create(const po::variables_map &vm,
 
 int execute_list(const po::variables_map &vm,
                  const std::vector<std::string> &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);
 }
 
index 56c14a90160987f70d4c5ab507ad9aa84e745ca8..9028a5706650596fae3fa08faf92369d9890b06d 100644 (file)
@@ -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<std::string> &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<uint64_t>("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;
   }
 
index 9a26cdbe3c30af2448433c282d38ee96ed517554..b7dfa6d57f3117b63f30eab3e5fcb47ba87dd169 100644 (file)
@@ -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: [<client name>@]<cluster name>)");
@@ -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<std::string> &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<std::string, std::string> 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<std::string> &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<std::string> &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<std::string> &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<std::string> &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<std::string> &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<std::string> &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<std::string> &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<std::string> &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;
   }
index 7930bfd6999b936b033db385b0cecede67347b25..746ab40c2b26cdecc419edc127557606a1d5c2db 100644 (file)
@@ -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<std::string> &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<std::string> &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<std::string> &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;
   }
index 0445ee390325347ad886af75580a40e4608e6f18..f1718eb1e1325a74bf5686dedc4b99f8c93fb32a 100644 (file)
@@ -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<std::string> &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<std::string> &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;
   }
index dfefc7e848bae43fbb99e20acba3a43a9740bb3e..ba93cd911517519aab55257496a09cae8900aa26 100644 (file)
@@ -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<std::string> &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<std::string> &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;
   }