diff --git a/pkg/action/action.go b/pkg/action/action.go index fd75b85d3..ac0b4fc0b 100644 --- a/pkg/action/action.go +++ b/pkg/action/action.go @@ -204,7 +204,11 @@ func (cfg *Configuration) renderResources(ch *chart.Chart, values common.Values, if ch.Metadata.KubeVersion != "" { if !chartutil.IsCompatibleRange(ch.Metadata.KubeVersion, caps.KubeVersion.String()) { - return hs, b, "", fmt.Errorf("chart requires kubeVersion: %s which is incompatible with Kubernetes %s", ch.Metadata.KubeVersion, caps.KubeVersion.String()) + errMsg := fmt.Sprintf("chart requires kubeVersion: %s which is incompatible with Kubernetes %s", ch.Metadata.KubeVersion, caps.KubeVersion.String()) + if caps.IsDefaultKubeVersion { + errMsg += " (no cluster connected, using default version; specify target version with --kube-version)" + } + return hs, b, "", fmt.Errorf("%s", errMsg) } } @@ -383,15 +387,14 @@ func (cfg *Configuration) getCapabilities() (*common.Capabilities, error) { } } - cfg.Capabilities = &common.Capabilities{ - APIVersions: apiVersions, - KubeVersion: common.KubeVersion{ + cfg.Capabilities = common.NewCapabilitiesFromCluster( + common.KubeVersion{ Version: kubeVersion.GitVersion, Major: kubeVersion.Major, Minor: kubeVersion.Minor, }, - HelmVersion: common.DefaultCapabilities.HelmVersion, - } + apiVersions, + ) return cfg.Capabilities, nil } diff --git a/pkg/action/install.go b/pkg/action/install.go index 87752684c..dd21f4083 100644 --- a/pkg/action/install.go +++ b/pkg/action/install.go @@ -304,7 +304,7 @@ func (i *Install) RunWithContext(ctx context.Context, ch ci.Charter, vals map[st // NOTE(bacongobbler): used for `helm template` i.cfg.Capabilities = common.DefaultCapabilities.Copy() if i.KubeVersion != nil { - i.cfg.Capabilities.KubeVersion = *i.KubeVersion + i.cfg.Capabilities = i.cfg.Capabilities.WithKubeVersion(*i.KubeVersion) } i.cfg.Capabilities.APIVersions = append(i.cfg.Capabilities.APIVersions, i.APIVersions...) i.cfg.KubeClient = &kubefake.PrintingKubeClient{Out: io.Discard} diff --git a/pkg/chart/common/capabilities.go b/pkg/chart/common/capabilities.go index 355c3978a..edffb3b7e 100644 --- a/pkg/chart/common/capabilities.go +++ b/pkg/chart/common/capabilities.go @@ -45,8 +45,9 @@ var ( Major: k8sVersionMajor, Minor: k8sVersionMinor, }, - APIVersions: DefaultVersionSet, - HelmVersion: helmversion.Get(), + APIVersions: DefaultVersionSet, + HelmVersion: helmversion.Get(), + IsDefaultKubeVersion: true, } ) @@ -58,13 +59,37 @@ type Capabilities struct { APIVersions VersionSet // HelmVersion is the build information for this helm version HelmVersion helmversion.BuildInfo + // IsDefaultKubeVersion indicates if KubeVersion is a default fallback value + // (not from a real cluster or user-provided --kube-version flag) + IsDefaultKubeVersion bool } func (capabilities *Capabilities) Copy() *Capabilities { return &Capabilities{ - KubeVersion: capabilities.KubeVersion, - APIVersions: capabilities.APIVersions, - HelmVersion: capabilities.HelmVersion, + KubeVersion: capabilities.KubeVersion, + APIVersions: capabilities.APIVersions, + HelmVersion: capabilities.HelmVersion, + IsDefaultKubeVersion: capabilities.IsDefaultKubeVersion, + } +} + +// WithKubeVersion returns a copy of Capabilities with a custom KubeVersion. +// Sets IsDefaultKubeVersion to false since this is an explicit override. +func (capabilities *Capabilities) WithKubeVersion(kv KubeVersion) *Capabilities { + c := capabilities.Copy() + c.KubeVersion = kv + c.IsDefaultKubeVersion = false + return c +} + +// NewCapabilitiesFromCluster creates a Capabilities from cluster discovery information. +// IsDefaultKubeVersion is set to false since this comes from a real cluster. +func NewCapabilitiesFromCluster(kubeVersion KubeVersion, apiVersions VersionSet) *Capabilities { + return &Capabilities{ + KubeVersion: kubeVersion, + APIVersions: apiVersions, + HelmVersion: DefaultCapabilities.HelmVersion, + IsDefaultKubeVersion: false, } }