diff --git a/internal/chart/v3/lint/rules/deprecations.go b/internal/chart/v3/lint/rules/deprecations.go index 000303228..478f861fd 100644 --- a/internal/chart/v3/lint/rules/deprecations.go +++ b/internal/chart/v3/lint/rules/deprecations.go @@ -82,7 +82,7 @@ func validateNoDeprecations(resource *k8sYamlStruct, kubeVersion *common.KubeVer func resourceToRuntimeObject(resource *k8sYamlStruct) (runtime.Object, error) { gvk := schema.FromAPIVersionAndKind(resource.APIVersion, resource.Kind) - out, err := kube.NativeScheme.New(gvk) + out, err := kube.NativeScheme().New(gvk) if err != nil { return nil, err } diff --git a/pkg/chart/common/capabilities.go b/pkg/chart/common/capabilities.go index 8af895604..a8dc55b00 100644 --- a/pkg/chart/common/capabilities.go +++ b/pkg/chart/common/capabilities.go @@ -124,7 +124,7 @@ func (v VersionSet) Has(apiVersion string) bool { } func allKnownVersions() VersionSet { - groups := kube.NativeScheme.PrioritizedVersionsAllGroups() + groups := kube.NativeScheme().PrioritizedVersionsAllGroups() vs := make(VersionSet, 0, len(groups)) for _, gv := range groups { vs = append(vs, gv.String()) diff --git a/pkg/chart/v2/lint/rules/deprecations.go b/pkg/chart/v2/lint/rules/deprecations.go index 4880d24d0..ecd0858b1 100644 --- a/pkg/chart/v2/lint/rules/deprecations.go +++ b/pkg/chart/v2/lint/rules/deprecations.go @@ -82,7 +82,7 @@ func validateNoDeprecations(resource *k8sYamlStruct, kubeVersion *common.KubeVer func resourceToRuntimeObject(resource *k8sYamlStruct) (runtime.Object, error) { gvk := schema.FromAPIVersionAndKind(resource.APIVersion, resource.Kind) - out, err := kube.NativeScheme.New(gvk) + out, err := kube.NativeScheme().New(gvk) if err != nil { return nil, err } diff --git a/pkg/kube/converter.go b/pkg/kube/converter.go index 813ffe1aa..c566d4994 100644 --- a/pkg/kube/converter.go +++ b/pkg/kube/converter.go @@ -26,29 +26,33 @@ import ( "k8s.io/client-go/kubernetes/scheme" ) -// NativeScheme is a clean *runtime.Scheme with _only_ Kubernetes -// native resources added to it. This is required to break free of custom resources -// that may have been added to scheme.Scheme due to Helm being used as a package in -// combination with e.g. a versioned kube client. If we would not do this, the client -// may attempt to perform e.g. a 3-way-merge strategy patch for custom resources. -// DO NOT MUTATE, this is a shared variable. -var NativeScheme *runtime.Scheme +var nativeScheme *runtime.Scheme func init() { - NativeScheme = runtime.NewScheme() - if err := scheme.AddToScheme(NativeScheme); err != nil { + nativeScheme = runtime.NewScheme() + if err := scheme.AddToScheme(nativeScheme); err != nil { panic(err) } // API extensions are not in the above scheme set, // and must thus be added separately. - if err := apiextensionsv1beta1.AddToScheme(NativeScheme); err != nil { + if err := apiextensionsv1beta1.AddToScheme(nativeScheme); err != nil { panic(err) } - if err := apiextensionsv1.AddToScheme(NativeScheme); err != nil { + if err := apiextensionsv1.AddToScheme(nativeScheme); err != nil { panic(err) } } +// NativeScheme returns a clean *runtime.Scheme with _only_ Kubernetes +// native resources added to it. This is required to break free of custom resources +// that may have been added to scheme.Scheme due to Helm being used as a package in +// combination with e.g. a versioned kube client. If we would not do this, the client +// may attempt to perform e.g. a 3-way-merge strategy patch for custom resources. +// DO NOT MUTATE the returned object, it is shared. +func NativeScheme() *runtime.Scheme { + return nativeScheme +} + // AsVersioned converts the given info into a runtime.Object with the correct // group and version set func AsVersioned(info *resource.Info) runtime.Object { @@ -58,11 +62,11 @@ func AsVersioned(info *resource.Info) runtime.Object { // convertWithMapper converts the given object with the optional provided // RESTMapping. If no mapping is provided, the default schema versioner is used func convertWithMapper(obj runtime.Object, mapping *meta.RESTMapping) runtime.Object { - var gv = runtime.GroupVersioner(schema.GroupVersions(NativeScheme.PrioritizedVersionsAllGroups())) + var gv = runtime.GroupVersioner(schema.GroupVersions(NativeScheme().PrioritizedVersionsAllGroups())) if mapping != nil { gv = mapping.GroupVersionKind.GroupVersion() } - if obj, err := NativeScheme.ConvertToVersion(obj, gv); err == nil { + if obj, err := NativeScheme().ConvertToVersion(obj, gv); err == nil { return obj } return obj diff --git a/pkg/kube/ready.go b/pkg/kube/ready.go index 94075d0ff..0948da76f 100644 --- a/pkg/kube/ready.go +++ b/pkg/kube/ready.go @@ -143,7 +143,7 @@ func (c *ReadyChecker) IsReady(ctx context.Context, v *resource.Info) (bool, err return false, err } crd := &apiextv1beta1.CustomResourceDefinition{} - if err := NativeScheme.Convert(v.Object, crd, nil); err != nil { + if err := NativeScheme().Convert(v.Object, crd, nil); err != nil { return false, err } if !c.crdBetaReady(*crd) { @@ -154,7 +154,7 @@ func (c *ReadyChecker) IsReady(ctx context.Context, v *resource.Info) (bool, err return false, err } crd := &apiextv1.CustomResourceDefinition{} - if err := NativeScheme.Convert(v.Object, crd, nil); err != nil { + if err := NativeScheme().Convert(v.Object, crd, nil); err != nil { return false, err } if !c.crdReady(*crd) {