From: Casey Bodley Date: Mon, 4 Dec 2023 01:27:05 +0000 (-0500) Subject: rgw/metadata: encapsulate role metadata handler in rgw_role.cc X-Git-Tag: v20.0.0~1070^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=78bbf69b57f1495b157e29f1eb276a235c140627;p=ceph.git rgw/metadata: encapsulate role metadata handler in rgw_role.cc Signed-off-by: Casey Bodley --- diff --git a/src/rgw/driver/posix/rgw_sal_posix.cc b/src/rgw/driver/posix/rgw_sal_posix.cc index d676213727e4..0ce02bcff13f 100644 --- a/src/rgw/driver/posix/rgw_sal_posix.cc +++ b/src/rgw/driver/posix/rgw_sal_posix.cc @@ -20,6 +20,7 @@ #include #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 diff --git a/src/rgw/driver/rados/rgw_service.cc b/src/rgw/driver/rados/rgw_service.cc index 5b9d71195607..f062a859c056 100644 --- a/src/rgw/driver/rados/rgw_service.cc +++ b/src/rgw/driver/rados/rgw_service.cc @@ -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(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( diff --git a/src/rgw/driver/rados/roles.cc b/src/rgw/driver/rados/roles.cc index 62a0aef8aad5..8503ece576cd 100644 --- a/src/rgw/driver/rados/roles.cc +++ b/src/rgw/driver/rados/roles.cc @@ -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; diff --git a/src/rgw/driver/rados/roles.h b/src/rgw/driver/rados/roles.h index eb53820039ed..0aeb9ecc75d5 100644 --- a/src/rgw/driver/rados/roles.h +++ b/src/rgw/driver/rados/roles.h @@ -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. diff --git a/src/rgw/rgw_rest_role.cc b/src/rgw/rgw_rest_role.cc index b824939582de..b3d6b42ae6b9 100644 --- a/src/rgw/rgw_rest_role.cc +++ b/src/rgw/rgw_rest_role.cc @@ -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, diff --git a/src/rgw/rgw_role.cc b/src/rgw/rgw_role.cc index bf9fb5d96f21..bad16949ed73 100644 --- a/src/rgw/rgw_role.cc +++ b/src/rgw/rgw_role.cc @@ -17,6 +17,7 @@ #include "rgw_string.h" #include "rgw_common.h" +#include "rgw_metadata.h" #include "rgw_tools.h" #include "rgw_role.h" @@ -30,13 +31,6 @@ 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(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 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 +{ + return std::make_unique(driver, role_svc); +} diff --git a/src/rgw/rgw_role.h b/src/rgw/rgw_role.h index 585f72397357..521d77ab13bb 100644 --- a/src/rgw/rgw_role.h +++ b/src/rgw/rgw_role.h @@ -3,20 +3,18 @@ #pragma once +#include #include +#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 tags; std::map 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; diff --git a/src/rgw/rgw_sal.h b/src/rgw/rgw_sal.h index d6129165689a..f89aa6f4e660 100644 --- a/src/rgw/rgw_sal.h +++ b/src/rgw/rgw_sal.h @@ -48,6 +48,7 @@ struct rgw_pubsub_bucket_topics; class RGWZonePlacementInfo; struct rgw_pubsub_topic; struct RGWOIDCProviderInfo; +struct RGWRoleInfo; using RGWBucketListNameFilter = std::function; diff --git a/src/rgw/rgw_sal_dbstore.cc b/src/rgw/rgw_sal_dbstore.cc index 5f8bab708177..d3af42cf2ec0 100644 --- a/src/rgw/rgw_sal_dbstore.cc +++ b/src/rgw/rgw_sal_dbstore.cc @@ -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; diff --git a/src/rgw/rgw_sal_fwd.h b/src/rgw/rgw_sal_fwd.h index e447cba4aae7..566a933f8ca0 100644 --- a/src/rgw/rgw_sal_fwd.h +++ b/src/rgw/rgw_sal_fwd.h @@ -45,7 +45,6 @@ namespace sal { class ZoneGroup; class Zone; class LuaManager; - struct RGWRoleInfo; class RGWRole; struct RoleList; struct GroupList;