* not filled in.
*
* @param cluster cluster handle
- * @param cmd the command string (in JSON)
+ * @param cmd an array of char *'s representing the command
+ * @param cmdlen count of valid entries in cmd
* @param inbuf any bulk input data (crush map, etc.)
* @param outbuf double pointer to output buffer
* @param outbuflen pointer to output buffer length
* @param outslen pointer to status string length
* @returns 0 on success, negative error code on failure
*/
-int rados_mon_command(rados_t cluster, const char *cmd,
+int rados_mon_command(rados_t cluster, const char **cmd, size_t cmdlen,
const char *inbuf, size_t inbuflen,
char **outbuf, size_t *outbuflen,
char **outs, size_t *outslen);
*/
void rados_buffer_free(char *buf);
-int rados_osd_command(rados_t cluster, int osdid, const char *cmd,
+int rados_osd_command(rados_t cluster, int osdid, const char **cmd,
+ size_t cmdlen,
const char *inbuf, size_t inbuflen,
char **outbuf, size_t *outbuflen,
char **outs, size_t *outslen);
-int rados_pg_command(rados_t cluster, const char *pgstr, const char *cmd,
+int rados_pg_command(rados_t cluster, const char *pgstr, const char **cmd,
+ size_t cmdlen,
const char *inbuf, size_t inbuflen,
char **outbuf, size_t *outbuflen,
char **outs, size_t *outslen);
*outbuflen = outbl.length();
}
-extern "C" int rados_mon_command(rados_t cluster, const char *cmd,
+extern "C" int rados_mon_command(rados_t cluster, const char **cmd,
+ size_t cmdlen,
const char *inbuf, size_t inbuflen,
char **outbuf, size_t *outbuflen,
char **outs, size_t *outslen)
string outstring;
vector<string> cmdvec;
- get_str_vec(string(cmd), cmdvec);
- cmdvec.push_back(cmd);
+ for (size_t i = 0; i < cmdlen; i++)
+ cmdvec.push_back(cmd[i]);
+
inbl.append(inbuf, inbuflen);
int ret = client->mon_command(cmdvec, inbl, &outbl, &outstring);
return ret;
}
-extern "C" int rados_osd_command(rados_t cluster, int osdid, const char *cmd,
+extern "C" int rados_osd_command(rados_t cluster, int osdid, const char **cmd,
+ size_t cmdlen,
const char *inbuf, size_t inbuflen,
char **outbuf, size_t *outbuflen,
char **outs, size_t *outslen)
string outstring;
vector<string> cmdvec;
- get_str_vec(string(cmd), cmdvec);
+ for (size_t i = 0; i < cmdlen; i++)
+ cmdvec.push_back(cmd[i]);
+
inbl.append(inbuf, inbuflen);
int ret = client->osd_command(osdid, cmdvec, inbl, &outbl, &outstring);
extern "C" int rados_pg_command(rados_t cluster, const char *pgstr,
- const char *cmd,
+ const char **cmd, size_t cmdlen,
const char *inbuf, size_t inbuflen,
char **outbuf, size_t *outbuflen,
char **outs, size_t *outslen)
pg_t pgid;
vector<string> cmdvec;
- get_str_vec(string(cmd), cmdvec);
+ for (size_t i = 0; i < cmdlen; i++)
+ cmdvec.push_back(cmd[i]);
+
inbl.append(inbuf, inbuflen);
if (!pgid.parse(pgstr))
return -EINVAL;
outbuflen = c_long()
outsp = pointer(pointer(c_char()))
outslen = c_long()
+ cmdarr = (c_char_p * len(cmd))(*cmd)
ret = run_in_thread(self.librados.rados_mon_command,
- (self.cluster, c_char_p(cmd),
+ (self.cluster, cmdarr, len(cmd),
c_char_p(inbuf), len(inbuf),
outbufp, byref(outbuflen), outsp, byref(outslen)),
timeout)
outbuflen = c_long()
outsp = pointer(pointer(c_char()))
outslen = c_long()
+ cmdarr = (c_char_p * len(cmd))(*cmd)
ret = run_in_thread(self.librados.rados_osd_command,
- (self.cluster, osdid, c_char_p(cmd),
+ (self.cluster, osdid, cmdarr, len(cmd),
c_char_p(inbuf), len(inbuf),
outbufp, byref(outbuflen), outsp, byref(outslen)),
timeout)
outbuflen = c_long()
outsp = pointer(pointer(c_char()))
outslen = c_long()
+ cmdarr = (c_char_p * len(cmd))(*cmd)
ret = run_in_thread(self.librados.rados_pg_command,
- (self.cluster, c_char_p(pgid), c_char_p(cmd),
+ (self.cluster, c_char_p(pgid), cmdarr, len(cmd),
c_char_p(inbuf), len(inbuf),
outbufp, byref(outbuflen), outsp, byref(outslen)),
timeout)
char *buf, *st;
size_t buflen, stlen;
+ char *cmd[2];
- ASSERT_EQ(0, rados_mon_command(cluster, "{\"prefix\":\"get_command_descriptions\"}", "", 0, &buf, &buflen, &st, &stlen));
+ cmd[1] = NULL;
+
+ cmd[0] = (char *)"{\"prefix\":\"get_command_descriptions\"}";
+ ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
ASSERT_LT(0u, buflen);
rados_buffer_free(buf);
rados_buffer_free(st);
- ASSERT_EQ(-EINVAL, rados_mon_command(cluster, "get_command_descriptions", "", 0, &buf, &buflen, &st, &stlen));
+ cmd[0] = (char *)"get_command_descriptions";
+ ASSERT_EQ(-EINVAL, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
rados_buffer_free(buf);
rados_buffer_free(st);
- ASSERT_EQ(-EINVAL, rados_mon_command(cluster, "asdfqwer", "{}", 2, &buf, &buflen, &st, &stlen));
+ cmd[0] = (char *)"asdfqwer";
+ ASSERT_EQ(-EINVAL, rados_mon_command(cluster, (const char **)cmd, 1, "{}", 2, &buf, &buflen, &st, &stlen));
rados_buffer_free(buf);
rados_buffer_free(st);
- ASSERT_EQ(0, rados_mon_command(cluster, "{\"prefix\":\"mon_status\"}", "", 0, &buf, &buflen, &st, &stlen));
+ cmd[0] = (char *)"{\"prefix\":\"mon_status\"}";
+ ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
ASSERT_LT(0u, buflen);
//ASSERT_LT(0u, stlen);
rados_buffer_free(buf);
ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster));
}
-/*
+
TEST(LibRadosCmd, OSDCmd) {
rados_t cluster;
std::string pool_name = get_temp_pool_name();
char *buf, *st;
size_t buflen, stlen;
-
- ASSERT_EQ(-22, rados_osd_command(cluster, 0, "asdfasdf", "", &buf, &buflen, &st, &stlen));
- ASSERT_EQ(-22, rados_osd_command(cluster, 0, "version", "", &buf, &buflen, &st, &stlen));
- ASSERT_EQ(0, rados_osd_command(cluster, 0, "{prefix:\"version\"}", "", &buf, &buflen, &st, &stlen));
+ char *cmd[2];
+ cmd[1] = NULL;
+
+ cmd[0] = (char *)"asdfasdf";
+ ASSERT_EQ(-22, rados_osd_command(cluster, 0, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
+ cmd[0] = (char *)"version";
+ ASSERT_EQ(-22, rados_osd_command(cluster, 0, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
+ cmd[0] = (char *)"{\"prefix\":\"version\"}";
+ ASSERT_EQ(0, rados_osd_command(cluster, 0, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
ASSERT_LT(0u, buflen);
rados_buffer_free(buf);
rados_buffer_free(st);
char *buf, *st;
size_t buflen, stlen;
+ char *cmd[2];
+ cmd[1] = NULL;
int64_t poolid = rados_pool_lookup(cluster, pool_name.c_str());
ASSERT_LT(0, poolid);
string pgid = stringify(poolid) + ".0";
- ASSERT_EQ(-22, rados_pg_command(cluster, pgid.c_str(), "asdfasdf", "", &buf, &buflen, &st, &stlen));
- ASSERT_EQ(0, rados_pg_command(cluster, pgid.c_str(), "query", "", &buf, &buflen, &st, &stlen));
+ cmd[0] = (char *)"asdfasdf";
+ ASSERT_EQ(-22, rados_pg_command(cluster, pgid.c_str(), (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
+ string qstr = "{\"prefix\":\"pg\", \"cmd\":\"query\", \"pgid\":\"" + pgid + "\"}";
+ cmd[0] = (char *)qstr.c_str();
+ ASSERT_EQ(0, rados_pg_command(cluster, pgid.c_str(), (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
ASSERT_LT(0u, buflen);
rados_buffer_free(buf);
rados_buffer_free(st);
ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster));
}
-*/
+
struct Log {
list<string> log;
Cond cond;
ASSERT_EQ("", create_one_pool(pool_name, &cluster));
char *buf, *st;
+ char *cmd[2];
+ cmd[1] = NULL;
size_t buflen, stlen;
Log l;
ASSERT_EQ(0, rados_monitor_log(cluster, "info", log_cb, &l));
- ASSERT_EQ(0, rados_mon_command(cluster, "{\"prefix\":\"log\", \"logtext\":[\"onexx\"]}", "", 0, &buf, &buflen, &st, &stlen));
+ cmd[0] = (char *)"{\"prefix\":\"log\", \"logtext\":[\"onexx\"]}";
+ ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
for (int i=0; !l.contains("onexx"); i++) {
ASSERT_TRUE(i<100);
sleep(1);
/*
changing the subscribe level is currently broken.
+ cmd[0] = (char *)"{\"prefix\":\"log\", \"logtext\":[\"twoxx\"]}";
ASSERT_EQ(0, rados_monitor_log(cluster, "err", log_cb, &l));
- ASSERT_EQ(0, rados_mon_command(cluster, "{\"prefix\":\"log\", \"logtext\":[\"twoxx\"]}", "", 0, &buf, &buflen, &st, &stlen));
+ ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
sleep(2);
ASSERT_FALSE(l.contains("twoxx"));
*/
ASSERT_EQ(0, rados_monitor_log(cluster, "info", log_cb, &l));
- ASSERT_EQ(0, rados_mon_command(cluster, "{\"prefix\":\"log\", \"logtext\":[\"threexx\"]}", "", 0, &buf, &buflen, &st, &stlen));
+ cmd[0] = (char *)"{\"prefix\":\"log\", \"logtext\":[\"threexx\"]}";
+ ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
for (int i=0; !l.contains("threexx"); i++) {
ASSERT_TRUE(i<100);
sleep(1);
}
ASSERT_EQ(0, rados_monitor_log(cluster, "info", NULL, NULL));
- ASSERT_EQ(0, rados_mon_command(cluster, "{\"prefix\":\"log\", \"logtext\":[\"fourxx\"]}", "", 0, &buf, &buflen, &st, &stlen));
+ cmd[0] = (char *)"{\"prefix\":\"log\", \"logtext\":[\"fourxx\"]}";
+ ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
sleep(2);
ASSERT_FALSE(l.contains("fourxx"));
ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster));
}
-