]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/lua: allow bucket name override in pre request 46978/head
authorYuval Lifshitz <ylifshit@redhat.com>
Sun, 12 Jun 2022 17:58:40 +0000 (20:58 +0300)
committerYuval Lifshitz <ylifshit@redhat.com>
Tue, 5 Jul 2022 18:12:57 +0000 (21:12 +0300)
Signed-off-by: Yuval Lifshitz <ylifshit@redhat.com>
doc/radosgw/lua-scripting.rst
src/rgw/rgw_lua_request.cc
src/test/rgw/test_rgw_lua.cc

index dbfd4b016e56b8c59acace2e29a0c1fc59a37683..750a91397ac25d4b5c6b70c805f7f217964de0c8 100644 (file)
@@ -149,7 +149,7 @@ Request Fields
 +----------------------------------------------------+----------+--------------------------------------------------------------+----------+-----------+----------+
 | ``Request.Bucket.Tenant``                          | string   | tenant of the bucket                                         | no       | no        | yes      |
 +----------------------------------------------------+----------+--------------------------------------------------------------+----------+-----------+----------+
-| ``Request.Bucket.Name``                            | string   | bucket name                                                  | no       | no        | no       |
+| ``Request.Bucket.Name``                            | string   | bucket name (writeable only in `preRequest` context)         | no       | yes       | no       |
 +----------------------------------------------------+----------+--------------------------------------------------------------+----------+-----------+----------+
 | ``Request.Bucket.Marker``                          | string   | bucket marker (initial id)                                   | no       | no        | yes      |
 +----------------------------------------------------+----------+--------------------------------------------------------------+----------+-----------+----------+
index 1974a2b8bc965cab9befca996f12ab379200b70e..3e9e0521b27ead7a996782956737fe0856b29e9b 100644 (file)
@@ -324,6 +324,21 @@ struct BucketMetaTable : public EmptyMetaTable {
     }
     return ONE_RETURNVAL;
   }
+  
+  static int NewIndexClosure(lua_State* L) {
+    const auto s = reinterpret_cast<req_state*>(lua_touserdata(L, lua_upvalueindex(FIRST_UPVAL)));
+    const auto bucket = s->bucket.get();
+
+    const char* index = luaL_checkstring(L, 2);
+
+    if (rgw::sal::Bucket::empty(bucket)) {
+      if (strcasecmp(index, "Name") == 0) {
+        s->init_state.url_bucket = luaL_checkstring(L, 3);
+        return NO_RETURNVAL;
+      }
+    }
+    return error_unknown_field(L, index, TableName());
+  }
 };
 
 struct ObjectMetaTable : public EmptyMetaTable {
index eeca2a09267a6ecc871ae7a365921453448d4ef6..b09848e53b4941acda8db3fe04b966c0c92824b3 100644 (file)
@@ -343,6 +343,39 @@ TEST(TestRGWLua, Bucket)
   ASSERT_EQ(rc, 0);
 }
 
+TEST(TestRGWLua, WriteBucket)
+{
+  const std::string script = R"(
+    assert(Request.Bucket)
+    assert(Request.Bucket.Name == "myname")
+    Request.Bucket.Name = "othername"
+  )";
+
+  DEFINE_REQ_STATE;
+  s.init_state.url_bucket = "myname";
+
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  ASSERT_EQ(rc, 0);
+  ASSERT_EQ(s.init_state.url_bucket, "othername");
+}
+
+TEST(TestRGWLua, WriteBucketFail)
+{
+  const std::string script = R"(
+    assert(Request.Bucket)
+    assert(Request.Bucket.Name == "myname")
+    Request.Bucket.Name = "othername"
+  )";
+
+  DEFINE_REQ_STATE;
+  rgw_bucket b;
+  b.name = "myname";
+  s.bucket.reset(new sal::RadosBucket(nullptr, b));
+
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  ASSERT_NE(rc, 0);
+}
+
 TEST(TestRGWLua, GenericAttributes)
 {
   const std::string script = R"(