]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw/multisite: handle secondary zone's response appropriately
authorShilpa Jagannath <smanjara@redhat.com>
Fri, 8 Aug 2025 23:34:54 +0000 (19:34 -0400)
committerThomas Serlin <tserlin@redhat.com>
Mon, 22 Sep 2025 19:18:18 +0000 (15:18 -0400)
depending on primary zone's version.
decode primary's response only when generate-key is true.

Signed-off-by: Shilpa Jagannath <smanjara@redhat.com>
(cherry picked from commit f1f55030a5bc982c3ead6ed756643e33aeec689e)

src/rgw/driver/rados/rgw_rest_user.cc
src/rgw/driver/rados/rgw_user.cc
src/rgw/driver/rados/rgw_user.h

index 18c0386c15b0efb6c82d5a3b1c7085e1d33a6ee7..c5f8b530f676ef9f602dff4ca7b777c07aa612a9 100644 (file)
@@ -15,6 +15,7 @@
 #include "services/svc_zone.h"
 #include "services/svc_sys_obj.h"
 #include "rgw_zone.h"
+#include "common/ceph_json.h"
 
 #define dout_subsys ceph_subsys_rgw
 
@@ -47,6 +48,21 @@ int fetch_access_keys_from_master(const DoutPrefixProvider* dpp, req_state* s,
   return 0;
 }
 
+
+static void dump_access_keys(Formatter *f, std::vector<RGWAccessKey>& access_keys)
+{
+  f->open_array_section("keys");
+  for (auto& k : access_keys) {
+    f->open_object_section("key");
+    f->dump_string("access_key", k.id);
+    f->dump_string("secret_key", k.key);
+    f->dump_bool("active", k.active);
+    encode_json("create_date", k.create_date, f);
+    f->close_section();
+  }
+  f->close_section();
+}
+
 class RGWOp_User_List : public RGWRESTOp {
 
 public:
@@ -566,6 +582,7 @@ void RGWOp_Subuser_Create::execute(optional_yield y)
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
   }
+
   op_ret = RGWUserAdminOp_Subuser::create(s, driver, op_state, flusher, y);
 }
 
@@ -745,16 +762,20 @@ void RGWOp_Key_Create::execute(optional_yield y)
       return;
     }
 
-    RGWAccessKey key;
-    try {
-      key.decode_json(&jp);
-    } catch (const JSONDecoder::err& e) {
-      cout << "failed to decode JSON input: " << e.what() << std::endl;
-      ret = -EINVAL;
-      return;
-    }
-    op_state.op_master_key = std::move(key);
+    if (gen_key) { // if generate-key is false, we simply read the user input key and store them
+      RGWAccessKey key;
+      try {
+        key.decode_json(&jp);
+      } catch (const JSONDecoder::err& e) {
+        Formatter *formatter = flusher.get_formatter();
+        std::vector<RGWAccessKey> access_keys;
+        decode_json_obj(access_keys, &jp);
+        dump_access_keys(formatter, access_keys);
+        return;
+      }
 
+      op_state.op_master_key = std::move(key);
+    }
     // set_generate_key() is not set if keys have already been fetched from master zone
     gen_key = false;
   }
index ac202823c11fdf1edd590a35d3a502679a4e5752..dba2276623a516ead5ad41d75ed3805ffcbefdad 100644 (file)
@@ -82,10 +82,7 @@ static void dump_subusers_info(Formatter *f, RGWUserInfo &info)
     f->open_object_section("user");
     string s;
     info.user_id.to_str(s);
-    f->dump_format("id", "%s:%s", s.c_str(), u.name.c_str());
-    char buf[256];
-    rgw_perm_to_str(u.perm_mask, buf, sizeof(buf));
-    f->dump_string("permissions", buf);
+    u.dump(f, s);
     f->close_section();
   }
   f->close_section();
@@ -97,35 +94,21 @@ static void dump_access_keys_info(Formatter *f, RGWUserInfo &info)
   f->open_array_section("keys");
   for (kiter = info.access_keys.begin(); kiter != info.access_keys.end(); ++kiter) {
     RGWAccessKey& k = kiter->second;
-    const char *sep = (k.subuser.empty() ? "" : ":");
-    const char *subuser = (k.subuser.empty() ? "" : k.subuser.c_str());
     f->open_object_section("key");
     string s;
     info.user_id.to_str(s);
-    f->dump_format("user", "%s%s%s", s.c_str(), sep, subuser);
-    f->dump_string("access_key", k.id);
-    f->dump_string("secret_key", k.key);
-    f->dump_bool("active", k.active);
-    encode_json("create_date", k.create_date, f);
+    k.dump(f, s, false);
     f->close_section();
   }
   f->close_section();
 }
 
-
-static void dump_master_key(Formatter *f, RGWUserInfo &info)
+static void dump_master_key(Formatter *f, RGWUserInfo& info, RGWAccessKey& k)
 {
-  f->open_object_section("user_info");
-  RGWAccessKey& k = info.master_key;
-  const char *sep = (k.subuser.empty() ? "" : ":");
-  const char *subuser = (k.subuser.empty() ? "" : k.subuser.c_str());
+  f->open_object_section("key");
   string s;
   info.user_id.to_str(s);
-  f->dump_format("user", "%s%s%s", s.c_str(), sep, subuser);
-  f->dump_string("access_key", k.id);
-  f->dump_string("secret_key", k.key);
-  f->dump_bool("active", k.active);
-  encode_json("create_date", k.create_date, f);
+  k.dump(f, s, false);
   f->close_section();
 }
 
@@ -283,7 +266,6 @@ int RGWAccessKeyPool::init(RGWUserAdminOpState& op_state)
 
   swift_keys = op_state.get_swift_keys();
   access_keys = op_state.get_access_keys();
-  master_key = op_state.get_master_key();
 
   keys_allowed = true;
 
@@ -364,11 +346,6 @@ map<std::string, RGWAccessKey>* RGWUserAdminOpState::get_access_keys()
   return &user->get_info().access_keys;
 }
 
-RGWAccessKey *RGWUserAdminOpState::get_master_key()
-{
-  return &user->get_info().master_key;
-}
-
 map<std::string, RGWSubUser>* RGWUserAdminOpState::get_subusers()
 {
   return &user->get_info().subusers;
@@ -666,8 +643,8 @@ int RGWAccessKeyPool::generate_key(const DoutPrefixProvider *dpp, RGWUserAdminOp
       new_key.id = id;
       new_key.key = key;
       access_keys->emplace(id, new_key);
+      op_state.op_master_key = new_key;
     }
-    *master_key = new_key;
   } else if (key_type == KEY_TYPE_SWIFT) {
     swift_keys->emplace(id, new_key);
   }
@@ -2454,6 +2431,7 @@ int RGWUserAdminOp_User::create(const DoutPrefixProvider *dpp,
     return ret;
   }
 
+
   ret = user.info(info, NULL);
   if (ret < 0)
     return ret;
@@ -2643,7 +2621,7 @@ int RGWUserAdminOp_Key::create(const DoutPrefixProvider *dpp,
       dump_swift_keys_info(formatter, info);
 
     else if (key_type == KEY_TYPE_S3) {
-      dump_master_key(formatter, info);
+      dump_master_key(formatter, info, op_state.op_master_key);
     }
 
     flusher.flush();
index bda4858b2967101a4036a4cbef6f3cc73a821e32..ce470afa1e20ed76a209f8e54cfd308eb24058ed 100644 (file)
@@ -149,6 +149,7 @@ struct RGWUserAdminOpState {
   std::map<std::string, RGWAccessKey> op_access_keys;
   // access key fetched for a user in the middle of a create_key op
   RGWAccessKey op_master_key;
+
   int32_t key_type{-1};
   bool access_key_exist = false;
   std::optional<bool> access_key_active;