Hey Yuval, No problem. It was interesting to me to figure out how it all fits together and works. Thanks for opening an issue on the tracker. Cheers, Tom On Thu, 27 Apr 2023 at 15:03, Yuval Lifshitz <ylifshit@xxxxxxxxxx> wrote: > Hi Thomas, > Thanks for the detailed info! > RGW lua scripting was never tested in a cephadm deployment :-( > Opened a tracker: https://tracker.ceph.com/issues/59574 to make sure this > would work out of the box. > > Yuval > > > On Tue, Apr 25, 2023 at 10:25 PM Thomas Bennett <thomas@xxxxxxxx> wrote: > >> Hi ceph users, >> >> I've been trying out the lua scripting for the rados gateway (thanks >> Yuval). >> >> As in my previous email I mentioned that there is an error when trying to >> load the luasocket module. However, I thought it was a good time to report >> on my progress. >> >> My 'hello world' example below is called *test.lua* below includes the >> following checks: >> >> 1. Can I write to the debug log? >> 2. Can I use the lua socket package to do something stupid but >> intersting, like connect to a webservice? >> >> Before you continue reading this, you might need to know that I run all >> ceph processes in a *CentOS Stream release 8 *container deployed using >> ceph >> orchestrator running *Ceph v17.2.5*, so please view the information below >> in that context. >> >> For anyone looking for a reference, I suggest going to the ceph lua rados >> gateway documentation at radosgw/lua-scripting >> <https://docs.ceph.com/en/quincy/radosgw/lua-scripting/>. >> >> There are two new switches you need to know about in the radosgw-admin: >> >> - *script* -> loading your lua script >> - *script-package* -> loading supporting packages for your script - >> e.i. >> luasocket in this case. >> >> For a basic setup, you'll need to have a few dependencies in your >> containers: >> >> - cephadm container: requires luarocks (I've checked the code - it runs >> a luarocks search command) >> - radosgw container: requires luarocks, gcc, make, m4, wget (wget just >> in case). >> >> To achieve the above, I updated the container image for our running >> system. >> I needed to do this because I needed to redeploy the rados gateway >> container to inject the lua script packages into the radosgw runtime >> process. This will start with a fresh container based on the global config >> *container_image* setting on your running system. >> >> For us this is currently captured in *quay.io/tsolo/ceph:v17.2.5-3 >> <http://quay.io/tsolo/ceph:v17.2.5-3>* and included the following exta >> steps (including installing the lua dev from an rpm because there is no >> centos package in yum): >> yum install luarocks gcc make wget m4 >> rpm -i >> >> https://rpmfind.net/linux/centos/8-stream/PowerTools/x86_64/os/Packages/lua-devel-5.3.4-12.el8.x86_64.rpm >> >> You will notice that I've included a compiler and compiler support into >> the >> image. This is because luarocks on the radosgw to compile luasocket (the >> package I want to install). This will happen at start time when the >> radosgw >> is restarted from ceph orch. >> >> In the cephadm container I still need to update our cephadm shell so I >> need >> to install luarocks by hand: >> yum install luarocks >> >> Then set thew updated image to use: >> ceph config set global container_image quay.io/tsolo/ceph:v17.2.5-3 >> >> I now create a file called: *test.lua* in the cephadm container. This >> contains the following lines to write to the log and then do a get request >> to google. This is not practical in production, but it serves the purpose >> of testing the infrastructure: >> >> RGWDebugLog("Tsolo start lua script") >> local LuaSocket = require("socket") >> client = LuaSocket.connect("google.com", 80) >> client:send("GET / HTTP/1.0\r\nHost: google.com\r\n\r\n") >> while true do >> s, status, partial = client:receive('*a') >> RGWDebugLog(s or partial) >> if status == "closed" then >> break >> end >> end >> client:close() >> RGWDebugLog("Tsolo stop lua") >> >> Next I run: >> radosgw-admin script-package add --package=luasocket --allow-compilation >> >> And then list the added package to make sure it is there: >> radosgw-admin script-package list >> >> Note - at this point the radosgw has not been modified, it must first be >> restarted. >> >> Then I put the *test.lua *script into the pre request context: >> radosgw-admin script put --infile=test.lua --context=preRequest >> >> You also need to raise the debug log level on the running rados gateway: >> ceph daemon >> /var/run/ceph/ceph-client.rgw.xxx.xxx-cms1.xxxxx.x.xxxxxxxxxxxxxx.asok >> config set debug_rgw 20 >> >> Inside the radosgw container I apply my fix (as per previous email): >> cp -ru /tmp/luarocks/client.rgw.xxxxxx.xxx-xxxx-xxxx.pcoulb/lib64/* >> /tmp/luarocks/client.rgw.xxxxxx.xxx-xxxx-xxxx.pcoulb/lib/ >> >> Outside on the host running the radosgw-admin container I follow the >> journalctl for the radosgw container (to get the logs): >> journalctl -fu ceph-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx@rgw. >> xxx.xxx-cms1.xxxxx.x.xxxxxxxxxxxxxx.service >> >> Then I run an s3cmd to put data in via the rados gateway and check the >> journalctl logs and see: >> Apr 25 20:54:47 brp-ceph-cms1 radosgw[60901]: Lua INFO: Tsolo start lua >> Apr 25 20:54:47 brp-ceph-cms1 radosgw[60901]: Lua INFO: HTTP/1.0 301 Moved >> Permanently >> Apr 25 20:54:47 brp-ceph-cms1 radosgw[60901]: Lua INFO: >> Apr 25 20:54:47 brp-ceph-cms1 radosgw[60901]: Lua INFO: Tsolo stop lua >> Apr 25 20:54:47 brp-ceph-cms1 radosgw[60901]: Lua INFO: Tsolo start lua >> Apr 25 20:54:48 brp-ceph-cms1 radosgw[60901]: Lua INFO: HTTP/1.0 301 Moved >> Permanently >> Apr 25 20:54:48 brp-ceph-cms1 radosgw[60901]: Lua INFO: >> Apr 25 20:54:48 brp-ceph-cms1 radosgw[60901]: Lua INFO: Tsolo stop lua >> >> So the script worked :) >> >> If you want to see where the luarocks libraries have been installed, look >> in the /tmp/ directory of the radosgw container after you redeploy it and >> you will find the content in /tmp/luarocks. >> >> Conclusions: >> There was a bit to figure out to get this working, but now that I've got >> this simple test working I think there is a lot more to look into and >> discover and use w.r.t. this powerful tool. >> >> Cheers, >> Tom >> _______________________________________________ >> ceph-users mailing list -- ceph-users@xxxxxxx >> To unsubscribe send an email to ceph-users-leave@xxxxxxx >> >> _______________________________________________ ceph-users mailing list -- ceph-users@xxxxxxx To unsubscribe send an email to ceph-users-leave@xxxxxxx