From: Stefan Chivu Date: Tue, 4 Oct 2022 12:25:45 +0000 (+0000) Subject: rbd: Moved get_image_or_snap_spec and parse_options to utils X-Git-Tag: v17.2.6~426^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ad718316361c8f7255c21f314d6daffaf9b60ac9;p=ceph.git rbd: Moved get_image_or_snap_spec and parse_options to utils At the moment, there are multiple copies of "get_image_or_snap_spec". For this reason, we're moving it to Utils.cc so that all backends may re-use it, also benefiting from the recent pool related fix. We are also renaming parse_options to append_options_as_args and changing its type to void Signed-off-by: Stefan Chivu (cherry picked from commit efe8ceb5398e52418ae9ac8c3e227d8bd66a65ff) --- diff --git a/src/tools/rbd/Utils.cc b/src/tools/rbd/Utils.cc index a47b45a8be1b..18e5e20d7ff9 100644 --- a/src/tools/rbd/Utils.cc +++ b/src/tools/rbd/Utils.cc @@ -273,6 +273,57 @@ int get_pool_image_id(const po::variables_map &vm, return 0; } +int get_image_or_snap_spec(const po::variables_map &vm, std::string *spec) { + size_t arg_index = 0; + std::string pool_name; + std::string nspace_name; + std::string image_name; + std::string snap_name; + int r = get_pool_image_snapshot_names( + vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &nspace_name, + &image_name, &snap_name, true, SNAPSHOT_PRESENCE_PERMITTED, + SPEC_VALIDATION_NONE); + if (r < 0) { + return r; + } + + if (pool_name.empty()) { + // connect to the cluster to get the default pool + librados::Rados rados; + r = init_rados(&rados); + if (r < 0) { + return r; + } + + normalize_pool_name(&pool_name); + } + + spec->append(pool_name); + spec->append("/"); + if (!nspace_name.empty()) { + spec->append(nspace_name); + spec->append("/"); + } + spec->append(image_name); + if (!snap_name.empty()) { + spec->append("@"); + spec->append(snap_name); + } + + return 0; +} + +void append_options_as_args(const std::vector &options, + std::vector *args) { + for (auto &opts : options) { + std::vector args_; + boost::split(args_, opts, boost::is_any_of(",")); + for (auto &o : args_) { + args->push_back("--" + o); + } + } +} + int get_pool_image_snapshot_names(const po::variables_map &vm, at::ArgumentModifier mod, size_t *spec_arg_index, diff --git a/src/tools/rbd/Utils.h b/src/tools/rbd/Utils.h index 3ed5bfddbcb6..bd00765f8ed7 100644 --- a/src/tools/rbd/Utils.h +++ b/src/tools/rbd/Utils.h @@ -104,6 +104,12 @@ std::string get_positional_argument( void normalize_pool_name(std::string* pool_name); std::string get_default_pool_name(); +int get_image_or_snap_spec(const boost::program_options::variables_map &vm, + std::string *spec); + +void append_options_as_args(const std::vector &options, + std::vector *args); + int get_pool_and_namespace_names( const boost::program_options::variables_map &vm, bool validate_pool_name, std::string* pool_name, std::string* namespace_name, size_t *arg_index); diff --git a/src/tools/rbd/action/Ggate.cc b/src/tools/rbd/action/Ggate.cc index 24699b43ff8d..11782d70ada8 100644 --- a/src/tools/rbd/action/Ggate.cc +++ b/src/tools/rbd/action/Ggate.cc @@ -51,59 +51,6 @@ static int call_ggate_cmd(const po::variables_map &vm, return 0; } - -int get_image_or_snap_spec(const po::variables_map &vm, std::string *spec) { - size_t arg_index = 0; - std::string pool_name; - std::string nspace_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, &nspace_name, - &image_name, &snap_name, true, - utils::SNAPSHOT_PRESENCE_PERMITTED, utils::SPEC_VALIDATION_NONE); - if (r < 0) { - return r; - } - - if (pool_name.empty()) { - // connect to the cluster to get the default pool - librados::Rados rados; - r = utils::init_rados(&rados); - if (r < 0) { - return r; - } - - utils::normalize_pool_name(&pool_name); - } - - spec->append(pool_name); - spec->append("/"); - if (!nspace_name.empty()) { - spec->append(nspace_name); - spec->append("/"); - } - spec->append(image_name); - if (!snap_name.empty()) { - spec->append("@"); - spec->append(snap_name); - } - - return 0; -} - -int parse_options(const std::vector &options, - std::vector *args) { - for (auto &opts : options) { - std::vector args_; - boost::split(args_, opts, boost::is_any_of(",")); - for (auto &o : args_) { - args->push_back("--" + o); - } - } - - return 0; -} #endif int execute_list(const po::variables_map &vm, @@ -138,7 +85,7 @@ int execute_map(const po::variables_map &vm, args.push_back("map"); std::string img; - int r = get_image_or_snap_spec(vm, &img); + int r = utils::get_image_or_snap_spec(vm, &img); if (r < 0) { return r; } @@ -161,10 +108,8 @@ int execute_map(const po::variables_map &vm, } if (vm.count("options")) { - r = parse_options(vm["options"].as>(), &args); - if (r < 0) { - return r; - } + utils::append_options_as_args(vm["options"].as>(), + &args); } return call_ggate_cmd(vm, args, ceph_global_init_args); @@ -184,7 +129,7 @@ int execute_unmap(const po::variables_map &vm, std::string image_name; if (device_name.empty()) { - int r = get_image_or_snap_spec(vm, &image_name); + int r = utils::get_image_or_snap_spec(vm, &image_name); if (r < 0) { return r; } @@ -202,10 +147,8 @@ int execute_unmap(const po::variables_map &vm, args.push_back(device_name.empty() ? image_name : device_name); if (vm.count("options")) { - int r = parse_options(vm["options"].as>(), &args); - if (r < 0) { - return r; - } + utils::append_options_as_args(vm["options"].as>(), + &args); } return call_ggate_cmd(vm, args, ceph_global_init_args); diff --git a/src/tools/rbd/action/Nbd.cc b/src/tools/rbd/action/Nbd.cc index 68345f43dd6c..061fdfa306a6 100644 --- a/src/tools/rbd/action/Nbd.cc +++ b/src/tools/rbd/action/Nbd.cc @@ -60,61 +60,6 @@ static int call_nbd_cmd(const po::variables_map &vm, #endif } -#if !defined(__FreeBSD__) && !defined(_WIN32) -int get_image_or_snap_spec(const po::variables_map &vm, std::string *spec) { - size_t arg_index = 0; - std::string pool_name; - std::string nspace_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, &nspace_name, - &image_name, &snap_name, true, utils::SNAPSHOT_PRESENCE_PERMITTED, - utils::SPEC_VALIDATION_NONE); - if (r < 0) { - return r; - } - - if (pool_name.empty()) { - // connect to the cluster to get the default pool - librados::Rados rados; - r = utils::init_rados(&rados); - if (r < 0) { - return r; - } - - utils::normalize_pool_name(&pool_name); - } - - spec->append(pool_name); - spec->append("/"); - if (!nspace_name.empty()) { - spec->append(nspace_name); - spec->append("/"); - } - spec->append(image_name); - if (!snap_name.empty()) { - spec->append("@"); - spec->append(snap_name); - } - - return 0; -} - -int parse_options(const std::vector &options, - std::vector *args) { - for (auto &opts : options) { - std::vector args_; - boost::split(args_, opts, boost::is_any_of(",")); - for (auto &o : args_) { - args->push_back("--" + o); - } - } - - return 0; -} -#endif - int execute_list(const po::variables_map &vm, const std::vector &ceph_global_init_args) { #if defined(__FreeBSD__) || defined(_WIN32) @@ -148,7 +93,7 @@ int execute_attach(const po::variables_map &vm, args.push_back("attach"); std::string img; - int r = get_image_or_snap_spec(vm, &img); + int r = utils::get_image_or_snap_spec(vm, &img); if (r < 0) { return r; } @@ -195,10 +140,8 @@ int execute_attach(const po::variables_map &vm, } if (vm.count("options")) { - r = parse_options(vm["options"].as>(), &args); - if (r < 0) { - return r; - } + utils::append_options_as_args(vm["options"].as>(), + &args); } return call_nbd_cmd(vm, args, ceph_global_init_args); @@ -218,7 +161,7 @@ int execute_detach(const po::variables_map &vm, std::string image_name; if (device_name.empty()) { - int r = get_image_or_snap_spec(vm, &image_name); + int r = utils::get_image_or_snap_spec(vm, &image_name); if (r < 0) { return r; } @@ -236,10 +179,8 @@ int execute_detach(const po::variables_map &vm, args.push_back(device_name.empty() ? image_name : device_name); if (vm.count("options")) { - int r = parse_options(vm["options"].as>(), &args); - if (r < 0) { - return r; - } + utils::append_options_as_args(vm["options"].as>(), + &args); } return call_nbd_cmd(vm, args, ceph_global_init_args); @@ -256,7 +197,7 @@ int execute_map(const po::variables_map &vm, args.push_back("map"); std::string img; - int r = get_image_or_snap_spec(vm, &img); + int r = utils::get_image_or_snap_spec(vm, &img); if (r < 0) { return r; } @@ -289,10 +230,8 @@ int execute_map(const po::variables_map &vm, } if (vm.count("options")) { - r = parse_options(vm["options"].as>(), &args); - if (r < 0) { - return r; - } + utils::append_options_as_args(vm["options"].as>(), + &args); } return call_nbd_cmd(vm, args, ceph_global_init_args); @@ -312,7 +251,7 @@ int execute_unmap(const po::variables_map &vm, std::string image_name; if (device_name.empty()) { - int r = get_image_or_snap_spec(vm, &image_name); + int r = utils::get_image_or_snap_spec(vm, &image_name); if (r < 0) { return r; } @@ -330,10 +269,8 @@ int execute_unmap(const po::variables_map &vm, args.push_back(device_name.empty() ? image_name : device_name); if (vm.count("options")) { - int r = parse_options(vm["options"].as>(), &args); - if (r < 0) { - return r; - } + utils::append_options_as_args(vm["options"].as>(), + &args); } return call_nbd_cmd(vm, args, ceph_global_init_args); diff --git a/src/tools/rbd/action/Wnbd.cc b/src/tools/rbd/action/Wnbd.cc index ae40fe538e3c..180676d2acef 100644 --- a/src/tools/rbd/action/Wnbd.cc +++ b/src/tools/rbd/action/Wnbd.cc @@ -63,50 +63,6 @@ static int call_wnbd_cmd(const po::variables_map &vm, return 0; } - -int get_image_or_snap_spec(const po::variables_map &vm, std::string *spec) { - size_t arg_index = 0; - std::string pool_name; - std::string nspace_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, &nspace_name, - &image_name, &snap_name, true, utils::SNAPSHOT_PRESENCE_PERMITTED, - utils::SPEC_VALIDATION_NONE); - if (r < 0) { - return r; - } - - if (!pool_name.empty()) { - spec->append(pool_name); - spec->append("/"); - } - if (!nspace_name.empty()) { - spec->append(nspace_name); - spec->append("/"); - } - spec->append(image_name); - if (!snap_name.empty()) { - spec->append("@"); - spec->append(snap_name); - } - - return 0; -} - -int parse_options(const std::vector &options, - std::vector *args) { - for (auto &opts : options) { - std::vector args_; - boost::split(args_, opts, boost::is_any_of(",")); - for (auto &o : args_) { - args->push_back("--" + o); - } - } - - return 0; -} #endif int execute_list(const po::variables_map &vm, @@ -141,7 +97,7 @@ int execute_map(const po::variables_map &vm, args.push_back("map"); std::string img; - int r = get_image_or_snap_spec(vm, &img); + int r = utils::get_image_or_snap_spec(vm, &img); if (r < 0) { return r; } @@ -156,10 +112,8 @@ int execute_map(const po::variables_map &vm, } if (vm.count("options")) { - r = parse_options(vm["options"].as>(), &args); - if (r < 0) { - return r; - } + utils::append_options_as_args(vm["options"].as>(), + &args); } return call_wnbd_cmd(vm, args, ceph_global_init_args); @@ -176,7 +130,7 @@ int execute_unmap(const po::variables_map &vm, std::string image_name; if (device_name.empty()) { - int r = get_image_or_snap_spec(vm, &image_name); + int r = utils::get_image_or_snap_spec(vm, &image_name); if (r < 0) { return r; } @@ -194,10 +148,8 @@ int execute_unmap(const po::variables_map &vm, args.push_back(device_name.empty() ? image_name : device_name); if (vm.count("options")) { - int r = parse_options(vm["options"].as>(), &args); - if (r < 0) { - return r; - } + utils::append_options_as_args(vm["options"].as>(), + &args); } return call_wnbd_cmd(vm, args, ceph_global_init_args);