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は、店舗が開いているかどうかを示すために使用されるブール型です。オペレーターの調整ループで、種類の CR がフィールドMyStoreの値を明示的に設定したかどうかを知りたいです。open例えば:

  1. openCR のフィールドの値が明示的にtrueまたはfalseに設定されている場合、調整ループはこの値を直接受け取る必要があります。
  2. CR にフィールドが明示的に設定されていない場合、またはこのフィールドが存在しない場合、調整ループはasopenのデフォルト値を考慮する必要があります。opentrue

現在、私はこの方法を試しました。これは、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フィールドのポインターが存在するかどうかを確認することです。ポインターが null の場合、フィールドに設定さtrueopenます。そして、アイデアはこの質問Go: How to check if a struct property was explicit set to a zero value? からです。

しかし、上記のコードは期待どおりに機能し openません。CR のフィールドが存在しない場合 (値が明示的に設定されていない場合)、 の値はstore.Spec.Openとして解析されますが、 ではfalseありませんnil

フィールド値のチェックを行う他の方法はありますか?

4

1 に答える 1

0

omitemptyjson タグで追加してみてください。

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 に答える