]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd: enable mirroring namespace support
authorMykola Golub <mgolub@suse.com>
Thu, 4 Jul 2019 16:30:35 +0000 (17:30 +0100)
committerMykola Golub <mgolub@suse.com>
Thu, 5 Sep 2019 12:57:47 +0000 (13:57 +0100)
Signed-off-by: Mykola Golub <mgolub@suse.com>
src/test/cli/rbd/help.t
src/tools/rbd/action/MirrorImage.cc
src/tools/rbd/action/MirrorPool.cc

index 6c5763b09399dba3becc2c633cd9d30e6a96e4e4..4f1f266b226288412eab814f62fc5e8dd546612a 100644 (file)
     --pretty-format      pretty formatting (json and xml)
   
   rbd help mirror pool demote
-  usage: rbd mirror pool demote [--pool <pool>] 
-                                <pool-name
+  usage: rbd mirror pool demote [--pool <pool>] [--namespace <namespace>] 
+                                <pool-spec
   
   Demote all primary images in the pool.
   
   Positional arguments
-    <pool-name>          pool name
+    <pool-spec>          pool specification
+                         (example: <pool-name>[/<namespace>]
   
   Optional arguments
     -p [ --pool ] arg    pool name
+    --namespace arg      namespace name
   
   rbd help mirror pool disable
-  usage: rbd mirror pool disable [--pool <pool>] 
-                                 <pool-name
+  usage: rbd mirror pool disable [--pool <pool>] [--namespace <namespace>] 
+                                 <pool-spec
   
   Disable RBD mirroring by default within a pool.
   
   Positional arguments
-    <pool-name>          pool name
+    <pool-spec>          pool specification
+                         (example: <pool-name>[/<namespace>]
   
   Optional arguments
     -p [ --pool ] arg    pool name
+    --namespace arg      namespace name
   
   rbd help mirror pool enable
-  usage: rbd mirror pool enable [--pool <pool>] 
-                                <pool-name> <mode> 
+  usage: rbd mirror pool enable [--pool <pool>] [--namespace <namespace>] 
+                                <pool-spec> <mode> 
   
   Enable RBD mirroring by default within a pool.
   
   Positional arguments
-    <pool-name>          pool name
+    <pool-spec>          pool specification
+                         (example: <pool-name>[/<namespace>]
     <mode>               mirror mode [image or pool]
   
   Optional arguments
     -p [ --pool ] arg    pool name
+    --namespace arg      namespace name
   
   rbd help mirror pool info
-  usage: rbd mirror pool info [--pool <pool>] [--format <format>] 
-                              [--pretty-format] [--all] 
-                              <pool-name
+  usage: rbd mirror pool info [--pool <pool>] [--namespace <namespace>] 
+                              [--format <format>] [--pretty-format] [--all] 
+                              <pool-spec
   
   Show information about the pool mirroring configuration.
   
   Positional arguments
-    <pool-name>          pool name
+    <pool-spec>          pool specification
+                         (example: <pool-name>[/<namespace>]
   
   Optional arguments
     -p [ --pool ] arg    pool name
+    --namespace arg      namespace name
     --format arg         output format (plain, json, or xml) [default: plain]
     --pretty-format      pretty formatting (json and xml)
     --all                list all attributes
   
   rbd help mirror pool promote
   usage: rbd mirror pool promote [--force] [--pool <pool>] 
-                                 <pool-name> 
+                                 [--namespace <namespace>] 
+                                 <pool-spec> 
   
   Promote all non-primary images in the pool.
   
   Positional arguments
-    <pool-name>          pool name
+    <pool-spec>          pool specification
+                         (example: <pool-name>[/<namespace>]
   
   Optional arguments
     --force              promote even if not cleanly demoted by remote cluster
     -p [ --pool ] arg    pool name
+    --namespace arg      namespace name
   
   rbd help mirror pool status
-  usage: rbd mirror pool status [--pool <pool>] [--format <format>] 
-                                [--pretty-format] [--verbose] 
-                                <pool-name
+  usage: rbd mirror pool status [--pool <pool>] [--namespace <namespace>] 
+                                [--format <format>] [--pretty-format] [--verbose] 
+                                <pool-spec
   
   Show status for all mirrored images in the pool.
   
   Positional arguments
-    <pool-name>          pool name
+    <pool-spec>          pool specification
+                         (example: <pool-name>[/<namespace>]
   
   Optional arguments
     -p [ --pool ] arg    pool name
+    --namespace arg      namespace name
     --format arg         output format (plain, json, or xml) [default: plain]
     --pretty-format      pretty formatting (json and xml)
     --verbose            be verbose
index a250b694c4ff9cc7bdf93cd7559d3cbc031fcdfb..14895c86eec0a76e97b235e93d5c3243925ff211 100644 (file)
@@ -52,7 +52,7 @@ int validate_mirroring_enabled(librbd::Image& image) {
 } // anonymous namespace
 
 void get_arguments(po::options_description *positional,
-                           po::options_description *options) {
+                   po::options_description *options) {
   at::add_image_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
 }
 
@@ -67,22 +67,22 @@ int execute_enable_disable(const po::variables_map &vm, bool enable,
                            bool force) {
   size_t arg_index = 0;
   std::string pool_name;
+  std::string namespace_name;
   std::string image_name;
   std::string snap_name;
   int r = utils::get_pool_image_snapshot_names(
-      vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, nullptr,
+      vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &namespace_name,
       &image_name, &snap_name, true, utils::SNAPSHOT_PRESENCE_NONE,
       utils::SPEC_VALIDATION_NONE);
   if (r < 0) {
     return r;
   }
 
-  // TODO support namespaces
   librados::Rados rados;
   librados::IoCtx io_ctx;
   librbd::Image image;
-  r = utils::init_and_open_image(pool_name, "", image_name, "", "", false,
-                                 &rados, &io_ctx, &image);
+  r = utils::init_and_open_image(pool_name, namespace_name, image_name, "", "",
+                                 false, &rados, &io_ctx, &image);
   if (r < 0) {
     return r;
   }
@@ -119,10 +119,11 @@ int execute_promote(const po::variables_map &vm,
                     const std::vector<std::string> &ceph_global_init_args) {
   size_t arg_index = 0;
   std::string pool_name;
+  std::string namespace_name;
   std::string image_name;
   std::string snap_name;
   int r = utils::get_pool_image_snapshot_names(
-      vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, nullptr,
+      vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &namespace_name,
       &image_name, &snap_name, true, utils::SNAPSHOT_PRESENCE_NONE,
       utils::SPEC_VALIDATION_NONE);
   if (r < 0) {
@@ -131,12 +132,11 @@ int execute_promote(const po::variables_map &vm,
 
   bool force = vm["force"].as<bool>();
 
-  // TODO support namespaces
   librados::Rados rados;
   librados::IoCtx io_ctx;
   librbd::Image image;
-  r = utils::init_and_open_image(pool_name, "", image_name, "", "", false,
-                                 &rados, &io_ctx, &image);
+  r = utils::init_and_open_image(pool_name, namespace_name, image_name, "", "",
+                                 false, &rados, &io_ctx, &image);
   if (r < 0) {
     return r;
   }
@@ -160,22 +160,22 @@ int execute_demote(const po::variables_map &vm,
                    const std::vector<std::string> &ceph_global_init_args) {
   size_t arg_index = 0;
   std::string pool_name;
+  std::string namespace_name;
   std::string image_name;
   std::string snap_name;
   int r = utils::get_pool_image_snapshot_names(
-      vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, nullptr,
+      vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &namespace_name,
       &image_name, &snap_name, true, utils::SNAPSHOT_PRESENCE_NONE,
       utils::SPEC_VALIDATION_NONE);
   if (r < 0) {
     return r;
   }
 
-  // TODO support namespaces
   librados::Rados rados;
   librados::IoCtx io_ctx;
   librbd::Image image;
-  r = utils::init_and_open_image(pool_name, "", image_name, "", "", false,
-                                 &rados, &io_ctx, &image);
+  r = utils::init_and_open_image(pool_name, namespace_name, image_name, "", "",
+                                 false, &rados, &io_ctx, &image);
   if (r < 0) {
     return r;
   }
@@ -199,22 +199,22 @@ int execute_resync(const po::variables_map &vm,
                    const std::vector<std::string> &ceph_global_init_args) {
   size_t arg_index = 0;
   std::string pool_name;
+  std::string namespace_name;
   std::string image_name;
   std::string snap_name;
   int r = utils::get_pool_image_snapshot_names(
-      vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, nullptr,
+      vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &namespace_name,
       &image_name, &snap_name, true, utils::SNAPSHOT_PRESENCE_NONE,
       utils::SPEC_VALIDATION_NONE);
   if (r < 0) {
     return r;
   }
 
-  // TODO support namespaces
   librados::Rados rados;
   librados::IoCtx io_ctx;
   librbd::Image image;
-  r = utils::init_and_open_image(pool_name, "", image_name, "", "", false,
-                                 &rados, &io_ctx, &image);
+  r = utils::init_and_open_image(pool_name, namespace_name, image_name, "", "",
+                                 false, &rados, &io_ctx, &image);
   if (r < 0) {
     return r;
   }
@@ -250,22 +250,22 @@ int execute_status(const po::variables_map &vm,
 
   size_t arg_index = 0;
   std::string pool_name;
+  std::string namespace_name;
   std::string image_name;
   std::string snap_name;
   r = utils::get_pool_image_snapshot_names(
-      vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, nullptr,
+      vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &namespace_name,
       &image_name, &snap_name, true, utils::SNAPSHOT_PRESENCE_NONE,
       utils::SPEC_VALIDATION_NONE);
   if (r < 0) {
     return r;
   }
 
-  // TODO support namespaces
   librados::Rados rados;
   librados::IoCtx io_ctx;
   librbd::Image image;
-  r = utils::init_and_open_image(pool_name, "", image_name, "", "", false,
-                                 &rados, &io_ctx, &image);
+  r = utils::init_and_open_image(pool_name, namespace_name, image_name, "", "",
+                                 false, &rados, &io_ctx, &image);
   if (r < 0) {
     return r;
   }
index 24da115bfcd2d2f1638dfb35e54e9cdbf3f3c853..53e6ffdaa73c0f0dcf3211c4ccbacc5052ae2a82 100644 (file)
@@ -687,7 +687,6 @@ int execute_peer_add(const po::variables_map &vm,
     return r;
   }
 
-  // TODO support namespaces
   librados::Rados rados;
   librados::IoCtx io_ctx;
   r = utils::init(pool_name, "", &rados, &io_ctx);
@@ -754,7 +753,6 @@ int execute_peer_remove(const po::variables_map &vm,
     return r;
   }
 
-  // TODO support namespaces
   librados::Rados rados;
   librados::IoCtx io_ctx;
   r = utils::init(pool_name, "", &rados, &io_ctx);
@@ -829,7 +827,6 @@ int execute_peer_set(const po::variables_map &vm,
     key = "mon_host";
   }
 
-  // TODO support namespaces
   librados::Rados rados;
   librados::IoCtx io_ctx;
   r = utils::init(pool_name, "", &rados, &io_ctx);
@@ -863,25 +860,25 @@ 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, false);
+  at::add_pool_options(positional, options, true);
 }
 
 void get_enable_arguments(po::options_description *positional,
                           po::options_description *options) {
-  at::add_pool_options(positional, options, false);
+  at::add_pool_options(positional, options, true);
   positional->add_options()
     ("mode", "mirror mode [image or pool]");
 }
 
 int execute_enable_disable(const std::string &pool_name,
+                           const std::string &namespace_name,
                            rbd_mirror_mode_t next_mirror_mode,
                            const std::string &mode) {
   librados::Rados rados;
   librados::IoCtx io_ctx;
   rbd_mirror_mode_t current_mirror_mode;
 
-  // TODO support namespaces
-  int r = utils::init(pool_name, "", &rados, &io_ctx);
+  int r = utils::init(pool_name, namespace_name, &rados, &io_ctx);
   if (r < 0) {
     return r;
   }
@@ -922,23 +919,25 @@ 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;
+  std::string namespace_name;
   size_t arg_index = 0;
   int r = utils::get_pool_and_namespace_names(vm, true, true, &pool_name,
-                                              nullptr, &arg_index);
+                                              &namespace_name, &arg_index);
   if (r < 0) {
     return r;
   }
 
-  return execute_enable_disable(pool_name, RBD_MIRROR_MODE_DISABLED,
-                                "disabled");
+  return execute_enable_disable(pool_name, namespace_name,
+                                RBD_MIRROR_MODE_DISABLED, "disabled");
 }
 
 int execute_enable(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;
   int r = utils::get_pool_and_namespace_names(vm, true, true, &pool_name,
-                                              nullptr, &arg_index);
+                                              &namespace_name, &arg_index);
   if (r < 0) {
     return r;
   }
@@ -954,12 +953,12 @@ int execute_enable(const po::variables_map &vm,
     return -EINVAL;
   }
 
-  return execute_enable_disable(pool_name, mirror_mode, mode);
+  return execute_enable_disable(pool_name, namespace_name, mirror_mode, mode);
 }
 
 void get_info_arguments(po::options_description *positional,
                         po::options_description *options) {
-  at::add_pool_options(positional, options, false);
+  at::add_pool_options(positional, options, true);
   at::add_format_options(options);
   options->add_options()
     (ALL_NAME.c_str(), po::bool_switch(), "list all attributes");
@@ -968,9 +967,10 @@ 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;
+  std::string namespace_name;
   size_t arg_index = 0;
   int r = utils::get_pool_and_namespace_names(vm, true, false, &pool_name,
-                                              nullptr, &arg_index);
+                                              &namespace_name, &arg_index);
   if (r < 0) {
     return r;
   }
@@ -981,10 +981,9 @@ int execute_info(const po::variables_map &vm,
     return r;
   }
 
-  // TODO support namespaces
   librados::Rados rados;
   librados::IoCtx io_ctx;
-  r = utils::init(pool_name, "", &rados, &io_ctx);
+  r = utils::init(pool_name, namespace_name, &rados, &io_ctx);
   if (r < 0) {
     return r;
   }
@@ -997,9 +996,11 @@ int execute_info(const po::variables_map &vm,
   }
 
   std::vector<librbd::mirror_peer_t> mirror_peers;
-  r = rbd.mirror_peer_list(io_ctx, &mirror_peers);
-  if (r < 0) {
-    return r;
+  if (namespace_name.empty()) {
+    r = rbd.mirror_peer_list(io_ctx, &mirror_peers);
+    if (r < 0) {
+      return r;
+    }
   }
 
   std::string mirror_mode_desc;
@@ -1025,7 +1026,7 @@ int execute_info(const po::variables_map &vm,
     std::cout << "Mode: " << mirror_mode_desc << std::endl;
   }
 
-  if (mirror_mode != RBD_MIRROR_MODE_DISABLED) {
+  if (mirror_mode != RBD_MIRROR_MODE_DISABLED && namespace_name.empty()) {
     r = format_mirror_peers(io_ctx, formatter, mirror_peers,
                             vm[ALL_NAME].as<bool>());
     if (r < 0) {
@@ -1041,7 +1042,7 @@ 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, false);
+  at::add_pool_options(positional, options, true);
   at::add_format_options(options);
   at::add_verbose_option(options);
 }
@@ -1049,9 +1050,10 @@ void get_status_arguments(po::options_description *positional,
 int execute_status(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;
   int r = utils::get_pool_and_namespace_names(vm, true, false, &pool_name,
-                                              nullptr, &arg_index);
+                                              &namespace_name, &arg_index);
   if (r < 0) {
     return r;
   }
@@ -1064,10 +1066,9 @@ int execute_status(const po::variables_map &vm,
 
   bool verbose = vm[at::VERBOSE].as<bool>();
 
-  // TODO support namespaces
   librados::Rados rados;
   librados::IoCtx io_ctx;
-  r = utils::init(pool_name, "", &rados, &io_ctx);
+  r = utils::init(pool_name, namespace_name, &rados, &io_ctx);
   if (r < 0) {
     return r;
   }
@@ -1186,23 +1187,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, false);
+  at::add_pool_options(positional, options, true);
 }
 
 int execute_promote(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;
   int r = utils::get_pool_and_namespace_names(vm, true, true, &pool_name,
-                                              nullptr, &arg_index);
+                                              &namespace_name, &arg_index);
   if (r < 0) {
     return r;
   }
 
-  // TODO support namespaces
   librados::Rados rados;
   librados::IoCtx io_ctx;
-  r = utils::init(pool_name, "", &rados, &io_ctx);
+  r = utils::init(pool_name, namespace_name, &rados, &io_ctx);
   if (r < 0) {
     return r;
   }
@@ -1225,23 +1226,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, false);
+  at::add_pool_options(positional, options, true);
 }
 
 int execute_demote(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;
   int r = utils::get_pool_and_namespace_names(vm, true, true, &pool_name,
-                                              nullptr, &arg_index);
+                                              &namespace_name, &arg_index);
   if (r < 0) {
     return r;
   }
 
-  // TODO support namespaces
   librados::Rados rados;
   librados::IoCtx io_ctx;
-  r = utils::init(pool_name, "", &rados, &io_ctx);
+  r = utils::init(pool_name, namespace_name, &rados, &io_ctx);
   if (r < 0) {
     return r;
   }