cmdb

package
v0.0.0-...-6a92a4a Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 3, 2026 License: MIT Imports: 19 Imported by: 0

Documentation

Overview

Package cmdb provides cmdb service.

Package cmdb provides cmdb client.

Index

Constants

View Source
const (
	// BK_SET_OBJ_ID Set 对象ID
	BK_SET_OBJ_ID = "set"
	// BK_MODULE_OBJ_ID Module 对象ID
	BK_MODULE_OBJ_ID = "module"
	// BK_HOST_OBJ_ID Host 对象ID
	BK_HOST_OBJ_ID = "host"
)

Variables

This section is empty.

Functions

func CheckAndMarkHostAliasConflicts

func CheckAndMarkHostAliasConflicts(kit *kit.Kit, dao dao.Set, tx *gen.QueryTx, bizID uint32) error

CheckAndMarkHostAliasConflicts 检测同主机同别名冲突并标记状态

逻辑:

  1. 查询同 biz 下 (host_id, alias) 重复的进程 ID 列表
  2. 将冲突进程标记为 abnormal
  3. 将之前标记为 abnormal 但已不再冲突的进程恢复为 synced

func DeleteInstanceStoppedUnmanaged

func DeleteInstanceStoppedUnmanaged(kit *kit.Kit, dao dao.Set, tx *gen.QueryTx, bizID uint32, processIDs []uint32) error

DeleteInstanceStoppedUnmanaged 删除进程状态是已停止或者是空 和 托管状态是未托管或者是空的实例数据

func NewSyncCMDBService

func NewSyncCMDBService(tenantID string, bizID int, svc bkcmdb.Service, dao dao.Set) *syncCMDBService

NewSyncCMDBService 初始化同步cmdb(多租户:tenantID 为空时按单租户 "default" 处理)

func PageFetcher

func PageFetcher[T any](fetch func(page *bkcmdb.PageParam) ([]T, int, error)) ([]T, error)

PageFetcher 封装分页逻辑的通用函数

Types

type ApplicationXML

type ApplicationXML struct {
	XMLName xml.Name `xml:"Application"`
	Sets    []SetXML `xml:"Set"`
}

ApplicationXML 应用根节点(对应 Python 中的 Application) 参考 Python 代码中的 XML 结构:doc.createElement("Application")

type BizGlobalVariables

type BizGlobalVariables struct {
	// TopoVariables 拓扑变量字段列表
	// 包含 Set、Module、Host 的所有字段列表,用于补充 XML 属性
	// 参考 Python 代码:topo_variables 用于 fillMissingFields
	TopoVariables struct {
		SetFields    []string `json:"set_fields"`    // Set 字段列表
		ModuleFields []string `json:"module_fields"` // Module 字段列表
		HostFields   []string `json:"host_fields"`   // Host 字段列表
	} `json:"topo_variables"`
}

BizGlobalVariables 业务全局变量结构 参考 Python 代码中的 biz_global_variables

type Bizs

type Bizs map[int][]Set

Bizs 业务

type BuildInstancesParams

type BuildInstancesParams struct {
	BizID            uint32
	HostID           uint32
	ModuleID         uint32
	CcProcessID      uint32
	ProcNum          int
	ExistCount       int
	MaxModuleInstSeq int
	MaxHostInstSeq   int
	Alias            string
}

BuildInstancesParams buildInstances 函数的参数

type BuildProcessChangesParams

type BuildProcessChangesParams struct {
	NewProcess *table.Process
	OldProcess *table.Process
}

BuildProcessChangesParams BuildProcessChanges 函数的参数

type BuildProcessChangesResult

type BuildProcessChangesResult struct {
	ToAddProcess        *table.Process
	ToUpdateProcess     *table.Process
	ToDeleteProcessID   uint32
	ToAddInstances      []*table.ProcessInstance
	ToDeleteInstanceIDs []uint32
	// 需要重新编排的模块 (moduleID, alias)
	ModuleToReorder *ModuleAliasKey
}

BuildProcessChangesResult 包含 BuildProcessChanges 的返回结果

func BuildProcessChanges

func BuildProcessChanges(ctx *SyncContext, params *BuildProcessChangesParams) (*BuildProcessChangesResult, error)

BuildProcessChanges 根据 CMDB 新旧进程数据,计算进程及其实例的变更结果: - 是否需要新增进程 - 是否需要更新进程 - 是否需要删除旧进程 - 是否需要新增/删除/更新进程实例

nolint: funlen

type CCTopoXMLService

type CCTopoXMLService struct {
	// contains filtered or unexported fields
}

CCTopoXMLService 用于获取和构建 CC 拓扑 XML 的服务 参考 Python 代码中的 CMDBHandler.cache_topo_tree_attr 方法

