]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
svc: role: introduce create role
authorPritha Srivastava <prsrivas@redhat.com>
Tue, 5 Oct 2021 09:18:05 +0000 (14:48 +0530)
committerPritha Srivastava <prsrivas@redhat.com>
Mon, 6 Jun 2022 10:49:42 +0000 (16:19 +0530)
Signed-off-by: Abhishek Lekshmanan <abhishek@suse.com>
src/rgw/rgw_role.h
src/rgw/services/svc_role.h
src/rgw/services/svc_role_rados.cc
src/rgw/services/svc_role_rados.h

index 5156a95533cbd6e176aa406ef5e0ab3fd4e6cb7b..2b9ace400413ffcbcc2bea7b31834f6c416f17fb 100644 (file)
@@ -125,6 +125,8 @@ public:
   const uint64_t& get_max_session_duration() const { return max_session_duration; }
 
   void set_id(const std::string& id) { this->id = id; }
+  void set_arn(const std::string& arn) { this->arn = arn; }
+  void set_creation_date(const std::string& creation_date) { this->creation_date = creation_date; }
 
   virtual int create(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y);
   virtual int delete_obj(const DoutPrefixProvider *dpp, optional_yield y);
index 8ca2d242601986f350f2aa80bc55bf4fb86f64db..eb07ef4f455ce26f8b0d94150617bfbb17c854b4 100644 (file)
@@ -30,6 +30,15 @@ class RGWSI_Role: public RGWServiceInstance
   static std::string get_role_name_meta_key(const std::string& role_name, const std::string& tenant);
   static std::string get_role_path_meta_key(const std::string& path, const std::string& role_id, const std::string& tenant);
 
+  virtual int create(RGWSI_MetaBackend::Context *ctx,
+                    rgw::sal::RGWRole& role,
+                    RGWObjVersionTracker * const objv_tracker,
+                    const real_time& pmtime,
+                    bool exclusive,
+                    std::map<std::string, bufferlist> * pattrs,
+                    optional_yield y,
+                        const DoutPrefixProvider *dpp) = 0;
+
   virtual int store_info(RGWSI_MetaBackend::Context *ctx,
                         const rgw::sal::RGWRole& role,
                         RGWObjVersionTracker * const objv_tracker,
@@ -85,7 +94,7 @@ class RGWSI_Role: public RGWServiceInstance
             const DoutPrefixProvider *dpp) = 0;
 
   virtual int delete_info(RGWSI_MetaBackend::Context *ctx,
-                         const std::string& name,
+                         const rgw::sal::RGWRole& info,
                          RGWObjVersionTracker * const objv_tracker,
                          optional_yield y,
                          const DoutPrefixProvider *dpp) = 0;
index 91bd293d7358ea2c49f8eb8bb0a506a5a89bb91a..7b148d8affbde78ab4f936495f804db6e63507ee 100644 (file)
@@ -4,6 +4,7 @@
 #include "rgw_role.h"
 #include "rgw_zone.h"
 #include "svc_zone.h"
+#include "rgw_tools.h"
 
 #define dout_subsys ceph_subsys_rgw
 
@@ -80,6 +81,130 @@ int RGWSI_Role_RADOS::do_start(optional_yield y, const DoutPrefixProvider *dpp)
   return 0;
 }
 
