From a87c4166b24f2f852d4e3d8c305eae8298576509 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Thu, 4 Jul 2019 17:30:35 +0100 Subject: [PATCH] rbd: enable mirroring namespace support Signed-off-by: Mykola Golub --- src/test/cli/rbd/help.t | 51 +++++++++++++--------- src/tools/rbd/action/MirrorImage.cc | 42 +++++++++---------- src/tools/rbd/action/MirrorPool.cc | 65 +++++++++++++++-------------- 3 files changed, 86 insertions(+), 72 deletions(-) diff --git a/src/test/cli/rbd/help.t b/src/test/cli/rbd/help.t index 6c5763b0939..4f1f266b226 100644 --- a/src/test/cli/rbd/help.t +++ b/src/test/cli/rbd/help.t @@ -1602,54 +1602,62 @@ --pretty-format pretty formatting (json and xml) rbd help mirror pool demote - usage: rbd mirror pool demote [--pool ] - + usage: rbd mirror pool demote [--pool ] [--namespace ] + Demote all primary images in the pool. Positional arguments - pool name + pool specification + (example: [/] Optional arguments -p [ --pool ] arg pool name + --namespace arg namespace name rbd help mirror pool disable - usage: rbd mirror pool disable [--pool ] - + usage: rbd mirror pool disable [--pool ] [--namespace ] + Disable RBD mirroring by default within a pool. Positional arguments - pool name + pool specification + (example: [/] Optional arguments -p [ --pool ] arg pool name + --namespace arg namespace name rbd help mirror pool enable - usage: rbd mirror pool enable [--pool ] - + usage: rbd mirror pool enable [--pool ] [--namespace ] + Enable RBD mirroring by default within a pool. Positional arguments - pool name + pool specification + (example: [/] 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 ] [--format ] - [--pretty-format] [--all] - + usage: rbd mirror pool info [--pool ] [--namespace ] + [--format ] [--pretty-format] [--all] + Show information about the pool mirroring configuration. Positional arguments - pool name + pool specification + (example: [/] 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 @@ -1706,29 +1714,34 @@ rbd help mirror pool promote usage: rbd mirror pool promote [--force] [--pool ] - + [--namespace ] + Promote all non-primary images in the pool. Positional arguments - pool name + pool specification + (example: [/] 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 ] [--format ] - [--pretty-format] [--verbose] - + usage: rbd mirror pool status [--pool ] [--namespace ] + [--format ] [--pretty-format] [--verbose] + Show status for all mirrored images in the pool. Positional arguments - pool name + pool specification + (example: [/] 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 diff --git a/src/tools/rbd/action/MirrorImage.cc b/src/tools/rbd/action/MirrorImage.cc index a250b694c4f..14895c86eec 100644 --- a/src/tools/rbd/action/MirrorImage.cc +++ b/src/tools/rbd/action/MirrorImage.cc @@ -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 &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(); - // 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 &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 &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; } diff --git a/src/tools/rbd/action/MirrorPool.cc b/src/tools/rbd/action/MirrorPool.cc index 24da115bfcd..53e6ffdaa73 100644 --- a/src/tools/rbd/action/MirrorPool.cc +++ b/src/tools/rbd/action/MirrorPool.cc @@ -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 &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 &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 &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 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()); 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 &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(); - // 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 &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 &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; } -- 2.39.5