]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 | } |