Обновление: я обнаружил, что мой код действительно работает. Причина, по которой цикл согласования сначала получает 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 не имеет явно установленного поля
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
: если указатель равен нулю, установите true
в поле open
. Идея исходит из этого вопроса Перейти: как проверить, было ли свойство структуры явно установлено на нулевое значение?
Но приведенный выше код работает не так, как я ожидал: если поле open
CR не существует (не имеет явно заданного значения), значение store.Spec.Open
будет проанализировано как false
, но не nil
.
Есть ли другие способы проверки значения поля?