#include "include/rados/librados.h" #include "test/librados/test.h" #include "gtest/gtest.h" #include #include #define POOL_LIST_BUF_SZ 32768 TEST(LibRadosPools, PoolList) { char pool_list_buf[POOL_LIST_BUF_SZ]; char *buf = pool_list_buf; rados_t cluster; std::string pool_name = get_temp_pool_name(); ASSERT_EQ("", create_one_pool(pool_name, &cluster)); ASSERT_LT(rados_pool_list(cluster, buf, POOL_LIST_BUF_SZ), POOL_LIST_BUF_SZ); // we can pass a null buffer too. ASSERT_LT(rados_pool_list(cluster, NULL, POOL_LIST_BUF_SZ), POOL_LIST_BUF_SZ); bool found_pool = false; while (buf[0] != '\0') { if ((found_pool == false) && (strcmp(buf, pool_name.c_str()) == 0)) { found_pool = true; } buf += strlen(buf) + 1; } ASSERT_EQ(found_pool, true); // make sure we honor the buffer size limit buf = pool_list_buf; memset(buf, 0, POOL_LIST_BUF_SZ); ASSERT_LT(rados_pool_list(cluster, buf, 20), POOL_LIST_BUF_SZ); ASSERT_NE(0, buf[0]); // include at least one pool name ASSERT_EQ(0, buf[20]); // but don't touch the stopping point ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster)); } int64_t rados_pool_lookup(rados_t cluster, const char *pool_name); TEST(LibRadosPools, PoolLookup) { rados_t cluster; std::string pool_name = get_temp_pool_name(); ASSERT_EQ("", create_one_pool(pool_name, &cluster)); ASSERT_LT(0, rados_pool_lookup(cluster, pool_name.c_str())); ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster)); } TEST(LibRadosPools, PoolLookup2) { rados_t cluster; std::string pool_name = get_temp_pool_name(); ASSERT_EQ("", create_one_pool(pool_name, &cluster)); int64_t pool_id = rados_pool_lookup(cluster, pool_name.c_str()); ASSERT_GT(pool_id, 0); rados_ioctx_t ioctx; ASSERT_EQ(0, rados_ioctx_create(cluster, pool_name.c_str(), &ioctx)); int64_t pool_id2 = rados_ioctx_get_id(ioctx); ASSERT_EQ(pool_id, pool_id2); rados_ioctx_destroy(ioctx); ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster)); } TEST(LibRadosPools, PoolDelete) { rados_t cluster; std::string pool_name = get_temp_pool_name(); ASSERT_EQ("", create_one_pool(pool_name, &cluster)); ASSERT_EQ(0, rados_pool_delete(cluster, pool_name.c_str())); ASSERT_GT(0, rados_pool_lookup(cluster, pool_name.c_str())); ASSERT_EQ(0, rados_pool_create(cluster, pool_name.c_str())); ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster)); } TEST(LibRadosPools, PoolCreateDelete) { rados_t cluster; std::string pool_name = get_temp_pool_name(); ASSERT_EQ("", create_one_pool(pool_name, &cluster)); std::string n = pool_name + "abc123"; ASSERT_EQ(0, rados_pool_create(cluster, n.c_str())); ASSERT_EQ(-EEXIST, rados_pool_create(cluster, n.c_str())); ASSERT_EQ(0, rados_pool_delete(cluster, n.c_str())); ASSERT_EQ(-ENOENT, rados_pool_delete(cluster, n.c_str())); ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster)); } TEST(LibRadosPools, PoolCreateWithCrushRule) { rados_t cluster; std::string pool_name = get_temp_pool_name(); ASSERT_EQ("", create_one_pool(pool_name, &cluster)); std::string pool2_name = get_temp_pool_name(); ASSERT_EQ(0, rados_pool_create_with_crush_rule(cluster, pool2_name.c_str(), 0)); ASSERT_EQ(0, rados_pool_delete(cluster, pool2_name.c_str())); std::string pool3_name = get_temp_pool_name(); ASSERT_EQ(0, rados_pool_create_with_all(cluster, pool3_name.c_str(), 456ull, 0)); rados_ioctx_t ioctx; ASSERT_EQ(0, rados_ioctx_create(cluster, pool3_name.c_str(), &ioctx)); uint64_t auid; ASSERT_EQ(0, rados_ioctx_pool_get_auid(ioctx, &auid)); ASSERT_EQ(456ull, auid); ASSERT_EQ(0, rados_pool_delete(cluster, pool3_name.c_str())); rados_ioctx_destroy(ioctx); ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster)); } TEST(LibRadosPools, PoolGetBaseTier) { rados_t cluster; std::string pool_name = get_temp_pool_name(); ASSERT_EQ("", create_one_pool(pool_name, &cluster)); std::string tier_pool_name = pool_name + "-cache"; ASSERT_EQ(0, rados_pool_create(cluster, tier_pool_name.c_str())); int64_t pool_id = rados_pool_lookup(cluster, pool_name.c_str()); ASSERT_GE(pool_id, 0); int64_t tier_pool_id = rados_pool_lookup(cluster, tier_pool_name.c_str()); ASSERT_GE(tier_pool_id, 0); int64_t base_tier = 0; EXPECT_EQ(0, rados_pool_get_base_tier(cluster, pool_id, &base_tier)); EXPECT_EQ(pool_id, base_tier); std::string cmdstr = "{\"prefix\": \"osd tier add\", \"pool\": \"" + pool_name + "\", \"tierpool\":\"" + tier_pool_name + "\", \"force_nonempty\":\"\"}"; char *cmd[1]; cmd[0] = (char *)cmdstr.c_str(); ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, NULL, 0, NULL, 0)); cmdstr = "{\"prefix\": \"osd tier cache-mode\", \"pool\": \"" + tier_pool_name + "\", \"mode\":\"readonly\", \"sure\": " + "\"--yes-i-really-mean-it\"}"; cmd[0] = (char *)cmdstr.c_str(); ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, NULL, 0, NULL, 0)); EXPECT_EQ(0, rados_wait_for_latest_osdmap(cluster)); EXPECT_EQ(0, rados_pool_get_base_tier(cluster, pool_id, &base_tier)); EXPECT_EQ(pool_id, base_tier); EXPECT_EQ(0, rados_pool_get_base_tier(cluster, tier_pool_id, &base_tier)); EXPECT_EQ(pool_id, base_tier); int64_t nonexistent_pool_id = (int64_t)((-1ULL) >> 1); EXPECT_EQ(-ENOENT, rados_pool_get_base_tier(cluster, nonexistent_pool_id, &base_tier)); cmdstr = "{\"prefix\": \"osd tier remove\", \"pool\": \"" + pool_name + "\", \"tierpool\":\"" + tier_pool_name + "\"}"; cmd[0] = (char *)cmdstr.c_str(); ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, NULL, 0, NULL, 0)); ASSERT_EQ(0, rados_pool_delete(cluster, tier_pool_name.c_str())); ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster)); }