更新:
我发现我的代码确实有效。协调循环false
首先出现的原因是因为我的集群中存在另一个运算符并自动进行布尔翻转。删除该运算符后,我的代码按预期工作。
这个问题与 Kubernetes 和 Operator-SDK 有关。假设我有一个自定义资源,其规范显示如下:
apiVersion: my.example.com/v1alpha1
kind: MyStore
metadata:
name: mystore
spec:
name: "sample-store"
address: "sample-address"
zip: "sample-zip"
open: true
最后一个字段open
是布尔类型,用于指示商店是否营业。在我的操作员的协调循环中,我想知道MyStore
类型的 CR 是否明确设置了open
字段值。例如:
- 如果值 CR 的
open
字段已显式设置为true
orfalse
,则协调循环应直接采用此值。 - 如果 CR 没有
open
明确设置字段,或者该字段不存在,则协调循环应考虑默认值open
astrue
。
目前我尝试了这种方式,将open
字段类型设置为我的结构中的布尔指针:
type MyStoreSpec struct {
Name string `json:"name"`
Address string `json:"address"`
Zip string `json:"zip"`
Open *bool `json:"open"` // Here I use *bool as type
}
type MyStore stuct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec MyStoreSpec `json:"spec,omitempty"`
}
然后在协调循环中,我检查现有的open
字段,如下所示:
store := &examplev1beta1.MyStore{}
r.client.Get(context.TODO(), request.NamespacedName, store)
if store.Spec.Open == nil {
a := true
store.Spec.Open = &a
}
上面代码的思路是检查open
field的指针是否存在:如果指针为null,则设置true
为open
field。这个想法来自这个问题Go: How to check if a struct property was explicit set to a zero value?
但是上面的代码没有像我预期的那样工作:如果 open
CR 的字段不存在(没有明确设置值),则 valuestore.Spec.Open
将被解析为false
but not nil
。
还有其他方法可以进行字段值检查吗?