apiextensions: only prune correct GroupKind

This commit is contained in:
Dr. Stefan Schimanski 2019-05-13 17:08:28 +02:00
parent 70ee02725f
commit 3f3ed79484

View File

@ -592,6 +592,7 @@ func (r *crdHandler) getOrCreateServingInfoFor(crd *apiextensions.CustomResource
decoderVersion: schema.GroupVersion{Group: crd.Spec.Group, Version: v.Name}, decoderVersion: schema.GroupVersion{Group: crd.Spec.Group, Version: v.Name},
encoderVersion: schema.GroupVersion{Group: crd.Spec.Group, Version: storageVersion}, encoderVersion: schema.GroupVersion{Group: crd.Spec.Group, Version: storageVersion},
structuralSchema: structuralSchema, structuralSchema: structuralSchema,
structuralSchemaGK: kind.GroupKind(),
preserveUnknownFields: *crd.Spec.PreserveUnknownFields, preserveUnknownFields: *crd.Spec.PreserveUnknownFields,
}, },
crd.Status.AcceptedNames.Categories, crd.Status.AcceptedNames.Categories,
@ -614,7 +615,14 @@ func (r *crdHandler) getOrCreateServingInfoFor(crd *apiextensions.CustomResource
ClusterScoped: clusterScoped, ClusterScoped: clusterScoped,
SelfLinkPathPrefix: selfLinkPrefix, SelfLinkPathPrefix: selfLinkPrefix,
}, },
Serializer: unstructuredNegotiatedSerializer{typer: typer, creator: creator, converter: safeConverter, structuralSchema: structuralSchema, preserveUnknownFields: *crd.Spec.PreserveUnknownFields}, Serializer: unstructuredNegotiatedSerializer{
typer: typer,
creator: creator,
converter: safeConverter,
structuralSchema: structuralSchema,
structuralSchemaGK: kind.GroupKind(),
preserveUnknownFields: *crd.Spec.PreserveUnknownFields,
},
ParameterCodec: parameterCodec, ParameterCodec: parameterCodec,
Creater: creator, Creater: creator,
@ -665,7 +673,13 @@ func (r *crdHandler) getOrCreateServingInfoFor(crd *apiextensions.CustomResource
// shallow copy // shallow copy
statusScope := *requestScopes[v.Name] statusScope := *requestScopes[v.Name]
statusScope.Subresource = "status" statusScope.Subresource = "status"
statusScope.Serializer = unstructuredNegotiatedSerializer{typer: typer, creator: creator, converter: safeConverter, structuralSchema: structuralSchema, preserveUnknownFields: *crd.Spec.PreserveUnknownFields} statusScope.Serializer = unstructuredNegotiatedSerializer{
typer: typer, creator: creator,
converter: safeConverter,
structuralSchema: structuralSchema,
structuralSchemaGK: kind.GroupKind(),
preserveUnknownFields: *crd.Spec.PreserveUnknownFields,
}
statusScope.Namer = handlers.ContextBasedNaming{ statusScope.Namer = handlers.ContextBasedNaming{
SelfLinker: meta.NewAccessor(), SelfLinker: meta.NewAccessor(),
ClusterScoped: clusterScoped, ClusterScoped: clusterScoped,
@ -702,6 +716,7 @@ type unstructuredNegotiatedSerializer struct {
converter runtime.ObjectConvertor converter runtime.ObjectConvertor
structuralSchema *structuralschema.Structural structuralSchema *structuralschema.Structural
structuralSchemaGK schema.GroupKind
preserveUnknownFields bool preserveUnknownFields bool
} }
@ -735,7 +750,7 @@ func (s unstructuredNegotiatedSerializer) EncoderForVersion(encoder runtime.Enco
} }
func (s unstructuredNegotiatedSerializer) DecoderToVersion(decoder runtime.Decoder, gv runtime.GroupVersioner) runtime.Decoder { func (s unstructuredNegotiatedSerializer) DecoderToVersion(decoder runtime.Decoder, gv runtime.GroupVersioner) runtime.Decoder {
d := schemaCoercingDecoder{delegate: decoder, validator: unstructuredSchemaCoercer{structuralSchema: s.structuralSchema, preserveUnknownFields: s.preserveUnknownFields}} d := schemaCoercingDecoder{delegate: decoder, validator: unstructuredSchemaCoercer{structuralSchema: s.structuralSchema, structuralSchemaGK: s.structuralSchemaGK, preserveUnknownFields: s.preserveUnknownFields}}
return versioning.NewDefaultingCodecForScheme(Scheme, nil, d, nil, gv) return versioning.NewDefaultingCodecForScheme(Scheme, nil, d, nil, gv)
} }
@ -828,6 +843,7 @@ type crdConversionRESTOptionsGetter struct {
encoderVersion schema.GroupVersion encoderVersion schema.GroupVersion
decoderVersion schema.GroupVersion decoderVersion schema.GroupVersion
structuralSchema *structuralschema.Structural structuralSchema *structuralschema.Structural
structuralSchemaGK schema.GroupKind
preserveUnknownFields bool preserveUnknownFields bool
} }
@ -838,9 +854,14 @@ func (t crdConversionRESTOptionsGetter) GetRESTOptions(resource schema.GroupReso
// drop invalid fields while decoding old CRs (before we haven't had any ObjectMeta validation) // drop invalid fields while decoding old CRs (before we haven't had any ObjectMeta validation)
dropInvalidMetadata: true, dropInvalidMetadata: true,
structuralSchema: t.structuralSchema, structuralSchema: t.structuralSchema,
structuralSchemaGK: t.structuralSchemaGK,
preserveUnknownFields: t.preserveUnknownFields,
}}
c := schemaCoercingConverter{delegate: t.converter, validator: unstructuredSchemaCoercer{
structuralSchema: t.structuralSchema,
structuralSchemaGK: t.structuralSchemaGK,
preserveUnknownFields: t.preserveUnknownFields, preserveUnknownFields: t.preserveUnknownFields,
}} }}
c := schemaCoercingConverter{delegate: t.converter, validator: unstructuredSchemaCoercer{structuralSchema: t.structuralSchema, preserveUnknownFields: t.preserveUnknownFields}}
ret.StorageConfig.Codec = versioning.NewCodec( ret.StorageConfig.Codec = versioning.NewCodec(
ret.StorageConfig.Codec, ret.StorageConfig.Codec,
d, d,
@ -927,8 +948,10 @@ func (v schemaCoercingConverter) ConvertFieldLabel(gvk schema.GroupVersionKind,
// - validating and pruning ObjectMeta // - validating and pruning ObjectMeta
// - generic pruning of unknown fields following a structural schema. // - generic pruning of unknown fields following a structural schema.
type unstructuredSchemaCoercer struct { type unstructuredSchemaCoercer struct {
dropInvalidMetadata bool dropInvalidMetadata bool
structuralSchema *structuralschema.Structural structuralSchema *structuralschema.Structural
structuralSchemaGK schema.GroupKind
preserveUnknownFields bool preserveUnknownFields bool
} }
@ -947,7 +970,12 @@ func (v *unstructuredSchemaCoercer) apply(u *unstructured.Unstructured) error {
return err return err
} }
if !v.preserveUnknownFields { // compare group and kind because also other object like DeleteCollection options pass through here
gv, err := schema.ParseGroupVersion(apiVersion)
if err != nil {
return err
}
if !v.preserveUnknownFields && gv.Group == v.structuralSchemaGK.Group && kind == v.structuralSchemaGK.Kind {
structuralpruning.Prune(u.Object, v.structuralSchema) structuralpruning.Prune(u.Object, v.structuralSchema)
} }