如何用Kubernetes API对象的默认值来自动填充空白字段?

时间:2019-05-13 15:10:10

标签: go kubernetes client-go

我想比较两个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)
}

1 个答案:

答案 0 :(得分:2)

有些助手可以填写默认值,以代替空/零值。

例如,查看SetObjectDefaults_Deployment进行部署。

看起来正确的调用方法是通过(*runtime.Scheme).Default。 以下是显示一般想法的代码段:

boolUpdate

如果您需要比较严格的比较(例如,如果您需要容忍一些注入的容器),则应使用更放松的东西,例如this