From: Mykola Golub Date: Mon, 26 Nov 2018 19:43:52 +0000 (+0000) Subject: rbd-ggate: support namespaces X-Git-Tag: v14.1.0~712^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d13b4197e4901e9ad35f27e8a7894f505cf80246;p=ceph.git rbd-ggate: support namespaces Fixes: http://tracker.ceph.com/issues/24608 Signed-off-by: Mykola Golub --- diff --git a/qa/workunits/rbd/rbd-ggate.sh b/qa/workunits/rbd/rbd-ggate.sh index 8e5ce3aaaf03..5c17590610fd 100755 --- a/qa/workunits/rbd/rbd-ggate.sh +++ b/qa/workunits/rbd/rbd-ggate.sh @@ -1,6 +1,7 @@ #!/bin/sh -ex POOL=testrbdggate$$ +NS=ns IMAGE=test SIZE=64 DATA= @@ -52,6 +53,8 @@ check_geom_gate() setup() { + local ns x + if [ -e CMakeCache.txt ]; then # running under cmake build dir @@ -75,17 +78,25 @@ setup() DATA=${TEMPDIR}/data dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE} ceph osd pool create ${POOL} 32 - rbd --dest-pool ${POOL} --no-progress import ${DATA} ${IMAGE} + + rbd namespace create ${POOL} ${NS} + for ns in '' ${NS}; do + rbd --dest-pool ${POOL} --dest-namespace "${ns}" --no-progress import \ + ${DATA} ${IMAGE} + done } cleanup() { + local ns s + set +e rm -Rf ${TEMPDIR} if [ -n "${DEV}" ] then _sudo rbd-ggate unmap ${DEV} fi + ceph osd pool delete ${POOL} ${POOL} --yes-i-really-really-mean-it } @@ -220,4 +231,12 @@ _sudo rbd-ggate unmap "${POOL}/${IMAGE}@snap" rbd-ggate list | expect_false grep " ${DEV} *$" DEV= +echo map/unmap namespace test +rbd snap create ${POOL}/${NS}/${IMAGE}@snap +DEV=`_sudo rbd-ggate map ${POOL}/${NS}/${IMAGE}@snap` +rbd-ggate list | grep " ${DEV} *$" +_sudo rbd-ggate unmap "${POOL}/${NS}/${IMAGE}@snap" +rbd-ggate list | expect_false grep "${DEV} $" +DEV= + echo OK diff --git a/src/tools/rbd/action/Ggate.cc b/src/tools/rbd/action/Ggate.cc index 611ffc7db816..61f77be2db3e 100644 --- a/src/tools/rbd/action/Ggate.cc +++ b/src/tools/rbd/action/Ggate.cc @@ -54,10 +54,11 @@ static int call_ggate_cmd(const po::variables_map &vm, 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, nullptr, + 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) { @@ -66,6 +67,10 @@ int get_image_or_snap_spec(const po::variables_map &vm, std::string *spec) { 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("@"); diff --git a/src/tools/rbd_ggate/main.cc b/src/tools/rbd_ggate/main.cc index c8ae88583570..67fe81942b4f 100644 --- a/src/tools/rbd_ggate/main.cc +++ b/src/tools/rbd_ggate/main.cc @@ -57,7 +57,7 @@ static void usage() { generic_server_usage(); } -static std::string devpath, poolname, imgname, snapname; +static std::string devpath, poolname, nsname, imgname, snapname; static bool readonly = false; static bool exclusive = false; @@ -143,6 +143,8 @@ static int do_map(int argc, const char *argv[]) goto done; } + io_ctx.set_namespace(nsname); + r = rbd.open(io_ctx, image, imgname.c_str()); if (r < 0) { std::cerr << "rbd-ggate: failed to open image " << imgname << ": " @@ -159,7 +161,8 @@ static int do_map(int argc, const char *argv[]) } } - desc = "RBD " + poolname + "/" + imgname; + desc = "RBD " + poolname + "/" + (nsname.empty() ? "" : nsname + "/") + + imgname; if (!snapname.empty()) { r = image.snap_set(snapname.c_str()); @@ -251,8 +254,9 @@ static int do_unmap() } static int parse_imgpath(const std::string &imgpath, std::string *poolname, - std::string *imgname, std::string *snapname) { - std::regex pattern("^(?:([^/@]+)/)?([^/@]+)(?:@([^/@]+))?$"); + std::string *nsname, std::string *imgname, + std::string *snapname) { + std::regex pattern("^(?:([^/]+)/(?:([^/@]+)/)?)?([^@]+)(?:@([^/@]+))?$"); std::smatch match; if (!std::regex_match(imgpath, match, pattern)) { std::cerr << "rbd-ggate: invalid spec '" << imgpath << "'" << std::endl; @@ -263,10 +267,14 @@ static int parse_imgpath(const std::string &imgpath, std::string *poolname, *poolname = match[1]; } - *imgname = match[2]; + if (match[2].matched) { + *nsname = match[2]; + } + + *imgname = match[3]; - if (match[3].matched) { - *snapname = match[3]; + if (match[4].matched) { + *snapname = match[4]; } return 0; @@ -274,8 +282,8 @@ static int parse_imgpath(const std::string &imgpath, std::string *poolname, static bool find_mapped_dev_by_spec(const std::string &spec, std::string *devname) { - std::string poolname, imgname, snapname; - int r = parse_imgpath(spec, &poolname, &imgname, &snapname); + std::string poolname, nsname, imgname, snapname; + int r = parse_imgpath(spec, &poolname, &nsname, &imgname, &snapname); if (r < 0) { return false; } @@ -301,9 +309,9 @@ static bool find_mapped_dev_by_spec(const std::string &spec, continue; } - std::string p, i, s; - parse_imgpath(info.substr(4), &p, &i, &s); - if (p == poolname && i == imgname && s == snapname) { + std::string p, n, i, s; + parse_imgpath(info.substr(4), &p, &n, &i, &s); + if (p == poolname && n == nsname && i == imgname && s == snapname) { *devname = name; return true; } @@ -339,6 +347,7 @@ static int do_list(const std::string &format, bool pretty_format) } else { tbl.define_column("id", TextTable::LEFT, TextTable::LEFT); tbl.define_column("pool", TextTable::LEFT, TextTable::LEFT); + tbl.define_column("namespace", TextTable::LEFT, TextTable::LEFT); tbl.define_column("image", TextTable::LEFT, TextTable::LEFT); tbl.define_column("snap", TextTable::LEFT, TextTable::LEFT); tbl.define_column("device", TextTable::LEFT, TextTable::LEFT); @@ -355,20 +364,22 @@ static int do_list(const std::string &format, bool pretty_format) } std::string poolname; + std::string nsname; std::string imgname; std::string snapname(f ? "" : "-"); - parse_imgpath(info.substr(4), &poolname, &imgname, &snapname); + parse_imgpath(info.substr(4), &poolname, &nsname, &imgname, &snapname); if (f) { f->open_object_section("device"); f->dump_string("id", id); f->dump_string("pool", poolname); + f->dump_string("namespace", nsname); f->dump_string("image", imgname); f->dump_string("snap", snapname); f->dump_string("device", "/dev/" + name); f->close_section(); } else { - tbl << id << poolname << imgname << snapname << "/dev/" + name + tbl << id << poolname << nsname << imgname << snapname << "/dev/" + name << TextTable::endrow; } count++; @@ -455,7 +466,8 @@ int main(int argc, const char *argv[]) { cerr << "rbd-ggate: must specify image-or-snap-spec" << std::endl; return EXIT_FAILURE; } - if (parse_imgpath(*args.begin(), &poolname, &imgname, &snapname) < 0) { + if (parse_imgpath(*args.begin(), &poolname, &nsname, &imgname, + &snapname) < 0) { return EXIT_FAILURE; } args.erase(args.begin());