+class PutRole
+{
+  RGWSI_Role_RADOS* svc_role;
+  RGWSI_MetaBackend::Context *ctx;
+  rgw::sal::RGWRole& info;
+  RGWObjVersionTracker *objv_tracker;
+  const real_time& mtime;
+  bool exclusive;
+  std::map<std::string, bufferlist> *pattrs;
+  optional_yield y;
+  const DoutPrefixProvider *dpp;
+
+public:
+  PutRole(RGWSI_Role_RADOS* _svc,
+          RGWSI_MetaBackend::Context *_ctx,
+          rgw::sal::RGWRole& _info,
+          RGWObjVersionTracker *_ot,
+          const real_time& _mtime,
+          bool _exclusive,
+          std::map<std::string, bufferlist> *_pattrs,
+          optional_yield _y,
+          const DoutPrefixProvider *dpp) :
+    svc_role(_svc), ctx(_ctx), info(_info), objv_tracker(_ot),
+    mtime(_mtime), exclusive(_exclusive), pattrs(_pattrs), y(_y), dpp(dpp)
+  {}
+
+  // Creation time
+  auto generate_ctime() {
+    real_clock::time_point t = real_clock::now();
+
+    struct timeval tv;
+    real_clock::to_timeval(t, tv);
+
+    char buf[30];
+    struct tm result;
+    gmtime_r(&tv.tv_sec, &result);
+    strftime(buf,30,"%Y-%m-%dT%H:%M:%S", &result);
+    sprintf(buf + strlen(buf),".%dZ",(int)tv.tv_usec/1000);
+    return std::string(std::begin(buf), std::end(buf));
+  }
+
+
+  void populate_info(rgw::sal::RGWRole& info) {
+    uuid_d new_role_id;
+    new_role_id.generate_random();
+
+    info.set_id(new_role_id.to_string());
+    info.set_arn(role_arn_prefix + info.get_tenant() + ":role" + info.get_path() + info.get_name());
+    info.set_creation_date(generate_ctime());
+  }
+
+  int prepare() {
+
+    if (exclusive) {
+      // TODO replace this with a stat call instead we don't really need to read
+      // the values here
+      real_time _mtime;
+      std::string name = info.get_name();
+      std::string tenant = info.get_tenant();
+      std::string id = info.get_id();
+
+      int ret = svc_role->read_name(ctx, name, tenant, id,
+                                    objv_tracker, &_mtime, y, dpp);
+      if (ret == 0) {
+        ldout(svc_role->ctx(), 0) << "ERROR: name " << info.get_name()
+                                  << " already in use for role id "
+                                  << info.get_id() << dendl;
+        return -EEXIST;
+      }
+    }
+
+    populate_info(info);
+    return 0;
+  }
+
+  int put() {
+    return svc_role->store_info(ctx, info, objv_tracker,
+                                mtime, exclusive, pattrs, y, dpp);
+  }
+
+  int complete() {
+    int r = svc_role->store_name(ctx, info.get_id(), info.get_name(), info.get_tenant(),
+                                 objv_tracker, mtime, exclusive, y, dpp);
+
+    if (r == 0) {
+      r = svc_role->store_path(ctx, info.get_id(), info.get_path(), info.get_tenant(),
+                               objv_tracker, mtime, exclusive, y, dpp);
+    }
+
+    if (r < 0) {
+      svc_role->delete_info(ctx, info, objv_tracker, y, dpp);
+      svc_role->delete_name(ctx, info.get_name(), info.get_tenant(), objv_tracker, y, dpp);
+    }
+
+    return r;
+  }
+
+};
+
+
+int RGWSI_Role_RADOS::create(RGWSI_MetaBackend::Context *ctx,
+                             rgw::sal::RGWRole& info,
+                             RGWObjVersionTracker * const objv_tracker,
+                             const real_time& mtime,
+                             bool exclusive,
+                             std::map<std::string, bufferlist> * pattrs,
+                             optional_yield y,
+                             const DoutPrefixProvider *dpp)
+{
+  PutRole Op(this, ctx, info, objv_tracker, mtime, exclusive, pattrs, y, dpp);
+
+  int r = Op.prepare();
+  if (r < 0) {
+    return r;
+  }
+
+  r = Op.put();
+  if (r < 0) {
+    return r;
+  }
+
+  return Op.complete();
+}
+
 int RGWSI_Role_RADOS::store_info(RGWSI_MetaBackend::Context *ctx,
                                  const rgw::sal::RGWRole& role,
                                  RGWObjVersionTracker * const objv_tracker,
@@ -111,10 +236,16 @@ int RGWSI_Role_RADOS::store_name(RGWSI_MetaBackend::Context *ctx,
 
   bufferlist data_bl;
   encode(nameToId, data_bl);
-  RGWSI_MBSObj_PutParams params(data_bl, nullptr, mtime, exclusive);
 
-  return svc.meta_be->put(ctx, get_role_name_meta_key(name, tenant),
-                          params, objv_tracker, y, dpp);
+  RGWSI_MetaBackend_SObj::Context_SObj *sys_ctx = static_cast<RGWSI_MetaBackend_SObj::Context_SObj *>(ctx);
+  return rgw_put_system_obj(dpp, *sys_ctx->obj_ctx,
+                            svc.zone->get_zone_params().roles_pool,
+                            get_role_name_meta_key(name, tenant),
+                            data_bl,
+                            exclusive,
+                            objv_tracker,
+                            mtime,
+                            y);
 }
 
 
@@ -128,11 +259,16 @@ int RGWSI_Role_RADOS::store_path(RGWSI_MetaBackend::Context *ctx,
                                  optional_yield y,
                                  const DoutPrefixProvider *dpp)
 {
-  bufferlist data_bl;
-  RGWSI_MBSObj_PutParams params(data_bl, nullptr, mtime, exclusive);
-  return svc.meta_be->put(ctx, get_role_path_meta_key(path, role_id, tenant),
-                          params, objv_tracker, y, dpp);
-
+  bufferlist bl;
+  RGWSI_MetaBackend_SObj::Context_SObj *sys_ctx = static_cast<RGWSI_MetaBackend_SObj::Context_SObj *>(ctx);
+  return rgw_put_system_obj(dpp, *sys_ctx->obj_ctx,
+                            svc.zone->get_zone_params().roles_pool,
+                            get_role_path_meta_key(path, role_id, tenant),
+                            bl,
+                            exclusive,
+                            objv_tracker,
+                            mtime,
+                            y);
 }
 
 
@@ -172,11 +308,17 @@ int RGWSI_Role_RADOS::read_name(RGWSI_MetaBackend::Context *ctx,
                                 optional_yield y,
                                 const DoutPrefixProvider *dpp)
 {
-  bufferlist data_bl;
-  RGWSI_MBSObj_GetParams params(&data_bl, nullptr, pmtime);
 
-  int r = svc.meta_be->get_entry(ctx, get_role_name_meta_key(name, tenant),
-                                 params, objv_tracker, y, dpp);
+  bufferlist data_bl;
+  RGWSI_MetaBackend_SObj::Context_SObj *sys_ctx = static_cast<RGWSI_MetaBackend_SObj::Context_SObj *>(ctx);
+  int r = rgw_get_system_obj(*sys_ctx->obj_ctx,
+                             svc.zone->get_zone_params().roles_pool,
+                             get_role_name_meta_key(name, tenant),
+                             data_bl,
+                             nullptr,
+                             pmtime,
+                             y,
+                             dpp);
   if (r < 0)
     return r;
 
@@ -193,32 +335,39 @@ int RGWSI_Role_RADOS::read_name(RGWSI_MetaBackend::Context *ctx,
   return 0;
 }
 
-static int delete_oid(RGWSI_MetaBackend::Context *ctx,
-                      RGWSI_MetaBackend* meta_be,
+static int delete_oid(RGWSI_Role_RADOS::Svc svc,
+                      RGWSI_MetaBackend::Context *ctx,
                       const std::string& oid,
                       RGWObjVersionTracker * const objv_tracker,
                       optional_yield y,
                       const DoutPrefixProvider *dpp)
 {
-  RGWSI_MBSObj_RemoveParams params;
-  int r = meta_be->remove(ctx, oid, params, objv_tracker, y, dpp);
+  RGWSI_MetaBackend_SObj::Context_SObj *sys_ctx = static_cast<RGWSI_MetaBackend_SObj::Context_SObj *>(ctx);
+  rgw_raw_obj obj(svc.zone->get_zone_params().roles_pool, oid);
+  auto sysobj = sys_ctx->obj_ctx->get_obj(obj);
+  int r =  sysobj.wop().remove(dpp, y);
   if (r < 0 && r != -ENOENT && r != -ECANCELED) {
-    ldout(meta_be->ctx(),0) << "ERROR: RGWSI_Role: could not remove oid = "
-                                << oid << " r = "<< r << dendl;
+    ldout(svc.meta_be->ctx(),0) << "ERROR: RGWSI_Role: could not remove oid = "
+                            << oid << " r = "<< r << dendl;
     return r;
   }
   return 0;
 }
 
 int RGWSI_Role_RADOS::delete_info(RGWSI_MetaBackend::Context *ctx,
-                                  const std::string& role_id,
+                                  const rgw::sal::RGWRole& info,
                                   RGWObjVersionTracker * const objv_tracker,
                                   optional_yield y,
                                   const DoutPrefixProvider *dpp)
 {
+  RGWSI_MBSObj_RemoveParams params;
+  int r = svc.meta_be->remove(ctx, info.get_id(), params, objv_tracker, y, dpp);
+  if (r < 0 && r != -ENOENT && r != -ECANCELED) {
+    ldout(svc.meta_be->ctx(),0) << "ERROR: RGWSI_Role: could not remove oid = "
+                            << info.get_id() << " r = "<< r << dendl;
+  }
 
-  return delete_oid(ctx, svc.meta_be, get_role_meta_key(role_id),
-                    objv_tracker, y, dpp);
+  return r;
 }
 
 int RGWSI_Role_RADOS::delete_name(RGWSI_MetaBackend::Context *ctx,
@@ -228,7 +377,7 @@ int RGWSI_Role_RADOS::delete_name(RGWSI_MetaBackend::Context *ctx,
                                   optional_yield y,
                                   const DoutPrefixProvider *dpp)
 {
-  return delete_oid(ctx, svc.meta_be, get_role_name_meta_key(name, tenant),
+  return delete_oid(svc, ctx, get_role_name_meta_key(name, tenant),
                     objv_tracker, y, dpp);
 
 }
@@ -241,7 +390,7 @@ int RGWSI_Role_RADOS::delete_path(RGWSI_MetaBackend::Context *ctx,
                                   optional_yield y,
                                   const DoutPrefixProvider *dpp)
 {
-  return delete_oid(ctx, svc.meta_be, get_role_path_meta_key(path, role_id, tenant),
+  return delete_oid(svc, ctx, get_role_path_meta_key(path, role_id, tenant),
                     objv_tracker, y, dpp);
 
 }
index 4ab74d4719ec012c4f733e48e9d165105d430e56..51fbeaad9b9285548629ea7126286fedb23391f2 100644 (file)
@@ -48,6 +48,15 @@ class RGWSI_Role_RADOS: public RGWSI_Role
                 optional_yield y,
                 const DoutPrefixProvider *dpp) override;
 
+  int create(RGWSI_MetaBackend::Context *ctx,
+            rgw::sal::RGWRole& role,
+            RGWObjVersionTracker * const objv_tracker,
+            const real_time& pmtime,
+            bool exclusive,
+            std::map<std::string, bufferlist> * pattrs,
+            optional_yield y,
+                const DoutPrefixProvider *dpp) override;
+
   int store_name(RGWSI_MetaBackend::Context *ctx,
                 const std::string& role_id,
                 const std::string& name,
@@ -94,7 +103,7 @@ class RGWSI_Role_RADOS: public RGWSI_Role
                const DoutPrefixProvider *dpp) override { return 0; } // TODO impl me
 
   int delete_info(RGWSI_MetaBackend::Context *ctx,
-                 const std::string& name,
+                 const rgw::sal::RGWRole& info,
                  RGWObjVersionTracker * const objv_tracker,
                  optional_yield y,
                  const DoutPrefixProvider *dpp) override;