- 后端
- 企业应用
- 运维
【免费下载链接】bk-cmdb
蓝鲸智云配置平台(BlueKing CMDB)
模型分类(Model Classification)是蓝鲸配置平台(bk-cmdb)中组织模型(对象)的第一层分组维度,平台内置的"主机管理""业务拓扑""组织架构"等分类即由它承载。本文围绕「添加模型分类」接口create_classification展开,完整讲解其请求参数、请求/返回示例、返回字段语义,并结合仓库源码揭示该接口从 ESB 网关、topo_server 到 coreservice 的完整调用链、字段校验规则与底层 MongoDB 持久化实现,帮助你准确理解并正确调用该接口,为自建模型分类、二次开发模型体系打下基础。
一、功能概述与权限要求
该接口用于添加一个模型分类,调用者需要拥有模型分组新建权限(对应create_classification操作)。在 CMDB 的模型管理体系中,模型分类是模型的容器:用户先创建分类(如"主机管理""业务拓扑"),再在分类下挂载具体模型(对象)。平台内置分类的 ID 在源码 src/common/metadata/classification.go 中以常量形式定义:
| 常量 | 分类 ID | 含义 |
|---|---|---|
| ClassificationHostManageID | bk_host_manage | 主机管理 |
| ClassificationBizTopoID | bk_biz_topo | 业务拓扑 |
| ClassificationOrganizationID | bk_organization | 组织架构 |
| ClassificationNetworkID | bk_network | 网络 |
| ClassificationUncategorizedID | bk_uncategorized | 未分类 |
| ClassificationTableID | bk_table_classification | 内置表格分类 |
内置分类的bk_classification_type字段值为inner;通过本接口创建的自定义分类该字段默认为空字符串,二者在返回结果中可以直接区分。
二、请求说明
2.1 公共参数
接口公共参数({{ common_args_desc }})与 CMDB 其他 OpenAPI 一致,调用时需附带认证信息,典型字段包括:
| 字段 | 类型 | 必选 | 描述 |
|---|---|---|---|
| bk_app_code | string | 是 | 应用 ID(如esb_test) |
| bk_app_secret | string | 是 | 应用密钥 |
| bk_username | string | 否 | 操作用户名 |
| bk_token | string | 否 | 登录票据 |
实际鉴权方式(AppSecret/Token/用户名组合)由接入方部署的鉴权策略决定,建议通过蓝鲸 ESB 网关统一接入。
2.2 接口参数
| 字段 | 类型 | 必选 | 描述 |
|---|---|---|---|
| bk_classification_id | string | 是 | 分类 ID,英文描述,用于系统内部使用 |
| bk_classification_name | string | 是 | 分类名 |
| bk_classification_icon | string | 否 | 模型分类的图标 |
其中bk_classification_id是系统内部标识,创建后将不可修改(更新接口会强制移除该字段,见 src/scene_server/topo_server/logics/model/classification.go),因此创建前务必规划好命名。
三、请求示例
{ "bk_app_code": "esb_test", "bk_app_secret": "xxx", "bk_username": "xxx", "bk_token": "xxx", "bk_classification_id": "cs_test", "bk_classification_name": "test_name", "bk_classification_icon": "icon-cc-business" }四、返回结果示例
{ "result": true, "code": 0, "data": { "id": 11, "bk_classification_id": "cs_test", "bk_classification_name": "test_name", "bk_classification_type": "", "bk_classification_icon": "icon-cc-business", "bk_supplier_account": "" }, "message": "success", "permission": null, "request_id": "76e9134a953b4055bb55853bb248dcb7" }五、返回结果参数说明
5.1 response 顶层字段
| 字段 | 类型 | 描述 |
|---|---|---|
| result | bool | 请求成功与否。true:请求成功;false:请求失败 |
| code | int | 错误编码。0 表示 success,>0 表示失败错误 |
| message | string | 请求失败返回的错误信息 |
| permission | object | 权限信息 |
| request_id | string | 请求链 id,用于链路追踪 |
| data | object | 请求返回的数据 |
5.2 data 字段
| 字段 | 类型 | 描述 |
|---|---|---|
| id | int | 新增数据记录的 ID(MongoDB 自增序列) |
| bk_classification_id | string | 分类 ID,英文描述用于系统内部使用 |
| bk_classification_name | string | 分类名 |
| bk_classification_icon | string | 模型分类的图标 |
| bk_classification_type | string | 用于对分类进行分类(如:inner 代码为内置分类,空字符串为自定义分类) |
| bk_supplier_account | string | 开发商账号 |
返回的data对象与源码中的metadata.Classification结构体字段一一对应(src/common/metadata/classification.go),创建成功后接口会回读一次数据库中的完整分类记录再返回,因此data中包含服务端自动生成/补充的id、bk_classification_type、bk_supplier_account等字段。
六、接口完整调用链与源码级原理
6.1 网关映射与路由注册
在 ESB 网关配置 docs/apidoc/cc/cc.yaml 中,对外路径/v2/cc/create_classification/被映射到 CMDB 内部接口:
- 对外:
POST /v2/cc/create_classification/(ESB,api_type 为 operate) - 对内:
POST /api/v3/create/objectclassification
内部路由由 topo_server 注册,见 src/scene_server/topo_server/service/service_business_initfunc.go,WebService 基础路径为/topo/v3/(src/scene_server/topo_server/service/service.go)。
6.2 topo_server 服务层:事务与权限联动
入口处理器CreateClassification(src/scene_server/topo_server/service/object_classification.go)做了两件关键事情:
- 开启事务:通过
CoreService().Txn().AutoRunTxn包裹整个创建流程,保证分类写入与后续操作原子性; - 注册 IAM 资源创建者:当开启鉴权(
auth.EnableAuthorize())时,将新分类以SysModelGroup资源类型注册到 IAM,并把当前用户记录为资源创建者(Creator),实现资源级细粒度权限控制。
6.3 业务逻辑层:字段校验规则
CreateClassification内部调用classification.CreateClassification(src/scene_server/topo_server/logics/model/classification.go),先通过isValid做参数校验,再调用 coreservice 落库,成功后回读记录并生成审计日志(auditlog.NewObjectClsAuditLog,动作类型AuditCreate)。
isValid(src/scene_server/topo_server/logics/model/classification.go)基于 src/common/valid/valid.go 中的校验函数执行:
bk_classification_id:ValidModelIDField,必填字符串,长度不超过 128 字符,且必须匹配正则^[a-zA-Z]\w*$——即以英文字母开头,后续只能是字母、数字、下划线(常量定义于 src/common/definitions.go,长度上限AttributeIDMaxLength = 128);bk_classification_name:ValidModelNameField,必填字符串,长度不超过 128 字符(AttributeNameMaxLength = 128)。
6.4 coreservice 存储层:ID 生成、前缀保护与去重
真正落库在 coreservice 的CreateOneModelClassification(src/source_controller/coreservice/core/model/classification.go),该函数额外把关三道:
- 必填校验:
bk_classification_id为空直接报错(错误码CCErrCommParamsNeedSet); - 内置前缀保护:分类 ID 不允许以
bk或BK开头(strings.HasPrefix(strings.ToLower(id), "bk")),防止用户自定义分类与平台内置分类冲突。注释明确说明:topo_server 上层虽已有 ID 校验,此处作为防止绕过上层直接调用 core service 的最后底线; - 唯一性保障:插入 MongoDB 表
bk_obj_classification(common.BKTableNameObjClassification)时若命中唯一索引冲突,返回CCErrCommDuplicateItem。
ID 通过mongodb.Client().NextSequence从序列生成,同时自动写入OwnerID = kit.SupplierAccount(src/source_controller/coreservice/core/model/classification_crud.go),这就是返回data.id与bk_supplier_account的来源。
6.5 测试用例验证
仓库内置了针对该链路的行为测试,见 src/source_controller/coreservice/core/model/classification_test.go:
- 传入空的
CreateOneModelClassification(分类 ID 为空)时,期望返回CCErrCommParamsNeedSet且指明bk_classification_id字段; - 使用唯一 ID(
xid生成)创建成功,返回的Created.ID非 0; - 再次使用同一 ID 创建时,期望命中
CCErrCommDuplicateItem重复项错误。
该测试直接印证了上文所述"必填校验 + 重复检测"两条规则的可观测行为。
七、调用注意事项与常见问题
- 分类 ID 一旦创建即固定:
bk_classification_id是系统内部标识,更新接口会强制剔除该字段(src/scene_server/topo_server/logics/model/classification.go),无法通过修改接口变更,只能删除后重建。 - 命名规范:必须以英文字母开头,长度 ≤ 128,禁止以
bk/BK开头(保留给平台内置分类,如bk_host_manage、bk_biz_topo)。 - 删除前置条件:分类下挂有模型(对象)时不允许删除,删除接口会返回
CCErrTopoObjectClassificationHasObject(见 src/scene_server/topo_server/logics/model/classification.go 与 src/source_controller/coreservice/core/model/classification.go)。 - 权限联动:开启鉴权后,创建者会被自动注册为该分类资源的 Creator,后续对该分类的新建模型等操作将基于此做资源级授权。
- 返回 data 的 type 区分:内置分类
bk_classification_type为inner,本接口创建的自定义分类为空字符串,可用该字段区分内置与自定义分组。
八、相关接口
围绕模型分类,仓库还提供了一组配套接口(均在 docs/apidoc/cc/cc.yaml 中定义),可与本接口配合使用:
| ESB 路径 | 内部路径 | 方法 | 说明 |
|---|---|---|---|
| /v2/cc/create_classification/ | /api/v3/create/objectclassification | POST | 添加模型分类(本文) |
| /v2/cc/delete_classification/ | /api/v3/delete/objectclassification/{id} | DELETE | 删除模型分类 |
| /v2/cc/update_classification/ | /api/v3/update/objectclassification/{id} | PUT | 更新模型分类 |
| /v2/cc/search_classifications/ | /api/v3/find/objectclassification | POST | 查询模型分类 |
建议的调用顺序是:先通过本接口创建自定义分类,再使用"新建模型"接口将模型挂载到该分类下,从而构建出符合自身运维场景的模型分组体系。
- 后端
- 企业应用
- 运维
【免费下载链接】bk-cmdb
蓝鲸智云配置平台(BlueKing CMDB)
相关推荐
蓝鲸配置平台 bk-cmdb 模型分类创建接口 create_classification 实战指南
蓝鲸配置平台 bk cmdb 模型分类创建接口 create_classification 实战指南 本文围绕蓝鲸配置平台(bk cmdb)开放网关(APIGW
后端企业应用运维蓝鲸配置平台 bk-cmdb 模型分类删除接口 delete_classification 实战指南
蓝鲸配置平台 bk cmdb 模型分类删除接口 delete_classification 实战指南 导读 delete_classification 是蓝鲸配
后端企业应用运维蓝鲸配置平台(bk-cmdb)查询模型分类接口 search_classifications 完整实战指南
蓝鲸配置平台(bk cmdb)查询模型分类接口 search_classifications 完整实战指南 导读 search_classifications
后端企业应用运维
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考