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$'
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
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() {
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
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}
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 \
rbd -p ${POOL} --namespace "${ns}" remove ${IMAGE}
fi
done
- rbd namespace remove ${POOL} ${NS}
+ rbd namespace remove ${POOL}/${NS}
}
function expect_false()
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
}
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,
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,
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,
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,
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;
}
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);
}
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;
}
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;
}
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>)");
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) {
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;
}
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]")
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;
}
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]");
}
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");
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++);
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");
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;
}
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;
}
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;
}
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;
}
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;
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;
}
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;
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;
}
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;
}
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");
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;
}
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;
}
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()
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;
}
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()
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();
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;
}