gpt4 book ai didi

go - 无论种类如何反序列化 ObjectMeta

转载 作者:IT王子 更新时间:2023-10-29 01:09:42 25 4
gpt4 key购买 nike

TL;DR:如何在不知道对象的 Kind metav1.ObjectMeta 结构提前?


我正在编写一个准入 Controller 端点,它根据 Request 将 metav1.AdmissionReview 对象的 Request.Object.Raw 字段解编为具体对象。 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,我们可以使用它来提高灵 active 。

我想要实现的是更接近于:

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接口(interface),但我需要先从 AdmissionReview.Request.Object(键入 runtime.RawExtension)到 runtime.Object

最佳答案

我相信你找不到你要找的东西,因为在解码对象时,Kubernetes 使用 GetObjectKind并将结果与​​ Scheme 进行比较将对象转换为具体类型,而不是使用一些 generic喜欢在不知 Prop 体类型的情况下接近和与对象的字段进行交互。

因此您可以改用反射,例如:

k8sObjValue := reflect.ValueOf(admissionReview.Request.Object.Raw).Elem()
k8sObjObjectMeta := k8sObjValue.FieldByName("ObjectMeta")
annotations, ok := k8sObjObjectMeta.FieldByName("Annotations").Interface().(map[string]string)
if !ok {
panic("failed to retrieve annotations")
}

编辑:

或者更接近你的要求,转换成一个ObjectMeta对象

k8sObjValue := reflect.ValueOf(admissionReview.Request.Object.Raw).Elem()
objMeta, ok := k8sObjValue.FieldByName("ObjectMeta").Interface().(core.ObjectMeta)
if !ok {
panic("failed to retrieve object metadata")
}

关于go - 无论种类如何反序列化 ObjectMeta,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56765480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com