summaryrefslogtreecommitdiffstats
path: root/src/rgw/rgw_user.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/rgw/rgw_user.cc')
-rw-r--r--src/rgw/rgw_user.cc127
1 files changed, 127 insertions, 0 deletions
diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc
new file mode 100644
index 000000000..e5e07cbc4
--- /dev/null
+++ b/src/rgw/rgw_user.cc
@@ -0,0 +1,127 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab ft=cpp
+
+#include "rgw_sal_rados.h"
+
+#include "include/types.h"
+#include "rgw_user.h"
+
+// until everything is moved from rgw_common
+#include "rgw_common.h"
+
+#define dout_subsys ceph_subsys_rgw
+
+using namespace std;
+
+int rgw_user_sync_all_stats(const DoutPrefixProvider *dpp, rgw::sal::Driver* driver,
+ rgw::sal::User* user, optional_yield y)
+{
+ rgw::sal::BucketList user_buckets;
+
+ CephContext *cct = driver->ctx();
+ size_t max_entries = cct->_conf->rgw_list_buckets_max_chunk;
+ string marker;
+ int ret;
+
+ do {
+ ret = user->list_buckets(dpp, marker, string(), max_entries, false, user_buckets, y);
+ if (ret < 0) {
+ ldpp_dout(dpp, 0) << "failed to read user buckets: ret=" << ret << dendl;
+ return ret;
+ }
+ auto& buckets = user_buckets.get_buckets();
+ for (auto i = buckets.begin(); i != buckets.end(); ++i) {
+ marker = i->first;
+
+ auto& bucket = i->second;
+
+ ret = bucket->load_bucket(dpp, y);
+ if (ret < 0) {
+ ldpp_dout(dpp, 0) << "ERROR: could not read bucket info: bucket=" << bucket << " ret=" << ret << dendl;
+ continue;
+ }
+ ret = bucket->sync_user_stats(dpp, y);
+ if (ret < 0) {
+ ldout(cct, 0) << "ERROR: could not sync bucket stats: ret=" << ret << dendl;
+ return ret;
+ }
+ ret = bucket->check_bucket_shards(dpp);
+ if (ret < 0) {
+ ldpp_dout(dpp, 0) << "ERROR in check_bucket_shards: " << cpp_strerror(-ret)<< dendl;
+ }
+ }
+ } while (user_buckets.is_truncated());
+
+ ret = user->complete_flush_stats(dpp, y);
+ if (ret < 0) {
+ cerr << "ERROR: failed to complete syncing user stats: ret=" << ret << std::endl;
+ return ret;
+ }
+
+ return 0;
+}
+
+int rgw_user_get_all_buckets_stats(const DoutPrefixProvider *dpp,
+ rgw::sal::Driver* driver,
+ rgw::sal::User* user,
+ map<string, bucket_meta_entry>& buckets_usage_map,
+ optional_yield y)
+{
+ CephContext *cct = driver->ctx();
+ size_t max_entries = cct->_conf->rgw_list_buckets_max_chunk;
+ bool done;
+ string marker;
+ int ret;
+
+ do {
+ rgw::sal::BucketList buckets;
+ ret = user->list_buckets(dpp, marker, string(), max_entries, false, buckets, y);
+ if (ret < 0) {
+ ldpp_dout(dpp, 0) << "failed to read user buckets: ret=" << ret << dendl;
+ return ret;
+ }
+ auto& m = buckets.get_buckets();
+ for (const auto& i : m) {
+ marker = i.first;
+
+ auto& bucket_ent = i.second;
+ ret = bucket_ent->load_bucket(dpp, y, true /* load user stats */);
+ if (ret < 0) {
+ ldpp_dout(dpp, 0) << "ERROR: could not get bucket stats: ret=" << ret << dendl;
+ return ret;
+ }
+ bucket_meta_entry entry;
+ entry.size = bucket_ent->get_size();
+ entry.size_rounded = bucket_ent->get_size_rounded();
+ entry.creation_time = bucket_ent->get_creation_time();
+ entry.count = bucket_ent->get_count();
+ buckets_usage_map.emplace(bucket_ent->get_name(), entry);
+ }
+ done = (buckets.count() < max_entries);
+ } while (!done);
+
+ return 0;
+}
+
+int rgw_validate_tenant_name(const string& t)
+{
+ struct tench {
+ static bool is_good(char ch) {
+ return isalnum(ch) || ch == '_';
+ }
+ };
+ std::string::const_iterator it =
+ std::find_if_not(t.begin(), t.end(), tench::is_good);
+ return (it == t.end())? 0: -ERR_INVALID_TENANT_NAME;
+}
+
+/**
+ * Get the anonymous (ie, unauthenticated) user info.
+ */
+void rgw_get_anon_user(RGWUserInfo& info)
+{
+ info.user_id = RGW_USER_ANON_ID;
+ info.display_name.clear();
+ info.access_keys.clear();
+}
+