TL; DR:如何在不事先metav1.ObjectMeta
知道k8s API对象的情况下灵活地对其进行解码并检查其顶层结构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.
这可能吗?k8s API涉及面非常广泛,对于没有相关示例的现有技术,我已经对metav1 godoc,corev1 godoc和https://cs.k8s.io进行了爬网。
我找到的最接近的可能是ObjectMetaAccessor
接口,但是我需要从AdmissionReview.Request.Object
(type runtime.RawExtension
)到runtime.Object
第一个。