func NewCCTopoXMLService

func NewCCTopoXMLService(bizID int, svc bkcmdb.Service) *CCTopoXMLService

NewCCTopoXMLService 创建 CC 拓扑 XML 服务

func (*CCTopoXMLService) GetBizGlobalVariables

func (s *CCTopoXMLService) GetBizGlobalVariables(ctx context.Context) (*BizGlobalVariables, error)

GetBizGlobalVariables 获取业务全局变量 参考 Python 代码中的 biz_global_variables 获取逻辑 返回包含 topo_variables 等全局变量的结构

func (*CCTopoXMLService) GetBizGlobalVariablesMap

func (s *CCTopoXMLService) GetBizGlobalVariablesMap(ctx context.Context) (map[string]interface{}, error)

GetBizGlobalVariablesMap 获取业务全局变量(Map 格式,用于模板渲染) 返回 map[string]interface{} 格式,可以直接用于模板渲染上下文 参考 Python 代码:biz_global_variables 在模板渲染时会被合并到 context 中 Python 代码逻辑:

  • biz_global_variables 的结构:{ "set": [...], "module": [...], "host": [...] }
  • 每个对象类型对应一个变量列表,每个变量包含 bk_property_id
  • 在模板渲染时,会从 this.cc_set.attrib、this.cc_module.attrib、this.cc_host.attrib 中提取属性值
  • 补充内置字段:for bk_obj_id, bk_obj_variables in biz_global_variables.items(): for variable in bk_obj_variables: bk_property_id = variable["bk_property_id"] context[bk_property_id] = getattr(this_context, f"cc_{bk_obj_id}").attrib.get(bk_property_id)

注意:此方法复用 GetBizObjectAttributes 来获取属性信息,确保数据一致性

func (*CCTopoXMLService) GetBizObjectAttributes

func (s *CCTopoXMLService) GetBizObjectAttributes(ctx context.Context) (map[string][]ObjectAttribute, error)

GetBizObjectAttributes 获取业务对象属性(完全对应 Python 的 biz_global_variables 方法) 返回 Set、Module、Host、Global 对象的属性列表 完全按照 Python 代码逻辑实现,包括: 1. 获取所有对象属性 2. 添加旧系统字段(append_legacy_global_variables) 3. 筛选业务自定义属性或系统常用属性 4. 按属性名称排序 5. 按对象ID分组

func (*CCTopoXMLService) GetTopoTreeXML

func (s *CCTopoXMLService) GetTopoTreeXML(ctx context.Context, setEnv string) (string, error)

GetTopoTreeXML 获取业务拓扑树的 XML 格式数据 参考 Python 代码中的 CMDBHandler.cache_topo_tree_attr(bk_set_env) 方法 参数 setEnv: 环境类型过滤(1-测试, 2-体验, 3-正式),如果为空则不过滤 返回包含所有 Set、Module、Host 及其属性的完整 XML 字符串 结构:Application -> Set -> Module -> Host

type Host

type Host struct {
	ID      int
	IP      string
	IPV6    string // 内网 IPv6,同步自 CC bk_host_innerip_v6
	CloudId int
	AgentID string
}

Host 主机

type HostInfo

type HostInfo struct {
	IP      string
	IPV6    string
	CloudId int
	AgentID string
}

HostInfo 构建 HostID -> HostInfo 映射

type HostProcessKey

type HostProcessKey struct {
	CcProcessID int
	HostID      int
}

HostProcessKey 用于 HostCounter 的 key,表示 (ccProcessID, hostID) 组合

type HostXML

type HostXML struct {
	XMLName xml.Name `xml:"Host"`
	// 所有属性通过 Attrs 动态添加(包括 InnerIP, CloudID, HostID, HostName 等,通过 buildAttrsFromStruct 统一处理)
	Attrs []xml.Attr `xml:",any,attr"` // 动态属性
}

HostXML 主机节点(包含所有属性) 注意:所有属性都通过 Attrs 动态添加,与 Python 代码统一处理方式一致

type InstanceReconcileResult

type InstanceReconcileResult struct {
	ToAdd    []*table.ProcessInstance
	ToDelete []uint32
}

InstanceReconcileResult 扩缩容实例

type Module

type Module struct {
	ID                int
	ServiceTemplateID int
	Name              string
	Host              []Host
	SvcInst           []SvcInst
}

Module 模块

type ModuleAliasKey

type ModuleAliasKey struct {
	ModuleID int
	Alias    string
}

ModuleAliasKey 用于 moduleCounter 的 key,表示 (moduleID, alias) 组合

type ModuleXML

