Как проверить, было ли поле явно задано в настраиваемом ресурсе

Обновление: я обнаружил, что мой код действительно работает. Причина, по которой цикл согласования сначала получает 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. Если поле open значения CR было явно установлено как true или false, то цикл согласования должен принимать это значение напрямую.
  2. Если 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.

Есть ли другие способы проверки значения поля?


person Haoming Zhang    schedule 22.02.2020    source источник


Ответы (1)


Попробуйте добавить omitempty с помощью тега json.

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
}

Остальной код должен работать.

person Abdullah Al Maruf - Tuhin    schedule 22.02.2020
comment
Я пробовал ваше решение, но добавление omitempty по-прежнему не работает. Есть ли у вас какие-либо дальнейшие мысли? Спасибо - person Haoming Zhang; 23.02.2020
comment
Доступен ли исходный код в github? Я могу попробовать внести некоторые изменения. - person Abdullah Al Maruf - Tuhin; 23.02.2020
comment
Я нашел причину, по которой мой код не работает, см. Обновление в моем вопросе. - person Haoming Zhang; 23.02.2020