我想比较两个Kubernetes API对象(例如v1.PodSpec
):其中一个是手动创建的(预期状态),另一个是从Kubernetes API /客户端接收的(实际状态)。
问题在于,即使两个对象在语义上是相等的,对于其他结构具有默认值的未指定字段,手动创建的结构也具有零值,因此这两个对象不匹配。这意味着简单的reflect.DeepEqual()
调用不足以进行比较。
例如之后:
expected := &v1.Container{
Name: "busybox",
Image: "busybox",
}
actual := getContainerSpecFromApi(...)
expected.ImagePullPolicy
将是""
,而actual.ImagePullPolicy
将是"IfNotPresent"
(默认值),因此比较失败。
在Kubernetes API结构中是否有惯用的方法用默认值替换零值?或者是构造函数,该函数用某个地方可用的默认值初始化结构吗?
编辑:
目前,我对每种K8s API对象类型都使用了手写相等性测试,但是这对我来说似乎无法维护。我正在寻找一个简单的(一组)函数,该函数“知道”所有内置Kubernetes API对象字段的默认值(可能在k8s.io/api*
下?)。像这样:
expected = api.ApplyContainerDefaults(expected)
if !reflect.DeepEqual(expected, actual) {
reconcile(expected, actual)
}
答案 0 :(得分:2)
有些助手可以填写默认值,以代替空/零值。
例如,查看SetObjectDefaults_Deployment进行部署。
看起来正确的调用方法是通过(*runtime.Scheme).Default
。
以下是显示一般想法的代码段:
boolUpdate
如果您需要比较严格的比较(例如,如果您需要容忍一些注入的容器),则应使用更放松的东西,例如this。