<< " snap create <--snap=name> [image-name] create a snapshot\n"
<< " snap rollback <--snap=name> [image-name] rollback image head to snapshot\n"
<< " snap rm <--snap=name> [image-name] deletes a snapshot\n"
+ << " watch [image-name] watch events on image\n"
<< "\n"
<< "Other input options:\n"
<< " -p, --pool <pool> source pool name\n"
return r;
}
+class RbdWatchCtx : public Rados::WatchCtx {
+ string name;
+public:
+ RbdWatchCtx(const char *imgname) : name(imgname) {}
+ virtual ~RbdWatchCtx() {}
+ virtual void notify(uint8_t opcode, uint64_t ver) {
+ cout << name << " got notification opcode=" << (int)opcode << " ver=" << ver << std::endl;
+ }
+};
+
+static int do_watch(pools_t& pp, const char *imgname)
+{
+ string md_oid, dest_md_oid;
+ uint64_t cookie;
+ RbdWatchCtx ctx(imgname);
+
+ md_oid = imgname;
+ md_oid += RBD_SUFFIX;
+
+ int r = rados.watch(pp.md, md_oid, 0, &cookie, &ctx);
+ if (r < 0) {
+ cerr << "watch failed" << std::endl;
+ return r;
+ }
+
+ cout << "press enter to exit..." << std::endl;
+ getchar();
+ return 0;
+}
+
static void err_exit(pools_t& pp)
{
if (pp.data)
OPT_SNAP_ROLLBACK,
OPT_SNAP_REMOVE,
OPT_SNAP_LIST,
+ OPT_WATCH,
};
static int get_cmd(const char *cmd, bool *snapcmd)
if (strcmp(cmd, "rename") == 0 ||
strcmp(cmd, "mv") == 0)
return OPT_RENAME;
+ if (strcmp(cmd, "watch") == 0)
+ return OPT_WATCH;
} else {
if (strcmp(cmd, "create") == 0||
strcmp(cmd, "add") == 0)
case OPT_SNAP_ROLLBACK:
case OPT_SNAP_REMOVE:
case OPT_SNAP_LIST:
+ case OPT_WATCH:
set_conf_param(CONF_VAL, &imgname, NULL);
break;
case OPT_EXPORT:
pp.dest = dest_pool;
}
- if (opt_cmd == OPT_LIST) {
+ switch (opt_cmd) {
+ case OPT_LIST:
r = do_list(pp, poolname);
if (r < 0) {
switch (r) {
}
err_exit(pp);
}
- } else if (opt_cmd == OPT_CREATE) {
+ break;
+
+ case OPT_CREATE:
if (!size) {
cerr << "must specify size in MB to create an rbd image" << std::endl;
usage();
cerr << "create error: " << strerror(-r) << std::endl;
err_exit(pp);
}
- } else if (opt_cmd == OPT_RENAME) {
+ break;
+
+ case OPT_RENAME:
r = do_rename(pp, md_oid, imgname, destname);
if (r < 0) {
cerr << "rename error: " << strerror(-r) << std::endl;
err_exit(pp);
}
- } else if (opt_cmd == OPT_INFO) {
+ break;
+
+ case OPT_INFO:
r = do_show_info(pp, md_oid, imgname);
if (r < 0) {
cerr << "error: " << strerror(-r) << std::endl;
err_exit(pp);
}
- } else if (opt_cmd == OPT_RM) {
+ break;
+
+ case OPT_RM:
r = do_delete(pp, md_oid, imgname);
if (r < 0) {
cerr << "delete error: " << strerror(-r) << std::endl;
err_exit(pp);
}
- } else if (opt_cmd == OPT_RESIZE) {
+ break;
+
+ case OPT_RESIZE:
r = do_resize(pp, md_oid, imgname, size);
if (r < 0) {
cerr << "resize error: " << strerror(-r) << std::endl;
err_exit(pp);
}
- } else if (opt_cmd == OPT_SNAP_LIST) {
+ break;
+
+ case OPT_SNAP_LIST:
if (!imgname) {
usage();
err_exit(pp);
cerr << "failed to list snapshots: " << strerror(-r) << std::endl;
err_exit(pp);
}
- } else if (opt_cmd == OPT_SNAP_CREATE) {
+ break;
+
+ case OPT_SNAP_CREATE:
if (!imgname || !snapname) {
usage();
err_exit(pp);
cerr << "failed to create snapshot: " << strerror(-r) << std::endl;
err_exit(pp);
}
- } else if (opt_cmd == OPT_SNAP_ROLLBACK) {
+ break;
+
+ case OPT_SNAP_ROLLBACK:
if (!imgname) {
usage();
err_exit(pp);
usage();
err_exit(pp);
}
- } else if (opt_cmd == OPT_SNAP_REMOVE) {
+ break;
+
+ case OPT_SNAP_REMOVE:
if (!imgname) {
usage();
err_exit(pp);
usage();
err_exit(pp);
}
- } else if (opt_cmd == OPT_EXPORT) {
+ break;
+
+ case OPT_EXPORT:
if (!path) {
cerr << "pathname should be specified" << std::endl;
err_exit(pp);
cerr << "export error: " << strerror(-r) << std::endl;
err_exit(pp);
}
- } else if (opt_cmd == OPT_IMPORT) {
+ break;
+
+ case OPT_IMPORT:
if (!path) {
cerr << "pathname should be specified" << std::endl;
err_exit(pp);
cerr << "import failed: " << strerror(-r) << std::endl;
err_exit(pp);
}
- } else if (opt_cmd == OPT_COPY) {
+ break;
+
+ case OPT_COPY:
r = do_copy(pp, imgname, destname);
if (r < 0) {
cerr << "copy failed: " << strerror(-r) << std::endl;
err_exit(pp);
}
+ break;
+
+ case OPT_WATCH:
+ r = do_watch(pp, imgname);
+ if (r < 0) {
+ cerr << "watch failed: " << strerror(-r) << std::endl;
+ err_exit(pp);
+ }
+ break;
}
rados.close_pool(pool);