ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

OpenStack Mitaka keystone 分页(pagination)实现:TaoToken 统一 Key 通道下的配置与验证

OpenStack Mitaka keystone 分页(pagination)实现:TaoToken 统一 Key 通道下的配置与验证 1. OpenStack Mitaka keystone 分页为什么总是不生效如果你在 Mitaka 环境里打开 Horizon 的项目列表把每页显示条数设成 2结果发现页面还是把几十个 tenant 一次性全列出来那说明你踩到了 keystone 分页的经典坑。Mitaka 的 Identity 服务在 V3 接口下Horizon 默认并没有把limit和marker这两个分页参数真正透传到后端format_project_list()里虽然写了切片逻辑但上游没传参分页自然形同虚设。V2.0 接口稍微好一点至少能出现“下一页”按钮但“上一页”依旧缺失翻回去只能靠手动改 URL。这篇文章要解决的就是这个落地问题在 Mitaka 的 keystone 里把分页链路打通同时用 TaoToken 的统一 Key/API 通道来验证整条调用链是否按预期返回分页数据。TaoToken 在这里扮演的是统一入口角色你不需要在多个模型或服务之间来回切换 Key用一套凭证就能完成请求验证和调试。适合正在维护 Mitaka 老集群、需要给 Horizon 项目列表补分页能力的运维和开发同学。我试过直接在 Horizon 里改local_settings.py切到 V2.0确实能让“下一页”出来但只解决了一半问题。真正要完整分页得从 Horizon 的views.py、api/keystone.py、keystoneclient 一直到 keystone 后端的sql.py做一条链路的扩展。下面按可复制的顺序拆开讲。2. TaoToken 前置统一 Key 通道准备在开始改 keystone 之前先把验证通道准备好。TaoToken 的作用是给你一个统一的 API Key后续无论是调模型对话做辅助排查还是走 Coding Plan 做长期编码都用同一套凭证。这样你在调试分页请求时不会因为 Key 分散而搞混请求来源。你需要先拿到 API Key。访问控制台创建https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite创建完成后Key 只在生成时显示一次复制保存好。接着可以打开 API Keys 管理页确认状态https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite如果你只是想先验证模型通道是否通可以用模型对话页面直接发一条测试消息https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite接口基地址统一用https://taotoken.net/api注意这个地址不加 UTM 参数保持干净。拿到 Key 之后把它写进你的本地配置文件后面验证分页请求时会用到。3. 可复制配置keystone.conf 与 TaoToken 接入3.1 keystone.conf 分页相关骨架Mitaka 的 keystone 分页能力依赖后端 driver 的paginate_query配置层面主要是确认 assignment 后端走 SQL。编辑/etc/keystone/keystone.conf[assignment] driver sql如果你用的是sql.py作为 assignment backend那paginate_query才可用。LDAP 和 KVS 后端在 Mitaka 下不支持这套分页扩展这点要提前确认。改完后重启 keystone 和 apachesudo systemctl restart keystone sudo systemctl restart apache23.2 TaoToken 接入 settings.json如果你在用支持settings.json的客户端或工具链做辅助调试可以这样写{ api_base: https://taotoken.net/api, api_key: 你的_TaoToken_Key, model: claude-sonnet, timeout: 30 }3.3 TaoToken 接入 config.toml用config.toml的场景[taotoken] api_base https://taotoken.net/api api_key 你的_TaoToken_Key model claude-sonnet timeout 30这两个配置的作用是让你在排查分页请求时有一个稳定的模型通道可以随时问“这个 marker 逻辑对不对”“sort_dir 反转后顺序为什么乱了”。长期做 OpenStack 二次开发的话可以走 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite3.4 Horizon 侧分页参数透传Horizon 的openstack_dashboard/api/keystone.py里tenant_list需要把limit和marker真正传给 manager。核心片段def tenant_list(request, paginateFalse, markerNone, domainNone, userNone, adminTrue, filtersNone): manager VERSIONS.get_project_manager(request, adminadmin) page_size utils.get_page_size(request) limit None if paginate: limit page_size 1 has_more_data False if VERSIONS.active 3: tenants manager.list(limit, marker) if paginate and len(tenants) page_size: tenants.pop(-1) has_more_data True return tenants, has_more_data这里limit page_size 1是关键多取一条用来判断是否还有下一页。marker传的是当前页最后一条 tenant 的 ID。4. 验证请求与成功结果4.1 直接调 keystone API 验证分页先用 curl 验证 V2.0 的 tenants 接口是否接受limit和markercurl -s -H X-Auth-Token: $TOKEN \ http://192.168.31.235:5000/v2.0/tenants?limit3marker64d50f68d69b451c8653296db25d9c86 \ | python -m json.tool成功返回的 JSON 里tenants数组长度应该等于 3并且第一条的id不等于 marker 本身说明分页从 marker 之后开始取。4.2 验证扩展后的 /tenants/paged 接口扩展路由后请求地址变成/tenants/pagedcurl -s -H X-Auth-Token: $TOKEN \ http://192.168.31.235:5000/v2.0/tenants/paged?limit3marker64d50f68d69b451c8653296db25d9c86sort_keyidsort_dirasc \ | python -m json.tool预期结果返回 3 条 tenant顺序按 id 升序且第一条 id 大于 marker 对应的 id。如果返回空数组检查marker_row是否在Project表里查到了记录。4.3 用 TaoToken 通道做辅助校验把上面 curl 返回的 JSON 贴到模型对话里让模型帮你确认字段结构是否符合分页预期https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite比如问“这个 tenants 数组长度和 marker 位置关系是否正确”模型会帮你快速判断。接入文档在这里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite4.4 Horizon 页面验证改完views.py的has_prev_data和get_data后刷新项目列表页。设置每页 2 条应该同时出现“上一页”和“下一页”按钮。点下一页URL 里出现tenant_markerxxx点上一页URL 里出现prev_markerxxx。两个方向都能翻说明分页链路通了。5. 本篇常见错排查5.1 Marker could not be found报错Marker could not be found说明传进来的 marker ID 在tenant_refs列表里找不到。常见原因有两个一是 marker 传的是 project ID但列表里混了 domain 过滤后的数据二是v3_to_v2_project转换时把部分记录过滤掉了。检查format_project_list里的循环是否在过滤前执行。5.2 上一页数据顺序颠倒点上一页时sort_dir会反转如果反转后没有重新排序页面显示顺序会乱。在update_pagination里补上if reversed_order: entities sorted( entities, keylambda entity: (getattr(entity, id) or ).lower(), reverse(sort_dir asc))5.3 limit 传了但没生效如果limit传了但返回条数还是全量检查keystone.conf的[assignment] driver是不是sql。LDAP 后端下paginate_query不生效list_projects_for_user_paged会直接返回全量。5.4 V3 接口下分页仍然无效Mitaka 的 V3 接口在 Horizon 里没有实现分页参数透传manager.list(**kwargs)根本没带limit和marker。要么切 V2.0要么自己扩展 V3 的 manager 调用。切 V2.0 的配置在local_settings.pyOPENSTACK_API_VERSIONS {identity: 2.0} OPENSTACK_KEYSTONE_URL http://192.168.31.235:5000/v2.05.5 TaoToken 请求超时如果验证时 TaoToken 通道超时先确认api_base写的是https://taotoken.net/api不要带多余路径。再检查 Key 是否复制完整控制台里 Key 状态是否正常。6. 继续用 TaoToken 统一通道做长期验证分页链路打通后后续你可能会继续扩展镜像列表、配置模板等组件的分页。每次改完 keystone 后端都需要一个稳定的通道来验证请求和响应。TaoToken 的统一 Key 在这里的价值就是你不用为每个验证场景单独配一套凭证一套 Key 走完模型对话、编码辅助和接口调试。长期做 OpenStack 二次开发的话Coding Plan 更适合https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite需要重新生成或管理 Key 时回到控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite接口文档和接入说明https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite如果你在用 Claude Code 做 OpenStack 相关开发Anthropic 兼容通道的说明在这里https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude-code-anthropicutm_campaignrewrite最后提醒一个实操细节Mitaka 的paginate_query对 marker 所在行的定位依赖主键顺序如果你扩展的是RoleAssignment这类 tenant ID 不是主键的表marker 定位会不准。稳妥做法是直接查Project表拿 marker 行再传给paginate_query。这个坑我在多个 Mitaka 集群上都遇到过绕过去之后分页就稳了。
返回列表