Hi Yuval, Just a follow up on this. An issue I’ve just resolved is getting scripts into the cephadm shell. As it turns out - I didn’t know this be it seems the host file system is mounted into the cephadm shell at /rootfs/. So I've been editing a /tmp/preRequest.lua on my host and then running: cephadm shell radosgw-admin script put --infile=/rootfs/tmp/preRequest.lua --context=preRequest This injects the lua script into the pre request context. Cheers, Tom On Fri, 28 Apr 2023 at 15:19, Thomas Bennett <thomas@xxxxxxxx> wrote: > 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