Как проверить, было ли поле явно задано в пользовательском ресурсе - PullRequest
1 голос
/ 22 февраля 2020

Обновление: Я обнаружил, что мой код действительно работает. Причина, по которой сначала выполняется согласование 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. Например:

  1. Если в поле значения CR open явно задано значение true или false, то при согласовании l oop это значение должно приниматься напрямую.
  2. Если 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.

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

1 Ответ

0 голосов
/ 22 февраля 2020

Попробуйте добавить 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
}

Остальная часть кода должна работать.

...