核心组件
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/ 目录 | 高 |