]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: update C interface and tests to use image contexts
authorJosh Durgin <josh.durgin@dreamhost.com>
Fri, 28 Jan 2011 23:11:41 +0000 (15:11 -0800)
committerYehuda Sadeh <yehuda.sadeh@dreamhost.com>
Mon, 7 Feb 2011 23:13:01 +0000 (15:13 -0800)
src/include/librbd.h
src/librbd.cc
src/testlibrbd.c

index 71e254357b0079a66e1213952cdff4c190616ec0..22e564e8eb62599efaccb9d2f611f05b7e4dee5a 100644 (file)
@@ -22,6 +22,7 @@ extern "C" {
 #include <netinet/in.h>
 #include <linux/types.h>
 #include <string.h>
+#include "librados.h"
 
 #define LIBRBD_VER_MAJOR 0
 #define LIBRBD_VER_MINOR 1
@@ -35,6 +36,7 @@ extern "C" {
 
 typedef void *rbd_snap_t;
 typedef void *rbd_pool_t;
+typedef void *rbd_image_t;
 
 typedef struct {
   uint64_t id;
@@ -60,21 +62,26 @@ int rbd_open_pool(const char *pool_name, rbd_pool_t *pool);
 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
 }
index f0a36e3651a81f126d6290cf0fba09b5023d1a22..2c61336e2dbb7ee1c66fff3e071eac0318e32a62 100644 (file)
@@ -1176,7 +1176,6 @@ extern "C" void librbd_version(int *major, int *minor, int *extra)
     *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)
@@ -1189,6 +1188,7 @@ extern "C" void rbd_shutdown()
   rbd.shutdown();
 }
 
+/* pools */
 extern "C" int rbd_open_pool(const char *pool_name, rbd_pool_t *pool)
 {
   librbd::pool_t cpp_pool;
@@ -1202,13 +1202,32 @@ extern "C" int rbd_open_pool(const char *pool_name, rbd_pool_t *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)
@@ -1216,15 +1235,31 @@ 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;
 
@@ -1235,46 +1270,26 @@ extern "C" int rbd_stat(rbd_pool_t pool, const char *name, rbd_image_info_t *inf
   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)
@@ -1291,4 +1306,3 @@ extern "C" size_t rbd_list_snaps(rbd_pool_t pool, const char *image, rbd_snap_in
   }
   return cpp_snaps.size();
 }
-#endif
index 53d7f851b6f7d703c265dce092e3b8484445a8a5..9949437b8143556a2f77840e9d2b5dc0869472da 100644 (file)
 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);
 }
@@ -92,19 +97,19 @@ void test_delete(rbd_pool_t pool, const char *name)
   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);
 
@@ -138,29 +143,32 @@ void test_ls_snaps(rbd_pool_t pool, char *image, int 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);