Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / test / librados / pool.cc
1 #include "include/rados/librados.h"
2 #include "test/librados/test.h"
3
4 #include "gtest/gtest.h"
5 #include <errno.h>
6 #include <vector>
7
8 #define POOL_LIST_BUF_SZ 32768
9
10 TEST(LibRadosPools, PoolList) {
11   char pool_list_buf[POOL_LIST_BUF_SZ];
12   char *buf = pool_list_buf;
13   rados_t cluster;
14   std::string pool_name = get_temp_pool_name();
15   ASSERT_EQ("", create_one_pool(pool_name, &cluster));
16   ASSERT_LT(rados_pool_list(cluster, buf, POOL_LIST_BUF_SZ), POOL_LIST_BUF_SZ);
17
18   // we can pass a null buffer too.
19   ASSERT_LT(rados_pool_list(cluster, NULL, POOL_LIST_BUF_SZ), POOL_LIST_BUF_SZ);
20
21   bool found_pool = false;
22   while (buf[0] != '\0') {
23     if ((found_pool == false) && (strcmp(buf, pool_name.c_str()) == 0)) {
24       found_pool = true;
25     }
26     buf += strlen(buf) + 1;
27   }
28   ASSERT_EQ(found_pool, true);
29
30   // make sure we honor the buffer size limit
31   buf = pool_list_buf;
32   memset(buf, 0, POOL_LIST_BUF_SZ);
33   ASSERT_LT(rados_pool_list(cluster, buf, 20), POOL_LIST_BUF_SZ);
34   ASSERT_NE(0, buf[0]);  // include at least one pool name
35   ASSERT_EQ(0, buf[20]);  // but don't touch the stopping point
36
37   ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster));
38 }
39
40 int64_t rados_pool_lookup(rados_t cluster, const char *pool_name);
41
42 TEST(LibRadosPools, PoolLookup) {
43   rados_t cluster;
44   std::string pool_name = get_temp_pool_name();
45   ASSERT_EQ("", create_one_pool(pool_name, &cluster));
46   ASSERT_LT(0, rados_pool_lookup(cluster, pool_name.c_str()));
47   ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster));
48 }
49
50 TEST(LibRadosPools, PoolLookup2) {
51   rados_t cluster;
52   std::string pool_name = get_temp_pool_name();
53   ASSERT_EQ("", create_one_pool(pool_name, &cluster));
54   int64_t pool_id = rados_pool_lookup(cluster, pool_name.c_str());
55   ASSERT_GT(pool_id, 0);
56   rados_ioctx_t ioctx;
57   ASSERT_EQ(0, rados_ioctx_create(cluster, pool_name.c_str(), &ioctx));
58   int64_t pool_id2 = rados_ioctx_get_id(ioctx);
59   ASSERT_EQ(pool_id, pool_id2);
60   rados_ioctx_destroy(ioctx);
61   ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster));
62 }
63
64 TEST(LibRadosPools, PoolDelete) {
65   rados_t cluster;
66   std::string pool_name = get_temp_pool_name();
67   ASSERT_EQ("", create_one_pool(pool_name, &cluster));
68   ASSERT_EQ(0, rados_pool_delete(cluster, pool_name.c_str()));
69   ASSERT_GT(0, rados_pool_lookup(cluster, pool_name.c_str()));
70   ASSERT_EQ(0, rados_pool_create(cluster, pool_name.c_str()));
71   ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster));
72 }
73
74 TEST(LibRadosPools, PoolCreateDelete) {
75   rados_t cluster;
76   std::string pool_name = get_temp_pool_name();
77   ASSERT_EQ("", create_one_pool(pool_name, &cluster));
78
79   std::string n = pool_name + "abc123";
80   ASSERT_EQ(0, rados_pool_create(cluster, n.c_str()));
81   ASSERT_EQ(-EEXIST, rados_pool_create(cluster, n.c_str()));
82   ASSERT_EQ(0, rados_pool_delete(cluster, n.c_str()));
83   ASSERT_EQ(-ENOENT, rados_pool_delete(cluster, n.c_str()));
84
85   ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster));
86 }
87
88 TEST(LibRadosPools, PoolCreateWithCrushRule) {
89   rados_t cluster;
90   std::string pool_name = get_temp_pool_name();
91   ASSERT_EQ("", create_one_pool(pool_name, &cluster));
92
93   std::string pool2_name = get_temp_pool_name();
94   ASSERT_EQ(0, rados_pool_create_with_crush_rule(cluster,
95                             pool2_name.c_str(), 0));
96   ASSERT_EQ(0, rados_pool_delete(cluster, pool2_name.c_str()));
97
98   std::string pool3_name = get_temp_pool_name();
99   ASSERT_EQ(0, rados_pool_create_with_all(cluster, pool3_name.c_str(),
100                                           456ull, 0));
101   rados_ioctx_t ioctx;
102   ASSERT_EQ(0, rados_ioctx_create(cluster, pool3_name.c_str(), &ioctx));
103   uint64_t auid;
104   ASSERT_EQ(0, rados_ioctx_pool_get_auid(ioctx, &auid));
105   ASSERT_EQ(456ull, auid);
106   ASSERT_EQ(0, rados_pool_delete(cluster, pool3_name.c_str()));
107   rados_ioctx_destroy(ioctx);
108   ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster));
109 }
110
111 TEST(LibRadosPools, PoolGetBaseTier) {
112   rados_t cluster;
113   std::string pool_name = get_temp_pool_name();
114   ASSERT_EQ("", create_one_pool(pool_name, &cluster));
115   std::string tier_pool_name = pool_name + "-cache";
116   ASSERT_EQ(0, rados_pool_create(cluster, tier_pool_name.c_str()));
117
118   int64_t pool_id = rados_pool_lookup(cluster, pool_name.c_str());
119   ASSERT_GE(pool_id, 0);
120
121   int64_t tier_pool_id = rados_pool_lookup(cluster, tier_pool_name.c_str());
122   ASSERT_GE(tier_pool_id, 0);
123
124
125   int64_t base_tier = 0;
126   EXPECT_EQ(0, rados_pool_get_base_tier(cluster, pool_id, &base_tier));
127   EXPECT_EQ(pool_id, base_tier);
128
129   std::string cmdstr = "{\"prefix\": \"osd tier add\", \"pool\": \"" +
130      pool_name + "\", \"tierpool\":\"" + tier_pool_name + "\", \"force_nonempty\":\"\"}";
131   char *cmd[1];
132   cmd[0] = (char *)cmdstr.c_str();
133   ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, NULL, 0, NULL, 0));
134
135   cmdstr = "{\"prefix\": \"osd tier cache-mode\", \"pool\": \"" +
136      tier_pool_name + "\", \"mode\":\"readonly\", \"sure\": " +
137     "\"--yes-i-really-mean-it\"}";
138   cmd[0] = (char *)cmdstr.c_str();
139   ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, NULL, 0, NULL, 0));
140
141   EXPECT_EQ(0, rados_wait_for_latest_osdmap(cluster));
142
143   EXPECT_EQ(0, rados_pool_get_base_tier(cluster, pool_id, &base_tier));
144   EXPECT_EQ(pool_id, base_tier);
145
146   EXPECT_EQ(0, rados_pool_get_base_tier(cluster, tier_pool_id, &base_tier));
147   EXPECT_EQ(pool_id, base_tier);
148
149   int64_t nonexistent_pool_id = (int64_t)((-1ULL) >> 1);
150   EXPECT_EQ(-ENOENT, rados_pool_get_base_tier(cluster, nonexistent_pool_id, &base_tier));
151
152   cmdstr = "{\"prefix\": \"osd tier remove\", \"pool\": \"" +
153      pool_name + "\", \"tierpool\":\"" + tier_pool_name + "\"}";
154   cmd[0] = (char *)cmdstr.c_str();
155   ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, NULL, 0, NULL, 0));
156   ASSERT_EQ(0, rados_pool_delete(cluster, tier_pool_name.c_str()));
157   ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster));
158 }