ARTICLE DETAIL

资讯详情

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

使用 Moto 模拟 AWS Service Catalog AppRegistry:已实现 API 全景与源码级实践指南

使用 Moto 模拟 AWS Service Catalog AppRegistry:已实现 API 全景与源码级实践指南 Mock测试【免费下载链接】motoA library that allows you to easily mock out tests based on AWS infrastructure.项目地址https://gitcode.com/gh_mirrors/mo/moto点击查看免费下载Service Catalog AppRegistry服务目录应用注册表是 AWS 用于登记应用、关联底层资源并统一管理元数据与标签的服务。本文基于当前 Moto 仓库对servicecatalog-appregistry的真实实现完整梳理该服务在 Moto 中已支持的 API 清单、各 API 的请求/响应细节、底层 Backend 与 Response 层的调用链并结合仓库测试用例给出可直接运行的最小示例。读完本文你将能够在本地无 AWS 依赖的环境下用 Moto 对 AppRegistry 的create_application、list_applications、associate_resource、put_configuration、get_configuration进行完整模拟与单元测试。为什么需要模拟 AppRegistry应用注册与资源关联的本地化在真实的 AWS 环境中AppRegistry 承担应用台账职责开发者通过create_application建立应用实体再通过associate_resource把 CloudFormation 堆栈或按标签查询得到的资源归并到该应用名下最终借助awsApplication标签实现成本分摊与资源治理。而在日常开发与 CI 中反复调用真实 AWS 既昂贵又不可控。Moto 通过mock_aws装饰器拦截 boto3 客户端请求将上述调用全部转交给内存中的AppRegistryBackend见 moto/servicecatalogappregistry/models.py从而在纯本地环境中复现应用的创建、查询、资源关联与配置读写行为。已实现功能清单与调用入口官方文档 docs/docs/services/servicecatalog-appregistry.rst 明确列出了该服务当前的实现状态。以[X]标记的 5 个 API 已可用其余 API 在 Moto 中暂未实现调用会直接失败或未被 URL 路由捕获API状态说明associate_resource✅ 已实现将 CFN_STACK 或 RESOURCE_TAG_VALUE 资源关联到应用create_application✅ 已实现创建应用实体get_configuration✅ 已实现读取 AppRegistry 配置tagQueryConfigurationlist_applications✅ 已实现列出全部应用put_configuration✅ 已实现写入配置tagQueryConfiguration.tagKeyassociate_attribute_group❌ 未实现关联属性组create_attribute_group / delete_attribute_group / update_attribute_group❌ 未实现属性组相关操作delete_application / get_application / update_application❌ 未实现应用增删改查的其余部分get_associated_resource / disassociate_resource / disassociate_attribute_group❌ 未实现关联资源反向操作list_associated_attribute_groups / list_attribute_groups / list_attribute_groups_for_application❌ 未实现属性组列表list_tags_for_resource / tag_resource / untag_resource❌ 未实现标签管理底层已有 TaggingService但未暴露 APIsync_resource❌ 未实现资源同步从 moto/servicecatalogappregistry/urls.py 可以看到路由层只注册了四条路径/applications创建/列出应用、/applications/{application}/resources/{resource_type}/{resource}关联资源、/applications/{application}/resources列出关联资源、/configuration读写配置。这与文档的实现清单完全吻合。环境准备与快速开始Moto 需要与 boto3 配合使用。在 Python 环境中安装依赖后通过mock_aws装饰器即可让 boto3 客户端自动命中本地 Backendimport boto3 from moto import mock_aws mock_aws def test_appregistry_flow(): client boto3.client(servicecatalog-appregistry, region_nameus-east-1) ...仓库测试 tests/test_servicecatalogappregistry/test_servicecatalogappregistry.py 展示了这一标准写法每个测试函数被mock_aws包裹随后直接创建 boto3 客户端。注意客户端名是servicecatalog-appregistry服务端点在 urls.py 中按servicecatalog-appregistry.(...).amazonaws.com匹配。backend 按区域与账号隔离servicecatalogappregistry_backends[account][region]模式见 models.py因此不同 region 的测试互不干扰。create_application应用实体的创建与字段语义create_application是 AppRegistry 模拟的入口。调用时传入name、description可选tags与clientTokenclient boto3.client(servicecatalog-appregistry, region_nameus-east-1) resp client.create_application(nametestapp, descriptionblah) assert resp[application][name] testapp响应中的application对象包含以下字段见 models.py 的to_jsonid27 位随机小写字母数字串由mock_random.get_random_string(length27, ...)生成arn按arn:{partition}:servicecatalog:{region}:{account_id}:applications/{id}拼接其中 partition 由 moto/utilities/utils.py 的get_partition依据区域推导如us-east-1对应aws中国区对应aws-cnname / description原样保存用户输入creationTime / lastUpdateTime创建时取当前时间两者初始相同tags传入的标签字典经TaggingService存储_tag_resource调用 moto/utilities/tagging_service.py 的convert_dict_to_tags_input做格式转换applicationTag固定为{awsApplication: app arn}这是 AWS 官方约定的应用标识标签用于后续资源级标记。后端create_application的实现models.py把应用以arn为键存入self.applications字典并同步调用self._tag_resource记录标签。list_applications应用的遍历与返回顺序list_applications将 Backend 中保存的全部应用按创建顺序返回client.create_application(nametestapp, descriptionblah) client.create_application(nametestapp2, descriptionfoo) resp client.list_applications() assert resp[applications][1][name] testapp2Response 层responses.py遍历backend.list_applications()的结果并逐个调用to_json()组装为{applications: [...]}。由于底层存储是 dict 而非按名称排序返回值严格遵循创建顺序——这一点在测试 test_list_applications 中直接通过索引断言验证。associate_resource两种资源类型与校验逻辑associate_resource是 AppRegistry 模拟中逻辑最丰富的 API它接受application、resourceType、resource、options四个参数。Response 层会先对application做 URL decode再通过_find_app_by_any_valueresponses.py按arn / id / name 三种取值之一定位应用找不到时抛出ValidationException若未传options则默认空列表responses.py。资源类型一CFN_STACK当resourceType为CFN_STACK时后端models.py会用正则校验 CloudFormation 堆栈 ARN 的格式区域段、账号段、栈名、UUID 后缀从 ARN 中提取栈名resource.split(/)[1]调用moto.cloudformation的cloudformation_backends[account][region].get_stack(name)确认该堆栈真实存在于本地模拟环境中若堆栈不存在抛出ResourceNotFoundException消息为No CloudFormation stack called name found。这意味着关联 CFN 堆栈前必须先用 Moto 的 CloudFormation 模拟创建同名堆栈。仓库测试 test_associate_resource_cloudformation 完整演示了这一前置依赖先cloudformation.create_stack得到StackId再把它作为resource传入关联而反向用例 test_associate_resource_cloudformation_validation_error 则验证了堆栈不存在时报 ResourceNotFoundException。资源类型二RESOURCE_TAG_VALUE当resourceType为RESOURCE_TAG_VALUE时resource参数被当作标签查询表达式Tag Query。后端models.py会构造一个FakeResourceGroup来自 moto/resourcegroups/models.py并注入 4 个系统标签EnableAWSServiceCatalogAppRegistry: trueaws:servicecatalog:applicationName应用名aws:servicecatalog:applicationId应用 IDaws:servicecatalog:applicationArn应用 ARN资源组名称按AWS_AppRegistry_AppTag_{account_id}-{application.name}生成资源 ARN 即该资源组的 ARN。响应中的resourceDetails.tagValue会携带原始查询串models.py。非法类型与返回结构任何其他resourceType都会触发ValidationException消息为The request has invalid or missing parameters.见 exceptions.py。测试 test_associate_resource_fails_resource_type 用resourceTypeFOO验证了这一行为。成功的关联返回{applicationArn, resourceArn, options}且resourceArn保持调用时传入的原始值models.py。关联资源列表list_associated_resources虽然文档清单中未将list_associated_resources列为已实现但 Response 层实际上提供了对应处理responses.pyURL 路由{0}/applications/(?Papplication.)/resources$也覆盖了它。它按应用arn/id/name 均可返回{resources: [...]}每个资源对象包含name、arn、resourceType、options对RESOURCE_TAG_VALUE类型额外附上resourceDetails.tagValue。测试 test_list_associated_resources 验证了这些字段。put_configuration 与 get_configuration配置读写AppRegistry 的配置能力在 Moto 中体现为configuration字典的读写。Backend 初始化时默认{tagQueryConfiguration: {}}models.pyclient.put_configuration( configuration{tagQueryConfiguration: {tagKey: testkey}} ) resp client.get_configuration() assert resp[configuration][tagQueryConfiguration][tagKey] testkeyput_configuration直接把请求体中的configuration整体覆盖到 Backend 属性models.pyget_configuration原样返回models.py。默认值tagQueryConfiguration为空对象这一事实被测试 test_get_configuration 断言覆盖——未调用 put 前get_configuration返回的tagQueryConfiguration不含任何键。异常体系与路由架构Moto 对 AppRegistry 的异常处理集中在 moto/servicecatalogappregistry/exceptions.pyResourceNotFoundException默认消息The specified resource does not exist.用于 CFN 堆栈不存在场景ValidationException消息固定为The request has invalid or missing parameters.用于非法的资源类型、应用定位失败等场景。两者均继承自JsonRESTError因此返回给 boto3 客户端时会呈现为标准 AWS 风格的ClientErrorCodeMessage与真实 AWS 的错误结构一致。请求分发链路为boto3 客户端 →mock_aws拦截 → urls.py 正则匹配 →AppRegistryResponse.dispatchresponses.py→ Backend 方法 → 结果 JSON 序列化。AppRegistryResponse通过servicecatalogappregistry_backends[self.current_account][self.region]获取当前区域的后端实例实现账号/区域级隔离。模块入口 moto/servicecatalogappregistry/init.py 仅导出servicecatalogappregistry_backends供 Moto 的全局 Backend 注册表moto/backends.py统一管理。局限性提示使用前请明确以下边界均可从文档清单与源码确认属性组Attribute Group全系列 API 未实现包括create_attribute_group、get_attribute_group及其关联/列表操作凡涉及属性组的调用在 Moto 中不可用。应用的删除、更新、单查get_application未实现因此无法在单测中模拟应用生命周期变更。资源反关联disassociate_resource未实现关联后的资源无法通过模拟 API 解除关联。独立标签 APItag_resource / untag_resource / list_tags_for_resource未实现虽然 Backend 内部已具备TaggingService能力但尚未暴露为可调用接口目前标签仅随create_application一并存储。associate_resource对CFN_STACK的校验依赖 Moto CloudFormation 后端属于跨服务协作场景需要提前在测试中创建对应堆栈。正则校验仅接受标准堆栈 ARN 格式区域形如us-east-1、eu-west-1、ap-southeast-1等非标准格式的资源串会被当作栈名直接查询可能产生不匹配预期栈的关联结果。小结Moto 对 Service Catalog AppRegistry 的模拟覆盖了最常用的应用登记—资源关联—配置读写闭环create_application建立带 ARN、awsApplication标签的应用实体associate_resource打通 CloudFormation 堆栈与标签查询两类资源put_configuration/get_configuration管理tagQueryConfiguration配置配合区域隔离的 Backend 架构与标准化的异常响应足以支撑针对应用注册与资源归集逻辑的本地单元测试。若要扩展属性组、应用删除等未实现 API可参照 models.py 中现有方法的结构在 Backend 与 Response 层补充并同步更新 docs/docs/services/servicecatalog-appregistry.rst 的清单标记。赞分享Mock测试【免费下载链接】motoA library that allows you to easily mock out tests based on AWS infrastructure.项目地址https://gitcode.com/gh_mirrors/mo/moto点击查看免费下载相关推荐moto 中的 AWS FSx 模拟已实现 API 全景、源码结构与测试实战指南moto 中的 AWS FSx 模拟已实现 API 全景、源码结构与测试实战指南 本文基于 moto 仓库中 docs/docs/services/fsx.rMock测试moto 中的 EMR 模拟实现已支持的 API 全景清单与源码级机制解析moto 中的 EMR 模拟实现已支持的 API 全景清单与源码级机制解析 本文以 moto 仓库中 Amazon EMR 服务的功能文档为核心完整梳理该服Mock测试moto 中的 AWS CodeDeploy 模拟已实现 API 清单、源码实现解析与 boto3 测试实战moto 中的 AWS CodeDeploy 模拟已实现 API 清单、源码实现解析与 boto3 测试实战 本文以 moto 官方服务文档 codedeplMock测试上一篇Mastering-GitHub-Copilot-for-Paired-Programming 实战GitHub Copilot Coding Agent 任务分配与会话跟踪完全指南下一篇Behdad字体实战指南如何为波斯语项目选择最佳开源字体创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表