]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-ggate: support namespaces 25266/head
authorMykola Golub <to.my.trociny@gmail.com>
Mon, 26 Nov 2018 19:43:52 +0000 (19:43 +0000)
committerMykola Golub <to.my.trociny@gmail.com>
Mon, 26 Nov 2018 19:47:34 +0000 (19:47 +0000)
Fixes: http://tracker.ceph.com/issues/24608
Signed-off-by: Mykola Golub <mgolub@suse.com>
qa/workunits/rbd/rbd-ggate.sh
src/tools/rbd/action/Ggate.cc
src/tools/rbd_ggate/main.cc

index 8e5ce3aaaf0303f4e2dcff1931221e2afa1be50a..5c17590610fdf692225fc49111a5a7e6b468663f 100755 (executable)
@@ -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
index 611ffc7db8167ec14960b743479b718894ea1111..61f77be2db3e13cb18ccc0da8929c8602d072f01 100644 (file)
@@ -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("@");
index c8ae885835707cf4d85b0210816bd83d8cb312c1..67fe81942b4fd81a875a2c223d9d8b8eaaffca7c 100644 (file)
@@ -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());