亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無論類型如何反序列化 ObjectMeta

無論類型如何反序列化 ObjectMeta

Go
波斯汪 2023-06-26 17:21:34
如何在事先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.ObjectMetaif _, _, 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一個。
查看完整描述

2 回答

?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

我最近發現了一種方法可以做到這一點,讓我在這里描述一下:


快速免責聲明:我使用了admission/v1,但從未使用admission/v1beta1 進行過測試,它的工作原理應該是相同的。


的數據類型admissionReview.Request.Object為runtime.RawExtension,并且提供了將 轉換為 a 的k8s.io/apimachinery/pkg/runtime方法。該方法稱為. 從那里,您可以輕松地轉換為數據類型,該數據類型具有可以通過簡單的 getter 方法訪問的對象的所有字段。runtime.RawExtensionruntime.Objectruntime.Convert_runtime_RawExtension_To_runtime_Object(...)unstructured.UnstructuredMetaV1


這是一個可以讓您完成此任務的代碼片段:


import (

? ? // ...

? ? "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"

? ? "k8s.io/apimachinery/pkg/runtime"

? ? // ...

)


// ...


func dummyFunc(ar *v1.AdmissionReview) {

? ? // ...

? ? var obj runtime.Object

? ? var scope conversion.Scope // While not actually used within the function, need to pass in

? ? err := runtime.Convert_runtime_RawExtension_To_runtime_Object(&ar.Request.Object, &obj, scope)

? ? if err != nil {

? ? ? ? // ...

? ? }


? ? innerObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)

? ? if err != nil {

? ? ? ? // ...

? ? }

? ? u := unstructured.Unstructured{Object: innerObj}

? ? // Now the `u` variable has all the meta info available with simple getters.

? ? // Sample:

? ? labels := u.GetLabels()

? ? kind := u.GetKind()

? ? // etc.

? ? // ...

}

查看完整回答
反對 回復 2023-06-26
?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

我相信你找不到你要找的東西,因為在解碼對象時,Kubernetes 使用GetObjectKind并將結果與方案進行比較,以將對象轉換為具體類型,而不是使用一些通用的方法并與字段交互對象的具體類型而不知道它的具體類型。

所以你可以使用反射來代替,比如:

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")

}


查看完整回答
反對 回復 2023-06-26
?
搖曳的薔薇

TA貢獻1793條經驗 獲得超6個贊

看來有兩種可能:

  1. 要么該字段Object應該已經包含正確的對象實例

  2. 嘗試使用此處的轉換器


查看完整回答
反對 回復 2023-06-26
  • 2 回答
  • 0 關注
  • 283 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號