if (vm.count(at::POOL_NAME)) {
pool_name = vm[at::POOL_NAME].as<std::string>();
- } else if (pool_name.empty()) {
- pool_name = utils::get_default_pool_name();
}
if (vm.count(at::NAMESPACE_NAME)) {
if (vm.count(at::POOL_NAME)) {
pool_name = vm[at::POOL_NAME].as<std::string>();
- } else {
- pool_name = utils::get_default_pool_name();
}
namespace_name = vm[at::NAMESPACE_NAME].as<std::string>();
return 0;
}
+void normalize_level_spec_args(std::map<std::string, std::string> *args) {
+ std::map<std::string, std::string> raw_args;
+ std::swap(raw_args, *args);
+
+ auto default_pool_name = utils::get_default_pool_name();
+ for (auto [key, value] : raw_args) {
+ if (key == "level_spec" && !value.empty() && value[0] == '/') {
+ value = default_pool_name + value;
+ }
+
+ (*args)[key] = value;
+ }
+}
+
void add_schedule_options(po::options_description *positional) {
positional->add_options()
("interval", "schedule interval");
boost::program_options::options_description *options, bool allow_image=true);
int get_level_spec_args(const boost::program_options::variables_map &vm,
std::map<std::string, std::string> *args);
+void normalize_level_spec_args(std::map<std::string, std::string> *args);
+
void add_schedule_options(
boost::program_options::options_description *positional);
int get_schedule_args(const boost::program_options::variables_map &vm,
return "";
}
+void normalize_pool_name(std::string* pool_name) {
+ if (pool_name->empty()) {
+ *pool_name = get_default_pool_name();
+ }
+}
+
std::string get_default_pool_name() {
return g_ceph_context->_conf.get_val<std::string>("rbd_default_pool");
}
}
}
- if (default_empty_pool_name && pool_name->empty()) {
- *pool_name = get_default_pool_name();
- }
-
if (!g_ceph_context->_conf.get_val<bool>("rbd_validate_names")) {
validate_pool_name = false;
}
}
}
- if (pool_name != nullptr && pool_name->empty()) {
- *pool_name = get_default_pool_name();
- }
-
if (image_id != nullptr && image_id->empty()) {
std::cerr << "rbd: image id was not specified" << std::endl;
return -EINVAL;
}
}
- if (pool_name != nullptr && pool_name->empty()) {
- *pool_name = get_default_pool_name();
- }
-
if (generic_name != nullptr && generic_name_required &&
generic_name->empty()) {
std::string prefix = at::get_description_prefix(mod);
return -EINVAL;
}
- std::regex pattern("^[^@/]+?$");
+ std::regex pattern("^[^@/]*?$");
if (spec_validation == SPEC_VALIDATION_FULL) {
// validate pool name while creating/renaming/copying/cloning/importing/etc
if ((pool_name != nullptr) && !std::regex_match (*pool_name, pattern)) {
return 0;
}
-int init_io_ctx(librados::Rados &rados, const std::string &pool_name,
+int init_io_ctx(librados::Rados &rados, std::string pool_name,
const std::string& namespace_name, librados::IoCtx *io_ctx) {
+ normalize_pool_name(&pool_name);
+
int r = rados.ioctx_create(pool_name.c_str(), *io_ctx);
if (r < 0) {
if (r == -ENOENT && pool_name == get_default_pool_name()) {
std::string get_positional_argument(
const boost::program_options::variables_map &vm, size_t index);
+void normalize_pool_name(std::string* pool_name);
std::string get_default_pool_name();
+
int get_pool_and_namespace_names(
const boost::program_options::variables_map &vm,
bool default_empty_pool_name, bool validate_pool_name,
int init_rados(librados::Rados *rados);
-int init(const std::string &pool_name, const std::string& namespace_name,
+int init(const std::string& pool_name, const std::string& namespace_name,
librados::Rados *rados, librados::IoCtx *io_ctx);
-int init_io_ctx(librados::Rados &rados, const std::string &pool_name,
+int init_io_ctx(librados::Rados &rados, std::string pool_name,
const std::string& namespace_name, librados::IoCtx *io_ctx);
int set_namespace(const std::string& namespace_name, librados::IoCtx *io_ctx);
}
librados::IoCtx dest_io_ctx;
- if (!dest_pool_name.empty()) {
- r = utils::init_io_ctx(rados, dest_pool_name, dest_namespace_name,
- &dest_io_ctx);
- if (r < 0) {
- return r;
- }
+ utils::normalize_pool_name(&dest_pool_name);
+ r = utils::init_io_ctx(rados, dest_pool_name, dest_namespace_name,
+ &dest_io_ctx);
+ if (r < 0) {
+ return r;
}
r = do_prepare(io_ctx, image_name, dest_pool_name.empty() ? io_ctx :
return r;
}
+ normalize_level_spec_args(&args);
r = utils::mgr_command(rados, "rbd mirror snapshot schedule add", args,
&std::cout, &std::cerr);
if (r < 0) {
return r;
}
+ normalize_level_spec_args(&args);
r = utils::mgr_command(rados, "rbd mirror snapshot schedule remove", args,
&std::cout, &std::cerr);
if (r < 0) {
return r;
}
+ normalize_level_spec_args(&args);
std::stringstream out;
r = utils::mgr_command(rados, "rbd mirror snapshot schedule list", args, &out,
&std::cerr);
return r;
}
+ normalize_level_spec_args(&args);
std::stringstream out;
r = utils::mgr_command(rados, "rbd mirror snapshot schedule status", args,
&out, &std::cerr);
return r;
}
+ utils::normalize_pool_name(&pool);
std::string pool_spec = format_pool_spec(pool, pool_namespace);
// no point to refreshing faster than the stats period
return r;
}
+ utils::normalize_pool_name(&pool);
iotop::MainWindow mainWindow(rados, format_pool_spec(pool, pool_namespace));
r = mainWindow.run();
if (r < 0) {
return r;
}
+ normalize_level_spec_args(&args);
r = utils::mgr_command(rados, "rbd trash purge schedule add", args,
&std::cout, &std::cerr);
if (r < 0) {
return r;
}
+ normalize_level_spec_args(&args);
r = utils::mgr_command(rados, "rbd trash purge schedule remove", args,
&std::cout, &std::cerr);
if (r < 0) {
return r;
}
+ normalize_level_spec_args(&args);
std::stringstream out;
r = utils::mgr_command(rados, "rbd trash purge schedule list", args, &out,
&std::cerr);
return r;
}
+ normalize_level_spec_args(&args);
std::stringstream out;
r = utils::mgr_command(rados, "rbd trash purge schedule status", args, &out,
&std::cerr);