Как десериализовать объект AdmissionRequest.Raw в объект Kubernetes, не зная, что это GroupVersionKind? - PullRequest
0 голосов
/ 03 июля 2019

В настоящее время я пишу проверочный веб-крючок для Kubernetes. Я столкнулся с проблемой при попытке десериализации запроса на вход, поступающего из API Kubernetes, в объект Kubernetes. Ресурс может быть любым из: модулей, развертываний, наборов состояний, входов, служб. UniversalDeserializer запрашивает у меня тип, но я не могу узнать тип с помощью AdmissionRequest. Есть какой-нибудь декодер, который берет только объект Raw и декодирует его в допустимый объект?

Я попытался десериализовать AdmissionRequest.Request.Object.Raw и получил эту ошибку:

panic: Object 'Kind' is missing in '{"metadata":{"name":"gac","namespace":"all","uid":"2b38b994-9cf4-11e9-bb40-0800270c8766","generation":1,"creationTimestamp":"2019-07-02T18:06:52Z","labels":{"app":"gac","release":"nao_pode_essa"}},"spec":{"replicas":1,"selector":{"matchLabels":{"app":"gac","release":"2"}},"template":{"metadata":{"creationTimestamp":null,"labels":{"app":"gac","release":"2"}},"spec":{"containers":'...

Но в моем объекте был Добрый.

Я попытался десериализовать это, используя JSON-представление объекта, и это сработало.

Это мой код:

func main() {

    review := v1beta1.AdmissionReview{}
    body := `{"kind":"AdmissionReview","apiVersion":"admission.k8s.io/v1beta1","request":{"uid":"2b38c0e2-9cf4-11e9-bb40-0800270c8766","kind":{"group":"apps","version":"v1","kind":"Deployment"},"resource":{"group":"apps","version":"v1","resource":"deployments"},"namespace":"all","operation":"CREATE","userInfo":{"username":"minikube-user","groups":["system:masters","system:authenticated"]},"object":{"metadata":{"name":"gac","namespace":"all","uid":"2b38b994-9cf4-11e9-bb40-0800270c8766","generation":1,"creationTimestamp":"2019-07-02T18:06:52Z","labels":{"app":"gac","release":"nao_pode_essa"}},"spec":{"replicas":1,"selector":{"matchLabels":{"app":"gac","release":"2"}},"template":{"metadata":{"creationTimestamp":null,"labels":{"app":"gac","release":"2"}},"spec":{"containers":[{"name":"erickkkkk","image":"erickfaustino/gac:v0.1.0","ports":[{"name":"http","containerPort":8443,"protocol":"TCP"}],"resources":{"limits":{"cpu":"1","memory":"1Gi"},"requests":{"cpu":"200m","memory":"200Mi"}},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","imagePullPolicy":"Always"}],"restartPolicy":"Always","terminationGracePeriodSeconds":30,"dnsPolicy":"ClusterFirst","securityContext":{},"schedulerName":"default-scheduler"}},"strategy":{"type":"RollingUpdate","rollingUpdate":{"maxUnavailable":"25%","maxSurge":"25%"}},"revisionHistoryLimit":10,"progressDeadlineSeconds":600},"status":{}},"oldObject":null,"dryRun":false}}`
    bbyte := []byte(body)
    ud := scheme.Codecs.UniversalDeserializer()
    _, _, err := ud.Decode(bbyte, nil, &review)
    if err != nil {
        panic(err)
    }
    raw := review.Request.Object.Raw
    lero, _, err := ud.Decode(raw, nil, nil)
    if err != nil {
        panic(err)
    }
    fmt.Println(lero)

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...