ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ceph RGW Lua 脚本测试实战指南:环境搭建、测试运行与源码级解析

Ceph RGW Lua 脚本测试实战指南:环境搭建、测试运行与源码级解析 存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载Ceph RADOS GatewayRGW自 Pacific 版本起内置了 Lua 脚本引擎允许用户在请求处理链路上挂载自定义 Lua 脚本实现元数据改写、访问日志、请求拦截、数据熵分析等动态能力。本文以仓库中的 src/test/rgw/lua/README.rst 为骨架完整讲解这套 Lua 脚本测试套件的环境准备、配置写法、运行方式并结合 src/test/rgw/lua/test_lua.py 的测试用例与 src/rgw/rgw_lua*.cc 底层实现帮助你理解 RGW Lua 脚本的执行上下文、管理命令与测试验证方法读完即可在本仓库环境下复现全部测试。一、测试套件概览它测什么src/test/rgw/lua目录是 RGW Lua 脚本功能的专项集成测试套件结构如下文件作用src/test/rgw/lua/README.rst测试运行说明本文章主依据src/test/rgw/lua/test_lua.pypytest 测试主体8 个用例src/test/rgw/lua/luatests.conf.SAMPLE测试连接配置样例RGW 地址与 S3 凭据src/test/rgw/lua/tox.initox 运行配置src/test/rgw/lua/pytest.inipytest 标记声明src/test/rgw/lua/requirements.txtPython 依赖boto3、pytestsrc/test/rgw/lua/init.py配置加载 fixture解析LUATESTS_CONF环境变量这套测试覆盖了官方 Lua 脚本功能文档 doc/radosgw/lua-scripting.rst 中描述的六大执行上下文prerequest、postauth、postrequest、background、getdata、putdata并用真实 S3 请求经 boto3 客户端发起验证脚本在请求生命周期中的实际效果——而非仅仅做语法级单元测试。二、测试运行步骤来自 README.rst原文档 src/test/rgw/lua/README.rst 给出了三条核心步骤逐条展开如下。2.1 启动测试集群Start the cluster using thevstart.shscript测试需要一个正在运行、且已启用 Lua 脚本支持的 RGW 实例。仓库提供了 src/vstart.sh 一键启动脚本用于在开发环境快速拉起 mon、mgr、osd 与 radosgw 等组件。典型做法在仓库根目录./src/vstart.sh -n -d # 以 debug 模式启动开发集群 ./src/stop.sh # 停止集群vstart.sh启动的 radosgw 默认监听在localhost:8000HTTP与下文配置样例中的port 8000、host localhost相对应。这是整个测试套件的前置条件没有可达的 RGW 端点所有用例都无法执行。2.2 安装 luarocksluarocks(package manager for lua) must be installed on the machineluarocks是 Lua 的包管理器。测试套件中test_access_log用例需要加载lua-cjson与luasocket两个 Lua 模块见下文 4.6 节它们正是通过 RGW 的包允许列表allowlist机制、由radosgw-admin script-package命令配合 luarocks 安装的。同时官方文档 doc/radosgw/lua-scripting.rst 也明确要求要为 RGW 添加 Lua 包宿主机必须安装luarocks。安装方式按发行版而定例如# Debian/Ubuntu apt-get install lua5.1 luarocks # RHEL/CentOS/Fedora dnf install lua lua-devel luarocks如果包包含需要编译的 C 源码还需保证宿主机有可用的 C 编译器--allow-compilation标志见 4.6 节。2.3 运行测试Run the test from within thesrc/test/rgw/luadirectory:LUATESTS_CONFluatests.conf.SAMPLE tox这是 README 给出的唯一一条命令需要在src/test/rgw/lua目录内执行cd src/test/rgw/lua LUATESTS_CONFluatests.conf.SAMPLE tox其含义拆解如下LUATESTS_CONF测试套件读取连接配置的环境变量。src/test/rgw/lua/init.py 中的setup()会先检查该变量是否存在缺失时直接抛出RuntimeError(To run tests, point environment variable LUATESTS_CONF to a config file.)。因此这是运行测试的强制前提。luatests.conf.SAMPLE配置样例文件指向 RGW 端点与 S3 主账号凭据。toxtox 是 Python 的虚拟环境管理/测试驱动工具。src/test/rgw/lua/tox.ini 定义了[tox] envlist py skipsdist True [testenv] deps -rrequirements.txt passenv LUATESTS_CONF commands pytest {posargs}即 tox 会创建一个 Python 虚拟环境按 src/test/rgw/lua/requirements.txt 安装boto3 1.0.0与pytest把LUATESTS_CONF透传给子进程最后执行pytest{posargs}允许追加参数如-k、-m。若机器上未安装 tox也可以绕过它直接运行 pytest效果等价pip install -r requirements.txt LUATESTS_CONFluatests.conf.SAMPLE python -m pytest -v2.4 配置文件说明src/test/rgw/lua/luatests.conf.SAMPLE 内容如下[DEFAULT] port 8000 host localhost [s3 main] access_key 0555b35654ad1656d804 secret_key h7GhxuBLTrlhVUyxSPUKUV8r/2EI4ngqJxD7iBdBYLhwluN30JaT3Q display_name M. Tester user_id testid email testerceph.com[DEFAULT]节host与port指定 RGW 端点。src/test/rgw/lua/init.py 的setup()要求该节必须存在否则报Your config file is missing the DEFAULT section!。配置缺省与vstart.sh默认监听一致。[s3 main]节主测试账号的 S3 凭据。setup()要求该节必须存在missing the s3 main section!其中access_key/secret_key会被 src/test/rgw/lua/test_lua.py 的connection()函数用来构造 boto3 S3 客户端。样例里的display_name、user_id、email为展示性字段当前测试代码未直接读取。这些凭据与vstart.sh默认创建的用户一致因此直接使用 SAMPLE 即可跑通若连接自定义集群可复制该文件修改后通过LUATESTS_CONF指向新文件。三、测试基础设施test_lua.py 的骨架src/test/rgw/lua/test_lua.py 约 550 行由一组辅助函数与 8 个测试函数组成。理解辅助函数有助于读懂用例逻辑。3.1 管理命令封装def admin(args, **kwargs): radosgw-admin command cmd [test_path test-rgw-call.sh, call_rgw_admin, noname] args return bash(cmd, **kwargs)admin()通过 src/test/rgw/test-rgw-call.sh 间接调用radosgw-admin所有 Lua 脚本管理操作script put/get/rm、script-package add/reload都走这条通道。3.2 S3 客户端工厂def connection(): hostname get_config_host() port_no get_config_port() access_key get_access_key() secret_key get_secret_key() if port_no 443 or port_no 8443: scheme https:// else: scheme http:// client boto3.client(s3, endpoint_urlschemehostname:str(port_no), aws_access_key_idaccess_key, aws_secret_access_keysecret_key) return clientconnection()从配置读取端点与凭据构造 boto3 客户端端口为 443/8443 时自动切到 HTTPS否则走 HTTP。测试对 RGW 发起的put_object、get_object、copy_object等操作均由它完成。另有another_user(tenant)动态创建第二个用户并返回其客户端用于验证 tenant 维度的脚本隔离put_script(script, context, tenant)把 Lua 脚本写入临时文件后经admin([script, put, --infile, ...])上传到指定上下文。3.3 UnixSocket 监听器UnixSocket类在测试进程内起一个线程创建 AF_UNIX socket 服务器并监听指定路径把收到的每行 JSON 解析为事件追加到events列表供test_access_log用例断言。这与官方文档 doc/radosgw/lua-scripting.rst 中用 Unix socket 输出 JSON 访问日志的示例脚本完全对应。3.4 pytest 标记src/test/rgw/lua/pytest.ini 声明了三个标记[pytest] markers basic_test request_test example_testbasic_test脚本管理类用例上传/读取/删除、tenant 隔离request_test请求上下文脚本用例改写元数据example_test对应官方文档示例的用例copy 打印、熵计算、访问日志、请求拦截。可通过-m选择性运行例如LUATESTS_CONFluatests.conf.SAMPLE tox -- -m basic_test。四、八个测试用例逐一解析4.1 脚本生命周期管理test_script_management对应官方文档的 Script Management via CLI 章节。该用例对全部六个上下文prerequest、postauth、postrequest、background、getdata、putdata循环执行script put上传print(hello from context)script get读取并断言内容一致script rm删除script get再次读取断言输出no script exists for context: context。它验证了radosgw-admin script put/get/rm三条命令的完整闭环以及删除后读取返回明确提示的行为。4.2 多租户脚本隔离test_script_management_with_tenant先经another_user(mytenant)创建 tenant 用户然后对同一上下文分别上传全局脚本与tenant 脚本不带--tenant的script get读到全局脚本带--tenant mytenant的script get读到 tenant 脚本各自删除后提示语不同全局为no script exists for context: ctxtenant 为no script exists for context: ctx in tenant: mytenant。这印证了官方文档请求上下文脚本可被限定到特定 tenant 用户的操作的能力说明脚本存储按 tenant 维度隔离。4.3 put_obj 元数据注入test_put_obj脚本挂在prerequest上下文RGWDebugLog(op was: ..Request.RGWOp) if Request.RGWOp put_obj then local object Request.Object local message Request.bucket.Name .. , .. object.Name .. , .. object.Id .. , .. object.Size .. , .. object.MTime RGWDebugLog(set: x-amz-meta-test to: .. message) Request.HTTP.Metadata[x-amz-meta-test] message end流程上传脚本 → boto3put_object写入对象 →get_object读取响应头x-amz-meta-test→ 断言其内容为{bucket},{key},{key},0,{MTime}。MTime 部分只校验日期属于1969-12-31或1970-01-01源码注释解释了时区导致的小时差异。该用例对应官方文档 Add metadata to objects that was not originally sent by the client 示例Request.HTTP.Metadata是 writable 字段脚本可在prerequest阶段为请求注入客户端未发送的自定义元数据x-amz-meta-*并随对象真实落盘、在 GET 响应头中可见——这是脚本改写请求能力最直观的证据。4.4 拷贝操作对象信息打印test_copyfrom脚本定义print_object()遍历对象的Name/Instance/Id/Size/MTime当Request.CopyFrom存在时打印源对象与目标对象信息并打印Request.RGWOp随后把同一脚本上传到除background外的五个上下文。测试执行 5 次copy_object1 MiB 随机内容。这与官方文档 Print information on source and destination objects in case of copy 示例一致验证了Request.CopyFrom.Object与Request.Object字段在 copy 操作中的可用性。4.5 putdata 数据熵计算test_entropy脚本挂在putdata上下文数据上传时逐 chunk 执行逐字节统计 256 个桶的频率并计算信息熵local full_name Request.Bucket.Name..-..Request.Object.Name RGWDebugLog(entropy of chunk of: .. full_name .. at offset: .. tostring(Offset) .. is: .. tostring(object_entropy())) RGWDebugLog(payload size of chunk of: .. full_name .. is: .. #Data)测试上传 5 个 16 MiB 的随机对象os.urandom验证Data只读、可迭代、按 chunk 提供与Offsetchunk 在对象中的偏移字段在putdata上下文可用。官方文档指出数据熵可用于检测对象是否加密——随机数据熵接近 1加密数据同样如此而压缩或明文文本熵较低。4.6 Unix socket JSON 访问日志test_access_log这是最复杂、最能体现包允许列表机制的用例完整流程对应官方文档 Use modules to create Unix socket based, JSON encoded, access log 示例添加 Lua 包并允许编译radosgw-admin script-package add --packagelua-cjson --allow-compilation radosgw-admin script-package add --packageluasocket --allow-compilation radosgw-admin script-package reload注意官方文档强调添加/移除允许列表并不会安装或卸载包必须执行reload才生效且所有允许列表中的包会在 radosgw 重启时用 luarocks 重新安装Lua 包安装在使用 radosgw 的本地目录默认/tmp/luarocks/entity name可用rgw_luarocks_location配置修改且不能设置为 luarocks 的默认安装位置。上传postrequest上下文脚本对get_obj操作用cjson编码访问日志bucket、object、time、operation、http_status、error_code、object_size、trans_id经luasocket的unix()连接/tmp/bucket并发送 JSON。测试进程用UnixSocket监听同一 socket 路径执行 5 次 put 5 次 get 后断言收到的 JSON 事件与 GET 的对象列表一致。该用例验证了第三方 Lua 模块cjson、socket.unix经允许列表机制可在 RGW 内加载运行以及postrequest上下文可访问Request.Response.HTTPStatusCode、Request.TransactionId等响应字段。4.7 请求拦截test_interrupt_request / test_interrupt_request_postauth两个用例分别把如下脚本挂到prerequest与postauthreturn RGW_ABORT_REQUEST行为验证put_object被脚本拦截抛出异常不再返回成功删除脚本后get_object返回NoSuchKey证明被拦截的写入确实没有落盘删除 bucket 清理。对应官方文档 Request Blocking and Return Values 章节脚本返回RGW_ABORT_REQUEST时RGW 将其解释为-EPERM并停止处理请求默认返回 HTTP 403Forbidden返回值的求值仅在prerequest与postauth上下文进行其他上下文忽略返回值请求被拦截后data与postrequest上下文也会一并中止。五、与底层源码的对应测试所覆盖的能力都能在 RGW 的 Lua 引擎源码中找到实现依据src/rgw/下以rgw_lua为前缀的 12 个文件src/rgw/rgw_lua_request.h定义rgw::lua::request命名空间create_top_metatable()负责构造请求元表即 Lua 侧Request表的字段来源execute()负责在请求上下文中执行脚本重载版本通过int script_return_code把脚本返回值带回 C 侧——这正是RGW_ABORT_REQUEST拦截机制-EPERM的接口所在。src/rgw/rgw_lua.ccLua 引擎核心负责脚本加载、执行、内存/运行时限制rgw_lua_max_memory_per_state默认 128K、rgw_lua_max_runtime_per_state默认 1000ms以及RGWDebugLog()等上下文无关函数。src/rgw/rgw_lua_data_filter.cc数据上下文getdata/putdata的数据过滤器实现对应测试中Data与Offset字段的语义。src/rgw/rgw_lua_background.ccbackground上下文实现默认每 5 秒执行一次。从源码结构可以推断Lua 脚本在 RGW 中是以请求处理管线上的钩子形式执行的prerequest在操作执行前、postauth在鉴权之后、postrequest在操作完成之后getdata/putdata则在数据传输路径上以 chunk 粒度触发background由独立定时机制驱动。测试用例正是围绕这些钩子点设计的最小闭环验证。六、运行注意事项与故障排查必须先启动集群所有用例依赖真实 RGW 端点与radosgw-admin未启动vstart.sh时connection()将连接失败admin()调用也会失败。LUATESTS_CONF必须设置缺失时 src/test/rgw/lua/init.py 会抛出运行时错误配置需同时包含[DEFAULT]与[s3 main]两节。配置文件中的端口决定协议test_lua.py的connection()对 443/8443 使用 HTTPS其余使用 HTTP若集群监听在其他端口需同步修改配置。luarocks 与编译器test_access_log用例依赖lua-cjson、luasocket的安装与重载script-package reload宿主需具备 luarocks 与 C 编译器reload会作用于所有 RGW 实例。用例间脚本清理每个用例结束都会对相关上下文执行script rm清理避免用例间相互污染。内存/运行时限官方文档提醒默认脚本内存上限 128Krgw_lua_max_memory_per_state、运行时限 1000msrgw_lua_max_runtime_per_state修改内存上限时若当前用量超过新值背景状态数据会丢失禁用时限可能因无界执行影响 RGW 可用性。测试中的脚本均为轻量级不会触碰这些限制。七、总结RGW Lua 脚本测试套件src/test/rgw/lua以真实 S3 请求 radosgw-admin 管理命令 官方示例脚本三位一体的方式覆盖了 doc/radosgw/lua-scripting.rst 所描述的六大执行上下文与核心能力脚本生命周期管理、tenant 隔离、请求元数据改写、copy 信息访问、数据熵分析、第三方 Lua 包加载、请求拦截与错误处理。运行它只需三步——vstart.sh起集群、安装 luarocks、在src/test/rgw/lua目录执行LUATESTS_CONFluatests.conf.SAMPLE tox。对开发者而言这套测试既是回归验证工具也是学习 RGW Lua 脚本 API 的最直接范例每个用例都能在 src/rgw/rgw_lua_request.h 等源码中找到对应的钩子实现形成文档 → 测试 → 源码的完整学习闭环。赞分享存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载相关推荐Ceph RGW 多站点Multi-site测试框架实战指南本地多集群环境的搭建、测试运行与用例编写Ceph RGW 多站点Multi site测试框架实战指南本地多集群环境的搭建、测试运行与用例编写 本指南围绕 Ceph 对象网关RGW多站点复制功存储分布式文件系统对象存储后端高可用MinerU 快速使用实战从命令行一键解析 PDF/Office 到 API 服务与配置文件扩展MinerU 快速使用实战从命令行一键解析 PDF/Office 到 API 服务与配置文件扩展 本文基于 MinerU 官方文档 docs/zh/usage存储分布式文件系统对象存储后端高可用RedisInsight API 集成测试指南环境搭建、用例运行与源码级实现解析RedisInsight API 集成测试指南环境搭建、用例运行与源码级实现解析 导读 本文以 RedisInsightRedis 官方 GUI 与配套 A数据库客户端桌面应用后端前端数据可视化上一篇ReactPy中的GraphQL订阅实现使用Apollo Client下一篇Promptise Foundry路线图解析未来发展方向与技术创新点创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表