更新:
私のコードが実際に機能していることがわかりました。調整ループが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
例えば:
open
CR のフィールドの値が明示的にtrue
またはfalse
に設定されている場合、調整ループはこの値を直接受け取る必要があります。- CR にフィールドが明示的に設定されていない場合、またはこのフィールドが存在しない場合、調整ループはas
open
のデフォルト値を考慮する必要があります。open
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
}
上記のコードの考え方は、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
。
フィールド値のチェックを行う他の方法はありますか?