summaryrefslogtreecommitdiffstats
path: root/src/rgw/driver/rados/groups.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/rgw/driver/rados/groups.cc')
-rw-r--r--src/rgw/driver/rados/groups.cc135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/rgw/driver/rados/groups.cc b/src/rgw/driver/rados/groups.cc
new file mode 100644
index 00000000000..21f66e7b7d5
--- /dev/null
+++ b/src/rgw/driver/rados/groups.cc
@@ -0,0 +1,135 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab ft=cpp
+
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright contributors to the Ceph project
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ *
+ */
+
+#include "groups.h"
+
+#include "include/rados/librados.hpp"
+#include "common/ceph_json.h"
+#include "common/dout.h"
+#include "cls/user/cls_user_client.h"
+#include "rgw_sal.h"
+
+namespace rgwrados::groups {
+
+int add(const DoutPrefixProvider* dpp,
+ optional_yield y,
+ librados::Rados& rados,
+ const rgw_raw_obj& obj,
+ const RGWGroupInfo& group,
+ bool exclusive, uint32_t limit)
+{
+ resource_metadata meta;
+ meta.group_id = group.id;
+
+ cls_user_account_resource resource;
+ resource.name = group.name;
+ resource.path = group.path;
+ encode(meta, resource.metadata);
+
+ rgw_rados_ref ref;
+ int r = rgw_get_rados_ref(dpp, &rados, obj, &ref);
+ if (r < 0) {
+ return r;
+ }
+
+ librados::ObjectWriteOperation op;
+ ::cls_user_account_resource_add(op, resource, exclusive, limit);
+ return ref.operate(dpp, &op, y);
+}
+
+int remove(const DoutPrefixProvider* dpp,
+ optional_yield y,
+ librados::Rados& rados,
+ const rgw_raw_obj& obj,
+ std::string_view name)
+{
+ rgw_rados_ref ref;
+ int r = rgw_get_rados_ref(dpp, &rados, obj, &ref);
+ if (r < 0) {
+ return r;
+ }
+
+ librados::ObjectWriteOperation op;
+ ::cls_user_account_resource_rm(op, name);
+ return ref.operate(dpp, &op, y);
+}
+
+int list(const DoutPrefixProvider* dpp,
+ optional_yield y,
+ librados::Rados& rados,
+ const rgw_raw_obj& obj,
+ std::string_view marker,
+ std::string_view path_prefix,
+ uint32_t max_items,
+ std::vector<std::string>& ids,
+ std::string& next_marker)
+{
+ rgw_rados_ref ref;
+ int r = rgw_get_rados_ref(dpp, &rados, obj, &ref);
+ if (r < 0) {
+ return r;
+ }
+
+ librados::ObjectReadOperation op;
+ std::vector<cls_user_account_resource> entries;
+ bool truncated = false;
+ int ret = 0;
+ ::cls_user_account_resource_list(op, marker, path_prefix, max_items,
+ entries, &truncated, &next_marker, &ret);
+
+ r = ref.operate(dpp, &op, nullptr, y);
+ if (r == -ENOENT) {
+ next_marker.clear();
+ return 0;
+ }
+ if (r < 0) {
+ return r;
+ }
+ if (ret < 0) {
+ return ret;
+ }
+
+ for (auto& resource : entries) {
+ resource_metadata meta;
+ try {
+ auto p = resource.metadata.cbegin();
+ decode(meta, p);
+ } catch (const buffer::error&) {
+ return -EIO;
+ }
+ ids.push_back(std::move(meta.group_id));
+ }
+
+ if (!truncated) {
+ next_marker.clear();
+ }
+ return 0;
+}
+
+
+void resource_metadata::dump(ceph::Formatter* f) const
+{
+ encode_json("group_id", group_id, f);
+}
+
+void resource_metadata::generate_test_instances(std::list<resource_metadata*>& o)
+{
+ o.push_back(new resource_metadata);
+ auto m = new resource_metadata;
+ m->group_id = "id";
+ o.push_back(m);
+}
+
+} // namespace rgwrados::groups