2

更新: 我发现我的代码确实有效。协调循环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字段值。例如:

  1. 如果值 CR 的open字段已显式设置为trueor false,则协调循环应直接采用此值。
  2. 如果 CR 没有open明确设置字段,或者该字段不存在,则协调循环应考虑默认值openas true

目前我尝试了这种方式,将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
}

上面代码的思路是检查openfield的指针是否存在:如果指针为null,则设置trueopenfield。这个想法来自这个问题Go: How to check if a struct property was explicit set to a zero value?

但是上面的代码没有像我预期的那样工作:如果 openCR 的字段不存在(没有明确设置值),则 valuestore.Spec.Open将被解析为falsebut not nil

还有其他方法可以进行字段值检查吗?

4

1 回答 1

0

尝试omitempty使用您的 json 标签添加。

type MyStoreSpec struct {
    Name         string   `json:"name"`
    Address      string   `json:"address"`
    Zip          string   `json:"zip"`
    Open         *bool    `json:"open,omitempty"` // Here I use *bool as type
}

其余代码应该可以工作。

于 2020-02-22T15:34:47.917 回答