1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
26 #include <curl/curl.h>
28 #include "common/ceph_crypto.h"
29 #include "include/str_list.h"
30 #include "common/ceph_json.h"
31 #include "common/code_environment.h"
32 #include "common/ceph_argparse.h"
33 #include "common/Finisher.h"
34 #include "global/global_init.h"
35 #include "rgw/rgw_common.h"
36 #include "rgw/rgw_bucket.h"
37 #include "rgw/rgw_rados.h"
38 #include "include/utime.h"
39 #include "include/object.h"
42 #include <gtest/gtest.h>
44 #define TEST(x, y) void y()
45 #define ASSERT_EQ(v, s) if(v != s)cout << "Error at " << __LINE__ << "(" << #v << "!= " << #s << "\n"; \
46 else cout << "(" << #v << "==" << #s << ") PASSED\n";
47 #define EXPECT_EQ(v, s) ASSERT_EQ(v, s)
48 #define ASSERT_TRUE(c) if(c)cout << "Error at " << __LINE__ << "(" << #c << ")" << "\n"; \
49 else cout << "(" << #c << ") PASSED\n";
50 #define EXPECT_TRUE(c) ASSERT_TRUE(c)
54 #define CURL_VERBOSE 0
55 #define HTTP_RESPONSE_STR "RespCode"
56 #define CEPH_CRYPTO_HMACSHA1_DIGESTSIZE 20
57 #define RGW_ADMIN_RESP_PATH "/tmp/.test_rgw_admin_resp"
58 #define TEST_BUCKET_NAME "test_bucket"
59 #define TEST_BUCKET_OBJECT "test_object"
60 #define TEST_BUCKET_OBJECT_1 "test_object1"
61 #define TEST_BUCKET_OBJECT_SIZE 1024
63 static string uid = "ceph";
64 static string display_name = "CEPH";
66 extern "C" int ceph_armor(char *dst, const char *dst_end,
67 const char *src, const char *end);
68 static void print_usage(char *exec){
69 cout << "Usage: " << exec << " <Options>\n";
71 "-g <gw-ip> - The ip address of the gateway\n"
72 "-p <gw-port> - The port number of the gateway\n"
73 "-c <ceph.conf> - Absolute path of ceph config file\n"
74 "-rgw-admin <path/to/radosgw-admin> - radosgw-admin absolute path\n";
83 string rgw_admin_path;
86 map<string, string> response;
87 list<string> extra_hdrs;
91 test_helper() : resp_data(NULL){
92 curl_global_init(CURL_GLOBAL_ALL);
95 curl_global_cleanup();
97 int send_request(string method, string uri,
98 size_t (*function)(void *,size_t,size_t,void *) = 0,
99 void *ud = 0, size_t length = 0);
100 int extract_input(int argc, char *argv[]);
101 string& get_response(string hdr){
102 return response[hdr];
104 void set_extra_header(string hdr){
105 extra_hdrs.push_back(hdr);
107 void set_response(char *val);
108 void set_response_data(char *data, size_t len){
109 if(resp_data) delete resp_data;
110 resp_data = new string(data, len);
112 string& get_rgw_admin_path() {
113 return rgw_admin_path;
115 string& get_ceph_conf_path() {
118 void set_creds(string& c) {
121 const string *get_response_data(){return resp_data;}
122 unsigned get_resp_code(){return resp_code;}
125 int test_helper::extract_input(int argc, char *argv[]){
126 #define ERR_CHECK_NEXT_PARAM(o) \
127 if(((int)loop + 1) >= argc)return -1; \
128 else o = argv[loop+1];
130 for(unsigned loop = 1;loop < (unsigned)argc; loop += 2){
131 if(strcmp(argv[loop], "-g") == 0){
132 ERR_CHECK_NEXT_PARAM(host);
133 }else if(strcmp(argv[loop],"-p") == 0){
134 ERR_CHECK_NEXT_PARAM(port);
135 }else if(strcmp(argv[loop], "-c") == 0){
136 ERR_CHECK_NEXT_PARAM(conf_path);
137 }else if(strcmp(argv[loop], "-rgw-admin") == 0){
138 ERR_CHECK_NEXT_PARAM(rgw_admin_path);
141 if(host.length() <= 0 ||
142 rgw_admin_path.length() <= 0)
147 void test_helper::set_response(char *r){
149 size_t off = sr.find(": ");
150 if(off != string::npos){
151 h.assign(sr, 0, off);
152 v.assign(sr, off + 2, sr.find("\r\n") - (off+2));
154 /*Could be the status code*/
155 if(sr.find("HTTP/") != string::npos){
156 h.assign(HTTP_RESPONSE_STR);
158 v.assign(sr, off + 1, sr.find("\r\n") - (off + 1));
159 resp_code = atoi((v.substr(0, 3)).c_str());
165 size_t write_header(void *ptr, size_t size, size_t nmemb, void *ud){
166 test_helper *h = static_cast<test_helper *>(ud);
167 h->set_response((char *)ptr);
171 size_t write_data(void *ptr, size_t size, size_t nmemb, void *ud){
172 test_helper *h = static_cast<test_helper *>(ud);
173 h->set_response_data((char *)ptr, size*nmemb);
177 static inline void buf_to_hex(const unsigned char *buf, int len, char *str)
181 for (i = 0; i < len; i++) {
182 sprintf(&str[i*2], "%02x", (int)buf[i]);
186 static void calc_hmac_sha1(const char *key, int key_len,
187 const char *msg, int msg_len, char *dest)
188 /* destination should be CEPH_CRYPTO_HMACSHA1_DIGESTSIZE bytes long */
190 ceph::crypto::HMACSHA1 hmac((const unsigned char *)key, key_len);
191 hmac.Update((const unsigned char *)msg, msg_len);
192 hmac.Final((unsigned char *)dest);
194 char hex_str[(CEPH_CRYPTO_HMACSHA1_DIGESTSIZE * 2) + 1];
195 admin_log::buf_to_hex((unsigned char *)dest, CEPH_CRYPTO_HMACSHA1_DIGESTSIZE, hex_str);
198 static int get_s3_auth(string method, string creds, string date, string res, string& out){
199 string aid, secret, auth_hdr;
201 size_t off = creds.find(":");
203 if(off != string::npos){
204 aid.assign(creds, 0, off);
205 secret.assign(creds, off + 1, string::npos);
207 /*sprintf(auth_hdr, "%s\n\n\n%s\n%s", req_type, date, res);*/
208 char hmac_sha1[CEPH_CRYPTO_HMACSHA1_DIGESTSIZE];
209 char b64[65]; /* 64 is really enough */
210 size_t off = res.find("?");
211 if(off == string::npos)
214 tmp_res.assign(res, 0, off);
215 auth_hdr.append(method + string("\n\n\n") + date + string("\n") + tmp_res);
216 admin_log::calc_hmac_sha1(secret.c_str(), secret.length(),
217 auth_hdr.c_str(), auth_hdr.length(), hmac_sha1);
218 int ret = ceph_armor(b64, b64 + 64, hmac_sha1,
219 hmac_sha1 + CEPH_CRYPTO_HMACSHA1_DIGESTSIZE);
221 cout << "ceph_armor failed\n";
225 out.append(aid + string(":") + b64);
230 void get_date(string& d){
234 char *days[] = {(char *)"Sun", (char *)"Mon", (char *)"Tue",
235 (char *)"Wed", (char *)"Thu", (char *)"Fri",
237 char *months[] = {(char *)"Jan", (char *)"Feb", (char *)"Mar",
238 (char *)"Apr", (char *)"May", (char *)"Jun",
239 (char *)"Jul",(char *) "Aug", (char *)"Sep",
240 (char *)"Oct", (char *)"Nov", (char *)"Dec"};
241 gettimeofday(&tv, NULL);
242 gmtime_r(&tv.tv_sec, &tm);
243 sprintf(date, "%s, %d %s %d %d:%d:%d GMT",
245 tm.tm_mday, months[tm.tm_mon],
247 tm.tm_hour, tm.tm_min, tm.tm_sec);
251 int test_helper::send_request(string method, string res,
252 size_t (*read_function)( void *,size_t,size_t,void *),
257 url.append(string("http://") + host);
258 if(port.length() > 0)url.append(string(":") + port);
260 curl_inst = curl_easy_init();
262 curl_easy_setopt(curl_inst, CURLOPT_URL, url.c_str());
263 curl_easy_setopt(curl_inst, CURLOPT_CUSTOMREQUEST, method.c_str());
264 curl_easy_setopt(curl_inst, CURLOPT_VERBOSE, CURL_VERBOSE);
265 curl_easy_setopt(curl_inst, CURLOPT_HEADERFUNCTION, admin_log::write_header);
266 curl_easy_setopt(curl_inst, CURLOPT_WRITEHEADER, (void *)this);
267 curl_easy_setopt(curl_inst, CURLOPT_WRITEFUNCTION, admin_log::write_data);
268 curl_easy_setopt(curl_inst, CURLOPT_WRITEDATA, (void *)this);
270 curl_easy_setopt(curl_inst, CURLOPT_READFUNCTION, read_function);
271 curl_easy_setopt(curl_inst, CURLOPT_READDATA, (void *)ud);
272 curl_easy_setopt(curl_inst, CURLOPT_UPLOAD, 1L);
273 curl_easy_setopt(curl_inst, CURLOPT_INFILESIZE_LARGE, (curl_off_t)length);
278 http_date.append(string("Date: ") + date);
281 if (admin_log::get_s3_auth(method, creds, date, res, s3auth) < 0)
283 auth.append(string("Authorization: AWS ") + s3auth);
285 struct curl_slist *slist = NULL;
286 slist = curl_slist_append(slist, auth.c_str());
287 slist = curl_slist_append(slist, http_date.c_str());
288 for(list<string>::iterator it = extra_hdrs.begin();
289 it != extra_hdrs.end(); ++it){
290 slist = curl_slist_append(slist, (*it).c_str());
293 curl_slist_append(slist, "Expect:");
294 curl_easy_setopt(curl_inst, CURLOPT_HTTPHEADER, slist);
296 response.erase(response.begin(), response.end());
297 extra_hdrs.erase(extra_hdrs.begin(), extra_hdrs.end());
298 CURLcode res = curl_easy_perform(curl_inst);
300 cout << "Curl perform failed for " << url << ", res: " <<
301 curl_easy_strerror(res) << "\n";
304 curl_slist_free_all(slist);
306 curl_easy_cleanup(curl_inst);
311 admin_log::test_helper *g_test;
314 int run_rgw_admin(string& cmd, string& resp) {
320 get_str_list(cmd, " \t", l);
321 char *argv[l.size()];
324 argv[0] = (char *)"radosgw-admin";
325 for (list<string>::iterator it = l.begin();
326 it != l.end(); ++it) {
327 argv[loop++] = (char *)(*it).c_str();
330 if (!freopen(RGW_ADMIN_RESP_PATH, "w+", stdout)) {
331 cout << "Unable to open stdout file" << std::endl;
333 execv((g_test->get_rgw_admin_path()).c_str(), argv);
334 } else if (pid > 0) {
336 waitpid(pid, &status, 0);
337 if (WIFEXITED(status)) {
338 if(WEXITSTATUS(status) != 0) {
339 cout << "Child exited with status " << WEXITSTATUS(status) << std::endl;
346 if (stat(RGW_ADMIN_RESP_PATH, &st) < 0) {
347 cout << "Error stating the admin response file, errno " << errno << std::endl;
350 char *data = (char *)malloc(st.st_size + 1);
351 in.open(RGW_ADMIN_RESP_PATH);
352 in.read(data, st.st_size);
354 data[st.st_size] = 0;
357 unlink(RGW_ADMIN_RESP_PATH);
358 /* cout << "radosgw-admin " << cmd << ": " << resp << std::endl; */
365 int get_creds(string& json, string& creds) {
367 if(!parser.parse(json.c_str(), json.length())) {
368 cout << "Error parsing create user response" << std::endl;
373 decode_json_obj(info, &parser);
375 for(map<string, RGWAccessKey>::iterator it = info.access_keys.begin();
376 it != info.access_keys.end(); ++it) {
377 RGWAccessKey _k = it->second;
378 /*cout << "accesskeys [ " << it->first << " ] = " <<
379 "{ " << _k.id << ", " << _k.key << ", " << _k.subuser << "}" << std::endl;*/
380 creds.append(it->first + string(":") + _k.key);
386 int user_create(string& uid, string& display_name, bool set_creds = true) {
389 ss << "-c " << g_test->get_ceph_conf_path() << " user create --uid=" << uid
390 << " --display-name=" << display_name;
393 string cmd = ss.str();
394 if(run_rgw_admin(cmd, out) != 0) {
395 cout << "Error creating user" << std::endl;
398 get_creds(out, creds);
400 g_test->set_creds(creds);
404 int user_info(string& uid, string& display_name, RGWUserInfo& uinfo) {
406 ss << "-c " << g_test->get_ceph_conf_path() << " user info --uid=" << uid
407 << " --display-name=" << display_name;
410 string cmd = ss.str();
411 if(run_rgw_admin(cmd, out) != 0) {
412 cout << "Error reading user information" << std::endl;
416 if(!parser.parse(out.c_str(), out.length())) {
417 cout << "Error parsing create user response" << std::endl;
420 decode_json_obj(uinfo, &parser);
424 int user_rm(string& uid, string& display_name) {
426 ss << "-c " << g_test->get_ceph_conf_path() <<
427 " metadata rm --metadata-key=user:" << uid;
430 string cmd = ss.str();
431 if(run_rgw_admin(cmd, out) != 0) {
432 cout << "Error removing user" << std::endl;
438 int caps_add(const char * name, const char *perm) {
441 ss << "-c " << g_test->get_ceph_conf_path() << " caps add --caps=" <<
442 name << "=" << perm << " --uid=" << uid;
444 string cmd = ss.str();
445 if(run_rgw_admin(cmd, out) != 0) {
446 cout << "Error creating user" << std::endl;
452 int caps_rm(const char * name, const char *perm) {
455 ss << "-c " << g_test->get_ceph_conf_path() << " caps rm --caps=" <<
456 name << "=" << perm << " --uid=" << uid;
458 string cmd = ss.str();
459 if(run_rgw_admin(cmd, out) != 0) {
460 cout << "Error creating user" << std::endl;
466 static int create_bucket(void){
467 g_test->send_request(string("PUT"), string("/" TEST_BUCKET_NAME));
468 if(g_test->get_resp_code() != 200U){
469 cout << "Error creating bucket, http code " << g_test->get_resp_code();
475 static int delete_bucket(void){
476 g_test->send_request(string("DELETE"), string("/" TEST_BUCKET_NAME));
477 if(g_test->get_resp_code() != 204U){
478 cout << "Error deleting bucket, http code " << g_test->get_resp_code();
484 size_t read_dummy_post(void *ptr, size_t s, size_t n, void *ud) {
486 memcpy(ptr, &dummy, sizeof(dummy));
487 return sizeof(dummy);
490 size_t read_bucket_object(void *ptr, size_t s, size_t n, void *ud) {
491 memcpy(ptr, ud, TEST_BUCKET_OBJECT_SIZE);
492 return TEST_BUCKET_OBJECT_SIZE;
495 static int put_bucket_obj(const char *obj_name, char *data, unsigned len) {
496 string req = "/" TEST_BUCKET_NAME"/";
497 req.append(obj_name);
498 g_test->send_request(string("PUT"), req,
499 read_bucket_object, (void *)data, (size_t)len);
500 if (g_test->get_resp_code() != 200U) {
501 cout << "Errror sending object to the bucket, http_code " << g_test->get_resp_code();
507 static int read_bucket_obj(const char *obj_name) {
508 string req = "/" TEST_BUCKET_NAME"/";
509 req.append(obj_name);
510 g_test->send_request(string("GET"), req);
511 if (g_test->get_resp_code() != 200U) {
512 cout << "Errror sending object to the bucket, http_code " << g_test->get_resp_code();
518 static int delete_obj(const char *obj_name) {
519 string req = "/" TEST_BUCKET_NAME"/";
520 req.append(obj_name);
521 g_test->send_request(string("DELETE"), req);
522 if (g_test->get_resp_code() != 204U) {
523 cout << "Errror deleting object from bucket, http_code " << g_test->get_resp_code();
529 int get_formatted_time(string& ret) {
530 struct tm *tm = NULL;
532 const char *format = "%Y-%m-%d%%20%H:%M:%S";
538 cerr << "Error returned by gmtime\n";
541 if (strftime(str_time, sizeof(str_time), format, tm) == 0) {
542 cerr << "Error returned by strftime\n";
549 int parse_json_resp(JSONParser &parser) {
551 resp = (string *)g_test->get_response_data();
554 if(!parser.parse(resp->c_str(), resp->length())) {
555 cout << "Error parsing create user response" << std::endl;
561 struct cls_log_entry_json {
565 RGWMetadataLogData log_data;
568 static int decode_json(JSONObj *obj, RGWMetadataLogData &data) {
571 jo = obj->find_obj("read_version");
574 data.read_version.decode_json(obj);
575 data.write_version.decode_json(obj);
577 jo = obj->find_obj("status");
580 JSONDecoder::decode_json("status", data, jo);
584 static int decode_json(JSONObj *obj, cls_log_entry_json& ret) {
585 JSONDecoder::decode_json("section", ret.section, obj);
586 JSONDecoder::decode_json("name", ret.name, obj);
587 JSONObj *jo = obj->find_obj("data");
590 return decode_json(jo, ret.log_data);
593 static int get_log_list(list<cls_log_entry_json> &entries) {
595 if (parse_json_resp(parser) != 0)
597 if (!parser.is_array())
601 l = parser.get_array_elements();
603 for(vector<string>::iterator it = l.begin();
604 it != l.end(); ++it, loop++) {
606 cls_log_entry_json entry;
608 if(!jp.parse((*it).c_str(), (*it).length())) {
609 cerr << "Error parsing log json object" << std::endl;
612 EXPECT_EQ(decode_json((JSONObj *)&jp, entry), 0);
613 entries.push_back(entry);
618 struct cls_bilog_entry {
627 static int decode_json(JSONObj *obj, cls_bilog_entry& ret) {
628 JSONDecoder::decode_json("op_id", ret.op_id, obj);
629 JSONDecoder::decode_json("op_tag", ret.op_tag, obj);
630 JSONDecoder::decode_json("op", ret.op, obj);
631 JSONDecoder::decode_json("object", ret.object, obj);
632 JSONDecoder::decode_json("state", ret.status, obj);
633 JSONDecoder::decode_json("index_ver", ret.index_ver, obj);
637 static int get_bilog_list(list<cls_bilog_entry> &entries) {
639 if (parse_json_resp(parser) != 0)
641 if (!parser.is_array())
645 l = parser.get_array_elements();
647 for(vector<string>::iterator it = l.begin();
648 it != l.end(); ++it, loop++) {
650 cls_bilog_entry entry;
652 if(!jp.parse((*it).c_str(), (*it).length())) {
653 cerr << "Error parsing log json object" << std::endl;
656 EXPECT_EQ(decode_json((JSONObj *)&jp, entry), 0);
657 entries.push_back(entry);
662 static int decode_json(JSONObj *obj, rgw_data_change& ret) {
665 JSONDecoder::decode_json("entity_type", entity, obj);
666 if (entity.compare("bucket") == 0)
667 ret.entity_type = ENTITY_TYPE_BUCKET;
668 JSONDecoder::decode_json("key", ret.key, obj);
672 static int get_datalog_list(list<rgw_data_change> &entries) {
675 if (parse_json_resp(parser) != 0)
677 if (!parser.is_array())
681 l = parser.get_array_elements();
683 for(vector<string>::iterator it = l.begin();
684 it != l.end(); ++it, loop++) {
686 rgw_data_change entry;
688 if(!jp.parse((*it).c_str(), (*it).length())) {
689 cerr << "Error parsing log json object" << std::endl;
692 EXPECT_EQ(decode_json((JSONObj *)&jp, entry), 0);
693 entries.push_back(entry);
698 unsigned get_mdlog_shard_id(string& key, int max_shards) {
699 string section = "user";
700 uint32_t val = ceph_str_hash_linux(key.c_str(), key.size());
701 val ^= ceph_str_hash_linux(section.c_str(), section.size());
702 return (unsigned)(val % max_shards);
705 unsigned get_datalog_shard_id(const char *bucket_name, int max_shards) {
706 uint32_t r = ceph_str_hash_linux(bucket_name, strlen(bucket_name)) % max_shards;
710 TEST(TestRGWAdmin, datalog_list) {
713 const char *cname = "datalog",
716 unsigned shard_id = get_datalog_shard_id(TEST_BUCKET_NAME, g_ceph_context->_conf->rgw_data_log_num_shards);
718 list<rgw_data_change> entries;
720 ASSERT_EQ(get_formatted_time(start_time), 0);
721 ASSERT_EQ(0, user_create(uid, display_name));
722 ASSERT_EQ(0, caps_add(cname, perm));
724 rest_req = "/admin/log?type=data";
725 g_test->send_request(string("GET"), rest_req);
726 EXPECT_EQ(200U, g_test->get_resp_code());
729 EXPECT_EQ (parse_json_resp(parser), 0);
730 JSONDecoder::decode_json("num_objects", num_objects, (JSONObj *)&parser);
731 ASSERT_EQ(num_objects,g_ceph_context->_conf->rgw_data_log_num_shards);
734 ASSERT_EQ(0, create_bucket());
736 char *bucket_obj = (char *)calloc(1, TEST_BUCKET_OBJECT_SIZE);
737 ASSERT_TRUE(bucket_obj != NULL);
738 EXPECT_EQ(put_bucket_obj(TEST_BUCKET_OBJECT, bucket_obj, TEST_BUCKET_OBJECT_SIZE), 0);
740 ss << "/admin/log?type=data&id=" << shard_id << "&start-time=" << start_time;
742 g_test->send_request(string("GET"), rest_req);
743 EXPECT_EQ(200U, g_test->get_resp_code());
745 get_datalog_list(entries);
746 EXPECT_EQ(1U, entries.size());
747 if (entries.size() == 1) {
748 rgw_data_change entry = *(entries.begin());
749 EXPECT_EQ(entry.entity_type, ENTITY_TYPE_BUCKET);
750 EXPECT_EQ(entry.key.compare(TEST_BUCKET_NAME), 0);
752 ASSERT_EQ(0, delete_obj(TEST_BUCKET_OBJECT));
754 ASSERT_EQ(get_formatted_time(end_time), 0);
756 ss << "/admin/log?type=data&id=" << shard_id << "&start-time=" << start_time;
758 g_test->send_request(string("GET"), rest_req);
759 EXPECT_EQ(200U, g_test->get_resp_code());
761 get_datalog_list(entries);
762 EXPECT_EQ(1U, entries.size());
763 if (entries.size() == 1) {
764 list<rgw_data_change>::iterator it = (entries.begin());
765 EXPECT_EQ((*it).entity_type, ENTITY_TYPE_BUCKET);
766 EXPECT_EQ((*it).key.compare(TEST_BUCKET_NAME), 0);
770 EXPECT_EQ(put_bucket_obj(TEST_BUCKET_OBJECT, bucket_obj, TEST_BUCKET_OBJECT_SIZE), 0);
774 ss << "/admin/log?type=data&id=" << shard_id << "&start-time=" << start_time;
776 g_test->send_request(string("GET"), rest_req);
777 EXPECT_EQ(200U, g_test->get_resp_code());
779 get_datalog_list(entries);
780 EXPECT_EQ(2U, entries.size());
781 if (entries.size() == 2) {
782 list<rgw_data_change>::iterator it = (entries.begin());
783 EXPECT_EQ((*it).entity_type, ENTITY_TYPE_BUCKET);
784 EXPECT_EQ((*it).key.compare(TEST_BUCKET_NAME), 0);
786 EXPECT_EQ((*it).entity_type, ENTITY_TYPE_BUCKET);
787 EXPECT_EQ((*it).key.compare(TEST_BUCKET_NAME), 0);
791 ss << "/admin/log?type=data&id=" << shard_id << "&start-time=" << start_time
794 g_test->send_request(string("GET"), rest_req);
795 EXPECT_EQ(200U, g_test->get_resp_code());
797 get_datalog_list(entries);
798 EXPECT_EQ(1U, entries.size());
801 ss << "/admin/log?type=data&id=" << shard_id << "&start-time=" << start_time
802 << "&end-time=" << end_time;
804 g_test->send_request(string("GET"), rest_req);
805 EXPECT_EQ(200U, g_test->get_resp_code());
807 get_datalog_list(entries);
808 EXPECT_EQ(1U, entries.size());
810 ASSERT_EQ(0, caps_rm(cname, perm));
812 ASSERT_EQ(0, caps_add(cname, perm));
814 ss << "/admin/log?type=data&id=" << shard_id << "&start-time=" << start_time;
816 g_test->send_request(string("GET"), rest_req);
817 EXPECT_EQ(200U, g_test->get_resp_code());
818 ASSERT_EQ(0, caps_rm(cname, perm));
820 ss << "/admin/log?type=data&id=" << shard_id << "&start-time=" << start_time;
823 g_test->send_request(string("GET"), rest_req);
824 EXPECT_EQ(403U, g_test->get_resp_code());
826 ASSERT_EQ(0, delete_obj(TEST_BUCKET_OBJECT));
827 ASSERT_EQ(0, delete_bucket());
828 ASSERT_EQ(0, user_rm(uid, display_name));
831 TEST(TestRGWAdmin, datalog_lock_unlock) {
832 const char *cname = "datalog",
836 ASSERT_EQ(0, user_create(uid, display_name));
837 ASSERT_EQ(0, caps_add(cname, perm));
839 rest_req = "/admin/log?type=data&lock&length=3&locker-id=ceph&zone-id=1";
840 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
841 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
843 rest_req = "/admin/log?type=data&lock&id=3&locker-id=ceph&zone-id=1";
844 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
845 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
847 rest_req = "/admin/log?type=data&lock&length=3&id=1&zone-id=1";
848 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
849 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
851 rest_req = "/admin/log?type=data&lock&length=3&id=1&locker-id=1";
852 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
853 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
855 rest_req = "/admin/log?type=data&unlock&id=1&zone-id=1";
856 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
857 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
859 rest_req = "/admin/log?type=data&unlock&locker-id=ceph&zone-id=1";
860 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
861 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
863 rest_req = "/admin/log?type=data&unlock&locker-id=ceph&id=1";
864 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
865 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
867 rest_req = "/admin/log?type=data&lock&id=1&length=3&locker-id=ceph&zone-id=1";
868 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
869 EXPECT_EQ(200U, g_test->get_resp_code());
871 rest_req = "/admin/log?type=data&unlock&id=1&locker-id=ceph&zone-id=1";
872 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
873 EXPECT_EQ(200U, g_test->get_resp_code());
875 rest_req = "/admin/log?type=data&lock&id=1&length=3&locker-id=ceph1&zone-id=1";
876 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
877 EXPECT_EQ(200U, g_test->get_resp_code());
879 rest_req = "/admin/log?type=data&unlock&id=1&locker-id=ceph1&zone-id=1";
880 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
881 EXPECT_EQ(200U, g_test->get_resp_code());
883 rest_req = "/admin/log?type=data&lock&id=1&length=3&locker-id=ceph&zone-id=1";
884 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
885 EXPECT_EQ(200U, g_test->get_resp_code());
886 utime_t sleep_time(3, 0);
888 rest_req = "/admin/log?type=data&lock&id=1&length=3&locker-id=ceph1&zone-id=1";
889 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
890 EXPECT_EQ(500U, g_test->get_resp_code());
892 rest_req = "/admin/log?type=data&lock&id=1&length=3&locker-id=ceph1&zone-id=2";
893 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
894 EXPECT_EQ(500U, g_test->get_resp_code());
896 rest_req = "/admin/log?type=data&lock&id=1&length=3&locker-id=ceph&zone-id=1";
897 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
898 EXPECT_EQ(200U, g_test->get_resp_code());
901 rest_req = "/admin/log?type=data&lock&id=1&length=3&locker-id=ceph1&zone-id=1";
902 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
903 EXPECT_EQ(200U, g_test->get_resp_code());
905 rest_req = "/admin/log?type=data&unlock&id=1&locker-id=ceph1&zone-id=1";
906 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
907 EXPECT_EQ(200U, g_test->get_resp_code());
909 ASSERT_EQ(0, caps_rm(cname, perm));
911 ASSERT_EQ(0, caps_add(cname, perm));
912 rest_req = "/admin/log?type=data&lock&id=1&length=3&locker-id=ceph&zone-id=1";
913 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
914 EXPECT_EQ(403U, g_test->get_resp_code());
916 rest_req = "/admin/log?type=data&unlock&id=1&locker-id=ceph&zone-id=1";
917 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
918 EXPECT_EQ(403U, g_test->get_resp_code());
920 ASSERT_EQ(0, caps_rm(cname, perm));
922 ASSERT_EQ(0, caps_add(cname, perm));
923 rest_req = "/admin/log?type=data&lock&id=1&length=3&locker-id=ceph&zone-id=1";
924 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
925 EXPECT_EQ(200U, g_test->get_resp_code());
927 rest_req = "/admin/log?type=data&unlock&id=1&locker-id=ceph&zone-id=1";
928 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
929 EXPECT_EQ(200U, g_test->get_resp_code());
931 ASSERT_EQ(0, caps_rm(cname, perm));
932 rest_req = "/admin/log?type=data&lock&id=1&length=3&locker-id=ceph&zone-id=1";
933 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
934 EXPECT_EQ(403U, g_test->get_resp_code());
936 rest_req = "/admin/log?type=data&unlock&id=1&locker-id=ceph&zone-id=1";
937 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
938 EXPECT_EQ(403U, g_test->get_resp_code());
940 ASSERT_EQ(0, user_rm(uid, display_name));
943 TEST(TestRGWAdmin, datalog_trim) {
946 const char *cname = "datalog",
949 unsigned shard_id = get_datalog_shard_id(TEST_BUCKET_NAME, g_ceph_context->_conf->rgw_data_log_num_shards);
951 list<rgw_data_change> entries;
953 ASSERT_EQ(get_formatted_time(start_time), 0);
954 ASSERT_EQ(0, user_create(uid, display_name));
955 ASSERT_EQ(0, caps_add(cname, perm));
957 rest_req = "/admin/log?type=data";
958 g_test->send_request(string("DELETE"), rest_req);
959 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
962 ss << "/admin/log?type=data&start-time=" << start_time;
964 g_test->send_request(string("DELETE"), rest_req);
965 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
968 ss << "/admin/log?type=data&id=" << shard_id << "&start-time=" << start_time;
970 g_test->send_request(string("DELETE"), rest_req);
971 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
973 ASSERT_EQ(0, create_bucket());
975 char *bucket_obj = (char *)calloc(1, TEST_BUCKET_OBJECT_SIZE);
976 ASSERT_TRUE(bucket_obj != NULL);
977 EXPECT_EQ(put_bucket_obj(TEST_BUCKET_OBJECT, bucket_obj, TEST_BUCKET_OBJECT_SIZE), 0);
978 ASSERT_EQ(0, delete_obj(TEST_BUCKET_OBJECT));
980 EXPECT_EQ(put_bucket_obj(TEST_BUCKET_OBJECT, bucket_obj, TEST_BUCKET_OBJECT_SIZE), 0);
981 ASSERT_EQ(0, delete_obj(TEST_BUCKET_OBJECT));
985 ASSERT_EQ(get_formatted_time(end_time), 0);
987 ss << "/admin/log?type=data&id=" << shard_id << "&start-time=" << start_time
988 << "&end-time=" << end_time;
990 g_test->send_request(string("GET"), rest_req);
991 EXPECT_EQ(200U, g_test->get_resp_code());
993 get_datalog_list(entries);
994 EXPECT_TRUE(!entries.empty());
997 ss << "/admin/log?type=data&id=" << shard_id << "&start-time=" << start_time
998 << "&end-time=" << end_time;
1000 g_test->send_request(string("DELETE"), rest_req);
1001 EXPECT_EQ(200U, g_test->get_resp_code());
1004 ss << "/admin/log?type=data&id=" << shard_id << "&start-time=" << start_time
1005 << "&end-time=" << end_time;
1006 rest_req = ss.str();
1007 g_test->send_request(string("GET"), rest_req);
1008 EXPECT_EQ(200U, g_test->get_resp_code());
1010 get_datalog_list(entries);
1011 EXPECT_TRUE(entries.empty());
1013 ASSERT_EQ(0, caps_rm(cname, perm));
1015 ASSERT_EQ(0, caps_add(cname, perm));
1017 ss << "/admin/log?type=data&id=" << shard_id << "&start-time=" << start_time
1018 << "&end-time=" << end_time;
1019 rest_req = ss.str();
1020 g_test->send_request(string("DELETE"), rest_req);
1021 EXPECT_EQ(200U, g_test->get_resp_code());
1023 ASSERT_EQ(0, caps_rm(cname, perm));
1025 ASSERT_EQ(0, caps_add(cname, perm));
1027 ss << "/admin/log?type=data&id=" << shard_id << "&start-time=" << start_time
1028 << "&end-time=" << end_time;
1029 rest_req = ss.str();
1030 g_test->send_request(string("DELETE"), rest_req);
1031 EXPECT_EQ(403U, g_test->get_resp_code());
1033 ASSERT_EQ(0, delete_bucket());
1034 ASSERT_EQ(0, user_rm(uid, display_name));
1037 TEST(TestRGWAdmin, mdlog_list) {
1041 const char *cname = "mdlog",
1044 unsigned shard_id = get_mdlog_shard_id(uid, g_ceph_context->_conf->rgw_md_log_max_shards);
1048 ASSERT_EQ(get_formatted_time(start_time), 0);
1049 ASSERT_EQ(0, user_create(uid, display_name));
1050 ASSERT_EQ(0, caps_add(cname, perm));
1052 rest_req = "/admin/log?type=metadata";
1053 g_test->send_request(string("GET"), rest_req);
1054 EXPECT_EQ(200U, g_test->get_resp_code());
1057 EXPECT_EQ (parse_json_resp(parser), 0);
1058 JSONDecoder::decode_json("num_objects", num_objects, (JSONObj *)&parser);
1059 ASSERT_EQ(num_objects,g_ceph_context->_conf->rgw_md_log_max_shards);
1062 ss << "/admin/log?type=metadata&id=" << shard_id << "&start-time=" << start_time;
1063 rest_req = ss.str();
1064 g_test->send_request(string("GET"), rest_req);
1065 EXPECT_EQ(200U, g_test->get_resp_code());
1067 list<cls_log_entry_json> entries;
1068 EXPECT_EQ(get_log_list(entries), 0);
1069 EXPECT_EQ(entries.size(), 4U);
1071 if(entries.size() == 4) {
1072 list<cls_log_entry_json>::iterator it = entries.begin();
1073 EXPECT_TRUE(it->section.compare("user") == 0);
1074 EXPECT_TRUE(it->name.compare(uid) == 0);
1075 EXPECT_TRUE(it->log_data.status == MDLOG_STATUS_WRITE);
1077 EXPECT_TRUE(it->section.compare("user") == 0);
1078 EXPECT_TRUE(it->name.compare(uid) == 0);
1079 EXPECT_TRUE(it->log_data.status == MDLOG_STATUS_COMPLETE);
1081 EXPECT_TRUE(it->section.compare("user") == 0);
1082 EXPECT_TRUE(it->name.compare(uid) == 0);
1083 EXPECT_TRUE(it->log_data.status == MDLOG_STATUS_WRITE);
1085 EXPECT_TRUE(it->section.compare("user") == 0);
1086 EXPECT_TRUE(it->name.compare(uid) == 0);
1087 EXPECT_TRUE(it->log_data.status == MDLOG_STATUS_COMPLETE);
1090 sleep(1); /*To get a modified time*/
1091 ASSERT_EQ(get_formatted_time(start_time_2), 0);
1092 ASSERT_EQ(0, caps_rm(cname, perm));
1094 ASSERT_EQ(0, caps_add(cname, perm));
1096 ss << "/admin/log?type=metadata&id=" << shard_id << "&start-time=" << start_time_2;
1097 rest_req = ss.str();
1098 g_test->send_request(string("GET"), rest_req);
1099 EXPECT_EQ(200U, g_test->get_resp_code());
1102 EXPECT_EQ(get_log_list(entries), 0);
1103 EXPECT_EQ(entries.size(), 4U);
1105 if(entries.size() == 4) {
1106 list<cls_log_entry_json>::iterator it = entries.begin();
1107 EXPECT_TRUE(it->section.compare("user") == 0);
1108 EXPECT_TRUE(it->name.compare(uid) == 0);
1109 EXPECT_TRUE(it->log_data.status == MDLOG_STATUS_WRITE);
1111 EXPECT_TRUE(it->section.compare("user") == 0);
1112 EXPECT_TRUE(it->name.compare(uid) == 0);
1113 EXPECT_TRUE(it->log_data.status == MDLOG_STATUS_COMPLETE);
1115 EXPECT_TRUE(it->section.compare("user") == 0);
1116 EXPECT_TRUE(it->name.compare(uid) == 0);
1117 EXPECT_TRUE(it->log_data.status == MDLOG_STATUS_WRITE);
1119 EXPECT_TRUE(it->section.compare("user") == 0);
1120 EXPECT_TRUE(it->name.compare(uid) == 0);
1121 EXPECT_TRUE(it->log_data.status == MDLOG_STATUS_COMPLETE);
1125 ASSERT_EQ(get_formatted_time(start_time_2), 0);
1126 ASSERT_EQ(0, user_rm(uid, display_name));
1128 ASSERT_EQ(0, user_create(uid, display_name));
1130 ASSERT_EQ(0, caps_add(cname, perm));
1133 ss << "/admin/log?type=metadata&id=" << shard_id << "&start-time=" << start_time_2;
1134 rest_req = ss.str();
1135 g_test->send_request(string("GET"), rest_req);
1136 EXPECT_EQ(200U, g_test->get_resp_code());
1139 EXPECT_EQ(get_log_list(entries), 0);
1140 EXPECT_EQ(entries.size(), 6U);
1141 if(entries.size() == 6) {
1142 list<cls_log_entry_json>::iterator it = entries.begin();
1143 EXPECT_TRUE(it->section.compare("user") == 0);
1144 EXPECT_TRUE(it->name.compare(uid) == 0);
1145 EXPECT_TRUE(it->log_data.status == MDLOG_STATUS_REMOVE);
1147 EXPECT_TRUE(it->section.compare("user") == 0);
1148 EXPECT_TRUE(it->name.compare(uid) == 0);
1150 EXPECT_TRUE(it->section.compare("user") == 0);
1151 EXPECT_TRUE(it->name.compare(uid) == 0);
1152 EXPECT_TRUE(it->log_data.status == MDLOG_STATUS_WRITE);
1154 EXPECT_TRUE(it->section.compare("user") == 0);
1155 EXPECT_TRUE(it->name.compare(uid) == 0);
1156 EXPECT_TRUE(it->log_data.status == MDLOG_STATUS_COMPLETE);
1160 ASSERT_EQ(get_formatted_time(end_time), 0);
1162 ss << "/admin/log?type=metadata&id=" << shard_id << "&start-time=" << start_time
1163 << "&end-time=" << end_time;
1164 rest_req = ss.str();
1165 g_test->send_request(string("GET"), rest_req);
1166 EXPECT_EQ(200U, g_test->get_resp_code());
1168 EXPECT_EQ(get_log_list(entries), 0);
1169 EXPECT_EQ(entries.size(), 14U);
1172 ss << "/admin/log?type=metadata&id=" << shard_id << "&start-time=" << start_time
1173 << "&max-entries=" << 1;
1174 rest_req = ss.str();
1175 g_test->send_request(string("GET"), rest_req);
1176 EXPECT_EQ(200U, g_test->get_resp_code());
1178 EXPECT_EQ(get_log_list(entries), 0);
1179 EXPECT_EQ(entries.size(), 1U);
1182 ss << "/admin/log?type=metadata&id=" << shard_id << "&start-time=" << start_time
1183 << "&max-entries=" << 6;
1184 rest_req = ss.str();
1185 g_test->send_request(string("GET"), rest_req);
1186 EXPECT_EQ(200U, g_test->get_resp_code());
1188 EXPECT_EQ(get_log_list(entries), 0);
1189 EXPECT_EQ(entries.size(), 6U);
1191 ASSERT_EQ(0, caps_rm(cname, perm));
1193 ss << "/admin/log?type=metadata&id=" << shard_id << "&start-time=" << start_time;
1194 rest_req = ss.str();
1195 g_test->send_request(string("GET"), rest_req);
1196 EXPECT_EQ(403U, g_test->get_resp_code());
1199 ASSERT_EQ(0, caps_add(cname, perm));
1201 ASSERT_EQ(get_formatted_time(end_time), 0);
1203 ss << "/admin/log?type=metadata&id=" << shard_id << "&start-time=" << start_time
1204 << "&end-time=" << end_time;
1205 rest_req = ss.str();
1206 g_test->send_request(string("DELETE"), rest_req);
1207 EXPECT_EQ(200U, g_test->get_resp_code());
1209 ASSERT_EQ(0, user_rm(uid, display_name));
1212 TEST(TestRGWAdmin, mdlog_trim) {
1215 const char *cname = "mdlog",
1218 list<cls_log_entry_json> entries;
1219 unsigned shard_id = get_mdlog_shard_id(uid, g_ceph_context->_conf->rgw_md_log_max_shards);
1223 ASSERT_EQ(get_formatted_time(start_time), 0);
1224 ASSERT_EQ(0, user_create(uid, display_name));
1225 ASSERT_EQ(0, caps_add(cname, perm));
1228 ss << "/admin/log?type=metadata&id=" << shard_id << "&start-time=" << start_time;
1229 rest_req = ss.str();
1230 g_test->send_request(string("DELETE"), rest_req);
1231 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
1233 g_test->send_request(string("GET"), rest_req);
1234 EXPECT_EQ(200U, g_test->get_resp_code());
1235 EXPECT_EQ(get_log_list(entries), 0);
1236 EXPECT_EQ(entries.size(), 4U);
1239 ASSERT_EQ(get_formatted_time(end_time), 0);
1241 ss << "/admin/log?type=metadata&id=" << shard_id << "&start-time=" << start_time << "&end-time=" << end_time;
1242 rest_req = ss.str();
1243 g_test->send_request(string("DELETE"), rest_req);
1244 EXPECT_EQ(200U, g_test->get_resp_code());
1247 ss << "/admin/log?type=metadata&id=" << shard_id << "&start-time=" << start_time;
1248 rest_req = ss.str();
1249 g_test->send_request(string("GET"), rest_req);
1250 EXPECT_EQ(200U, g_test->get_resp_code());
1252 EXPECT_EQ(get_log_list(entries), 0);
1253 EXPECT_EQ(entries.size(), 0U);
1255 ASSERT_EQ(0, caps_rm(cname, perm));
1257 ASSERT_EQ(0, caps_add(cname, perm));
1258 ASSERT_EQ(get_formatted_time(end_time), 0);
1260 ss << "/admin/log?type=metadata&id=" << shard_id << "&start-time=" << start_time << "&end-time=" << end_time;
1261 rest_req = ss.str();
1262 g_test->send_request(string("DELETE"), rest_req);
1263 EXPECT_EQ(200U, g_test->get_resp_code());
1265 ASSERT_EQ(0, caps_rm(cname, perm));
1266 g_test->send_request(string("DELETE"), rest_req);
1267 EXPECT_EQ(403U, g_test->get_resp_code());
1268 ASSERT_EQ(0, user_rm(uid, display_name));
1271 TEST(TestRGWAdmin, mdlog_lock_unlock) {
1272 const char *cname = "mdlog",
1276 ASSERT_EQ(0, user_create(uid, display_name));
1277 ASSERT_EQ(0, caps_add(cname, perm));
1279 rest_req = "/admin/log?type=metadata&lock&length=3&locker-id=ceph&zone-id=1";
1280 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1281 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
1283 rest_req = "/admin/log?type=metadata&lock&id=3&locker-id=ceph&zone-id=1";
1284 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1285 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
1287 rest_req = "/admin/log?type=metadata&lock&length=3&id=1&zone-id=1";
1288 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1289 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
1291 rest_req = "/admin/log?type=metadata&lock&id=3&locker-id=ceph&length=1";
1292 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1293 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
1295 rest_req = "/admin/log?type=metadata&unlock&id=1&zone-id=1";
1296 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1297 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
1299 rest_req = "/admin/log?type=metadata&unlock&locker-id=ceph&zone-id=1";
1300 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1301 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
1303 rest_req = "/admin/log?type=metadata&unlock&locker-id=ceph&id=1";
1304 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1305 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
1307 rest_req = "/admin/log?type=metadata&lock&id=1&length=3&locker-id=ceph&zone-id=1";
1308 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1309 EXPECT_EQ(200U, g_test->get_resp_code());
1311 rest_req = "/admin/log?type=metadata&unlock&id=1&locker-id=ceph&zone-id=1";
1312 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1313 EXPECT_EQ(200U, g_test->get_resp_code());
1315 rest_req = "/admin/log?type=metadata&lock&id=1&length=3&locker-id=ceph1&zone-id=1";
1316 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1317 EXPECT_EQ(200U, g_test->get_resp_code());
1319 rest_req = "/admin/log?type=metadata&unlock&id=1&locker-id=ceph1&zone-id=1";
1320 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1321 EXPECT_EQ(200U, g_test->get_resp_code());
1323 rest_req = "/admin/log?type=metadata&lock&id=1&length=3&locker-id=ceph&zone-id=1";
1324 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1325 EXPECT_EQ(200U, g_test->get_resp_code());
1326 utime_t sleep_time(3, 0);
1328 rest_req = "/admin/log?type=metadata&lock&id=1&length=3&locker-id=ceph1&zone-id=1";
1329 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1330 EXPECT_EQ(500U, g_test->get_resp_code());
1332 rest_req = "/admin/log?type=metadata&lock&id=1&length=3&locker-id=ceph&zone-id=2";
1333 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1334 EXPECT_EQ(500U, g_test->get_resp_code());
1336 rest_req = "/admin/log?type=metadata&lock&id=1&length=3&locker-id=ceph&zone-id=1";
1337 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1338 EXPECT_EQ(200U, g_test->get_resp_code());
1341 rest_req = "/admin/log?type=metadata&lock&id=1&length=3&locker-id=ceph1&zone-id=1";
1342 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1343 EXPECT_EQ(200U, g_test->get_resp_code());
1345 rest_req = "/admin/log?type=metadata&unlock&id=1&locker-id=ceph1&zone-id=1";
1346 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1347 EXPECT_EQ(200U, g_test->get_resp_code());
1349 ASSERT_EQ(0, caps_rm(cname, perm));
1351 ASSERT_EQ(0, caps_add(cname, perm));
1352 rest_req = "/admin/log?type=metadata&lock&id=1&length=3&locker-id=ceph&zone-id=1";
1353 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1354 EXPECT_EQ(403U, g_test->get_resp_code());
1356 rest_req = "/admin/log?type=metadata&unlock&id=1&locker-id=ceph&zone-id=1";
1357 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1358 EXPECT_EQ(403U, g_test->get_resp_code());
1360 ASSERT_EQ(0, caps_rm(cname, perm));
1362 ASSERT_EQ(0, caps_add(cname, perm));
1363 rest_req = "/admin/log?type=metadata&lock&id=1&length=3&locker-id=ceph&zone-id=1";
1364 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1365 EXPECT_EQ(200U, g_test->get_resp_code());
1367 rest_req = "/admin/log?type=metadata&unlock&id=1&locker-id=ceph&zone-id=1";
1368 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1369 EXPECT_EQ(200U, g_test->get_resp_code());
1371 ASSERT_EQ(0, caps_rm(cname, perm));
1372 rest_req = "/admin/log?type=metadata&lock&id=1&length=3&locker-id=ceph&zone-id=1";
1373 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1374 EXPECT_EQ(403U, g_test->get_resp_code());
1376 rest_req = "/admin/log?type=metadata&unlock&id=1&locker-id=ceph&zone-id=1";
1377 g_test->send_request(string("POST"), rest_req, read_dummy_post, NULL, sizeof(int));
1378 EXPECT_EQ(403U, g_test->get_resp_code());
1380 ASSERT_EQ(0, user_rm(uid, display_name));
1383 TEST(TestRGWAdmin, bilog_list) {
1384 const char *cname = "bilog",
1388 ASSERT_EQ(0, user_create(uid, display_name));
1389 ASSERT_EQ(0, caps_add(cname, perm));
1391 ASSERT_EQ(0, create_bucket());
1393 char *bucket_obj = (char *)calloc(1, TEST_BUCKET_OBJECT_SIZE);
1394 ASSERT_TRUE(bucket_obj != NULL);
1395 EXPECT_EQ(put_bucket_obj(TEST_BUCKET_OBJECT, bucket_obj, TEST_BUCKET_OBJECT_SIZE), 0);
1398 rest_req = "/admin/log?type=bucket-index&bucket=" TEST_BUCKET_NAME;
1399 g_test->send_request(string("GET"), rest_req);
1400 EXPECT_EQ(200U, g_test->get_resp_code());
1401 list<cls_bilog_entry> entries;
1402 get_bilog_list(entries);
1403 EXPECT_EQ(2U, entries.size());
1404 if (entries.size() == 2) {
1405 list<cls_bilog_entry>::iterator it = entries.begin();
1406 EXPECT_EQ(it->op.compare("write"), 0);
1407 EXPECT_EQ(it->object.compare(TEST_BUCKET_OBJECT), 0);
1408 EXPECT_EQ(it->status.compare("pending"), 0);
1409 EXPECT_EQ(it->index_ver, 1U);
1411 EXPECT_EQ(it->op.compare("write"), 0);
1412 EXPECT_EQ(it->object.compare(TEST_BUCKET_OBJECT), 0);
1413 EXPECT_EQ(it->status.compare("complete"), 0);
1414 EXPECT_EQ(it->index_ver, 2U);
1416 EXPECT_EQ(read_bucket_obj(TEST_BUCKET_OBJECT), 0);
1417 g_test->send_request(string("GET"), rest_req);
1418 EXPECT_EQ(200U, g_test->get_resp_code());
1420 get_bilog_list(entries);
1421 EXPECT_EQ(2U, entries.size());
1423 bucket_obj = (char *)calloc(1, TEST_BUCKET_OBJECT_SIZE);
1424 ASSERT_TRUE(bucket_obj != NULL);
1425 EXPECT_EQ(put_bucket_obj(TEST_BUCKET_OBJECT_1, bucket_obj, TEST_BUCKET_OBJECT_SIZE), 0);
1428 rest_req = "/admin/log?type=bucket-index&bucket=" TEST_BUCKET_NAME;
1429 g_test->send_request(string("GET"), rest_req);
1430 EXPECT_EQ(200U, g_test->get_resp_code());
1432 get_bilog_list(entries);
1433 EXPECT_EQ(4U, entries.size());
1434 if (entries.size() == 4) {
1435 list<cls_bilog_entry>::iterator it = entries.begin();
1438 EXPECT_EQ(it->op.compare("write"), 0);
1439 EXPECT_EQ(it->object.compare(TEST_BUCKET_OBJECT_1), 0);
1440 EXPECT_EQ(it->status.compare("pending"), 0);
1441 EXPECT_EQ(it->index_ver, 3U);
1443 EXPECT_EQ(it->op.compare("write"), 0);
1444 EXPECT_EQ(it->object.compare(TEST_BUCKET_OBJECT_1), 0);
1445 EXPECT_EQ(it->status.compare("complete"), 0);
1446 EXPECT_EQ(it->index_ver, 4U);
1449 ASSERT_EQ(0, delete_obj(TEST_BUCKET_OBJECT));
1450 rest_req = "/admin/log?type=bucket-index&bucket=" TEST_BUCKET_NAME;
1451 g_test->send_request(string("GET"), rest_req);
1452 EXPECT_EQ(200U, g_test->get_resp_code());
1454 get_bilog_list(entries);
1456 EXPECT_EQ(6U, entries.size());
1458 if (entries.size() == 6) {
1459 list<cls_bilog_entry>::iterator it = entries.begin();
1461 ++it; ++it; ++it; ++it;
1463 EXPECT_EQ(it->op.compare("del"), 0);
1464 EXPECT_EQ(it->object.compare(TEST_BUCKET_OBJECT), 0);
1465 EXPECT_EQ(it->status.compare("pending"), 0);
1466 EXPECT_EQ(it->index_ver, 5U);
1468 EXPECT_EQ(it->op.compare("del"), 0);
1469 EXPECT_EQ(it->object.compare(TEST_BUCKET_OBJECT), 0);
1470 EXPECT_EQ(it->status.compare("complete"), 0);
1471 EXPECT_EQ(it->index_ver, 6U);
1474 rest_req = "/admin/log?type=bucket-index&bucket=" TEST_BUCKET_NAME;
1475 rest_req.append("&marker=");
1476 rest_req.append(marker);
1477 g_test->send_request(string("GET"), rest_req);
1478 EXPECT_EQ(200U, g_test->get_resp_code());
1480 get_bilog_list(entries);
1481 EXPECT_EQ(2U, entries.size());
1482 if (entries.size() == 2U) {
1483 list<cls_bilog_entry>::iterator it = entries.begin();
1484 EXPECT_EQ(it->index_ver, 5U);
1486 EXPECT_EQ(it->index_ver, 6U);
1487 EXPECT_EQ(it->op.compare("del"), 0);
1490 rest_req = "/admin/log?type=bucket-index&bucket=" TEST_BUCKET_NAME;
1491 rest_req.append("&marker=");
1492 rest_req.append(marker);
1493 rest_req.append("&max-entries=1");
1494 g_test->send_request(string("GET"), rest_req);
1495 EXPECT_EQ(200U, g_test->get_resp_code());
1497 get_bilog_list(entries);
1498 EXPECT_EQ(1U, entries.size());
1499 EXPECT_EQ((entries.begin())->index_ver, 5U);
1501 ASSERT_EQ(0, caps_rm(cname, perm));
1503 ASSERT_EQ(0, caps_add(cname, perm));
1504 rest_req = "/admin/log?type=bucket-index&bucket=" TEST_BUCKET_NAME;
1505 g_test->send_request(string("GET"), rest_req);
1506 EXPECT_EQ(200U, g_test->get_resp_code());
1508 ASSERT_EQ(0, caps_rm(cname, perm));
1510 ASSERT_EQ(0, caps_add(cname, perm));
1511 rest_req = "/admin/log?type=bucket-index&bucket=" TEST_BUCKET_NAME;
1512 g_test->send_request(string("GET"), rest_req);
1513 EXPECT_EQ(403U, g_test->get_resp_code());
1515 ASSERT_EQ(0, delete_obj(TEST_BUCKET_OBJECT_1));
1516 ASSERT_EQ(0, delete_bucket());
1517 ASSERT_EQ(0, user_rm(uid, display_name));
1520 TEST(TestRGWAdmin, bilog_trim) {
1521 const char *cname = "bilog",
1523 string rest_req, start_marker, end_marker;
1525 ASSERT_EQ(0, user_create(uid, display_name));
1526 ASSERT_EQ(0, caps_add(cname, perm));
1528 ASSERT_EQ(0, create_bucket());
1530 rest_req = "/admin/log?type=bucket-index&bucket=" TEST_BUCKET_NAME;
1531 g_test->send_request(string("DELETE"), rest_req);
1532 EXPECT_EQ(400U, g_test->get_resp_code()); /*Bad request*/
1534 char *bucket_obj = (char *)calloc(1, TEST_BUCKET_OBJECT_SIZE);
1535 ASSERT_TRUE(bucket_obj != NULL);
1536 EXPECT_EQ(put_bucket_obj(TEST_BUCKET_OBJECT, bucket_obj, TEST_BUCKET_OBJECT_SIZE), 0);
1539 rest_req = "/admin/log?type=bucket-index&bucket=" TEST_BUCKET_NAME;
1540 g_test->send_request(string("GET"), rest_req);
1541 EXPECT_EQ(200U, g_test->get_resp_code());
1542 list<cls_bilog_entry> entries;
1543 get_bilog_list(entries);
1544 EXPECT_EQ(2U, entries.size());
1546 list<cls_bilog_entry>::iterator it = entries.begin();
1547 start_marker = it->op_id;
1549 end_marker = it->op_id;
1551 rest_req = "/admin/log?type=bucket-index&bucket=" TEST_BUCKET_NAME;
1552 rest_req.append("&start-marker=");
1553 rest_req.append(start_marker);
1554 rest_req.append("&end-marker=");
1555 rest_req.append(end_marker);
1556 g_test->send_request(string("DELETE"), rest_req);
1557 EXPECT_EQ(200U, g_test->get_resp_code());
1559 rest_req = "/admin/log?type=bucket-index&bucket=" TEST_BUCKET_NAME;
1560 g_test->send_request(string("GET"), rest_req);
1561 EXPECT_EQ(200U, g_test->get_resp_code());
1563 get_bilog_list(entries);
1564 EXPECT_EQ(0U, entries.size());
1566 ASSERT_EQ(0, delete_obj(TEST_BUCKET_OBJECT));
1567 ASSERT_EQ(0, delete_bucket());
1568 ASSERT_EQ(0, user_rm(uid, display_name));
1571 int main(int argc, char *argv[]){
1572 vector<const char*> args;
1573 argv_to_vec(argc, (const char **)argv, args);
1575 auto cct = global_init(NULL, args, CEPH_ENTITY_TYPE_CLIENT,
1576 CODE_ENVIRONMENT_UTILITY, 0);
1577 common_init_finish(g_ceph_context);
1578 g_test = new admin_log::test_helper();
1579 finisher = new Finisher(g_ceph_context);
1581 ::testing::InitGoogleTest(&argc, argv);
1585 if(g_test->extract_input(argc, argv) < 0){
1586 print_usage(argv[0]);
1590 int r = RUN_ALL_TESTS();
1592 cout << "There are no failures in the test case\n";
1594 cout << "There are some failures\n";