From 1c061bb401cf0693462cbbf87c75639b28ffbdcf Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Mon, 10 Jun 2019 18:16:57 +0200 Subject: [PATCH] apiextensions: only clone on !s.XEmbeddedResource --- .../pkg/apiserver/schema/objectmeta/algorithm.go | 14 ++++++++------ .../pkg/apiserver/schema/objectmeta/validation.go | 14 ++++++++------ .../pkg/apiserver/schema/pruning/algorithm.go | 14 ++++++++------ 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/algorithm.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/algorithm.go index fd3ff23d703..4cd32c1293b 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/algorithm.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/algorithm.go @@ -23,16 +23,18 @@ import ( ) // Coerce checks types of embedded ObjectMeta and TypeMeta and prunes unknown fields inside the former. -// It does coerce ObjectMeta and TypeMeta at the root if includeRoot is true. +// It does coerce ObjectMeta and TypeMeta at the root if isResourceRoot is true. // If dropInvalidFields is true, fields of wrong type will be dropped. -func Coerce(pth *field.Path, obj interface{}, s *structuralschema.Structural, includeRoot, dropInvalidFields bool) *field.Error { - if includeRoot { +func Coerce(pth *field.Path, obj interface{}, s *structuralschema.Structural, isResourceRoot, dropInvalidFields bool) *field.Error { + if isResourceRoot { if s == nil { s = &structuralschema.Structural{} } - clone := *s - clone.XEmbeddedResource = true - s = &clone + if !s.XEmbeddedResource { + clone := *s + clone.XEmbeddedResource = true + s = &clone + } } c := coercer{dropInvalidFields: dropInvalidFields} return c.coerce(pth, obj, s) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/validation.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/validation.go index 5e788109f90..195150ae236 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/validation.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/validation.go @@ -28,15 +28,17 @@ import ( ) // Validate validates embedded ObjectMeta and TypeMeta. -// It also validate those at the root if includeRoot is true. -func Validate(pth *field.Path, obj interface{}, s *structuralschema.Structural, includeRoot bool) field.ErrorList { - if includeRoot { +// It also validate those at the root if isResourceRoot is true. +func Validate(pth *field.Path, obj interface{}, s *structuralschema.Structural, isResourceRoot bool) field.ErrorList { + if isResourceRoot { if s == nil { s = &structuralschema.Structural{} } - clone := *s - clone.XEmbeddedResource = true - s = &clone + if !s.XEmbeddedResource { + clone := *s + clone.XEmbeddedResource = true + s = &clone + } } return validate(pth, obj, s) } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning/algorithm.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning/algorithm.go index 164105c9408..5a6a8c7c8c4 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning/algorithm.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning/algorithm.go @@ -21,15 +21,17 @@ import ( ) // Prune removes object fields in obj which are not specified in s. It skips TypeMeta and ObjectMeta fields -// if XEmbeddedResource is set to true, or for the root if root=true. -func Prune(obj interface{}, s *structuralschema.Structural, root bool) { - if root { +// if XEmbeddedResource is set to true, or for the root if isResourceRoot=true. +func Prune(obj interface{}, s *structuralschema.Structural, isResourceRoot bool) { + if isResourceRoot { if s == nil { s = &structuralschema.Structural{} } - clone := *s - clone.XEmbeddedResource = true - s = &clone + if !s.XEmbeddedResource { + clone := *s + clone.XEmbeddedResource = true + s = &clone + } } prune(obj, s) }