#include <netinet/in.h>
#include <linux/types.h>
#include <string.h>
+#include "librados.h"
#define LIBRBD_VER_MAJOR 0
#define LIBRBD_VER_MINOR 1
typedef void *rbd_snap_t;
typedef void *rbd_pool_t;
+typedef void *rbd_image_t;
typedef struct {
uint64_t id;
int rbd_close_pool(rbd_pool_t pool);
/* images */
-int rbd_create(rbd_pool_t pool, const char *name, size_t size);
-int rbd_remove(rbd_pool_t pool, const char *name);
-int rbd_resize(rbd_pool_t pool, const char *name, size_t size);
-int rbd_stat(rbd_pool_t pool, const char *name, rbd_image_info_t *info);
size_t rbd_list(rbd_pool_t pool, char **names, size_t max_names);
+int rbd_create(rbd_pool_t pool, const char *name, size_t size, int *order);
+int rbd_remove(rbd_pool_t pool, const char *name);
+int rbd_copy(rbd_pool_t src_pool, const char *srcname, rbd_pool_t dest_pool, const char *destname);
+int rbd_rename(rbd_pool_t src_pool, const char *srcname, const char *destname);
+
+int rbd_open_image(rbd_pool_t pool, const char *name, rbd_image_t *image);
+int rbd_close_image(rbd_image_t image);
+int rbd_resize(rbd_image_t image, size_t size);
+int rbd_stat(rbd_image_t image, rbd_image_info_t *info);
/* snapshots */
-int rbd_create_snap(rbd_pool_t pool, const char *image,
- const char *snapname);
-int rbd_remove_snap(rbd_pool_t pool, const char *image,
- const char *snapname);
-int rbd_rollback_snap(rbd_pool_t pool, const char *image,
- const char *snapname);
-size_t rbd_list_snaps(rbd_pool_t pool, const char *image,
- rbd_snap_info_t *snaps, size_t max_snaps);
+size_t rbd_list_snaps(rbd_image_t image, rbd_snap_info_t *snaps, size_t max_snaps);
+int rbd_create_snap(rbd_image_t image, const char *snapname);
+int rbd_remove_snap(rbd_image_t image, const char *snapname);
+int rbd_rollback_snap(rbd_image_t image, const char *snapname);
+int set_snap(rbd_image_t image, const char *snapname);
+
+/* lower level access */
+void get_rados_pools(rbd_pool_t pool, rados_pool_t *md_pool, rados_pool_t *data_pool);
#ifdef __cplusplus
}
*extra = LIBRBD_VER_EXTRA;
}
-#if 0 /* waiting until C++ interface stabilizes */
static librbd::RBD rbd;
extern "C" int rbd_initialize(int argc, const char **argv)
rbd.shutdown();
}
+/* pools */
extern "C" int rbd_open_pool(const char *pool_name, rbd_pool_t *pool)
{
librbd::pool_t cpp_pool;
extern "C" int rbd_close_pool(rbd_pool_t pool)
{
- return rbd.close_pool((librbd::pool_t) pool);
+ return rbd.close_pool(pool);
}
/* images */
-extern "C" int rbd_create(rbd_pool_t pool, const char *name, size_t size)
+extern "C" size_t rbd_list(rbd_pool_t pool, char **names, size_t max_names)
{
- return rbd.create(pool, name, size);
+ std::vector<string> cpp_names;
+ int r = rbd.list(pool, cpp_names);
+ if (r == -ENOENT)
+ return 0;
+ if (r < 0)
+ return r;
+ if (max_names < cpp_names.size())
+ return -ERANGE;
+
+ for (size_t i = 0; i < cpp_names.size(); i++) {
+ names[i] = strdup(cpp_names[i].c_str());
+ if (!names[i])
+ return -ENOMEM;
+ }
+ return cpp_names.size();
+}
+
+extern "C" int rbd_create(rbd_pool_t pool, const char *name, size_t size, int *order)
+{
+ return rbd.create(pool, name, size, order);
}
extern "C" int rbd_remove(rbd_pool_t pool, const char *name)
return rbd.remove(pool, name);
}
-extern "C" int rbd_resize(rbd_pool_t pool, const char *name, size_t size)
+extern "C" int rbd_open_image(rbd_pool_t pool, const char *name, rbd_image_t *image)
+{
+ librbd::image_t cpp_image;
+ int r = rbd.open_image(pool, name, &cpp_image);
+ if (r < 0)
+ return r;
+
+ *image = (rbd_image_t) cpp_image;
+ return 0;
+}
+
+extern "C" int rbd_close_image(rbd_image_t image)
+{
+ return rbd.close_image(image);
+}
+
+extern "C" int rbd_resize(rbd_image_t image, size_t size)
{
- return rbd.resize(pool, name, size);
+ return rbd.resize(image, size);
}
-extern "C" int rbd_stat(rbd_pool_t pool, const char *name, rbd_image_info_t *info)
+extern "C" int rbd_stat(rbd_image_t image, rbd_image_info_t *info)
{
librbd::image_info_t cpp_info;
- int r = rbd.stat(pool, name, cpp_info);
+ int r = rbd.stat(image, cpp_info);
if (r < 0)
return r;
return 0;
}
-extern "C" size_t rbd_list(rbd_pool_t pool, char **names, size_t max_names)
-{
- std::vector<string> cpp_names;
- librbd::pool_t cpp_pool = (librbd::pool_t) pool;
- int r = rbd.list(cpp_pool, cpp_names);
- if (r == -ENOENT)
- return 0;
- if (r < 0)
- return r;
- if (max_names < cpp_names.size())
- return -ERANGE;
-
- for (size_t i = 0; i < cpp_names.size(); i++) {
- names[i] = strdup(cpp_names[i].c_str());
- if (!names[i])
- return -ENOMEM;
- }
- return cpp_names.size();
-}
-
/* snapshots */
-extern "C" int rbd_create_snap(rbd_pool_t pool, const char *image, const char *snap_name)
+extern "C" int rbd_create_snap(rbd_image_t image, const char *snap_name)
{
- return rbd.create_snap(pool, image, snap_name);
+ return rbd.create_snap(image, snap_name);
}
-extern "C" int rbd_remove_snap(rbd_pool_t pool, const char *image, const char *snap_name)
+extern "C" int rbd_remove_snap(rbd_image_t image, const char *snap_name)
{
- return rbd.remove_snap(pool, image, snap_name);
+ return rbd.remove_snap(image, snap_name);
}
-extern "C" int rbd_rollback_snap(rbd_pool_t pool, const char *image, const char *snap_name)
+extern "C" int rbd_rollback_snap(rbd_image_t image, const char *snap_name)
{
- return rbd.rollback_snap(pool, image, snap_name);
+ return rbd.rollback_snap(image, snap_name);
}
-extern "C" size_t rbd_list_snaps(rbd_pool_t pool, const char *image, rbd_snap_info_t *snaps, size_t max_snaps)
+extern "C" size_t rbd_list_snaps(rbd_image_t image, rbd_snap_info_t *snaps, size_t max_snaps)
{
std::vector<librbd::snap_info_t> cpp_snaps;
- int r = rbd.list_snaps(pool, image, cpp_snaps);
+ int r = rbd.list_snaps(image, cpp_snaps);
if (r == -ENOENT)
return 0;
if (r < 0)
}
return cpp_snaps.size();
}
-#endif
void test_create_and_stat(rbd_pool_t pool, const char *name, size_t size)
{
rbd_image_info_t info;
- assert(rbd_create(pool, name, size) == 0);
- assert(rbd_stat(pool, name, &info) == 0);
+ rbd_image_t image;
+ int order;
+ assert(rbd_create(pool, name, size, &order) == 0);
+ assert(rbd_open_image(pool, name, &image) == 0);
+ assert(rbd_stat(image, &info) == 0);
printf("image has size %llu and order %d\n", (unsigned long long) info.size, info.order);
assert(info.size == size);
+ assert(info.order == order);
+ assert(rbd_close_image(image) == 0);
}
-void test_resize_and_stat(rbd_pool_t pool, const char *name, size_t size)
+void test_resize_and_stat(rbd_image_t image, size_t size)
{
rbd_image_info_t info;
- assert(rbd_resize(pool, name, size) == 0);
- assert(rbd_stat(pool, name, &info) == 0);
+ assert(rbd_resize(image, size) == 0);
+ assert(rbd_stat(image, &info) == 0);
printf("image has size %llu and order %d\n", (unsigned long long) info.size, info.order);
assert(info.size == size);
}
assert(rbd_remove(pool, name) == 0);
}
-void test_create_snap(rbd_pool_t pool, const char *image, const char *name)
+void test_create_snap(rbd_image_t image, const char *name)
{
- assert(rbd_create_snap(pool, image, name) == 0);
+ assert(rbd_create_snap(image, name) == 0);
}
-void test_ls_snaps(rbd_pool_t pool, char *image, int num_expected, ...)
+void test_ls_snaps(rbd_image_t image, int num_expected, ...)
{
rbd_snap_info_t *snaps;
int num_snaps, i, j, expected_size;
char *expected;
va_list ap;
snaps = (rbd_snap_info_t *) malloc(sizeof(rbd_snap_info_t *) * 10);
- num_snaps = rbd_list_snaps(pool, image, snaps, 10);
+ num_snaps = rbd_list_snaps(image, snaps, 10);
printf("num snaps is: %d\nexpected: %d\n", num_snaps, num_expected);
assert(num_snaps == num_expected);
free(snaps);
}
-void test_delete_snap(rbd_pool_t pool, const char *image, const char *name)
+void test_delete_snap(rbd_image_t image, const char *name)
{
- assert(rbd_remove_snap(pool, image, name) == 0);
+ assert(rbd_remove_snap(image, name) == 0);
}
int main(int argc, const char **argv)
{
rbd_pool_t pool;
+ rbd_image_t image;
assert(rbd_initialize(0, NULL) == 0);
assert(rbd_open_pool(TEST_POOL, &pool) == 0);
test_ls(pool, 0);
test_create_and_stat(pool, TEST_IMAGE, MB_BYTES(1));
+ assert(rbd_open_image(pool, TEST_IMAGE, &image) == 0);
test_ls(pool, 1, TEST_IMAGE);
- test_ls_snaps(pool, TEST_IMAGE, 0);
- test_create_snap(pool, TEST_IMAGE, TEST_SNAP);
- test_ls_snaps(pool, TEST_IMAGE, 1, TEST_SNAP, MB_BYTES(1));
- test_resize_and_stat(pool, TEST_IMAGE, MB_BYTES(2));
- test_create_snap(pool, TEST_IMAGE, TEST_SNAP "1");
- test_ls_snaps(pool, TEST_IMAGE, 2, TEST_SNAP, MB_BYTES(1), TEST_SNAP "1", MB_BYTES(2));
- test_delete_snap(pool, TEST_IMAGE, TEST_SNAP);
- test_ls_snaps(pool, TEST_IMAGE, 1, TEST_SNAP "1", MB_BYTES(2));
- test_delete_snap(pool, TEST_IMAGE, TEST_SNAP "1");
- test_ls_snaps(pool, TEST_IMAGE, 0);
+ test_ls_snaps(image, 0);
+ test_create_snap(image, TEST_SNAP);
+ test_ls_snaps(image, 1, TEST_SNAP, MB_BYTES(1));
+ test_resize_and_stat(image, MB_BYTES(2));
+ test_create_snap(image, TEST_SNAP "1");
+ test_ls_snaps(image, 2, TEST_SNAP, MB_BYTES(1), TEST_SNAP "1", MB_BYTES(2));
+ test_delete_snap(image, TEST_SNAP);
+ test_ls_snaps(image, 1, TEST_SNAP "1", MB_BYTES(2));
+ test_delete_snap(image, TEST_SNAP "1");
+ test_ls_snaps(image, 0);
+ assert(rbd_close_image(image) == 0);
test_create_and_stat(pool, TEST_IMAGE "1", MB_BYTES(2));
test_ls(pool, 2, TEST_IMAGE, TEST_IMAGE "1");
test_delete(pool, TEST_IMAGE);