Skip to content

核心组件

text
# 相关代码:
- cmd/main.go         # 入口和协调
- cel/condition.go    # CEL 条件定义
- cel/evaluate.go     # CEL 评估逻辑

组件总览

1. ValidationCondition

文件: cel/condition.go

CEL 表达式的包装器,实现 cel.ExpressionAccessor 接口。

go
type ValidationCondition struct {
    Expression string
}

func (v *ValidationCondition) GetExpression() string {
    return v.Expression
}

func (v *ValidationCondition) ReturnTypes() []*celgo.Type {
    return []*celgo.Type{celgo.BoolType}
}

设计意图

  • 将 CEL 表达式封装为可编译的形式
  • ReturnTypes 约束返回值必须为布尔类型

2. Evaluate 函数

文件: cel/evaluate.go:14-85

评估 CEL 表达式的核心函数。

关键实现

go
// 变量解析 - 只暴露 "object" 变量
func (a *evaluationActivation) ResolveName(name string) (interface{}, bool) {
    switch name {
    case cel.ObjectVarName:  // "object"
        return a.object, true
    default:
        return nil, false
    }
}

设计意图

  • 使用 evaluationActivation 实现 CEL 的 interpreter.Activation 接口
  • 只暴露 object 变量,限制表达式的访问范围

3. Informer 事件处理

文件: cmd/main.go:88-112

使用 Dynamic Informer 监听任意资源类型。

go
informer := dynamicinformer.NewFilteredDynamicInformer(
    client,
    gate.gvr,           // 监听的资源类型
    gate.namespace,      // 命名空间
    0,                   // resyncPeriod = 0,不定期重同步
    nil,                 // 无 indexers
    func(opts *metav1.ListOptions) {
        opts.FieldSelector = "metadata.name=" + gate.name  // 只监听指定名称
    },
).Informer()

事件处理器

go
informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
    AddFunc:    func(obj interface{}) { gateChecker(obj.(*unstructured.Unstructured)) },
    UpdateFunc: func(_, obj interface{}) { gateChecker(obj.(*unstructured.Unstructured)) },
    DeleteFunc: func(_ interface{}) { /* 忽略删除事件 */ },
})

设计意图

  • FieldSelector 限制只监听一个特定资源,减少开销
  • DeleteFunc 不处理,因为资源删除不应触发解锁

4. 默认模式回退

文件: cmd/main.go:63-69

go
if gate.gvr.Empty() {
    gate.gvr = schema.GroupVersionResource{
        Group:    "pod-running-control.io",
        Version:  "v1alpha1",
        Resource: "podrunninggates",
    }
    expression = "size(object.spec.gates) == 0"
}

设计意图

  • 未指定 GVR 时自动使用 CRD 模式
  • 表达式 size(object.spec.gates) == 0 检查 gates 数组是否为空

依赖关系

扩展点

扩展场景修改位置复杂度
支持多表达式gateChecker 逻辑
添加自定义 CEL 函数cel/ 新增文件
支持多资源监听informer 创建逻辑
添加 Webhook 注入新增 webhook/ 目录

基于代码自动生成的文档