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