From e54dea7a9cc122a9009c4c32a0f25a4f9ad2d1cd Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Tue, 7 May 2019 22:47:20 +0200 Subject: [PATCH] apiextensions: wire defaulter --- .../pkg/apiserver/customresource_handler.go | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go index 4471e4cc5f9..a110a3a9b2a 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go @@ -31,6 +31,7 @@ import ( "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" "k8s.io/apiextensions-apiserver/pkg/apiserver/conversion" structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" + structuraldefaulting "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting" structuralpruning "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning" apiservervalidation "k8s.io/apiextensions-apiserver/pkg/apiserver/validation" informers "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion" @@ -645,7 +646,7 @@ func (r *crdHandler) getOrCreateServingInfoFor(crd *apiextensions.CustomResource Creater: creator, Convertor: safeConverter, - Defaulter: unstructuredDefaulter{parameterScheme}, + Defaulter: unstructuredDefaulter{parameterScheme, structuralSchemas, kind.GroupKind()}, Typer: typer, UnsafeConvertor: unsafeConverter, @@ -771,7 +772,11 @@ func (s unstructuredNegotiatedSerializer) EncoderForVersion(encoder runtime.Enco func (s unstructuredNegotiatedSerializer) DecoderToVersion(decoder runtime.Decoder, gv runtime.GroupVersioner) runtime.Decoder { d := schemaCoercingDecoder{delegate: decoder, validator: unstructuredSchemaCoercer{structuralSchemas: s.structuralSchemas, structuralSchemaGK: s.structuralSchemaGK, preserveUnknownFields: s.preserveUnknownFields}} - return versioning.NewDefaultingCodecForScheme(Scheme, nil, d, nil, gv) + return versioning.NewCodec(nil, d, runtime.UnsafeObjectConvertor(Scheme), Scheme, Scheme, unstructuredDefaulter{ + delegate: Scheme, + structuralSchemas: s.structuralSchemas, + structuralSchemaGK: s.structuralSchemaGK, + }, nil, gv, "unstructuredNegotiatedSerializer") } type UnstructuredObjectTyper struct { @@ -807,14 +812,20 @@ func (c unstructuredCreator) New(kind schema.GroupVersionKind) (runtime.Object, } type unstructuredDefaulter struct { - delegate runtime.ObjectDefaulter + delegate runtime.ObjectDefaulter + structuralSchemas map[string]*structuralschema.Structural // by version + structuralSchemaGK schema.GroupKind } func (d unstructuredDefaulter) Default(in runtime.Object) { - // Delegate for things other than Unstructured. - if _, ok := in.(runtime.Unstructured); !ok { + // Delegate for things other than Unstructured, and other GKs + u, ok := in.(runtime.Unstructured) + if !ok || u.GetObjectKind().GroupVersionKind().GroupKind() != d.structuralSchemaGK { d.delegate.Default(in) + return } + + structuraldefaulting.Default(u.UnstructuredContent(), d.structuralSchemas[u.GetObjectKind().GroupVersionKind().Version]) } type CRDRESTOptionsGetter struct { @@ -888,7 +899,11 @@ func (t crdConversionRESTOptionsGetter) GetRESTOptions(resource schema.GroupReso c, &unstructuredCreator{}, crdserverscheme.NewUnstructuredObjectTyper(), - &unstructuredDefaulter{delegate: Scheme}, + &unstructuredDefaulter{ + delegate: Scheme, + structuralSchemaGK: t.structuralSchemaGK, + structuralSchemas: t.structuralSchemas, + }, t.encoderVersion, t.decoderVersion, "crdRESTOptions",