github.com/stefanmcshane/helm@v0.0.0-20221213002717-88a4a2c6e77d/pkg/chartutil/capabilities.go (about)

     1  /*
     2  Copyright The Helm Authors.
     3  Licensed under the Apache License, Version 2.0 (the "License");
     4  you may not use this file except in compliance with the License.
     5  You may obtain a copy of the License at
     6  
     7  http://www.apache.org/licenses/LICENSE-2.0
     8  
     9  Unless required by applicable law or agreed to in writing, software
    10  distributed under the License is distributed on an "AS IS" BASIS,
    11  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  See the License for the specific language governing permissions and
    13  limitations under the License.
    14  */
    15  
    16  package chartutil
    17  
    18  import (
    19  	"fmt"
    20  	"strconv"
    21  
    22  	"github.com/Masterminds/semver/v3"
    23  	"k8s.io/client-go/kubernetes/scheme"
    24  
    25  	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
    26  	apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
    27  
    28  	helmversion "github.com/stefanmcshane/helm/internal/version"
    29  )
    30  
    31  var (
    32  	// The Kubernetes version can be set by LDFLAGS. In order to do that the value
    33  	// must be a string.
    34  	k8sVersionMajor = "1"
    35  	k8sVersionMinor = "20"
    36  
    37  	// DefaultVersionSet is the default version set, which includes only Core V1 ("v1").
    38  	DefaultVersionSet = allKnownVersions()
    39  
    40  	// DefaultCapabilities is the default set of capabilities.
    41  	DefaultCapabilities = &Capabilities{
    42  		KubeVersion: KubeVersion{
    43  			Version: fmt.Sprintf("v%s.%s.0", k8sVersionMajor, k8sVersionMinor),
    44  			Major:   k8sVersionMajor,
    45  			Minor:   k8sVersionMinor,
    46  		},
    47  		APIVersions: DefaultVersionSet,
    48  		HelmVersion: helmversion.Get(),
    49  	}
    50  )
    51  
    52  // Capabilities describes the capabilities of the Kubernetes cluster.
    53  type Capabilities struct {
    54  	// KubeVersion is the Kubernetes version.
    55  	KubeVersion KubeVersion
    56  	// APIversions are supported Kubernetes API versions.
    57  	APIVersions VersionSet
    58  	// HelmVersion is the build information for this helm version
    59  	HelmVersion helmversion.BuildInfo
    60  }
    61  
    62  func (capabilities *Capabilities) Copy() *Capabilities {
    63  	return &Capabilities{
    64  		KubeVersion: capabilities.KubeVersion,
    65  		APIVersions: capabilities.APIVersions,
    66  		HelmVersion: capabilities.HelmVersion,
    67  	}
    68  }
    69  
    70  // KubeVersion is the Kubernetes version.
    71  type KubeVersion struct {
    72  	Version string // Kubernetes version
    73  	Major   string // Kubernetes major version
    74  	Minor   string // Kubernetes minor version
    75  }
    76  
    77  // String implements fmt.Stringer
    78  func (kv *KubeVersion) String() string { return kv.Version }
    79  
    80  // GitVersion returns the Kubernetes version string.
    81  //
    82  // Deprecated: use KubeVersion.Version.
    83  func (kv *KubeVersion) GitVersion() string { return kv.Version }
    84  
    85  // ParseKubeVersion parses kubernetes version from string
    86  func ParseKubeVersion(version string) (*KubeVersion, error) {
    87  	sv, err := semver.NewVersion(version)
    88  	if err != nil {
    89  		return nil, err
    90  	}
    91  	return &KubeVersion{
    92  		Version: "v" + sv.String(),
    93  		Major:   strconv.FormatUint(sv.Major(), 10),
    94  		Minor:   strconv.FormatUint(sv.Minor(), 10),
    95  	}, nil
    96  }
    97  
    98  // VersionSet is a set of Kubernetes API versions.
    99  type VersionSet []string
   100  
   101  // Has returns true if the version string is in the set.
   102  //
   103  //	vs.Has("apps/v1")
   104  func (v VersionSet) Has(apiVersion string) bool {
   105  	for _, x := range v {
   106  		if x == apiVersion {
   107  			return true
   108  		}
   109  	}
   110  	return false
   111  }
   112  
   113  func allKnownVersions() VersionSet {
   114  	// We should register the built in extension APIs as well so CRDs are
   115  	// supported in the default version set. This has caused problems with `helm
   116  	// template` in the past, so let's be safe
   117  	apiextensionsv1beta1.AddToScheme(scheme.Scheme)
   118  	apiextensionsv1.AddToScheme(scheme.Scheme)
   119  
   120  	groups := scheme.Scheme.PrioritizedVersionsAllGroups()
   121  	vs := make(VersionSet, 0, len(groups))
   122  	for _, gv := range groups {
   123  		vs = append(vs, gv.String())
   124  	}
   125  	return vs
   126  }