#!/bin/sh -ex
POOL=testrbdggate$$
+NS=ns
IMAGE=test
SIZE=64
DATA=
setup()
{
+ local ns x
+
if [ -e CMakeCache.txt ]; then
# running under cmake build dir
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
}
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
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) {
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("@");
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;
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 << ": "
}
}
- desc = "RBD " + poolname + "/" + imgname;
+ desc = "RBD " + poolname + "/" + (nsname.empty() ? "" : nsname + "/") +
+ imgname;
if (!snapname.empty()) {
r = image.snap_set(snapname.c_str());
}
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;
*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;
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;
}
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;
}
} 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);
}
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++;
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());