TL; DR: Как можно гибко декодировать объект API k8s и проверять его структуру metav1.ObjectMeta
верхнего уровня, не зная заранее Kind
объекта?
Я пишу конечную точку контроллера допуска, которая демаршализирует поле metav1.AdmissionReview
объекта Request.Object.Raw
в конкретный объект на основе поля Request.Kind
- например,
if kind == "Pod" {
var pod core.Pod
// ...
if _, _, err := deserializer.Decode(admissionReview.Request.Object.Raw, nil, &pod); err != nil {
return nil, err
}
annotations := pod.ObjectMeta.Annotations
// inspect/validate the annotations...
Это требует знания всех возможных типов заранее.или, возможно, попросить пользователя предоставить map[kind]corev1.Object
, который мы можем использовать для большей гибкости.
То, что я хотел бы вместо этого достичь, - это что-то ближе к:
var objMeta core.ObjectMeta
if _, _, err := deserializer.Decode(admissionReview.Request.Object.Raw, nil, &objMeta); err != nil {
return nil, err
}
// if objMeta is populated, validate the fields, else
// assume it is an object that does not define an ObjectMeta
// as part of its schema.
Isэто возможно?Поверхность API k8s довольно обширна, и я просканировал metav1 godoc , corev1 godoc & https://cs.k8s.io для предшествующего уровня техники без приличного примера.
Ближайший IВозможно, обнаружен интерфейс ObjectMetaAccessor
, но мне нужно было бы перейти от AdmissionReview.Request.Object
(тип runtime.RawExtension
) к runtime.Object
сначала.