test: Add EC test classes RadosTestEC and RadosTestECPP

Fixes: #7437

Signed-off-by: David Zafman <david.zafman@inktank.com>
This commit is contained in:
David Zafman 2014-03-28 15:35:46 -07:00
parent a4da24d3bc
commit 9bd5821aab
4 changed files with 251 additions and 0 deletions

View File

@ -27,6 +27,7 @@ void RadosTest::SetUp()
ASSERT_EQ(0, rados_ioctx_create(cluster, pool_name.c_str(), &ioctx));
std::string nspace = get_temp_pool_name();
rados_ioctx_set_namespace(ioctx, nspace.c_str());
ASSERT_FALSE(rados_ioctx_pool_requires_alignment(ioctx));
}
void RadosTest::TearDown()
@ -72,6 +73,7 @@ void RadosTestPP::SetUp()
ASSERT_EQ(0, cluster.ioctx_create(pool_name.c_str(), ioctx));
ns = get_temp_pool_name();
ioctx.set_namespace(ns);
ASSERT_FALSE(ioctx.pool_requires_alignment());
}
void RadosTestPP::TearDown()
@ -91,3 +93,94 @@ void RadosTestPP::cleanup_default_namespace(librados::IoCtx ioctx)
ASSERT_EQ(0, ioctx.remove(it->first));
}
}
std::string RadosTestEC::pool_name;
rados_t RadosTestEC::s_cluster = NULL;
void RadosTestEC::SetUpTestCase()
{
pool_name = get_temp_pool_name();
ASSERT_EQ("", create_one_ec_pool(pool_name, &s_cluster));
}
void RadosTestEC::TearDownTestCase()
{
ASSERT_EQ(0, destroy_one_ec_pool(pool_name, &s_cluster));
}
void RadosTestEC::SetUp()
{
cluster = RadosTestEC::s_cluster;
ASSERT_EQ(0, rados_ioctx_create(cluster, pool_name.c_str(), &ioctx));
std::string nspace = get_temp_pool_name();
rados_ioctx_set_namespace(ioctx, nspace.c_str());
ASSERT_TRUE(rados_ioctx_pool_requires_alignment(ioctx));
alignment = rados_ioctx_pool_required_alignment(ioctx);
ASSERT_NE((unsigned)0, alignment);
}
void RadosTestEC::TearDown()
{
cleanup_default_namespace(ioctx);
rados_ioctx_destroy(ioctx);
}
void RadosTestEC::cleanup_default_namespace(rados_ioctx_t ioctx)
{
// remove all objects from the default namespace to avoid polluting
// other tests
rados_ioctx_set_namespace(ioctx, "");
rados_list_ctx_t list_ctx;
ASSERT_EQ(0, rados_objects_list_open(ioctx, &list_ctx));
int r;
const char *entry = NULL;
const char *key = NULL;
while ((r = rados_objects_list_next(list_ctx, &entry, &key)) != -ENOENT) {
ASSERT_EQ(0, r);
rados_ioctx_locator_set_key(ioctx, key);
ASSERT_EQ(0, rados_remove(ioctx, entry));
}
rados_objects_list_close(list_ctx);
}
std::string RadosTestECPP::pool_name;
Rados RadosTestECPP::s_cluster;
void RadosTestECPP::SetUpTestCase()
{
pool_name = get_temp_pool_name();
ASSERT_EQ("", create_one_ec_pool_pp(pool_name, s_cluster));
}
void RadosTestECPP::TearDownTestCase()
{
ASSERT_EQ(0, destroy_one_ec_pool_pp(pool_name, s_cluster));
}
void RadosTestECPP::SetUp()
{
ASSERT_EQ(0, cluster.ioctx_create(pool_name.c_str(), ioctx));
ns = get_temp_pool_name();
ioctx.set_namespace(ns);
ASSERT_TRUE(ioctx.pool_requires_alignment());
alignment = ioctx.pool_required_alignment();
ASSERT_NE((unsigned)0, alignment);
}
void RadosTestECPP::TearDown()
{
cleanup_default_namespace(ioctx);
ioctx.close();
}
void RadosTestECPP::cleanup_default_namespace(librados::IoCtx ioctx)
{
// remove all objects from the default namespace to avoid polluting
// other tests
ioctx.set_namespace("");
for (ObjectIterator it = ioctx.objects_begin();
it != ioctx.objects_end(); ++it) {
ioctx.locator_set_key(it->second);
ASSERT_EQ(0, ioctx.remove(it->first));
}
}

View File

@ -53,4 +53,41 @@ protected:
std::string ns;
};
class RadosTestEC : public ::testing::Test {
public:
RadosTestEC() {}
virtual ~RadosTestEC() {}
protected:
static void SetUpTestCase();
static void TearDownTestCase();
static void cleanup_default_namespace(rados_ioctx_t ioctx);
static rados_t s_cluster;
static std::string pool_name;
virtual void SetUp();
virtual void TearDown();
rados_t cluster;
rados_ioctx_t ioctx;
uint64_t alignment;
};
class RadosTestECPP : public ::testing::Test {
public:
RadosTestECPP() : cluster(s_cluster) {};
virtual ~RadosTestECPP() {};
protected:
static void SetUpTestCase();
static void TearDownTestCase();
static void cleanup_default_namespace(librados::IoCtx ioctx);
static librados::Rados s_cluster;
static std::string pool_name;
virtual void SetUp();
virtual void TearDown();
librados::Rados &cluster;
librados::IoCtx ioctx;
std::string ns;
uint64_t alignment;
};
#endif

View File

@ -43,6 +43,46 @@ std::string create_one_pool(const std::string &pool_name, rados_t *cluster)
return "";
}
std::string create_one_ec_pool(const std::string &pool_name, rados_t *cluster)
{
std::string err = connect_cluster(cluster);
if (err.length())
return err;
char *cmd[2];
cmd[1] = NULL;
cmd[0] = (char *)"{\"prefix\": \"osd erasure-code-profile set\", \"name\": \"testprofile\", \"profile\": [ \"k=2\", \"m=1\", \"ruleset-failure-domain=osd\"]}";
int ret = rados_mon_command(*cluster, (const char **)cmd, 1, "", 0, NULL, NULL, NULL, NULL);
if (ret) {
rados_shutdown(*cluster);
std::ostringstream oss;
oss << "rados_mon_command erasure-code-profile set name:testprofile failed with error " << ret;
return oss.str();
}
std::string cmdstr = "{\"prefix\": \"osd pool create\", \"pool\": \"" +
pool_name + "\", \"pool_type\":\"erasure\", \"pg_num\":8, \"pgp_num\":8, \"erasure_code_profile\":\"testprofile\"}";
cmd[0] = (char *)cmdstr.c_str();
ret = rados_mon_command(*cluster, (const char **)cmd, 1, "", 0, NULL, 0, NULL, 0);
if (ret) {
std::ostringstream oss;
cmd[0] = (char *)"{\"prefix\": \"osd erasure-code-profile rm\", \"name\": \"testprofile\"}";
int ret2 = rados_mon_command(*cluster, (const char **)cmd, 1, "", 0, NULL, 0, NULL, 0);
if (ret2)
oss << "rados_mon_command osd erasure-code-profile rm name:testprofile failed with error " << ret2 << std::endl;
rados_shutdown(*cluster);
oss << "rados_mon_command erasure-code-profile set name:testprofile failed with error " << ret;
return oss.str();
}
rados_wait_for_latest_osdmap(*cluster);
return "";
}
std::string create_one_pool_pp(const std::string &pool_name, Rados &cluster)
{
std::string err = connect_cluster_pp(cluster);
@ -58,6 +98,44 @@ std::string create_one_pool_pp(const std::string &pool_name, Rados &cluster)
return "";
}
std::string create_one_ec_pool_pp(const std::string &pool_name, Rados &cluster)
{
std::string err = connect_cluster_pp(cluster);
if (err.length())
return err;
bufferlist inbl;
int ret = cluster.mon_command(
"{\"prefix\": \"osd erasure-code-profile set\", \"name\": \"testprofile\", \"profile\": [ \"k=2\", \"m=1\", \"ruleset-failure-domain=osd\"]}",
inbl, NULL, NULL);
if (ret) {
cluster.shutdown();
std::ostringstream oss;
oss << "mon_command erasure-code-profile set name:testprofile failed with error " << ret;
return oss.str();
}
ret = cluster.mon_command(
"{\"prefix\": \"osd pool create\", \"pool\": \"" + pool_name + "\", \"pool_type\":\"erasure\", \"pg_num\":8, \"pgp_num\":8, \"erasure_code_profile\":\"testprofile\"}",
inbl, NULL, NULL);
if (ret) {
std::ostringstream oss;
bufferlist inbl;
int ret2 = cluster.mon_command(
"{\"prefix\": \"osd erasure-code-profile rm\", \"name\": \"testprofile\"}",
inbl, NULL, NULL);
if (ret2)
oss << "mon_command osd erasure-code-profile rm name:testprofile failed with error " << ret2 << std::endl;
cluster.shutdown();
oss << "mon_command osd pool create pool:" << pool_name << " pool_type:erasure failed with error " << ret;
return oss.str();
}
cluster.wait_for_latest_osdmap();
return "";
}
std::string connect_cluster(rados_t *cluster)
{
char *id = getenv("CEPH_CLIENT_ID");
@ -129,6 +207,26 @@ int destroy_one_pool(const std::string &pool_name, rados_t *cluster)
return 0;
}
int destroy_one_ec_pool(const std::string &pool_name, rados_t *cluster)
{
int ret = rados_pool_delete(*cluster, pool_name.c_str());
if (ret == 0) {
char *cmd[2];
cmd[1] = NULL;
cmd[0] = (char *)"{\"prefix\": \"osd erasure-code-profile rm\", \"name\": \"testprofile\"}";
int ret2 = rados_mon_command(*cluster, (const char **)cmd, 1, "", 0, NULL, 0, NULL, 0);
if (ret2) {
rados_shutdown(*cluster);
return ret2;
}
rados_wait_for_latest_osdmap(*cluster);
}
rados_shutdown(*cluster);
return ret;
}
int destroy_one_pool_pp(const std::string &pool_name, Rados &cluster)
{
int ret = cluster.pool_delete(pool_name.c_str());
@ -139,3 +237,21 @@ int destroy_one_pool_pp(const std::string &pool_name, Rados &cluster)
cluster.shutdown();
return 0;
}
int destroy_one_ec_pool_pp(const std::string &pool_name, Rados &cluster)
{
int ret = cluster.pool_delete(pool_name.c_str());
bufferlist inbl;
if (ret == 0) {
int ret2 = cluster.mon_command(
"{\"prefix\": \"osd erasure-code-profile rm\", \"name\": \"testprofile\"}",
inbl, NULL, NULL);
if (ret2) {
cluster.shutdown();
return ret2;
}
cluster.wait_for_latest_osdmap();
}
cluster.shutdown();
return ret;
}

View File

@ -24,12 +24,17 @@
std::string get_temp_pool_name();
std::string create_one_pool(const std::string &pool_name, rados_t *cluster);
std::string create_one_ec_pool(const std::string &pool_name, rados_t *cluster);
std::string create_one_pool_pp(const std::string &pool_name,
librados::Rados &cluster);
std::string create_one_ec_pool_pp(const std::string &pool_name,
librados::Rados &cluster);
std::string connect_cluster(rados_t *cluster);
std::string connect_cluster_pp(librados::Rados &cluster);
int destroy_one_pool(const std::string &pool_name, rados_t *cluster);
int destroy_one_ec_pool(const std::string &pool_name, rados_t *cluster);
int destroy_one_pool_pp(const std::string &pool_name, librados::Rados &cluster);
int destroy_one_ec_pool_pp(const std::string &pool_name, librados::Rados &cluster);
class TestAlarm
{