Я хочу сравнить два объекта API Kubernetes (например, v1.PodSpec
s): один из них был создан вручную (ожидаемое состояние), другой был получен от API / клиента Kubernetes (фактическое состояние). Проблема в том, что даже если два объекта семантически равны, созданная вручную структура имеет нулевые значения для неопределенных полей, тогда как другая структура имеет значения по умолчанию, и поэтому два не совпадают. Это означает, что простого вызова reflect.DeepEqual()
для сравнения недостаточно.
Например. после этого:
expected := &v1.Container{
Name: "busybox",
Image: "busybox",
}
actual := getContainerSpecFromApi(...)
expected.ImagePullPolicy
будет ""
, а actual.ImagePullPolicy
будет "IfNotPresent"
(значение по умолчанию), поэтому сравнение не выполняется.
Есть ли идиоматический способ конкретно заменить нулевые значения значениями по умолчанию в структурах Kubernetes API? Или, альтернативно, есть функция-конструктор, которая инициализирует структуру значениями по умолчанию, доступными для них где-то?
РЕДАКТИРОВАТЬ: В настоящее время я использую рукописные тесты на равенство для каждого типа объектов API K8s, но мне это не кажется поддерживаемым. Я ищу простую (набор) функцию (ы), которая «знает» значения по умолчанию для всех встроенных полей объекта Kubernetes API (возможно, где-то под k8s.io/api*
?). Что-то вроде этого:
expected = api.ApplyContainerDefaults(expected)
if !reflect.DeepEqual(expected, actual) {
reconcile(expected, actual)
}
if field == "" { field = defaultvalue }
. - person mkopriva   schedule 13.05.2019reflect
, чтобы сделать это за вас, но я не уверен, что это будет считаться идиоматическим. Тем не менее, если вам это нужно в основном для тестирования, я определенно рекомендую вам использоватьreflect
. - person mkopriva   schedule 13.05.2019