libcls_rbd_client_la_SOURCES = cls/rbd/cls_rbd_client.cc
noinst_LTLIBRARIES += libcls_rbd_client.la
-libcls_user_client_a_SOURCES = cls/user/cls_user_client.cc
+libcls_user_client_a_SOURCES = cls/user/cls_user_client.cc cls/user/cls_user_types.cc
noinst_LIBRARIES += libcls_user_client.a
noinst_HEADERS += \
const string& in_marker, int max_entries,
list<cls_user_bucket_entry>& entries,
string *out_marker, bool *truncated);
+void cls_user_get_header(librados::ObjectReadOperation& op, cls_user_header *header);
#endif
--- /dev/null
+// -*- mode:C; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include "cls/user/cls_user_types.h"
+#include "common/Formatter.h"
+
+
+void cls_user_header::dump(Formatter *f) const
+{
+ f->dump_int("total_entries", total_entries);
+ f->dump_int("total_bytes", total_bytes);
+ f->dump_int("total_bytes_rounded", total_bytes_rounded);
+}
+
::decode(total_bytes_rounded, bl);
DECODE_FINISH(bl);
}
+
+ void dump(Formatter *f) const;
};
WRITE_CLASS_ENCODER(cls_user_header)
OPT_USER_SUSPEND,
OPT_USER_ENABLE,
OPT_USER_CHECK,
+ OPT_USER_STAT,
OPT_SUBUSER_CREATE,
OPT_SUBUSER_MODIFY,
OPT_SUBUSER_RM,
return OPT_USER_ENABLE;
if (strcmp(cmd, "check") == 0)
return OPT_USER_CHECK;
+ if (strcmp(cmd, "stat") == 0)
+ return OPT_USER_STAT;
} else if (strcmp(prev_cmd, "subuser") == 0) {
if (strcmp(cmd, "create") == 0)
return OPT_SUBUSER_CREATE;
check_bad_user_bucket_mapping(store, user_id, fix);
}
+ if (opt_cmd == OPT_USER_STAT) {
+ if (user_id.empty()) {
+ cerr << "ERROR: uid not specified" << std::endl;
+ return EINVAL;
+ }
+ rgw_obj obj(store->zone.user_uid_pool, user_id);
+
+ cls_user_header header;
+ int ret = store->cls_user_get_header(obj, &header);
+ if (ret < 0) {
+ cerr << "ERROR: can't read user header: " << cpp_strerror(-ret) << std::endl;
+ return -ret;
+ }
+
+ encode_json("header", header, formatter);
+ formatter->flush(cout);
+ }
+
if (opt_cmd == OPT_METADATA_GET) {
int ret = store->meta_mgr->get(metadata_key, formatter);
if (ret < 0) {
set_user_bucket_quota(opt_cmd, user, user_op, max_size, max_objects, have_max_size, have_max_objects);
}
}
+
return 0;
}
return 0;
}
+int RGWRados::cls_user_get_header(rgw_obj& obj, cls_user_header *header)
+{
+ librados::IoCtx io_ctx;
+ rgw_bucket bucket;
+ std::string oid, key;
+ get_obj_bucket_and_oid_key(obj, bucket, oid, key);
+ int r = open_bucket_data_ctx(bucket, io_ctx);
+ if (r < 0)
+ return r;
+
+ librados::ObjectReadOperation op;
+ ::cls_user_get_header(op, header);
+ bufferlist ibl;
+ r = io_ctx.operate(oid, &op, &ibl);
+ if (r < 0)
+ return r;
+
+ return 0;
+}
+
int RGWRados::cls_user_list_buckets(rgw_obj& obj,
const string& in_marker, int max_entries,
list<cls_user_bucket_entry>& entries,
string *out_marker, bool *truncated)
{
- bufferlist bl;
librados::IoCtx io_ctx;
rgw_bucket bucket;
std::string oid, key;
int bucket_rebuild_index(rgw_bucket& bucket);
int remove_objs_from_index(rgw_bucket& bucket, list<string>& oid_list);
+ int cls_user_get_header(rgw_obj& obj, cls_user_header *header);
int cls_user_list_buckets(rgw_obj& obj,
const string& in_marker, int max_entries,
list<cls_user_bucket_entry>& entries,