后端企业应用运维【免费下载链接】bk-cmdb蓝鲸智云配置平台(BlueKing CMDB)项目地址https://gitcode.com/gh_mirrors/bk/bk-cmdb点击查看免费下载导读本文以蓝鲸智云配置平台bk-cmdb的「删除对象模型属性」接口delete_object_attribute为主线完整讲解该接口的功能定位、请求/返回参数、网关层调用方式并结合 topo_server 与 coreservice 的源码剖析属性删除的完整内部链路与多重删除保护机制。读完本文你将掌握如何安全地通过该接口删除业务自定义字段并能理解删除过程中字段模板校验、唯一校验、实例字段清理与审计日志等底层行为为二次开发与排障提供依据。功能概述与应用场景「删除对象模型属性」用于删除对象模型中已定义的属性字段可以删除业务自定义字段。根据接口文档的描述调用该接口需要具备模型编辑权限。在 bk-cmdb 的模型管理体系中对象模型由多个属性字段构成例如主机模型包含主机名称操作系统等属性。当某个自定义字段不再需要时例如业务自定义的扩展字段可以通过该接口将其从模型中删除。需要注意该接口删除的是模型层的属性定义删除后对应实例数据中的该字段值也会被一并清理详见下文源码分析。该接口对应的 API 名称为delete_object_attribute在 v3 原生接口中通过DELETE /api/v3/delete/objectattr/{id}路由提供服务在蓝鲸 ESB 网关中则通过/v2/cc/delete_object_attribute/对外暴露。路由注册代码位于 路由注册文件utility.AddHandler(rest.Action{Verb: http.MethodDelete, Path: /delete/objectattr/{id}, Handler: s.DeleteObjectAttribute})请求参数说明接口文档给出的参数如下字段类型必选描述idint是被删除的数据记录的唯一标识ID其中id是待删除属性在属性表中的唯一记录 ID即创建属性时返回的记录 ID对应创建接口返回结果中的id字段。同时接口文档中还包含{{ common_args_desc }}占位符代表 ESB 网关的通用请求参数通常包括bk_app_code、bk_app_secret、bk_username、bk_token等鉴权与身份标识字段。需要注意调用方式上的差异v3 原生接口id作为 URL 路径参数传递即DELETE /api/v3/delete/objectattr/{id}ESB 网关接口文档示例将id放在请求 body 中网关组件会将 body 中的id映射到后端dest_path: /api/v3/delete/objectattr/{id}的路径模板上。ESB 网关的映射定义见 cc.yaml- path: /v2/cc/delete_object_attribute/ name: delete_object_attribute label: 删除对象模型属性 label_en: delete object attribute suggest_method: POST api_type: operate comp_codename: generic.v2.cc.cc_component dest_path: /api/v3/delete/objectattr/{id} dest_http_method: DELETE从配置可以看出网关对外建议使用 POST但后端实际转发为 DELETE 方法同时该接口在蓝鲸 API 网关APIGateway中也注册了对应资源delete_object_attribute定义见 API 网关资源定义。请求参数示例接口文档提供的请求参数示例ESB 网关调用方式如下{ bk_app_code: esb_test, bk_app_secret: xxx, bk_username: xxx, bk_token: xxx, id : 0 }其中bk_app_code/bk_app_secret为应用凭证bk_username/bk_token为用户身份凭证这些字段属于网关公共参数id为要删除的属性记录 ID示例中为 0实际调用时应替换为目标属性 ID。如果直接调用 v3 原生接口则无需 body只需在路径中携带 ID例如curl -X DELETE http://bk-cmdb-ip:port/api/v3/delete/objectattr/123说明归档版接口文档 object_model_property.md 中记录了该接口的旧版形态同样为DELETE /api/v3/delete/objectattr/{id}且输入 body 为空{}可作为 v3 原生调用方式的佐证。返回结果示例与参数说明接口文档给出的成功返回示例{ result: true, code: 0, message: success, permission: null, request_id: e43da4ef221746868dc4c837d36f3807, data: success }返回结果字段说明字段类型描述resultbool请求成功与否。true:请求成功false请求失败codeint错误编码。 0表示success0表示失败错误messagestring请求失败返回的错误信息permissionobject权限信息request_idstring请求链iddataobject请求返回的数据其中code为 0 表示成功非 0 表示失败失败时message会携带具体错误信息request_id用于在日志中追踪整条请求链。需要说明的是从当前源码看删除成功时处理器实际调用ctx.RespEntity(nil)返回空数据见 删除处理实现文档示例中的data: success属于网关层的返回约定两者并不冲突。源码级实现删除调用链全解析1. 入口处理器参数解析与前置校验删除接口的入口处理函数为Service.DeleteObjectAttribute位于 object_attribute.go。其核心流程如下func (s *Service) DeleteObjectAttribute(ctx *rest.Contexts) { // 1. 从路径参数中解析 id paramPath : mapstr.MapStr{} paramPath.Set(id, ctx.Request.PathParameter(id)) id, err : paramPath.Int64(id) ... // 2. 解析请求体中的 bk_biz_id可选用于区分公共/私有模型 modelType : new(ModelType) if err : ctx.DecodeInto(modelType); err ! nil { ... } // 3. 按 id 查询待删除属性 attr, err : s.getModelAttrByID(ctx.Kit, id, modelType.BizID) ... // 4. 属性不存在时直接返回成功 if attr.ID 0 { ctx.RespEntity(nil) return } ... }其中ModelType定义在 service.go用于解析请求体中的bk_biz_id// ModelType is model type // bk_biz_id 0 : public model // bk_biz_id 0 : private model type ModelType struct { BizID int64 json:bk_biz_id }也就是说bk_biz_id为 0 表示操作公共模型平台级模型大于 0 表示操作某业务下的私有模型业务自定义模型。getModelAttrByID会基于id与bizID组合条件调用 coreservice 的ReadModelAttrsWithTableByCondition查询属性详情见 getModelAttrByID。2. 删除保护字段模板属性禁止直接删除查询到属性后处理器首先检查该属性是否由字段模板field template派生if attr.TemplateID ! 0 { ctx.RespAutoError(kit.CCError.CCErrorf(common.CCErrorTopoFieldTemplateForbiddenDeleteAttr, id, attr.TemplateID)) return }如果属性的TemplateID非 0说明该字段由字段模板生成不允许通过此接口直接删除返回错误码CCErrorTopoFieldTemplateForbiddenDeleteAttr值为 1101122见 错误码定义。这一机制确保字段模板对字段生命周期的统一管控不会被绕过。3. 特殊分支内建表inner table类型属性的删除对于属性类型为FieldTypeInnerTable内建表字段的情况处理器走独立的事务删除路径if attr.PropertyType common.FieldTypeInnerTable { if err : s.deleteTableObject(ctx.Kit, attr.ObjectID, attr.PropertyID, attr.ID); err ! nil { ... } ctx.RespEntity(nil) return }deleteTableObject使用 coreservice 的事务接口AutoRunTxn包裹DeleteTableObject调用保证内建表对象及其属性删除的原子性见 deleteTableObject。4. 常规属性删除审计日志 coreservice 下发对于常规属性处理器调用拓扑层的属性操作门面if err s.Logics.AttributeOperation().DeleteObjectAttribute(kit, []metadata.Attribute{attr}); err ! nil { ... }其实现位于 attribute.go主要步骤为为待删除属性生成审计日志auditlog.NewObjectAttributeAuditLog审计操作类型为AuditDelete按属性所属对象 IDObjectID将属性 ID 分组对每个对象分组构造DeleteOption条件为id in [...]调用 coreservice 客户端Model().DeleteModelAttr删除成功后保存审计日志。其中客户端DeleteModelAttr会向 coreservice 发起DELETE /delete/model/{obj_id}/attributes请求见 apimachinery 客户端实现func (m *model) DeleteModelAttr(ctx context.Context, h http.Header, objID string, input *metadata.DeleteOption) (resp *metadata.DeletedOptionResult, err error) { resp new(metadata.DeletedOptionResult) subPath : /delete/model/%s/attributes err m.client.Delete(). WithContext(ctx). Body(input). SubResourcef(subPath, objID). ... }5. coreservice 底层属性删除与实例字段清理coreservice 侧入口为DeleteModelAttributes位于 attribute.go其先校验模型合法性isValid再注入供应商账号SetModOwner与Eq{Key: AttributeFieldSupplierAccount}并调用底层delete。底层delete实现在 attribute_curd.go这是整个删除动作的核心包含多重保护与清理逻辑查询待删除属性从BKTableNameObjAttDes属性描述表读取 id、属性 ID、属性类型、对象 ID、业务 ID 等字段再次校验内建表类型属性在此直接报错TemplateID ! 0的模板派生属性同样禁止删除对FieldTypeIDRuleID 规则类型的属性单独分组处理调用delIDRuleUnique删除相关唯一约束调用cleanAttributeFieldInInstances清理模型实例中该字段的数据——即删除模型属性后历史实例中对应的字段值也会被移除该操作可能耗时较长实现中特意将 context 切换为context.Background()以避免请求取消中断注释明确说明 this operation may take a long time, do not use transaction调用cleanAttrTemplateRelation清理属性与字段模板的关联关系唯一校验保护通过checkAttributeInUnique检查待删除属性是否被模型唯一校验unique规则引用若被引用则直接拒绝删除返回错误CCErrCoreServiceNotAllowUniqueAttr见 attribute_curd.go最后对属性描述表执行DeleteMany真正删除记录。6. 关联清理主机自动应用规则属性删除成功后topo_server 还会额外执行deleteHostApplyRule将引用了该属性 ID 的主机自动应用规则host apply rule一并删除if err : s.deleteHostApplyRule(ctx.Kit, id); err ! nil { ctx.RespAutoError(err) return }其实现位于 deleteHostApplyRule先按AttributeIDs: []int64{id}查询主机自动应用规则再批量调用 coreservice 的DeleteHostApplyRule删除。这保证了删除字段后不会残留针对已失效字段的自动应用规则避免后续主机属性自动应用出现异常。完整调用链小结综合上述分析一次属性删除请求的完整内部链路为ESB 网关 POST /v2/cc/delete_object_attribute/ └─ v3 原生 DELETE /api/v3/delete/objectattr/{id} └─ topo_server: Service.DeleteObjectAttribute ├─ 解析路径参数 id 请求体 bk_biz_id ├─ 查询属性getModelAttrByID ├─ 字段模板属性保护校验TemplateID ! 0 拒绝 ├─ 内建表类型事务删除表对象deleteTableObject └─ 常规属性 ├─ 生成审计日志 ├─ 调 coreservice: DELETE /delete/model/{obj_id}/attributes │ └─ DeleteModelAttributes - delete │ ├─ 模型合法性校验 供应商账号注入 │ ├─ 模板/唯一/ID规则保护校验 │ ├─ 清理实例字段数据 │ ├─ 清理字段模板关联 │ └─ DeleteMany 删除属性描述 ├─ 删除关联主机自动应用规则deleteHostApplyRule └─ 保存审计日志并返回常见错误与注意事项场景行为/错误码说明属性不存在返回成功data为空处理器在attr.ID 0时直接返回空结果属于幂等设计删除字段模板派生的属性错误码1101122CCErrorTopoFieldTemplateForbiddenDeleteAttr需通过字段模板管理流程删除不能直接调用本接口删除被唯一校验引用的属性错误码CCErrCoreServiceNotAllowUniqueAttr需先调整模型唯一校验规则属性被主机自动应用规则引用规则被级联删除删除属性时自动清理关联规则内建表类型属性走独立事务删除路径由deleteTableObject以事务方式处理通用删除失败错误码1101018CCErrTopoObjectAttributeDeleteFailed删除过程中的通用失败错误码具体原因见message实战建议删除前先查询建议先通过查询模型属性接口确认目标属性的id、bk_obj_id、ispre是否预置字段等信息。预置字段通常由系统管理删除需格外谨慎权限要求调用方必须具备模型编辑权限否则会被权限中间件拦截数据影响面删除属性会同步清理所有实例中该字段的数据且该清理动作可能耗时较长源码注释明确提示删除前应充分评估数据影响追踪排障返回结果中的request_id对应全链路日志追踪 ID排障时可结合 topo_server 与 coreservice 日志中的rid字段串联定位。总结delete_object_attribute是 bk-cmdb 模型管理中删除字段的标准入口对外表现为 ESB 网关POST /v2/cc/delete_object_attribute/与 v3 原生DELETE /api/v3/delete/objectattr/{id}两种形态。从源码看其删除链路经过 topo_server 的参数校验、字段模板保护、内建表分支处理再到 coreservice 的模型合法性校验、唯一校验保护、实例字段清理与属性记录删除最后级联清理主机自动应用规则并落审计日志形成了一套完整的删除 保护 清理 审计体系。理解这条链路有助于在模型治理、字段回收和数据一致性保障场景中做出正确决策。赞分享后端企业应用运维【免费下载链接】bk-cmdb蓝鲸智云配置平台(BlueKing CMDB)项目地址https://gitcode.com/gh_mirrors/bk/bk-cmdb点击查看免费下载相关推荐bk-cmdb 开放 API 详解删除对象模型属性delete_object_attributebk cmdb 开放 API 详解删除对象模型属性delete_object_attribute 本篇技术指南基于蓝鲸智云配置平台bk cmdb的开放后端企业应用运维蓝鲸配置平台bk-cmdb删除对象模型属性 API 接口详解蓝鲸配置平台bk cmdb删除对象模型属性 API 接口详解 导读 本文以 delete_object_attribute.md https://link.后端企业应用运维蓝鲸配置平台 bk-cmdb 删除模型接口delete_object实战指南参数解析、调用链路与删除约束蓝鲸配置平台 bk cmdb 删除模型接口delete_object实战指南参数解析、调用链路与删除约束 本文以蓝鲸智云配置平台bk cmdb官方 A后端企业应用运维创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考