refactor(chart): generate default API versions

Signed-off-by: Yugo Kobayashi <kobdotsh@gmail.com>
pull/32470/head
Yugo Kobayashi 1 month ago
parent 87dfbebdf5
commit 1d294b981d

@ -0,0 +1,125 @@
/*
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 main
import (
"bytes"
"flag"
"fmt"
"go/format"
"os"
"slices"
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"
)
const licenseHeader = `/*
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.
*/`
func main() {
output := flag.String("output", "default_versions.go", "path to the generated Go file")
flag.Parse()
versions, err := knownVersions()
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
var source bytes.Buffer
fmt.Fprintln(&source, licenseHeader)
fmt.Fprintln(&source)
fmt.Fprintln(&source, "// Code generated by gendefaultversions; DO NOT EDIT.")
fmt.Fprintln(&source)
fmt.Fprintln(&source, "package common")
fmt.Fprintln(&source)
fmt.Fprintln(&source, "// DefaultVersionSet is the default set of Kubernetes API versions used")
fmt.Fprintln(&source, "// when Helm renders without live cluster discovery.")
fmt.Fprintln(&source, "//")
fmt.Fprintln(&source, "// This is a snapshot of the API versions registered by Helm's Kubernetes")
fmt.Fprintln(&source, "// dependencies, not a list of APIs served by every supported cluster. Live")
fmt.Fprintln(&source, "// cluster operations build Capabilities from server discovery instead.")
fmt.Fprintln(&source, "//")
fmt.Fprintln(&source, "// Review API additions and removals against the Kubernetes versions supported")
fmt.Fprintln(&source, "// by this Helm release before committing a regenerated snapshot.")
fmt.Fprintln(&source, "//")
fmt.Fprintln(&source, "// Regenerate after updating Kubernetes dependencies with:")
fmt.Fprintln(&source, "//")
fmt.Fprintln(&source, "//\tgo generate ./pkg/chart/common")
fmt.Fprintln(&source, "var DefaultVersionSet = VersionSet{")
for _, version := range versions {
fmt.Fprintf(&source, "\t%q,\n", version)
}
fmt.Fprintln(&source, "}")
formatted, err := format.Source(source.Bytes())
if err != nil {
fmt.Fprintf(os.Stderr, "format generated source: %v\n", err)
os.Exit(1)
}
if err := os.WriteFile(*output, formatted, 0o644); err != nil {
fmt.Fprintf(os.Stderr, "write generated source: %v\n", err)
os.Exit(1)
}
}
func knownVersions() ([]string, error) {
scheme := runtime.NewScheme()
if err := clientgoscheme.AddToScheme(scheme); err != nil {
return nil, fmt.Errorf("register client-go scheme: %w", err)
}
if err := apiextensionsv1beta1.AddToScheme(scheme); err != nil {
return nil, fmt.Errorf("register apiextensions v1beta1 scheme: %w", err)
}
if err := apiextensionsv1.AddToScheme(scheme); err != nil {
return nil, fmt.Errorf("register apiextensions v1 scheme: %w", err)
}
groupSet := make(map[string]struct{})
for _, groupVersion := range scheme.PrioritizedVersionsAllGroups() {
groupSet[groupVersion.Group] = struct{}{}
}
groups := make([]string, 0, len(groupSet))
for group := range groupSet {
groups = append(groups, group)
}
slices.Sort(groups)
versions := make([]string, 0)
for _, group := range groups {
for _, groupVersion := range scheme.PrioritizedVersionsForGroup(group) {
versions = append(versions, groupVersion.String())
}
}
return versions, nil
}

@ -34,6 +34,8 @@ const (
kubeVersionMinorTesting = 20
)
//go:generate go run helm.sh/helm/v4/internal/cmd/gendefaultversions -output default_versions.go
var (
DefaultCapabilities = func() *Capabilities {
caps, err := makeDefaultCapabilities()

@ -1,10 +1,11 @@
/*
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
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,
@ -13,20 +14,30 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
// Code generated by gendefaultversions; DO NOT EDIT.
package common
// DefaultVersionSet is the default set of Kubernetes API versions.
// DefaultVersionSet is the default set of Kubernetes API versions used
// when Helm renders without live cluster discovery.
//
// This is a snapshot of the API versions registered by Helm's Kubernetes
// dependencies, not a list of APIs served by every supported cluster. Live
// cluster operations build Capabilities from server discovery instead.
//
// 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.
// Review API additions and removals against the Kubernetes versions supported
// by this Helm release before committing a regenerated snapshot.
//
// Regenerate after updating Kubernetes dependencies with:
//
// go generate ./pkg/chart/common
var DefaultVersionSet = VersionSet{
"v1",
"admissionregistration.k8s.io/v1",
"admissionregistration.k8s.io/v1alpha1",
"admissionregistration.k8s.io/v1beta1",
"internal.apiserver.k8s.io/v1alpha1",
"apiextensions.k8s.io/v1beta1",
"apiextensions.k8s.io/v1",
"apps/v1",
"apps/v1beta1",
"apps/v1beta2",
@ -54,6 +65,7 @@ var DefaultVersionSet = VersionSet{
"flowcontrol.apiserver.k8s.io/v1beta1",
"flowcontrol.apiserver.k8s.io/v1beta2",
"flowcontrol.apiserver.k8s.io/v1beta3",
"internal.apiserver.k8s.io/v1alpha1",
"networking.k8s.io/v1",
"networking.k8s.io/v1beta1",
"node.k8s.io/v1",
@ -75,6 +87,4 @@ var DefaultVersionSet = VersionSet{
"storage.k8s.io/v1",
"storage.k8s.io/v1alpha1",
"storagemigration.k8s.io/v1beta1",
"apiextensions.k8s.io/v1beta1",
"apiextensions.k8s.io/v1",
}

@ -16,6 +16,7 @@ limitations under the License.
package common
import (
"slices"
"testing"
"github.com/stretchr/testify/require"
@ -23,7 +24,6 @@ import (
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
)
@ -33,17 +33,23 @@ func TestDefaultVersionSetMatchesScheme(t *testing.T) {
require.NoError(t, apiextensionsv1beta1.AddToScheme(scheme))
require.NoError(t, apiextensionsv1.AddToScheme(scheme))
defaultVersionsByGroup := make(map[string][]string)
for _, apiVersion := range DefaultVersionSet {
groupVersion, err := schema.ParseGroupVersion(apiVersion)
require.NoErrorf(t, err, "invalid API version %q in DefaultVersionSet", apiVersion)
defaultVersionsByGroup[groupVersion.Group] = append(defaultVersionsByGroup[groupVersion.Group], groupVersion.Version)
groupSet := make(map[string]struct{})
for _, groupVersion := range scheme.PrioritizedVersionsAllGroups() {
groupSet[groupVersion.Group] = struct{}{}
}
groups := make([]string, 0, len(groupSet))
for group := range groupSet {
groups = append(groups, group)
}
slices.Sort(groups)
schemeVersionsByGroup := make(map[string][]string)
for _, groupVersion := range scheme.PrioritizedVersionsAllGroups() {
schemeVersionsByGroup[groupVersion.Group] = append(schemeVersionsByGroup[groupVersion.Group], groupVersion.Version)
schemeVersions := make(VersionSet, 0)
for _, group := range groups {
for _, groupVersion := range scheme.PrioritizedVersionsForGroup(group) {
schemeVersions = append(schemeVersions, groupVersion.String())
}
}
require.Equal(t, schemeVersionsByGroup, defaultVersionsByGroup, "DefaultVersionSet must stay in sync with the Kubernetes scheme")
require.Equal(t, schemeVersions, DefaultVersionSet,
"DefaultVersionSet must stay in sync with the Kubernetes scheme; run `go generate ./pkg/chart/common`")
}

Loading…
Cancel
Save