Как использовать runtime.Object для создания универсальных функций CRD в go
Я пишу контроллер Kubernetes, в котором мне нужно запустить функцию для разных видов ресурсов, включая мои собственные ресурсы и другие виды ресурсов (эта функция интересует только имя ресурса).
Я понимаю, что это выполнимо, используя runtime.Object
но я не могу заставить его работать.
Вот подпись функции:
func myFunc(foo []runtime.Object) []runtime.Object
При вызове функции я передаю типизированный объект и ожидаю, что он будет назначен runtime.Object
:
foo := []v1alpha1.MyCRD{}
bar := myFunc(foo)
Я получаю ошибку компилятора:
cannot use foo (type []v1alpha1.MyCRD) as []runtime.Object in argument to myFunc
Глядя на определение runtime.Object
:
type Object interface {
GetObjectKind() schema.ObjectKind
DeepCopyObject() Object
}
MyCRD
тип встраивания metav1.TypeMeta
поэтому он имеет необходимый GetObjectKind()
функция.
Это также отмечено с:
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
Так что он также имеет необходимые DeepCopyObject()
(см. в сгенерированном файле).
Я боролся с этим некоторое время, и я думаю, что это может иметь отношение к регистрации типа с scheme
но я не уверен, как это работает, и не могу найти никакой документации по этому вопросу. Я пытался скопировать регистрационный код типа из других проектов, которые я нашел, не понимая, что он делает (как я уже сказал, не могу найти документы по этому вопросу).. все еще не работает.
связанные с: