]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw/metadata: encapsulate role metadata handler in rgw_role.cc
authorCasey Bodley <cbodley@redhat.com>
Mon, 4 Dec 2023 01:27:05 +0000 (20:27 -0500)
committerCasey Bodley <cbodley@redhat.com>
Thu, 12 Sep 2024 20:55:01 +0000 (16:55 -0400)
Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/rgw/driver/posix/rgw_sal_posix.cc
src/rgw/driver/rados/rgw_service.cc
src/rgw/driver/rados/roles.cc
src/rgw/driver/rados/roles.h
src/rgw/rgw_rest_role.cc
src/rgw/rgw_role.cc
src/rgw/rgw_role.h
src/rgw/rgw_sal.h
src/rgw/rgw_sal_dbstore.cc
src/rgw/rgw_sal_fwd.h

index d676213727e43588438b5f2db3a863c9541163d1..0ce02bcff13fd0ebd5f862dc8a0d6ac91b4e8374 100644 (file)
@@ -20,6 +20,7 @@
 #include <unistd.h>
 #include "rgw_multi.h"
 #include "include/scope_guard.h"
+#include "common/errno.h"
 
 #define dout_subsys ceph_subsys_rgw
 #define dout_context g_ceph_context
index 5b9d71195607fb358e53bbaf744367faa6846177..f062a859c05621c1111a3ac0e4e0d9cf7c97780f 100644 (file)
@@ -385,7 +385,7 @@ int RGWCtlDef::init(RGWServices& svc, rgw::sal::Driver* driver,
 
   meta.otp = rgwrados::otp::create_metadata_handler(
       *svc.sysobj, *svc.cls, *svc.mdlog, svc.zone->get_zone_params());
-  meta.role = std::make_unique<rgw::sal::RGWRoleMetadataHandler>(driver, svc.role);
+  meta.role = create_role_metadata_handler(driver, svc.role);
   meta.account = rgwrados::account::create_metadata_handler(
       *svc.sysobj, svc.zone->get_zone_params());
   meta.group = rgwrados::group::create_metadata_handler(
index 62a0aef8aad5fedd82f47b68e7f174dc649a6aac..8503ece576cd23c9535a80faae6baed346de5b8c 100644 (file)
@@ -28,7 +28,7 @@ int add(const DoutPrefixProvider* dpp,
         optional_yield y,
         librados::Rados& rados,
         const rgw_raw_obj& obj,
-        const rgw::sal::RGWRoleInfo& role,
+        const RGWRoleInfo& role,
         bool exclusive, uint32_t limit)
 {
   resource_metadata meta;
index eb53820039edd91b890506c4434dc4d04c0a3f17..0aeb9ecc75d5e80e0722c27e3e3a2e917fdab73b 100644 (file)
@@ -25,6 +25,7 @@ namespace ceph { class Formatter; }
 class DoutPrefixProvider;
 class optional_yield;
 struct rgw_raw_obj;
+struct RGWRoleInfo;
 
 
 namespace rgwrados::roles {
@@ -34,7 +35,7 @@ int add(const DoutPrefixProvider* dpp,
         optional_yield y,
         librados::Rados& rados,
         const rgw_raw_obj& obj,
-        const rgw::sal::RGWRoleInfo& role,
+        const RGWRoleInfo& role,
         bool exclusive, uint32_t limit);
 
 /// Look up a role's id by name in the list.
index b824939582de5cdfb88b543d195debc1d6bcb128..b3d6b42ae6b9bb9e14f6b8dab349366fa6bf972b 100644 (file)
@@ -40,7 +40,7 @@ int RGWRestRole::check_caps(const RGWUserCaps& caps)
   return caps.check_cap("roles", perm);
 }
 
-static void dump_iam_role(const rgw::sal::RGWRoleInfo& role, Formatter *f)
+static void dump_iam_role(const RGWRoleInfo& role, Formatter *f)
 {
   encode_json("RoleId", role.id, f);
   encode_json("RoleName", role.name, f);
@@ -582,7 +582,7 @@ int RGWPutRolePolicy::init_processing(optional_yield y)
 
   try {
     // non-account identity policy is restricted to the current tenant
-    const rgw::sal::RGWRoleInfo& info = role->get_info();
+    const RGWRoleInfo& info = role->get_info();
     const std::string* policy_tenant = account_id.empty() ? &info.tenant : nullptr;
     const rgw::IAM::Policy p(
       s->cct, policy_tenant, perm_policy,
index bf9fb5d96f214b3d53238454334e7803bb924d27..bad16949ed738dd2df9fd8f35eb60b3b4d4534c8 100644 (file)
@@ -17,6 +17,7 @@
 #include "rgw_string.h"
 
 #include "rgw_common.h"
+#include "rgw_metadata.h"
 #include "rgw_tools.h"
 #include "rgw_role.h"
 
 
 using namespace std;
 
-namespace rgw { namespace sal {
-
-const string RGWRole::role_name_oid_prefix = "role_names.";
-const string RGWRole::role_oid_prefix = "roles.";
-const string RGWRole::role_path_oid_prefix = "role_paths.";
-const string RGWRole::role_arn_prefix = "arn:aws:iam::";
-
 void RGWRoleInfo::dump(Formatter *f) const
 {
   encode_json("RoleId", id , f);
@@ -134,6 +128,13 @@ void RGWRoleInfo::decode_json(JSONObj *obj)
   }
 }
 
+namespace rgw::sal {
+
+const string RGWRole::role_name_oid_prefix = "role_names.";
+const string RGWRole::role_oid_prefix = "roles.";
+const string RGWRole::role_path_oid_prefix = "role_paths.";
+const string RGWRole::role_arn_prefix = "arn:aws:iam::";
+
 RGWRole::RGWRole(std::string name,
               std::string tenant,
               rgw_account_id account_id,
@@ -347,10 +348,64 @@ const string& RGWRole::get_path_oid_prefix()
   return role_path_oid_prefix;
 }
 
-RGWRoleMetadataHandler::RGWRoleMetadataHandler(Driver* driver,
-                                              RGWSI_Role_RADOS *role_svc)
+} // namespace rgw::sal
+
+
+class RGWRoleMetadataObject: public RGWMetadataObject {
+  RGWRoleInfo info;
+public:
+  RGWRoleMetadataObject(const RGWRoleInfo& info, const obj_version& v, real_time m)
+    : RGWMetadataObject(v, m), info(info) {}
+
+  void dump(Formatter *f) const override {
+    info.dump(f);
+  }
+
+  RGWRoleInfo& get_role_info() {
+    return info;
+  }
+};
+
+class RGWRoleMetadataHandler: public RGWMetadataHandler_GenericMetaBE
+{
+ public:
+  RGWRoleMetadataHandler(rgw::sal::Driver* driver, RGWSI_Role_RADOS *role_svc);
+
+  std::string get_type() final { return "roles";  }
+
+  RGWMetadataObject *get_meta_obj(JSONObj *jo,
+                                 const obj_version& objv,
+                                 const ceph::real_time& mtime);
+
+  int do_get(RGWSI_MetaBackend_Handler::Op *op,
+            std::string& entry,
+            RGWMetadataObject **obj,
+            optional_yield y,
+       const DoutPrefixProvider *dpp) final;
+
+  int do_remove(RGWSI_MetaBackend_Handler::Op *op,
+               std::string& entry,
+               RGWObjVersionTracker& objv_tracker,
+               optional_yield y,
+    const DoutPrefixProvider *dpp) final;
+
+  int do_put(RGWSI_MetaBackend_Handler::Op *op,
+            std::string& entr,
+            RGWMetadataObject *obj,
+            RGWObjVersionTracker& objv_tracker,
+            optional_yield y,
+       const DoutPrefixProvider *dpp,
+            RGWMDLogSyncType type,
+       bool from_remote_zone) override;
+
+private:
+  rgw::sal::Driver* driver;
+};
+
+RGWRoleMetadataHandler::RGWRoleMetadataHandler(rgw::sal::Driver* driver,
+                                               RGWSI_Role_RADOS *role_svc)
+  : driver(driver)
 {
-  this->driver = driver;
   base_init(role_svc->ctx(), role_svc->get_be_handler());
 }
 
@@ -366,7 +421,7 @@ RGWMetadataObject *RGWRoleMetadataHandler::get_meta_obj(JSONObj *jo,
     return nullptr;
   }
 
-  return new RGWRoleMetadataObject(info, objv, mtime, driver);
+  return new RGWRoleMetadataObject(info, objv, mtime);
 }
 
 int RGWRoleMetadataHandler::do_get(RGWSI_MetaBackend_Handler::Op *op,
@@ -381,13 +436,11 @@ int RGWRoleMetadataHandler::do_get(RGWSI_MetaBackend_Handler::Op *op,
     return ret;
   }
 
+  const RGWRoleInfo& info = role->get_info();
   RGWObjVersionTracker objv_tracker = role->get_objv_tracker();
   real_time mtime = role->get_mtime();
 
-  RGWRoleInfo info = role->get_info();
-  RGWRoleMetadataObject *rdo = new RGWRoleMetadataObject(info, objv_tracker.read_version,
-                                                         mtime, driver);
-  *obj = rdo;
+  *obj = new RGWRoleMetadataObject(info, objv_tracker.read_version, mtime);
 
   return 0;
 }
@@ -409,10 +462,12 @@ int RGWRoleMetadataHandler::do_remove(RGWSI_MetaBackend_Handler::Op *op,
 
 class RGWMetadataHandlerPut_Role : public RGWMetadataHandlerPut_SObj
 {
+  rgw::sal::Driver* driver;
   RGWRoleMetadataHandler *rhandler;
   RGWRoleMetadataObject *mdo;
 public:
-  RGWMetadataHandlerPut_Role(RGWRoleMetadataHandler *handler,
+  RGWMetadataHandlerPut_Role(rgw::sal::Driver* driver,
+                             RGWRoleMetadataHandler *handler,
                              RGWSI_MetaBackend_Handler::Op *op,
                              std::string& entry,
                              RGWMetadataObject *obj,
@@ -421,14 +476,13 @@ public:
                              RGWMDLogSyncType type,
                              bool from_remote_zone) :
     RGWMetadataHandlerPut_SObj(handler, op, entry, obj, objv_tracker, y, type, from_remote_zone),
-    rhandler(handler) {
+    driver(driver), rhandler(handler) {
     mdo = static_cast<RGWRoleMetadataObject*>(obj);
   }
 
   int put_checked(const DoutPrefixProvider *dpp) override {
     auto& info = mdo->get_role_info();
     auto mtime = mdo->get_mtime();
-    auto* driver = mdo->get_driver();
     info.mtime = mtime;
     std::unique_ptr<rgw::sal::RGWRole> role = driver->get_role(info);
     constexpr bool exclusive = false;
@@ -450,8 +504,13 @@ int RGWRoleMetadataHandler::do_put(RGWSI_MetaBackend_Handler::Op *op,
                                    RGWMDLogSyncType type,
                                    bool from_remote_zone)
 {
-  RGWMetadataHandlerPut_Role put_op(this, op , entry, obj, objv_tracker, y, type, from_remote_zone);
+  RGWMetadataHandlerPut_Role put_op(driver, this, op , entry, obj, objv_tracker, y, type, from_remote_zone);
   return do_put_operate(&put_op, dpp);
 }
 
-} } // namespace rgw::sal
+auto create_role_metadata_handler(rgw::sal::Driver* driver,
+                                  RGWSI_Role_RADOS *role_svc)
+    -> std::unique_ptr<RGWMetadataHandler>
+{
+  return std::make_unique<RGWRoleMetadataHandler>(driver, role_svc);
+}
index 585f723973573f6e3261c18dc37690057c033e28..521d77ab13bbc2f571f17605eacffbc31fdacb01 100644 (file)
@@ -3,20 +3,18 @@
 
 #pragma once
 
+#include <map>
 #include <string>
 
+#include "include/encoding.h"
 #include "common/async/yield_context.h"
-
-#include "common/ceph_json.h"
 #include "common/ceph_context.h"
-#include "rgw_rados.h"
-#include "rgw_metadata.h"
+#include "common/ceph_json.h"
+#include "common/ceph_time.h"
+#include "rgw_common.h"
 #include "rgw_iam_managed_policy.h"
 
-class RGWRados;
-
-namespace rgw { namespace sal {
-struct RGWRoleInfo
+struct RGWRoleInfo // TODO: move to rgw_common.h
 {
   std::string id;
   std::string name;
@@ -34,7 +32,7 @@ struct RGWRoleInfo
   std::multimap<std::string,std::string> tags;
   std::map<std::string, bufferlist> attrs;
   RGWObjVersionTracker objv_tracker;
-  real_time mtime;
+  ceph::real_time mtime;
   rgw_account_id account_id;
 
   RGWRoleInfo() = default;
@@ -86,6 +84,8 @@ struct RGWRoleInfo
 };
 WRITE_CLASS_ENCODER(RGWRoleInfo)
 
+namespace rgw::sal {
+
 class RGWRole
 {
 public:
@@ -164,62 +164,12 @@ public:
   static const std::string& get_path_oid_prefix();
 };
 
-class RGWRoleMetadataObject: public RGWMetadataObject {
-  RGWRoleInfo info;
-  Driver* driver;
-public:
-  RGWRoleMetadataObject() = default;
-  RGWRoleMetadataObject(RGWRoleInfo& info,
-                       const obj_version& v,
-                       real_time m,
-      Driver* driver) : RGWMetadataObject(v,m), info(info), driver(driver) {}
-
-  void dump(Formatter *f) const override {
-    info.dump(f);
-  }
+} // namespace rgw::sal
 
-  RGWRoleInfo& get_role_info() {
-    return info;
-  }
 
-  Driver* get_driver() {
-    return driver;
-  }
-};
+class RGWMetadataHandler;
+class RGWSI_Role_RADOS;
 
-class RGWRoleMetadataHandler: public RGWMetadataHandler_GenericMetaBE
-{
-public:
-  RGWRoleMetadataHandler(Driver* driver, RGWSI_Role_RADOS *role_svc);
-
-  std::string get_type() final { return "roles";  }
-
-  RGWMetadataObject *get_meta_obj(JSONObj *jo,
-                                 const obj_version& objv,
-                                 const ceph::real_time& mtime);
-
-  int do_get(RGWSI_MetaBackend_Handler::Op *op,
-            std::string& entry,
-            RGWMetadataObject **obj,
-            optional_yield y,
-       const DoutPrefixProvider *dpp) final;
-
-  int do_remove(RGWSI_MetaBackend_Handler::Op *op,
-               std::string& entry,
-               RGWObjVersionTracker& objv_tracker,
-               optional_yield y,
-    const DoutPrefixProvider *dpp) final;
-
-  int do_put(RGWSI_MetaBackend_Handler::Op *op,
-            std::string& entr,
-            RGWMetadataObject *obj,
-            RGWObjVersionTracker& objv_tracker,
-            optional_yield y,
-       const DoutPrefixProvider *dpp,
-            RGWMDLogSyncType type,
-       bool from_remote_zone) override;
-
-private:
-  Driver* driver;
-};
-} } // namespace rgw::sal
+auto create_role_metadata_handler(rgw::sal::Driver* driver,
+                                  RGWSI_Role_RADOS *role_svc)
+    -> std::unique_ptr<RGWMetadataHandler>;
index d6129165689ac4ab01572361f28f137dead0fb2b..f89aa6f4e6602d100e7d170d662709e933ce55b7 100644 (file)
@@ -48,6 +48,7 @@ struct rgw_pubsub_bucket_topics;
 class RGWZonePlacementInfo;
 struct rgw_pubsub_topic;
 struct RGWOIDCProviderInfo;
+struct RGWRoleInfo;
 
 using RGWBucketListNameFilter = std::function<bool (const std::string&)>;
 
index 5f8bab7081772ccec175b60eba9a0cc0e698c97b..d3af42cf2ec0399666676edb50673bb2bca30c48 100644 (file)
@@ -26,6 +26,8 @@
 #include "rgw_sal_dbstore.h"
 #include "rgw_bucket.h"
 
+#include "driver/rados/rgw_rados.h" // XXX: for RGW_OBJ_NS_MULTIPART, PUT_OBJ_CREATE, etc
+
 #define dout_subsys ceph_subsys_rgw
 
 using namespace std;
index e447cba4aae79e225045877fad109cb327033328..566a933f8ca05fa592b8e501e73f8eb78034210d 100644 (file)
@@ -45,7 +45,6 @@ namespace sal {
   class ZoneGroup;
   class Zone;
   class LuaManager;
-  struct RGWRoleInfo;
   class RGWRole;
   struct RoleList;
   struct GroupList;