Обновление: Я обнаружил, что мой код действительно работает. Причина, по которой сначала выполняется согласование l oop get false
, заключается в том, что в моем кластере есть другой оператор, который выполняет логическое переключение автоматически. После удаления этого оператора мой код работает должным образом.
Этот вопрос связан с Kubernetes и Operator-SDK. Допустим, у меня есть пользовательский ресурс, значение которого c показано следующим образом:
apiVersion: my.example.com/v1alpha1
kind: MyStore
metadata:
name: mystore
spec:
name: "sample-store"
address: "sample-address"
zip: "sample-zip"
open: true
Где последнее поле open
- логический тип, используемый для указания, открыто ли хранилище или нет. В согласовании l oop моего оператора, я хотел бы знать, было ли CR типа MyStore
явно установлено значение поля open
. Например:
- Если в поле значения CR
open
явно задано значение true
или false
, то при согласовании l oop это значение должно приниматься напрямую. - Если CR не имеет поля
open
, явно установленного, или это поле не существует, для согласования l oop следует рассмотреть значение по умолчанию 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"`
}
Затем в согласовании l oop я проверяю существующее поле open
, как это :
store := &examplev1beta1.MyStore{}
r.client.Get(context.TODO(), request.NamespacedName, store)
if store.Spec.Open == nil {
a := true
store.Spec.Open = &a
}
Идея приведенного выше кода заключается в проверке существования указателя поля open
: если указатель нулевой, установите true
в поле open
. И идея этого вопроса Go: Как проверить, было ли для свойства struct явно установлено нулевое значение?
Но приведенный выше код работает не так, как я ожидал: if open
поле CR не существует (значение не может быть задано явно), значение store.Spec.Open
будет проанализировано как false
, но не nil
.
Есть ли другие способы сделать проверка значения поля?