更新:
私のコードが実際に機能していることがわかりました。調整ループが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例えば:
openCR のフィールドの値が明示的にtrueまたはfalseに設定されている場合、調整ループはこの値を直接受け取る必要があります。- CR にフィールドが明示的に設定されていない場合、またはこのフィールドが存在しない場合、調整ループはas
openのデフォルト値を考慮する必要があります。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 の場合、フィールドに設定さtrueれopenます。そして、アイデアはこの質問Go: How to check if a struct property was explicit set to a zero value? からです。
しかし、上記のコードは期待どおりに機能し openません。CR のフィールドが存在しない場合 (値が明示的に設定されていない場合)、 の値はstore.Spec.Openとして解析されますが、 ではfalseありませんnil。
フィールド値のチェックを行う他の方法はありますか?