CEPH_RBD_API int rbd_group_create(rados_ioctx_t p, const char *name);
CEPH_RBD_API int rbd_group_remove(rados_ioctx_t p, const char *name);
CEPH_RBD_API int rbd_group_list(rados_ioctx_t p, char *names, size_t *size);
+CEPH_RBD_API int rbd_group_get_id(rados_ioctx_t p, const char *group_name,
+ char *group_id, size_t *size);
CEPH_RBD_API int rbd_group_rename(rados_ioctx_t p, const char *src_name,
const char *dest_name);
CEPH_RBD_API int rbd_group_info_cleanup(rbd_group_info_t *group_info,
int group_create(IoCtx& io_ctx, const char *group_name);
int group_remove(IoCtx& io_ctx, const char *group_name);
int group_list(IoCtx& io_ctx, std::vector<std::string> *names);
+ int group_get_id(IoCtx& io_ctx, const char *group_name,
+ std::string *group_id);
int group_rename(IoCtx& io_ctx, const char *src_group_name,
const char *dest_group_name);
return 0;
}
+template <typename I>
+int Group<I>::get_id(IoCtx& io_ctx, const char *group_name,
+ std::string *group_id)
+{
+ CephContext *cct = (CephContext *)io_ctx.cct();
+ ldout(cct, 20) << "io_ctx=" << &io_ctx << dendl;
+
+ int r = cls_client::dir_get_id(&io_ctx, RBD_GROUP_DIRECTORY, group_name,
+ group_id);
+ if (r < 0) {
+ lderr(cct) << "error reading group id object: "
+ << cpp_strerror(r) << dendl;
+ return r;
+ }
+
+ return 0;
+}
+
template <typename I>
int Group<I>::image_add(librados::IoCtx& group_ioctx, const char *group_name,
librados::IoCtx& image_ioctx, const char *image_name)
static int create(librados::IoCtx& io_ctx, const char *group_name);
static int remove(librados::IoCtx& io_ctx, const char *group_name);
static int list(librados::IoCtx& io_ctx, std::vector<std::string> *names);
+ static int get_id(librados::IoCtx& io_ctx, const char *group_name,
+ std::string *group_id);
static int rename(librados::IoCtx& io_ctx, const char *src_group_name,
const char *dest_group_name);
return r;
}
+ int RBD::group_get_id(IoCtx& io_ctx, const char *group_name, std::string *group_id)
+ {
+ return librbd::api::Group<>::get_id(io_ctx, group_name, group_id);
+ }
+
int RBD::group_rename(IoCtx& io_ctx, const char *src_name,
const char *dest_name)
{
return r;
}
+extern "C" int rbd_group_get_id(rados_ioctx_t p,
+ const char *group_name,
+ char *group_id,
+ size_t *size)
+{
+ librados::IoCtx io_ctx;
+ librados::IoCtx::from_rados_ioctx_t(p, io_ctx);
+
+ std::string cpp_id;
+ int r = librbd::api::Group<>::get_id(io_ctx, group_name, &cpp_id);
+ if (r < 0) {
+ return r;
+ }
+
+ auto total_len = cpp_id.size() + 1;
+ if (*size < total_len) {
+ *size = total_len;
+ return -ERANGE;
+ }
+ *size = total_len;
+
+ strcpy(group_id, cpp_id.c_str());
+ return 0;
+}
+
extern "C" int rbd_group_image_add(rados_ioctx_t group_p,
const char *group_name,
rados_ioctx_t image_p,
int rbd_group_create(rados_ioctx_t p, const char *name)
int rbd_group_remove(rados_ioctx_t p, const char *name)
int rbd_group_list(rados_ioctx_t p, char *names, size_t *size)
+ int rbd_group_get_id(rados_ioctx_t p, const char *group_name,
+ char *group_id, size_t *size)
int rbd_group_rename(rados_ioctx_t p, const char *src, const char *dest)
void rbd_group_info_cleanup(rbd_group_info_t *group_info,
size_t group_info_size)
pass
int rbd_group_list(rados_ioctx_t p, char *names, size_t *size):
pass
+ int rbd_group_get_id(rados_ioctx_t p, const char *group_name,
+ char *group_id, size_t *size):
+ pass
int rbd_group_rename(rados_ioctx_t p, const char *src, const char *dest):
pass
void rbd_group_info_cleanup(rbd_group_info_t *group_info,
def __exit__(self, type_, value, traceback):
return False
+
+ def id(self):
+ """
+ Get group's id.
+
+ :returns: str - group id
+ """
+ cdef:
+ size_t size = 32
+ char *id = NULL
+ try:
+ while True:
+ id = <char *>realloc_chk(id, size)
+ with nogil:
+ ret = rbd_group_get_id(self._ioctx, self._name, id, &size)
+ if ret >= 0:
+ break
+ elif ret != -errno.ERANGE:
+ raise make_ex(ret, 'error getting id for group %s' % self._name,
+ group_errno_to_exception)
+ return decode_cstr(id)
+ finally:
+ free(id)
def add_image(self, image_ioctx, image_name):
"""
group image add Add an image to a group.
group image list (... ls) List images in a group.
group image remove (... rm) Remove an image from a group.
+ group info Show information about a group.
group list (group ls) List rbd groups.
group remove (group rm) Delete a group.
group rename Rename a group within pool.
-p [ --pool ] arg pool name unless overridden
--image-id arg image id
+ rbd help group info
+ usage: rbd group info [--pool <pool>] [--namespace <namespace>]
+ [--group <group>] [--format <format>] [--pretty-format]
+ <group-spec>
+
+ Show information about a group.
+
+ Positional arguments
+ <group-spec> group specification
+ (example: [<pool-name>/[<namespace>/]]<group-name>)
+
+ Optional arguments
+ -p [ --pool ] arg pool name
+ --namespace arg namespace name
+ --group arg group name
+ --format arg output format (plain, json, or xml) [default: plain]
+ --pretty-format pretty formatting (json and xml)
+
rbd help group list
usage: rbd group list [--pool <pool>] [--namespace <namespace>]
[--format <format>] [--pretty-format]
ASSERT_EQ(0U, groups.size());
}
+TEST_F(TestGroup, group_get_id)
+{
+ rados_ioctx_t ioctx;
+ rados_ioctx_create(_cluster, _pool_name.c_str(), &ioctx);
+ BOOST_SCOPE_EXIT(ioctx) {
+ rados_ioctx_destroy(ioctx);
+ } BOOST_SCOPE_EXIT_END;
+
+ ASSERT_EQ(0, rbd_group_create(ioctx, "group_get_id"));
+
+ size_t size = 0;
+ ASSERT_EQ(-ERANGE, rbd_group_get_id(ioctx, "group_get_id", NULL, &size));
+ ASSERT_GT(size, 0);
+
+ char group_id[32];
+ ASSERT_EQ(0, rbd_group_get_id(ioctx, "group_get_id", group_id, &size));
+ ASSERT_EQ(strlen(group_id) + 1, size);
+
+ ASSERT_EQ(0, rbd_group_remove(ioctx, "group_get_id"));
+}
+
+TEST_F(TestGroup, group_get_idPP)
+{
+ librados::IoCtx ioctx;
+ ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
+
+ librbd::RBD rbd;
+ ASSERT_EQ(0, rbd.group_create(ioctx, "group_get_idPP"));
+
+ std::string group_id;
+ ASSERT_EQ(0, rbd.group_get_id(ioctx, "group_get_idPP", &group_id));
+ ASSERT_FALSE(group_id.empty());
+
+ ASSERT_EQ(0, rbd.group_remove(ioctx, "group_get_idPP"));
+}
+
TEST_F(TestGroup, add_image)
{
REQUIRE_FORMAT_V2();
eq([], list(self.group.list_images()))
RBD().trash_restore(ioctx, image_id, image_name)
+ def test_group_get_id(self):
+ id = self.group.id()
+ assert isinstance(id, str)
+ assert len(id) > 0
+
def test_group_image_many_images(self):
eq([], list(self.group.list_images()))
self.group.add_image(ioctx, image_name)
return 0;
}
+int execute_info(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 group_name;
+
+ int r = utils::get_pool_generic_snapshot_names(
+ vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, at::POOL_NAME, &pool_name,
+ &namespace_name, GROUP_NAME, "group", &group_name, nullptr, true,
+ utils::SNAPSHOT_PRESENCE_NONE, utils::SPEC_VALIDATION_FULL);
+ if (r < 0) {
+ return r;
+ }
+
+ at::Format::Formatter formatter;
+ r = utils::get_formatter(vm, &formatter);
+ if (r < 0) {
+ return r;
+ }
+ Formatter *f = formatter.get();
+
+ librados::Rados rados;
+ librados::IoCtx io_ctx;
+
+ r = utils::init(pool_name, namespace_name, &rados, &io_ctx);
+ if (r < 0) {
+ return r;
+ }
+
+ librbd::RBD rbd;
+ std::string group_id;
+ r = rbd.group_get_id(io_ctx, group_name.c_str(), &group_id);
+ if (r < 0) {
+ return r;
+ }
+
+ if (f) {
+ f->open_object_section("group");
+ f->dump_string("group_name", group_name);
+ f->dump_string("group_id", group_id);
+ f->close_section();
+ f->flush(std::cout);
+ } else {
+ std::cout << "rbd group '" << group_name << "':\n"
+ << "\t" << "id: " << group_id << std::endl;
+ }
+
+ return 0;
+}
+
int execute_add(const po::variables_map &vm,
const std::vector<std::string> &ceph_global_init_args) {
size_t arg_index = 0;
false);
}
+void get_info_arguments(po::options_description *positional,
+ po::options_description *options) {
+ add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE,
+ false);
+ at::add_format_options(options);
+}
+
void get_add_arguments(po::options_description *positional,
po::options_description *options) {
positional->add_options()
Shell::Action action_rename(
{"group", "rename"}, {}, "Rename a group within pool.",
"", &get_rename_arguments, &execute_rename);
+Shell::Action action_info(
+ {"group", "info"}, {}, "Show information about a group.",
+ "", &get_info_arguments, &execute_info);
Shell::Action action_add(
{"group", "image", "add"}, {}, "Add an image to a group.",
"", &get_add_arguments, &execute_add);