type ModuleXML struct {
	XMLName xml.Name `xml:"Module"`
	// 所有属性通过 Attrs 动态添加(包括 ModuleName, ModuleID 等,通过 buildAttrsFromStruct 统一处理)
	Attrs []xml.Attr `xml:",any,attr"` // 动态属性
	Hosts []HostXML  `xml:"Host"`
}

ModuleXML 模块节点(包含所有属性) 注意:所有属性都通过 Attrs 动态添加,与 Python 代码统一处理方式一致

type ObjectAttribute

type ObjectAttribute struct {
	BkPropertyID        string `json:"bk_property_id"`         // 属性ID
	BkPropertyName      string `json:"bk_property_name"`       // 属性名称
	BkPropertyGroupName string `json:"bk_property_group_name"` // 属性分组名称(可选)
	BkPropertyType      string `json:"bk_property_type"`       // 属性类型(可选)
	BkObjID             string `json:"bk_obj_id"`              // 对象ID(set/module/host/global)
	BkBizID             int    `json:"bk_biz_id,omitempty"`    // 业务ID(可选,内置变量为0)
}

ObjectAttribute 对象属性信息(完全对应 Python 代码中的属性结构)

type ProcInst

type ProcInst struct {
	ID                int
	HostID            int
	ProcessTemplateID int
	Name              string
	FuncName          string
	ProcNum           int
	table.ProcessInfo
}

ProcInst 进程实例

type ProcessDiff

type ProcessDiff struct {
	// 进程级
	ToAddProcesses     []*table.Process
	ToUpdateProcesses  []*table.Process
	ToDeleteProcessIDs []uint32

	// 实例级
	ToAddInstances      []*table.ProcessInstance
	ToDeleteInstanceIDs []uint32

	// 需要重新编排 ModuleInstSeq 的模块 (moduleID, alias) 集合
	ModulesToReorder map[ModuleAliasKey]struct{}

	// side effect
	NeedSyncGSE bool
}

ProcessDiff 进程差异对比

type ProcessWithInstances

type ProcessWithInstances struct {
	Process   *table.Process
	Instances []*table.ProcessInstance
}

ProcessSyncItem 一次同步中单个进程的结果

type ReconcileInstancesParams

type ReconcileInstancesParams struct {
	BizID       uint32
	ProcessID   uint32
	HostID      uint32
	ModuleID    uint32
	CcProcessID uint32
	Alias       string
	OldNum      int
	NewNum      int
}

ReconcileInstancesParams reconcileProcessInstances 函数的参数

type ReorderParams

type ReorderParams struct {
	BizID      uint32
	ModuleID   uint32
	Alias      string
	ExcludeIDs []uint32
}

ReorderParams reorderModuleInstSeq 函数的参数

type Set

type Set struct {
	ID     int
	Name   string
	SetEnv string
	Module []Module
}

Set 集群

type SetXML

type SetXML struct {
	XMLName xml.Name `xml:"Set"`
	// 所有属性通过 Attrs 动态添加(包括 SetName, SetID 等,通过 buildAttrsFromStruct 统一处理)
	Attrs   []xml.Attr  `xml:",any,attr"` // 动态属性
	Modules []ModuleXML `xml:"Module"`
}

SetXML 集群节点(包含所有属性) 参考 Python 代码,确保属性名与 Python 输出一致 注意:所有属性都通过 Attrs 动态添加,与 Python 代码统一处理方式一致

type SvcInst

type SvcInst struct {
	ID       int
	Name     string
	ProcInst []ProcInst
}

SvcInst 服务实例

type SyncContext

type SyncContext struct {
	Kit           *kit.Kit
	Dao           dao.Set
	Tx            *gen.QueryTx
	Now           time.Time
	HostCounter   map[HostProcessKey]int // key: HostProcessKey{ccProcessID, hostID}
	ModuleCounter map[ModuleAliasKey]int // key: ModuleAliasKey{moduleID, alias}
}

SyncContext 同步过程中的共享上下文

type SyncProcessResult

type SyncProcessResult struct {
	Items []*ProcessWithInstances
}

SyncProcessResult 表示一次进程同步任务的汇总结果

func SyncProcessData

func SyncProcessData(kit *kit.Kit, dao dao.Set, tx *gen.QueryTx, bizID uint32, oldProcesses,
	newProcesses []*table.Process) (*SyncProcessResult, error)

SyncProcessData 对比并同步进程及进程实例数据

同步策略:

  1. 基于 oldProcesses / newProcesses 做差异计算
  2. 先删除实例(缩容)
  3. 再删除进程(包含兜底删除 stopped / unmanaged 实例)
  4. 新增进程
  5. 更新进程
  6. 回填 ProcessID 到新增实例
  7. 新增实例(扩容 / 新进程)

返回值:

  • SyncProcessResult:本次新增/更新的进程及其新增实例
  • error:任一阶段失败则直接返回

nolint:funlen

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL