Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / cls / sdk / cls_sdk.cc
1 /*
2  * This is an example RADOS object class built using only the Ceph SDK interface.
3  */
4 #include "include/rados/objclass.h"
5
6 CLS_VER(1,0)
7 CLS_NAME(sdk)
8
9 cls_handle_t h_class;
10 cls_method_handle_t h_test_coverage_write;
11 cls_method_handle_t h_test_coverage_replay;
12
13 /**
14  * test_coverage_write - a "write" method that creates an object
15  *
16  * This method modifies the object by making multiple write calls (write,
17  * setxattr and set_val).
18  */
19 static int test_coverage_write(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
20 {
21   // create the object
22   int ret = cls_cxx_create(hctx, false);
23   if (ret < 0) {
24     CLS_LOG(0, "ERROR: %s(): cls_cxx_create returned %d", __func__, ret);         
25     return ret;
26   }
27
28   uint64_t size;
29   // get the size of the object
30   ret = cls_cxx_stat(hctx, &size, NULL);
31   if (ret < 0)
32     return ret;
33   
34   std::string c = "test";
35   bufferlist bl;
36   bl.append(c);
37
38   // write to the object
39   ret = cls_cxx_write(hctx, 0, bl.length(), &bl);
40   if (ret < 0)
41     return ret;
42   
43   uint64_t new_size;
44   // get the new size of the object
45   ret = cls_cxx_stat(hctx, &new_size, NULL);
46   if (ret < 0)
47     return ret;
48
49   // make some change to the xattr
50   ret = cls_cxx_setxattr(hctx, "foo", &bl);
51   if (ret < 0)
52     return ret;
53
54   // make some change to the omap
55   ret = cls_cxx_map_set_val(hctx, "foo", &bl);
56   if (ret < 0)
57     return ret;
58
59   return 0;
60 }
61
62 /**
63  * test_coverage_replay - a "read" method to retrieve previously written data
64  *
65  * This method reads the object by making multiple read calls (read, getxattr 
66  * and get_val). It also removes the object after reading.
67  */
68
69 static int test_coverage_replay(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
70 {
71   CLS_LOG(0, "reading already written object");
72   uint64_t size;
73   // get the size of the object
74   int ret = cls_cxx_stat(hctx, &size, NULL);
75   if (ret < 0)
76     return ret;
77   
78   bufferlist bl;
79   // read the object entry
80   ret = cls_cxx_read(hctx, 0, size, &bl);
81   if (ret < 0)
82     return ret;
83
84   // if the size is incorrect 
85   if (bl.length() != size)
86     return -EIO;
87   
88   bl.clear();
89
90   // read xattr entry
91   ret = cls_cxx_getxattr(hctx, "foo", &bl);
92   if (ret < 0)
93     return ret;
94
95   // if the size is incorrect
96   if (bl.length() != size)
97     return -EIO;
98   
99   bl.clear();
100
101   // read omap entry
102   ret = cls_cxx_map_get_val(hctx, "foo", &bl);
103   if (ret < 0)
104     return ret;
105
106   // if the size is incorrect
107   if (bl.length() != size)
108     return -EIO;
109
110   // remove the object
111   ret = cls_cxx_remove(hctx);
112   if (ret < 0)
113     return ret;
114   
115   return 0;
116 }
117
118 void __cls_init()
119 {
120   CLS_LOG(0, "loading cls_sdk");
121
122   cls_register("sdk", &h_class);
123
124   cls_register_cxx_method(h_class, "test_coverage_write",
125       CLS_METHOD_RD|CLS_METHOD_WR,
126       test_coverage_write, &h_test_coverage_write);
127   
128   cls_register_cxx_method(h_class, "test_coverage_replay",
129       CLS_METHOD_RD|CLS_METHOD_WR,
130       test_coverage_replay, &h_test_coverage_replay);
131 }