initial code repo
[stor4nfv.git] / src / ceph / src / cls / sdk / cls_sdk.cc
diff --git a/src/ceph/src/cls/sdk/cls_sdk.cc b/src/ceph/src/cls/sdk/cls_sdk.cc
new file mode 100644 (file)
index 0000000..1f907b4
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * This is an example RADOS object class built using only the Ceph SDK interface.
+ */
+#include "include/rados/objclass.h"
+
+CLS_VER(1,0)
+CLS_NAME(sdk)
+
+cls_handle_t h_class;
+cls_method_handle_t h_test_coverage_write;
+cls_method_handle_t h_test_coverage_replay;
+
+/**
+ * test_coverage_write - a "write" method that creates an object
+ *
+ * This method modifies the object by making multiple write calls (write,
+ * setxattr and set_val).
+ */
+static int test_coverage_write(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
+{
+  // create the object
+  int ret = cls_cxx_create(hctx, false);
+  if (ret < 0) {
+    CLS_LOG(0, "ERROR: %s(): cls_cxx_create returned %d", __func__, ret);        
+    return ret;
+  }
+
+  uint64_t size;
+  // get the size of the object
+  ret = cls_cxx_stat(hctx, &size, NULL);
+  if (ret < 0)
+    return ret;
+  
+  std::string c = "test";
+  bufferlist bl;
+  bl.append(c);
+
+  // write to the object
+  ret = cls_cxx_write(hctx, 0, bl.length(), &bl);
+  if (ret < 0)
+    return ret;
+  
+  uint64_t new_size;
+  // get the new size of the object
+  ret = cls_cxx_stat(hctx, &new_size, NULL);
+  if (ret < 0)
+    return ret;
+
+  // make some change to the xattr
+  ret = cls_cxx_setxattr(hctx, "foo", &bl);
+  if (ret < 0)
+    return ret;
+
+  // make some change to the omap
+  ret = cls_cxx_map_set_val(hctx, "foo", &bl);
+  if (ret < 0)
+    return ret;
+
+  return 0;
+}
+
+/**
+ * test_coverage_replay - a "read" method to retrieve previously written data
+ *
+ * This method reads the object by making multiple read calls (read, getxattr 
+ * and get_val). It also removes the object after reading.
+ */
+
+static int test_coverage_replay(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
+{
+  CLS_LOG(0, "reading already written object");
+  uint64_t size;
+  // get the size of the object
+  int ret = cls_cxx_stat(hctx, &size, NULL);
+  if (ret < 0)
+    return ret;
+  
+  bufferlist bl;
+  // read the object entry
+  ret = cls_cxx_read(hctx, 0, size, &bl);
+  if (ret < 0)
+    return ret;
+
+  // if the size is incorrect 
+  if (bl.length() != size)
+    return -EIO;
+  
+  bl.clear();
+
+  // read xattr entry
+  ret = cls_cxx_getxattr(hctx, "foo", &bl);
+  if (ret < 0)
+    return ret;
+
+  // if the size is incorrect
+  if (bl.length() != size)
+    return -EIO;
+  
+  bl.clear();
+
+  // read omap entry
+  ret = cls_cxx_map_get_val(hctx, "foo", &bl);
+  if (ret < 0)
+    return ret;
+
+  // if the size is incorrect
+  if (bl.length() != size)
+    return -EIO;
+
+  // remove the object
+  ret = cls_cxx_remove(hctx);
+  if (ret < 0)
+    return ret;
+  
+  return 0;
+}
+
+void __cls_init()
+{
+  CLS_LOG(0, "loading cls_sdk");
+
+  cls_register("sdk", &h_class);
+
+  cls_register_cxx_method(h_class, "test_coverage_write",
+      CLS_METHOD_RD|CLS_METHOD_WR,
+      test_coverage_write, &h_test_coverage_write);
+  
+  cls_register_cxx_method(h_class, "test_coverage_replay",
+      CLS_METHOD_RD|CLS_METHOD_WR,
+      test_coverage_replay, &h_test_coverage_replay);
+}