diff --git a/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/meta.go b/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/meta.go index 644b6d53fa6..85b0cfc0728 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/meta.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/meta.go @@ -183,7 +183,7 @@ func resolve(l *PatchMetaFromOpenAPIV3) error { if ok { l.Schema = sch } else { - return fmt.Errorf("Unable to resolve %s in OpenAPI V3", refString) + return fmt.Errorf("unable to resolve %s in OpenAPI V3", refString) } } return nil @@ -225,7 +225,7 @@ func (s PatchMetaFromOpenAPIV3) LookupPatchMetadataForSlice(key string) (LookupP if l.Schema.Items != nil { l.Schema = l.Schema.Items.Schema } - resolve(&l) + err = resolve(&l) return l, p, err } diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/apply/patcher.go b/staging/src/k8s.io/kubectl/pkg/cmd/apply/patcher.go index b835a321774..912e95e4c27 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/apply/patcher.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/apply/patcher.go @@ -222,6 +222,7 @@ func (p *Patcher) buildMergePatch(original, modified, current []byte) ([]byte, e // gvkSupportsPatchOpenAPIV3 checks if a particular GVK supports the patch operation. // It returns an error if the OpenAPI V3 could not be downloaded. func (p *Patcher) gvkSupportsPatchOpenAPIV3(gvk schema.GroupVersionKind) (bool, error) { + // Bypassing root to save apiserver memory. gvSpec, err := p.OpenAPIV3Root.GVSpec(schema.GroupVersion{ Group: p.Mapping.GroupVersionKind.Group, Version: p.Mapping.GroupVersionKind.Version, diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/diff/diff.go b/staging/src/k8s.io/kubectl/pkg/cmd/diff/diff.go index 2ea894566f8..b08da5a4785 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/diff/diff.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/diff/diff.go @@ -35,6 +35,7 @@ import ( "k8s.io/cli-runtime/pkg/genericiooptions" "k8s.io/cli-runtime/pkg/resource" "k8s.io/client-go/dynamic" + "k8s.io/client-go/openapi3" "k8s.io/klog/v2" "k8s.io/kubectl/pkg/cmd/apply" cmdutil "k8s.io/kubectl/pkg/cmd/util" @@ -110,6 +111,7 @@ type DiffOptions struct { Concurrency int Selector string OpenAPISchema openapi.Resources + OpenAPIV3Root openapi3.Root DynamicClient dynamic.Interface CmdNamespace string EnforceNamespace bool @@ -324,6 +326,7 @@ type InfoObject struct { Info *resource.Info Encoder runtime.Encoder OpenAPI openapi.Resources + OpenAPIV3Root openapi3.Root Force bool ServerSideApply bool FieldManager string @@ -396,6 +399,7 @@ func (obj InfoObject) Merged() (runtime.Object, error) { Overwrite: true, BackOff: clockwork.NewRealClock(), OpenapiSchema: obj.OpenAPI, + OpenAPIV3Root: obj.OpenAPIV3Root, ResourceVersion: resourceVersion, } @@ -641,6 +645,11 @@ func (o *DiffOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []str if err != nil { return err } + openAPIV3Client, err := f.OpenAPIV3Client() + if err != nil { + return err + } + o.OpenAPIV3Root = openapi3.NewRoot(openAPIV3Client) } o.DynamicClient, err = f.DynamicClient() @@ -722,6 +731,7 @@ func (o *DiffOptions) Run() error { Info: info, Encoder: scheme.DefaultJSONEncoder(), OpenAPI: o.OpenAPISchema, + OpenAPIV3Root: o.OpenAPIV3Root, Force: force, ServerSideApply: o.ServerSideApply, FieldManager: o.FieldManager,