diff --git a/pkg/chart/common/capabilities.go b/pkg/chart/common/capabilities.go index 16910acaa..faae42ef0 100644 --- a/pkg/chart/common/capabilities.go +++ b/pkg/chart/common/capabilities.go @@ -23,10 +23,7 @@ import ( "testing" "github.com/Masterminds/semver/v3" - "k8s.io/client-go/kubernetes/scheme" - apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" k8sversion "k8s.io/apimachinery/pkg/util/version" helmversion "helm.sh/helm/v4/internal/version" @@ -38,9 +35,6 @@ const ( ) var ( - // DefaultVersionSet is the default version set, which includes only Core V1 ("v1"). - DefaultVersionSet = allKnownVersions() - DefaultCapabilities = func() *Capabilities { caps, err := makeDefaultCapabilities() if err != nil { @@ -127,21 +121,6 @@ func (v VersionSet) Has(apiVersion string) bool { return slices.Contains(v, apiVersion) } -func allKnownVersions() VersionSet { - // We should register the built in extension APIs as well so CRDs are - // supported in the default version set. This has caused problems with `helm - // template` in the past, so let's be safe - apiextensionsv1beta1.AddToScheme(scheme.Scheme) - apiextensionsv1.AddToScheme(scheme.Scheme) - - groups := scheme.Scheme.PrioritizedVersionsAllGroups() - vs := make(VersionSet, 0, len(groups)) - for _, gv := range groups { - vs = append(vs, gv.String()) - } - return vs -} - func makeDefaultCapabilities() (*Capabilities, error) { // Test builds don't include debug info / module info // (And even if they did, we probably want stable capabilities for tests anyway) diff --git a/pkg/chart/common/default_versions.go b/pkg/chart/common/default_versions.go new file mode 100644 index 000000000..b6048bf0a --- /dev/null +++ b/pkg/chart/common/default_versions.go @@ -0,0 +1,80 @@ +/* +Copyright The Helm Authors. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package common + +// DefaultVersionSet is the default set of Kubernetes API versions. +// +// This static snapshot avoids initializing the Kubernetes runtime scheme in +// binaries that only need chart capabilities. TestDefaultVersionSetMatchesScheme +// verifies that it remains in sync with the Kubernetes dependencies used by +// Helm. +var DefaultVersionSet = VersionSet{ + "v1", + "admissionregistration.k8s.io/v1", + "admissionregistration.k8s.io/v1alpha1", + "admissionregistration.k8s.io/v1beta1", + "internal.apiserver.k8s.io/v1alpha1", + "apps/v1", + "apps/v1beta1", + "apps/v1beta2", + "authentication.k8s.io/v1", + "authentication.k8s.io/v1alpha1", + "authentication.k8s.io/v1beta1", + "authorization.k8s.io/v1", + "authorization.k8s.io/v1beta1", + "autoscaling/v1", + "autoscaling/v2", + "batch/v1", + "batch/v1beta1", + "certificates.k8s.io/v1", + "certificates.k8s.io/v1beta1", + "certificates.k8s.io/v1alpha1", + "coordination.k8s.io/v1alpha2", + "coordination.k8s.io/v1beta1", + "coordination.k8s.io/v1", + "discovery.k8s.io/v1", + "discovery.k8s.io/v1beta1", + "events.k8s.io/v1", + "events.k8s.io/v1beta1", + "extensions/v1beta1", + "flowcontrol.apiserver.k8s.io/v1", + "flowcontrol.apiserver.k8s.io/v1beta1", + "flowcontrol.apiserver.k8s.io/v1beta2", + "flowcontrol.apiserver.k8s.io/v1beta3", + "networking.k8s.io/v1", + "networking.k8s.io/v1beta1", + "node.k8s.io/v1", + "node.k8s.io/v1alpha1", + "node.k8s.io/v1beta1", + "policy/v1", + "policy/v1beta1", + "rbac.authorization.k8s.io/v1", + "rbac.authorization.k8s.io/v1beta1", + "rbac.authorization.k8s.io/v1alpha1", + "resource.k8s.io/v1", + "resource.k8s.io/v1beta2", + "resource.k8s.io/v1beta1", + "resource.k8s.io/v1alpha3", + "scheduling.k8s.io/v1alpha2", + "scheduling.k8s.io/v1beta1", + "scheduling.k8s.io/v1", + "storage.k8s.io/v1beta1", + "storage.k8s.io/v1", + "storage.k8s.io/v1alpha1", + "storagemigration.k8s.io/v1beta1", + "apiextensions.k8s.io/v1beta1", + "apiextensions.k8s.io/v1", +} diff --git a/pkg/chart/common/default_versions_test.go b/pkg/chart/common/default_versions_test.go new file mode 100644 index 000000000..fc0e5b56e --- /dev/null +++ b/pkg/chart/common/default_versions_test.go @@ -0,0 +1,42 @@ +/* +Copyright The Helm Authors. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package common + +import ( + "testing" + + "github.com/stretchr/testify/require" + + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + "k8s.io/apimachinery/pkg/runtime" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" +) + +func TestDefaultVersionSetMatchesScheme(t *testing.T) { + scheme := runtime.NewScheme() + require.NoError(t, clientgoscheme.AddToScheme(scheme)) + require.NoError(t, apiextensionsv1beta1.AddToScheme(scheme)) + require.NoError(t, apiextensionsv1.AddToScheme(scheme)) + + groups := scheme.PrioritizedVersionsAllGroups() + schemeVersions := make(VersionSet, 0, len(groups)) + for _, group := range groups { + schemeVersions = append(schemeVersions, group.String()) + } + + require.ElementsMatch(t, DefaultVersionSet, schemeVersions, "DefaultVersionSet must stay in sync with the Kubernetes scheme") +}