From 844d8c0d10328e0c77abdf7ecd144c9f19221b94 Mon Sep 17 00:00:00 2001 From: Henry Peteet <102990783+henry-fn@users.noreply.github.com> Date: Tue, 3 Oct 2023 11:52:54 -0400 Subject: [PATCH 1/7] #2563: Expose Helm --kube-version argument for contextless diffs ### Proposed changes This PR exposes the helm template `--kube-version` argument so it can be manually specified in situations when there is no access to the Kubernetes API server (e.g running a diff in CSA mode with no connection to the cluster). Prior to this merge: * If there were zero k8s contexts --> this field was unset meaning helm would default to some old version (1.20.0 at the time of writing) if it couldn't connect to the k8s context * 1+ k8s contexts --> would always try to contact the API server to get the version leading to an error if the API server was unreachable. This variable will override the behavior in either case, but is mostly useful in the first case or when the context in the second case is malformed / unreachable. ### Related issues (optional) Closes #2563 --- .gitignore | 1 + CHANGELOG.md | 1 + provider/cmd/pulumi-gen-kubernetes/main.go | 2 +- .../gen/_go-templates/helm/v3/pulumiTypes.go | 5 ++ .../gen/dotnet-templates/helm/ChartBase.cs | 7 +++ .../pkg/gen/dotnet-templates/helm/Unwraps.cs | 25 +++++---- .../pkg/gen/dotnet-templates/helm/v3/Chart.cs | 4 ++ .../pkg/gen/nodejs-templates/helm/v3/helm.ts | 10 ++++ .../pkg/gen/python-templates/helm/v3/helm.py | 30 +++++++++-- provider/pkg/provider/invoke_helm_template.go | 53 +++++++++++-------- sdk/dotnet/Helm/ChartBase.cs | 7 +++ sdk/dotnet/Helm/Unwraps.cs | 25 +++++---- sdk/dotnet/Helm/V3/Chart.cs | 4 ++ sdk/go/kubernetes/helm/v3/chartPulumiTypes.go | 5 ++ sdk/nodejs/helm/v3/helm.ts | 10 ++++ sdk/python/pulumi_kubernetes/helm/v3/helm.py | 30 +++++++++-- 16 files changed, 165 insertions(+), 54 deletions(-) diff --git a/.gitignore b/.gitignore index ba8b15eaef..524f5e8ccb 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ yarn.lock ci-scripts /nuget/ **/.DS_Store +dist sdk/java/build sdk/java/.gradle diff --git a/CHANGELOG.md b/CHANGELOG.md index e9c32732fc..f626b65b61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ - Fix normalizing fields with empty objects/slices (https://github.com/pulumi/pulumi-kubernetes/pull/2576) - helm.v3.Release: Improved cancellation support (https://github.com/pulumi/pulumi-kubernetes/pull/2579) - Update Kubernetes client library to v0.28.2 (https://github.com/pulumi/pulumi-kubernetes/pull/2585) +- helm.v3.ChartOpts: Add KubeVersion field that can be passed to avoid asking the kubernetes API server for the version. ## 4.3.0 (September 25, 2023) diff --git a/provider/cmd/pulumi-gen-kubernetes/main.go b/provider/cmd/pulumi-gen-kubernetes/main.go index e43d34ed60..0132260017 100644 --- a/provider/cmd/pulumi-gen-kubernetes/main.go +++ b/provider/cmd/pulumi-gen-kubernetes/main.go @@ -711,7 +711,7 @@ func buildPulumiFieldsFromTerraform(path string, block *TerraformBlockSchema) ma if path == "kubernetes_deployment.spec.template.spec.container" && blockName == "port" { field["name"] = "ports" } - // 3. kubernetes_service has a field "port" wich is a list, but we call it "ports" + // 3. kubernetes_service has a field "port" which is a list, but we call it "ports" if path == "kubernetes_service.spec" && blockName == "port" { field["name"] = "ports" } diff --git a/provider/pkg/gen/_go-templates/helm/v3/pulumiTypes.go b/provider/pkg/gen/_go-templates/helm/v3/pulumiTypes.go index 50ccbc0b71..deb642dfaa 100644 --- a/provider/pkg/gen/_go-templates/helm/v3/pulumiTypes.go +++ b/provider/pkg/gen/_go-templates/helm/v3/pulumiTypes.go @@ -127,6 +127,10 @@ type ChartArgs struct { SkipCRDRendering pulumi.BoolInput // The optional namespace to install chart resources into. Namespace pulumi.StringInput + // By default, the kubernetes version is derived from your k8s context, this allows it to be overridden. + // Warning: This option should not be used unless you have a good reason to not use the auto-discovered + // version as it is much more bug-prone. + KubeVersion pulumi.StringInput // Overrides for chart values. Values pulumi.MapInput // Transformations is an optional list of transformations to apply to Kubernetes resource definitions @@ -167,6 +171,7 @@ type chartArgs struct { Repo string `json:"repo,omitempty" pulumi:"repo"` Chart string `json:"chart,omitempty" pulumi:"chart"` Version string `json:"version,omitempty" pulumi:"version"` + KubeVersion string `json:"kube_version,omitempty" pulumi:"kubeVersion"` FetchArgs fetchArgs `json:"fetch_opts,omitempty" pulumi:"fetchArgs"` Path string `json:"path,omitempty" pulumi:"path"` } diff --git a/provider/pkg/gen/dotnet-templates/helm/ChartBase.cs b/provider/pkg/gen/dotnet-templates/helm/ChartBase.cs index 769700566c..34ae76c70f 100644 --- a/provider/pkg/gen/dotnet-templates/helm/ChartBase.cs +++ b/provider/pkg/gen/dotnet-templates/helm/ChartBase.cs @@ -426,6 +426,13 @@ public InputList ApiVersions /// public Input? Namespace { get; set; } + /// + /// By default, the kubernetes version is derived from your k8s context, this allows it to be overridden. + /// Warning: This option should not be used unless you have a good reason to not use the auto-discovered + /// version as it is much more bug-prone. + /// + public Input? KubeVersion { get; set; } + private InputMap? _values; /// diff --git a/provider/pkg/gen/dotnet-templates/helm/Unwraps.cs b/provider/pkg/gen/dotnet-templates/helm/Unwraps.cs index d7c5d8a2c2..50d2e00434 100644 --- a/provider/pkg/gen/dotnet-templates/helm/Unwraps.cs +++ b/provider/pkg/gen/dotnet-templates/helm/Unwraps.cs @@ -28,6 +28,7 @@ internal class BaseChartArgsUnwrap public bool? SkipCRDRendering { get; set; } public bool? SkipAwait { get; set; } public string? Namespace { get; set; } + public string? KubeVersion { get; set; } public ImmutableDictionary Values { get; set; } = null!; public List Transformations { get; set; } = null!; public string? ResourcePrefix { get; set; } @@ -70,24 +71,25 @@ internal static class Extensions public static Output> Unwrap(this Union options) { return options.Match( - v => Output.Tuple(v.ApiVersions, v.Namespace.ToNullable(), v.Values, v.Repo.ToNullable(), v.Chart, v.Version.ToNullable(), v.FetchOptions.Unwrap(), new InputList { v.IncludeTestHookResources.ToNullable(), v.SkipCRDRendering.ToNullable(), v.SkipAwait.ToNullable() }).Apply(vs => + v => Output.Tuple(v.ApiVersions, v.Values, v.Chart, v.FetchOptions.Unwrap(), new InputList { v.Namespace.ToNullable(), v.Repo.ToNullable(), v.Version.ToNullable(), v.KubeVersion.ToNullable() }, new InputList { v.IncludeTestHookResources.ToNullable(), v.SkipCRDRendering.ToNullable(), v.SkipAwait.ToNullable() }).Apply(vs => Union.FromT0( new ChartArgsUnwrap { ApiVersions = vs.Item1, - Namespace = vs.Item2, - Values = vs.Item3, + Values = vs.Item2, + Chart = vs.Item3, + FetchOptions = vs.Item4, + Namespace = vs.Item5[0], + Repo = vs.Item5[1], + Version = vs.Item5[2], + KubeVersion = vs.Item5[3], + IncludeTestHookResources = vs.Item6[0], + SkipCRDRendering = vs.Item6[1], + SkipAwait = vs.Item6[2], Transformations = v.Transformations, ResourcePrefix = v.ResourcePrefix, - Repo = vs.Item4, - Chart = vs.Item5, - Version = vs.Item6, - FetchOptions = vs.Item7, - IncludeTestHookResources = vs.Item8[0], - SkipCRDRendering = vs.Item8[1], - SkipAwait = vs.Item8[2] })), - v => Output.Tuple(v.ApiVersions, v.IncludeTestHookResources.ToNullable(), v.SkipCRDRendering.ToNullable(), v.SkipAwait.ToNullable(), v.Namespace.ToNullable(), v.Values).Apply(vs => + v => Output.Tuple(v.ApiVersions, v.IncludeTestHookResources.ToNullable(), v.SkipCRDRendering.ToNullable(), v.SkipAwait.ToNullable(), v.Namespace.ToNullable(), v.Values, v.KubeVersion.ToNullable()).Apply(vs => Union.FromT1( new LocalChartArgsUnwrap { @@ -97,6 +99,7 @@ internal static class Extensions SkipAwait = vs.Item4, Namespace = vs.Item5, Values = vs.Item6, + KubeVersion = vs.Item7, Transformations = v.Transformations, ResourcePrefix = v.ResourcePrefix, Path = v.Path diff --git a/provider/pkg/gen/dotnet-templates/helm/v3/Chart.cs b/provider/pkg/gen/dotnet-templates/helm/v3/Chart.cs index e9a52eace1..7e01584742 100644 --- a/provider/pkg/gen/dotnet-templates/helm/v3/Chart.cs +++ b/provider/pkg/gen/dotnet-templates/helm/v3/Chart.cs @@ -315,6 +315,7 @@ private static string GetName(Union config, string re SkipCRDRendering = cfgBase.SkipCRDRendering, Namespace = cfgBase.Namespace, Values = cfgBase.Values, + KubeVersion = cfgBase.KubeVersion, ReleaseName = releaseName, Repo = cfg.Repo, Chart = cfg.Chart, @@ -353,6 +354,7 @@ private static string GetName(Union config, string re SkipCRDRendering = cfgBase.SkipCRDRendering, Namespace = cfgBase.Namespace, Values = cfgBase.Values, + KubeVersion = cfgBase.KubeVersion, ReleaseName = releaseName, Path = cfg.Path, }; @@ -396,6 +398,8 @@ internal class JsonOpts [JsonPropertyName("chart")] public string? Chart { get; set; } [JsonPropertyName("version")] + public string? KubeVersion { get; set; } + [JsonPropertyName("kube_version")] public string? Version { get; set; } [JsonPropertyName("fetch_opts")] public JsonOptsFetch? FetchOptions { get; set; } diff --git a/provider/pkg/gen/nodejs-templates/helm/v3/helm.ts b/provider/pkg/gen/nodejs-templates/helm/v3/helm.ts index 790e784781..a9b01192bc 100644 --- a/provider/pkg/gen/nodejs-templates/helm/v3/helm.ts +++ b/provider/pkg/gen/nodejs-templates/helm/v3/helm.ts @@ -209,6 +209,10 @@ export class Chart extends yaml.CollectionComponentResource { obj["skip_crd_rendering"] = value; break; } + case "kubeVersion": { + obj["kube_version"] = value; + break; + } case "releaseName": { obj["release_name"] = value; break; @@ -277,6 +281,12 @@ interface BaseChartOpts { * The optional namespace to install chart resources into. */ namespace?: pulumi.Input; + /** + * By default, the kubernetes version is derived from your k8s context, this allows it to be overridden. + * Warning: This option should not be used unless you have a good reason to not use the auto-discovered + * version as it is much more bug-prone. + */ + kubeVersion?: pulumi.Input; /** * Overrides for chart values. */ diff --git a/provider/pkg/gen/python-templates/helm/v3/helm.py b/provider/pkg/gen/python-templates/helm/v3/helm.py index 57da034700..06b8b768b3 100644 --- a/provider/pkg/gen/python-templates/helm/v3/helm.py +++ b/provider/pkg/gen/python-templates/helm/v3/helm.py @@ -415,6 +415,12 @@ class BaseChartOpts: Warning: This option should not be used if you have resources depending on Outputs from the Chart. """ + kube_version: Optional[pulumi.Input[str]] + """ + By default, the kubernetes version is derived from your k8s context, this allows it to be overridden. + Warning: This option should not be used unless you have a good reason to not use the auto-discovered version as it is much more bug-prone. + """ + def __init__(self, namespace: Optional[pulumi.Input[str]] = None, values: Optional[pulumi.Inputs] = None, @@ -423,7 +429,8 @@ def __init__(self, api_versions: Optional[Sequence[pulumi.Input[str]]] = None, include_test_hook_resources: Optional[pulumi.Input[bool]] = None, skip_crd_rendering: Optional[pulumi.Input[bool]] = None, - skip_await: Optional[pulumi.Input[bool]] = None): + skip_await: Optional[pulumi.Input[bool]] = None, + kube_version: Optional[pulumi.Input[str]] = None): """ :param Optional[pulumi.Input[str]] namespace: Optional namespace to install chart resources into. :param Optional[pulumi.Inputs] values: Optional overrides for chart values. @@ -442,6 +449,9 @@ def __init__(self, :param Optional[pulumi.Input[bool]] skip_await: Skip await logic for all resources in this Chart. Resources will be marked ready as soon as they are created. Warning: This option should not be used if you have resources depending on Outputs from the Chart. + :param Optional[pulumi.Input[str]] kube_version: By default, the kubernetes version is derived from your k8s + context, this allows it to be overridden. Warning: This option should not be used unless you have a + good reason to not use the auto-discovered version as it is much more bug-prone. """ self.namespace = namespace self.include_test_hook_resources = include_test_hook_resources @@ -451,6 +461,7 @@ def __init__(self, self.transformations = transformations self.resource_prefix = resource_prefix self.api_versions = api_versions + self.kube_version = kube_version def to_json(self): return pulumi.Output.from_input(self.__dict__).apply( @@ -497,7 +508,8 @@ def __init__(self, api_versions: Optional[Sequence[pulumi.Input[str]]] = None, include_test_hook_resources: Optional[pulumi.Input[bool]] = None, skip_crd_rendering: Optional[pulumi.Input[bool]] = None, - skip_await: Optional[pulumi.Input[bool]] = None): + skip_await: Optional[pulumi.Input[bool]] = None, + kube_version: Optional[pulumi.Input[str]] = None): """ :param pulumi.Input[str] chart: The name of the chart to deploy. If `repo` is provided, this chart name will be prefixed by the repo name. @@ -526,9 +538,12 @@ def __init__(self, :param Optional[pulumi.Input[bool]] skip_await: Skip await logic for all resources in this Chart. Resources will be marked ready as soon as they are created. Warning: This option should not be used if you have resources depending on Outputs from the Chart. + :param Optional[pulumi.Input[str]] kube_version: By default, the kubernetes version is derived from your k8s + context, this allows it to be overridden. Warning: This option should not be used unless you have a + good reason to not use the auto-discovered version as it is much more bug-prone. """ super(ChartOpts, self).__init__(namespace, values, transformations, resource_prefix, api_versions, - include_test_hook_resources, skip_crd_rendering, skip_await) + include_test_hook_resources, skip_crd_rendering, skip_await, kube_version) self.chart = chart self.repo = repo self.version = version @@ -554,7 +569,9 @@ def __init__(self, api_versions: Optional[Sequence[pulumi.Input[str]]] = None, include_test_hook_resources: Optional[pulumi.Input[bool]] = None, skip_crd_rendering: Optional[pulumi.Input[bool]] = None, - skip_await: Optional[pulumi.Input[bool]] = None): + skip_await: Optional[pulumi.Input[bool]] = None, + kube_version: Optional[pulumi.Input[str]] = None): + """ :param pulumi.Input[str] path: The path to the chart directory which contains the `Chart.yaml` file. @@ -575,10 +592,13 @@ def __init__(self, :param Optional[pulumi.Input[bool]] skip_await: Skip await logic for all resources in this Chart. Resources will be marked ready as soon as they are created. Warning: This option should not be used if you have resources depending on Outputs from the Chart. + :param Optional[pulumi.Input[str]] kube_version: By default, the kubernetes version is derived from your k8s + context, this allows it to be overridden. Warning: This option should not be used unless you have a + good reason to not use the auto-discovered version as it is much more bug-prone. """ super(LocalChartOpts, self).__init__(namespace, values, transformations, resource_prefix, api_versions, - include_test_hook_resources, skip_crd_rendering, skip_await) + include_test_hook_resources, skip_crd_rendering, skip_await, kube_version) self.path = path diff --git a/provider/pkg/provider/invoke_helm_template.go b/provider/pkg/provider/invoke_helm_template.go index a573454f9f..737551315e 100644 --- a/provider/pkg/provider/invoke_helm_template.go +++ b/provider/pkg/provider/invoke_helm_template.go @@ -71,6 +71,7 @@ type HelmChartOpts struct { Version string `json:"version,omitempty"` HelmChartDebug bool `json:"helm_chart_debug,omitempty"` HelmRegistryConfig string `json:"helm_registry_config,omitempty"` + KubeVersion string `json:"kube_version,omitempty"` } // helmTemplate performs Helm fetch/pull + template operations and returns the resulting YAML manifest based on the @@ -242,39 +243,49 @@ func (c *chart) template(clientSet *clients.DynamicClientSet) (string, error) { installAction.ReleaseName = c.opts.ReleaseName installAction.Version = c.opts.Version - // Preserve backward compatibility + if c.opts.KubeVersion != "" { + var kubeVersion *chartutil.KubeVersion + if kubeVersion, err = chartutil.ParseKubeVersion(c.opts.KubeVersion); err != nil { + return "", fmt.Errorf("could not get parse kube_version %q from chart options: %w", c.opts.KubeVersion, err) + } + installAction.KubeVersion = kubeVersion + } + + // Preserve backward compatibility so APIVersions can be explicitly passed if len(c.opts.APIVersions) > 0 { installAction.APIVersions = c.opts.APIVersions - } else if clientSet != nil { - // The following code to discover Kubernetes version and API versions comes - // from the Helm project: - // https://github.com/helm/helm/blob/d7b4c38c42cb0b77f1bcebf9bb4ae7695a10da0b/pkg/action/action.go#L239 + } + if clientSet != nil { dc := clientSet.DiscoveryClientCached - dc.Invalidate() - kubeVersion, err := dc.ServerVersion() - if err != nil { - return "", fmt.Errorf("could not get server version from Kubernetes: %w", err) + // The following code to discover Kubernetes version and API versions comes + // from the Helm project: + // https://github.com/helm/helm/blob/d7b4c38c42cb0b77f1bcebf9bb4ae7695a10da0b/pkg/action/action.go#L239 + if installAction.KubeVersion == nil { + kubeVersion, err := dc.ServerVersion() + if err != nil { + return "", fmt.Errorf("could not get server version from Kubernetes: %w", err) + } + installAction.KubeVersion = &chartutil.KubeVersion{ + Version: kubeVersion.GitVersion, + Major: kubeVersion.Major, + Minor: kubeVersion.Minor, + } } // Client-Go emits an error when an API service is registered but unimplemented. // Since the discovery client continues building the API object, it is correctly // populated with all valid APIs. // See https://github.com/kubernetes/kubernetes/issues/72051#issuecomment-521157642 - apiVersions, err := action.GetVersionSet(dc) - if err != nil { - if !discovery.IsGroupDiscoveryFailedError(err) { - return "", fmt.Errorf("could not get apiVersions from Kubernetes: %w", err) + if installAction.APIVersions == nil { + apiVersions, err := action.GetVersionSet(dc) + if err != nil { + if !discovery.IsGroupDiscoveryFailedError(err) { + return "", fmt.Errorf("could not get apiVersions from Kubernetes: %w", err) + } } + installAction.APIVersions = apiVersions } - - installAction.KubeVersion = &chartutil.KubeVersion{ - Version: kubeVersion.GitVersion, - Major: kubeVersion.Major, - Minor: kubeVersion.Minor, - } - - installAction.APIVersions = apiVersions } chartName, err := func() (string, error) { diff --git a/sdk/dotnet/Helm/ChartBase.cs b/sdk/dotnet/Helm/ChartBase.cs index 769700566c..34ae76c70f 100644 --- a/sdk/dotnet/Helm/ChartBase.cs +++ b/sdk/dotnet/Helm/ChartBase.cs @@ -426,6 +426,13 @@ public InputList ApiVersions /// public Input? Namespace { get; set; } + /// + /// By default, the kubernetes version is derived from your k8s context, this allows it to be overridden. + /// Warning: This option should not be used unless you have a good reason to not use the auto-discovered + /// version as it is much more bug-prone. + /// + public Input? KubeVersion { get; set; } + private InputMap? _values; /// diff --git a/sdk/dotnet/Helm/Unwraps.cs b/sdk/dotnet/Helm/Unwraps.cs index d7c5d8a2c2..50d2e00434 100644 --- a/sdk/dotnet/Helm/Unwraps.cs +++ b/sdk/dotnet/Helm/Unwraps.cs @@ -28,6 +28,7 @@ internal class BaseChartArgsUnwrap public bool? SkipCRDRendering { get; set; } public bool? SkipAwait { get; set; } public string? Namespace { get; set; } + public string? KubeVersion { get; set; } public ImmutableDictionary Values { get; set; } = null!; public List Transformations { get; set; } = null!; public string? ResourcePrefix { get; set; } @@ -70,24 +71,25 @@ internal static class Extensions public static Output> Unwrap(this Union options) { return options.Match( - v => Output.Tuple(v.ApiVersions, v.Namespace.ToNullable(), v.Values, v.Repo.ToNullable(), v.Chart, v.Version.ToNullable(), v.FetchOptions.Unwrap(), new InputList { v.IncludeTestHookResources.ToNullable(), v.SkipCRDRendering.ToNullable(), v.SkipAwait.ToNullable() }).Apply(vs => + v => Output.Tuple(v.ApiVersions, v.Values, v.Chart, v.FetchOptions.Unwrap(), new InputList { v.Namespace.ToNullable(), v.Repo.ToNullable(), v.Version.ToNullable(), v.KubeVersion.ToNullable() }, new InputList { v.IncludeTestHookResources.ToNullable(), v.SkipCRDRendering.ToNullable(), v.SkipAwait.ToNullable() }).Apply(vs => Union.FromT0( new ChartArgsUnwrap { ApiVersions = vs.Item1, - Namespace = vs.Item2, - Values = vs.Item3, + Values = vs.Item2, + Chart = vs.Item3, + FetchOptions = vs.Item4, + Namespace = vs.Item5[0], + Repo = vs.Item5[1], + Version = vs.Item5[2], + KubeVersion = vs.Item5[3], + IncludeTestHookResources = vs.Item6[0], + SkipCRDRendering = vs.Item6[1], + SkipAwait = vs.Item6[2], Transformations = v.Transformations, ResourcePrefix = v.ResourcePrefix, - Repo = vs.Item4, - Chart = vs.Item5, - Version = vs.Item6, - FetchOptions = vs.Item7, - IncludeTestHookResources = vs.Item8[0], - SkipCRDRendering = vs.Item8[1], - SkipAwait = vs.Item8[2] })), - v => Output.Tuple(v.ApiVersions, v.IncludeTestHookResources.ToNullable(), v.SkipCRDRendering.ToNullable(), v.SkipAwait.ToNullable(), v.Namespace.ToNullable(), v.Values).Apply(vs => + v => Output.Tuple(v.ApiVersions, v.IncludeTestHookResources.ToNullable(), v.SkipCRDRendering.ToNullable(), v.SkipAwait.ToNullable(), v.Namespace.ToNullable(), v.Values, v.KubeVersion.ToNullable()).Apply(vs => Union.FromT1( new LocalChartArgsUnwrap { @@ -97,6 +99,7 @@ internal static class Extensions SkipAwait = vs.Item4, Namespace = vs.Item5, Values = vs.Item6, + KubeVersion = vs.Item7, Transformations = v.Transformations, ResourcePrefix = v.ResourcePrefix, Path = v.Path diff --git a/sdk/dotnet/Helm/V3/Chart.cs b/sdk/dotnet/Helm/V3/Chart.cs index e9a52eace1..7e01584742 100644 --- a/sdk/dotnet/Helm/V3/Chart.cs +++ b/sdk/dotnet/Helm/V3/Chart.cs @@ -315,6 +315,7 @@ private static string GetName(Union config, string re SkipCRDRendering = cfgBase.SkipCRDRendering, Namespace = cfgBase.Namespace, Values = cfgBase.Values, + KubeVersion = cfgBase.KubeVersion, ReleaseName = releaseName, Repo = cfg.Repo, Chart = cfg.Chart, @@ -353,6 +354,7 @@ private static string GetName(Union config, string re SkipCRDRendering = cfgBase.SkipCRDRendering, Namespace = cfgBase.Namespace, Values = cfgBase.Values, + KubeVersion = cfgBase.KubeVersion, ReleaseName = releaseName, Path = cfg.Path, }; @@ -396,6 +398,8 @@ internal class JsonOpts [JsonPropertyName("chart")] public string? Chart { get; set; } [JsonPropertyName("version")] + public string? KubeVersion { get; set; } + [JsonPropertyName("kube_version")] public string? Version { get; set; } [JsonPropertyName("fetch_opts")] public JsonOptsFetch? FetchOptions { get; set; } diff --git a/sdk/go/kubernetes/helm/v3/chartPulumiTypes.go b/sdk/go/kubernetes/helm/v3/chartPulumiTypes.go index 50ccbc0b71..deb642dfaa 100644 --- a/sdk/go/kubernetes/helm/v3/chartPulumiTypes.go +++ b/sdk/go/kubernetes/helm/v3/chartPulumiTypes.go @@ -127,6 +127,10 @@ type ChartArgs struct { SkipCRDRendering pulumi.BoolInput // The optional namespace to install chart resources into. Namespace pulumi.StringInput + // By default, the kubernetes version is derived from your k8s context, this allows it to be overridden. + // Warning: This option should not be used unless you have a good reason to not use the auto-discovered + // version as it is much more bug-prone. + KubeVersion pulumi.StringInput // Overrides for chart values. Values pulumi.MapInput // Transformations is an optional list of transformations to apply to Kubernetes resource definitions @@ -167,6 +171,7 @@ type chartArgs struct { Repo string `json:"repo,omitempty" pulumi:"repo"` Chart string `json:"chart,omitempty" pulumi:"chart"` Version string `json:"version,omitempty" pulumi:"version"` + KubeVersion string `json:"kube_version,omitempty" pulumi:"kubeVersion"` FetchArgs fetchArgs `json:"fetch_opts,omitempty" pulumi:"fetchArgs"` Path string `json:"path,omitempty" pulumi:"path"` } diff --git a/sdk/nodejs/helm/v3/helm.ts b/sdk/nodejs/helm/v3/helm.ts index 790e784781..a9b01192bc 100644 --- a/sdk/nodejs/helm/v3/helm.ts +++ b/sdk/nodejs/helm/v3/helm.ts @@ -209,6 +209,10 @@ export class Chart extends yaml.CollectionComponentResource { obj["skip_crd_rendering"] = value; break; } + case "kubeVersion": { + obj["kube_version"] = value; + break; + } case "releaseName": { obj["release_name"] = value; break; @@ -277,6 +281,12 @@ interface BaseChartOpts { * The optional namespace to install chart resources into. */ namespace?: pulumi.Input; + /** + * By default, the kubernetes version is derived from your k8s context, this allows it to be overridden. + * Warning: This option should not be used unless you have a good reason to not use the auto-discovered + * version as it is much more bug-prone. + */ + kubeVersion?: pulumi.Input; /** * Overrides for chart values. */ diff --git a/sdk/python/pulumi_kubernetes/helm/v3/helm.py b/sdk/python/pulumi_kubernetes/helm/v3/helm.py index 57da034700..06b8b768b3 100644 --- a/sdk/python/pulumi_kubernetes/helm/v3/helm.py +++ b/sdk/python/pulumi_kubernetes/helm/v3/helm.py @@ -415,6 +415,12 @@ class BaseChartOpts: Warning: This option should not be used if you have resources depending on Outputs from the Chart. """ + kube_version: Optional[pulumi.Input[str]] + """ + By default, the kubernetes version is derived from your k8s context, this allows it to be overridden. + Warning: This option should not be used unless you have a good reason to not use the auto-discovered version as it is much more bug-prone. + """ + def __init__(self, namespace: Optional[pulumi.Input[str]] = None, values: Optional[pulumi.Inputs] = None, @@ -423,7 +429,8 @@ def __init__(self, api_versions: Optional[Sequence[pulumi.Input[str]]] = None, include_test_hook_resources: Optional[pulumi.Input[bool]] = None, skip_crd_rendering: Optional[pulumi.Input[bool]] = None, - skip_await: Optional[pulumi.Input[bool]] = None): + skip_await: Optional[pulumi.Input[bool]] = None, + kube_version: Optional[pulumi.Input[str]] = None): """ :param Optional[pulumi.Input[str]] namespace: Optional namespace to install chart resources into. :param Optional[pulumi.Inputs] values: Optional overrides for chart values. @@ -442,6 +449,9 @@ def __init__(self, :param Optional[pulumi.Input[bool]] skip_await: Skip await logic for all resources in this Chart. Resources will be marked ready as soon as they are created. Warning: This option should not be used if you have resources depending on Outputs from the Chart. + :param Optional[pulumi.Input[str]] kube_version: By default, the kubernetes version is derived from your k8s + context, this allows it to be overridden. Warning: This option should not be used unless you have a + good reason to not use the auto-discovered version as it is much more bug-prone. """ self.namespace = namespace self.include_test_hook_resources = include_test_hook_resources @@ -451,6 +461,7 @@ def __init__(self, self.transformations = transformations self.resource_prefix = resource_prefix self.api_versions = api_versions + self.kube_version = kube_version def to_json(self): return pulumi.Output.from_input(self.__dict__).apply( @@ -497,7 +508,8 @@ def __init__(self, api_versions: Optional[Sequence[pulumi.Input[str]]] = None, include_test_hook_resources: Optional[pulumi.Input[bool]] = None, skip_crd_rendering: Optional[pulumi.Input[bool]] = None, - skip_await: Optional[pulumi.Input[bool]] = None): + skip_await: Optional[pulumi.Input[bool]] = None, + kube_version: Optional[pulumi.Input[str]] = None): """ :param pulumi.Input[str] chart: The name of the chart to deploy. If `repo` is provided, this chart name will be prefixed by the repo name. @@ -526,9 +538,12 @@ def __init__(self, :param Optional[pulumi.Input[bool]] skip_await: Skip await logic for all resources in this Chart. Resources will be marked ready as soon as they are created. Warning: This option should not be used if you have resources depending on Outputs from the Chart. + :param Optional[pulumi.Input[str]] kube_version: By default, the kubernetes version is derived from your k8s + context, this allows it to be overridden. Warning: This option should not be used unless you have a + good reason to not use the auto-discovered version as it is much more bug-prone. """ super(ChartOpts, self).__init__(namespace, values, transformations, resource_prefix, api_versions, - include_test_hook_resources, skip_crd_rendering, skip_await) + include_test_hook_resources, skip_crd_rendering, skip_await, kube_version) self.chart = chart self.repo = repo self.version = version @@ -554,7 +569,9 @@ def __init__(self, api_versions: Optional[Sequence[pulumi.Input[str]]] = None, include_test_hook_resources: Optional[pulumi.Input[bool]] = None, skip_crd_rendering: Optional[pulumi.Input[bool]] = None, - skip_await: Optional[pulumi.Input[bool]] = None): + skip_await: Optional[pulumi.Input[bool]] = None, + kube_version: Optional[pulumi.Input[str]] = None): + """ :param pulumi.Input[str] path: The path to the chart directory which contains the `Chart.yaml` file. @@ -575,10 +592,13 @@ def __init__(self, :param Optional[pulumi.Input[bool]] skip_await: Skip await logic for all resources in this Chart. Resources will be marked ready as soon as they are created. Warning: This option should not be used if you have resources depending on Outputs from the Chart. + :param Optional[pulumi.Input[str]] kube_version: By default, the kubernetes version is derived from your k8s + context, this allows it to be overridden. Warning: This option should not be used unless you have a + good reason to not use the auto-discovered version as it is much more bug-prone. """ super(LocalChartOpts, self).__init__(namespace, values, transformations, resource_prefix, api_versions, - include_test_hook_resources, skip_crd_rendering, skip_await) + include_test_hook_resources, skip_crd_rendering, skip_await, kube_version) self.path = path From c1a320f88a8b059812e227f3c648d766fe15cfd4 Mon Sep 17 00:00:00 2001 From: Henry Peteet Date: Mon, 9 Oct 2023 13:16:20 -0400 Subject: [PATCH 2/7] add golang tests for kubeversion --- tests/sdk/dotnet/dotnet_test.go | 19 +++++++++++++ tests/sdk/go/go_test.go | 9 +++++++ .../go/helm-kube-version/step1/Pulumi.yaml | 3 +++ .../step1/kube-version/.helmignore | 21 +++++++++++++++ .../step1/kube-version/Chart.yaml | 4 +++ .../kube-version/templates/test-pod.yaml | 9 +++++++ .../step1/kube-version/values.yaml | 0 tests/sdk/go/helm-kube-version/step1/main.go | 27 +++++++++++++++++++ 8 files changed, 92 insertions(+) create mode 100644 tests/sdk/go/helm-kube-version/step1/Pulumi.yaml create mode 100755 tests/sdk/go/helm-kube-version/step1/kube-version/.helmignore create mode 100755 tests/sdk/go/helm-kube-version/step1/kube-version/Chart.yaml create mode 100755 tests/sdk/go/helm-kube-version/step1/kube-version/templates/test-pod.yaml create mode 100755 tests/sdk/go/helm-kube-version/step1/kube-version/values.yaml create mode 100644 tests/sdk/go/helm-kube-version/step1/main.go diff --git a/tests/sdk/dotnet/dotnet_test.go b/tests/sdk/dotnet/dotnet_test.go index f35b5d3769..6bf68e358b 100644 --- a/tests/sdk/dotnet/dotnet_test.go +++ b/tests/sdk/dotnet/dotnet_test.go @@ -177,6 +177,25 @@ func TestDotnet_HelmApiVersions(t *testing.T) { integration.ProgramTest(t, &test) } +func TestDotnet_HelmKubeVersion(t *testing.T) { + test := baseOptions.With(integration.ProgramTestOptions{ + Dir: filepath.Join("helm-kube-version", "step1"), + Quick: true, + ExpectRefreshChanges: true, + OrderedConfig: []integration.ConfigValue{ + { + Key: "pulumi:disable-default-providers[0]", + Value: "kubernetes", + Path: true, + }, + }, + ExtraRuntimeValidation: func(t *testing.T, stackInfo integration.RuntimeValidationStackInfo) { + assert.NotNil(t, stackInfo.Deployment) + }, + }) + integration.ProgramTest(t, &test) +} + func TestDotnet_HelmAllowCRDRendering(t *testing.T) { test := baseOptions.With(integration.ProgramTestOptions{ Dir: filepath.Join("helm-skip-crd-rendering", "step1"), diff --git a/tests/sdk/go/go_test.go b/tests/sdk/go/go_test.go index 955ae3e936..53bfa0b303 100644 --- a/tests/sdk/go/go_test.go +++ b/tests/sdk/go/go_test.go @@ -284,6 +284,15 @@ func TestGo(t *testing.T) { integration.ProgramTest(t, &options) }) + t.Run("Helm Kube Version", func(t *testing.T) { + options := baseOptions.With(integration.ProgramTestOptions{ + Dir: filepath.Join(cwd, "helm-kube-version", "step1"), + Quick: true, + ExpectRefreshChanges: true, + }) + integration.ProgramTest(t, &options) + }) + t.Run("Helm Skip CRD Rendering", func(t *testing.T) { options := baseOptions.With(integration.ProgramTestOptions{ Dir: filepath.Join("helm-skip-crd-rendering", "step1"), diff --git a/tests/sdk/go/helm-kube-version/step1/Pulumi.yaml b/tests/sdk/go/helm-kube-version/step1/Pulumi.yaml new file mode 100644 index 0000000000..6d405395f4 --- /dev/null +++ b/tests/sdk/go/helm-kube-version/step1/Pulumi.yaml @@ -0,0 +1,3 @@ +name: go_helm_local_kubernetes +description: Test Kubernetes Helm package with local Chart. +runtime: go diff --git a/tests/sdk/go/helm-kube-version/step1/kube-version/.helmignore b/tests/sdk/go/helm-kube-version/step1/kube-version/.helmignore new file mode 100755 index 0000000000..f0c1319444 --- /dev/null +++ b/tests/sdk/go/helm-kube-version/step1/kube-version/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/tests/sdk/go/helm-kube-version/step1/kube-version/Chart.yaml b/tests/sdk/go/helm-kube-version/step1/kube-version/Chart.yaml new file mode 100755 index 0000000000..46accb0778 --- /dev/null +++ b/tests/sdk/go/helm-kube-version/step1/kube-version/Chart.yaml @@ -0,0 +1,4 @@ +deprecated: true +description: Chart to test KubeVersion +name: kubeversion-test +version: 0.0.1 diff --git a/tests/sdk/go/helm-kube-version/step1/kube-version/templates/test-pod.yaml b/tests/sdk/go/helm-kube-version/step1/kube-version/templates/test-pod.yaml new file mode 100755 index 0000000000..58893f7a6b --- /dev/null +++ b/tests/sdk/go/helm-kube-version/step1/kube-version/templates/test-pod.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Pod +metadata: + name: kube-version-test + namespace: {{ .Release.Namespace }} +spec: + containers: + - name: kube-version-test + image: nginx diff --git a/tests/sdk/go/helm-kube-version/step1/kube-version/values.yaml b/tests/sdk/go/helm-kube-version/step1/kube-version/values.yaml new file mode 100755 index 0000000000..e69de29bb2 diff --git a/tests/sdk/go/helm-kube-version/step1/main.go b/tests/sdk/go/helm-kube-version/step1/main.go new file mode 100644 index 0000000000..3895154a2b --- /dev/null +++ b/tests/sdk/go/helm-kube-version/step1/main.go @@ -0,0 +1,27 @@ +package main + +import ( + corev1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/core/v1" + "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/helm/v3" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +func main() { + pulumi.Run(func(ctx *pulumi.Context) error { + namespace, err := corev1.NewNamespace(ctx, "test", nil) + if err != nil { + return err + } + + _, err = helm.NewChart(ctx, "kube-version", helm.ChartArgs{ + KubeVersion: pulumi.String("1.25.0"), + Namespace: namespace.Metadata.Name().Elem(), + Path: pulumi.String("kube-version"), + }) + if err != nil { + return err + } + + return nil + }) +} From 522379d4e78db2fda7c5675c2e5bdd07c71e28cc Mon Sep 17 00:00:00 2001 From: Henry Peteet Date: Mon, 9 Oct 2023 13:16:39 -0400 Subject: [PATCH 3/7] add dotnet tests for kubeversion (untested, local tests not runing) --- .../step1/HelmKubeVersion.csproj | 8 ++++ .../dotnet/helm-kube-version/step1/Program.cs | 39 +++++++++++++++++++ .../helm-kube-version/step1/Pulumi.yaml | 3 ++ .../step1/helm-kube-version/.helmignore | 21 ++++++++++ .../step1/helm-kube-version/Chart.yaml | 5 +++ .../helm-kube-version/templates/test-pod.yaml | 9 +++++ .../step1/helm-kube-version/values.yaml | 0 7 files changed, 85 insertions(+) create mode 100644 tests/sdk/dotnet/helm-kube-version/step1/HelmKubeVersion.csproj create mode 100644 tests/sdk/dotnet/helm-kube-version/step1/Program.cs create mode 100644 tests/sdk/dotnet/helm-kube-version/step1/Pulumi.yaml create mode 100755 tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/.helmignore create mode 100755 tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/Chart.yaml create mode 100755 tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/templates/test-pod.yaml create mode 100755 tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/values.yaml diff --git a/tests/sdk/dotnet/helm-kube-version/step1/HelmKubeVersion.csproj b/tests/sdk/dotnet/helm-kube-version/step1/HelmKubeVersion.csproj new file mode 100644 index 0000000000..74954604db --- /dev/null +++ b/tests/sdk/dotnet/helm-kube-version/step1/HelmKubeVersion.csproj @@ -0,0 +1,8 @@ + + + + Exe + net6.0 + + + diff --git a/tests/sdk/dotnet/helm-kube-version/step1/Program.cs b/tests/sdk/dotnet/helm-kube-version/step1/Program.cs new file mode 100644 index 0000000000..646294f581 --- /dev/null +++ b/tests/sdk/dotnet/helm-kube-version/step1/Program.cs @@ -0,0 +1,39 @@ +// Copyright 2016-2022, Pulumi Corporation. All rights reserved. + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi; +using Pulumi.Kubernetes; +using Pulumi.Kubernetes.Core.V1; +using Pulumi.Kubernetes.Helm; +using Pulumi.Kubernetes.Helm.V3; +using Pulumi.Kubernetes.Types.Inputs.Core.V1; +using Pulumi.Kubernetes.Yaml; +using Pulumi.Serialization; + +class HelmStack : Stack +{ + public HelmStack() + { + var provider = new Provider("k8s"); + var namespaceTest = new Namespace("test", null, new CustomResourceOptions{Provider = provider}); + var namespaceName = namespaceTest.Metadata.Apply(n => n.Name); + + new Chart("kube-version", new LocalChartArgs + { + KubeVersion = "1.25.0" + Namespace = namespaceName, + Path = "helm-kube-version" + }, new ComponentResourceOptions + { + Provider = provider, + }); + } +} + +class Program +{ + static Task Main(string[] args) => Deployment.RunAsync(); +} diff --git a/tests/sdk/dotnet/helm-kube-version/step1/Pulumi.yaml b/tests/sdk/dotnet/helm-kube-version/step1/Pulumi.yaml new file mode 100644 index 0000000000..a076e7d4c8 --- /dev/null +++ b/tests/sdk/dotnet/helm-kube-version/step1/Pulumi.yaml @@ -0,0 +1,3 @@ +name: dotnet-helm-kubeversions +description: Deploys a simple Helm chart that manually specifies the helm --kube-version argument to work. +runtime: dotnet diff --git a/tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/.helmignore b/tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/.helmignore new file mode 100755 index 0000000000..f0c1319444 --- /dev/null +++ b/tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/Chart.yaml b/tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/Chart.yaml new file mode 100755 index 0000000000..2270752fa1 --- /dev/null +++ b/tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/Chart.yaml @@ -0,0 +1,5 @@ +deprecated: true +description: Chart to test KubeVersion +name: apiversions-test +version: 0.0.1 +kubernetesVersion: ">1.24.0" diff --git a/tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/templates/test-pod.yaml b/tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/templates/test-pod.yaml new file mode 100755 index 0000000000..29f2ad1e4c --- /dev/null +++ b/tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/templates/test-pod.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Pod +metadata: + name: kube-version-test + namespace: {{ .Release.Namespace }} +spec: + containers: + - name: kube-version-test + image: nginx \ No newline at end of file diff --git a/tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/values.yaml b/tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/values.yaml new file mode 100755 index 0000000000..e69de29bb2 From 0edff0de2a6f94839b92793ec461e4987e268aae Mon Sep 17 00:00:00 2001 From: Henry Peteet Date: Mon, 9 Oct 2023 13:40:25 -0400 Subject: [PATCH 4/7] more tests --- .../step1/kube-version/Chart.yaml | 1 + tests/sdk/nodejs/examples/examples_test.go | 16 +++++++++++++ .../helm-kube-version/step1/.gitignore | 3 +++ .../helm-kube-version/step1/Pulumi.yaml | 3 +++ .../step1/helm-kube-version/.helmignore | 21 +++++++++++++++++ .../step1/helm-kube-version/Chart.yaml | 6 +++++ .../helm-kube-version/templates/test-pod.yaml | 9 ++++++++ .../step1/helm-kube-version/values.yaml | 0 .../examples/helm-kube-version/step1/index.ts | 9 ++++++++ .../helm-kube-version/step1/package.json | 14 +++++++++++ .../helm-kube-version/step1/tsconfig.json | 21 +++++++++++++++++ .../helm-kube-version/step1/Pulumi.yaml | 3 +++ .../helm-kube-version/step1/__main__.py | 23 +++++++++++++++++++ .../step1/helm-kube-version/.helmignore | 21 +++++++++++++++++ .../step1/helm-kube-version/Chart.yaml | 5 ++++ .../helm-kube-version/templates/test-pod.yaml | 9 ++++++++ .../step1/helm-kube-version/values.yaml | 0 .../helm-kube-version/step1/requirements.txt | 1 + tests/sdk/python/python_test.go | 12 ++++++++++ 19 files changed, 177 insertions(+) create mode 100644 tests/sdk/nodejs/examples/helm-kube-version/step1/.gitignore create mode 100644 tests/sdk/nodejs/examples/helm-kube-version/step1/Pulumi.yaml create mode 100755 tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/.helmignore create mode 100755 tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/Chart.yaml create mode 100755 tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/templates/test-pod.yaml create mode 100755 tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/values.yaml create mode 100644 tests/sdk/nodejs/examples/helm-kube-version/step1/index.ts create mode 100644 tests/sdk/nodejs/examples/helm-kube-version/step1/package.json create mode 100644 tests/sdk/nodejs/examples/helm-kube-version/step1/tsconfig.json create mode 100644 tests/sdk/python/helm-kube-version/step1/Pulumi.yaml create mode 100644 tests/sdk/python/helm-kube-version/step1/__main__.py create mode 100755 tests/sdk/python/helm-kube-version/step1/helm-kube-version/.helmignore create mode 100755 tests/sdk/python/helm-kube-version/step1/helm-kube-version/Chart.yaml create mode 100755 tests/sdk/python/helm-kube-version/step1/helm-kube-version/templates/test-pod.yaml create mode 100755 tests/sdk/python/helm-kube-version/step1/helm-kube-version/values.yaml create mode 100644 tests/sdk/python/helm-kube-version/step1/requirements.txt diff --git a/tests/sdk/go/helm-kube-version/step1/kube-version/Chart.yaml b/tests/sdk/go/helm-kube-version/step1/kube-version/Chart.yaml index 46accb0778..8cefd6298a 100755 --- a/tests/sdk/go/helm-kube-version/step1/kube-version/Chart.yaml +++ b/tests/sdk/go/helm-kube-version/step1/kube-version/Chart.yaml @@ -2,3 +2,4 @@ deprecated: true description: Chart to test KubeVersion name: kubeversion-test version: 0.0.1 +kubernetesVersion: ">1.24.0" diff --git a/tests/sdk/nodejs/examples/examples_test.go b/tests/sdk/nodejs/examples/examples_test.go index 2f41e8a2fe..7e697bf648 100644 --- a/tests/sdk/nodejs/examples/examples_test.go +++ b/tests/sdk/nodejs/examples/examples_test.go @@ -220,6 +220,22 @@ func TestAccHelmApiVersions(t *testing.T) { integration.ProgramTest(t, &test) } +func TestAccHelmKubeVersion(t *testing.T) { + tests.SkipIfShort(t) + test := getBaseOptions(t). + With(integration.ProgramTestOptions{ + Dir: filepath.Join(getCwd(t), "helm-kube-version", "step1"), + SkipRefresh: true, + ExtraRuntimeValidation: func( + t *testing.T, stackInfo integration.RuntimeValidationStackInfo, + ) { + assert.NotNil(t, stackInfo.Deployment) + }, + }) + + integration.ProgramTest(t, &test) +} + func TestAccHelmAllowCRDRendering(t *testing.T) { test := getBaseOptions(t). With(integration.ProgramTestOptions{ diff --git a/tests/sdk/nodejs/examples/helm-kube-version/step1/.gitignore b/tests/sdk/nodejs/examples/helm-kube-version/step1/.gitignore new file mode 100644 index 0000000000..02453dd3ca --- /dev/null +++ b/tests/sdk/nodejs/examples/helm-kube-version/step1/.gitignore @@ -0,0 +1,3 @@ +/bin/ +/node_modules/ +/stable/ diff --git a/tests/sdk/nodejs/examples/helm-kube-version/step1/Pulumi.yaml b/tests/sdk/nodejs/examples/helm-kube-version/step1/Pulumi.yaml new file mode 100644 index 0000000000..4106e2980c --- /dev/null +++ b/tests/sdk/nodejs/examples/helm-kube-version/step1/Pulumi.yaml @@ -0,0 +1,3 @@ +name: helm-kube-version +runtime: nodejs +description: Deploys a simple Helm chart with KubeVersion requirement diff --git a/tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/.helmignore b/tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/.helmignore new file mode 100755 index 0000000000..f0c1319444 --- /dev/null +++ b/tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/Chart.yaml b/tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/Chart.yaml new file mode 100755 index 0000000000..014118aab9 --- /dev/null +++ b/tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +deprecated: true +description: Chart to test helm --kube-version +name: kubeversion-test +version: 0.0.1 +kubernetesVersion: ">1.24.0" \ No newline at end of file diff --git a/tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/templates/test-pod.yaml b/tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/templates/test-pod.yaml new file mode 100755 index 0000000000..29f2ad1e4c --- /dev/null +++ b/tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/templates/test-pod.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Pod +metadata: + name: kube-version-test + namespace: {{ .Release.Namespace }} +spec: + containers: + - name: kube-version-test + image: nginx \ No newline at end of file diff --git a/tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/values.yaml b/tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/values.yaml new file mode 100755 index 0000000000..e69de29bb2 diff --git a/tests/sdk/nodejs/examples/helm-kube-version/step1/index.ts b/tests/sdk/nodejs/examples/helm-kube-version/step1/index.ts new file mode 100644 index 0000000000..672bc5b195 --- /dev/null +++ b/tests/sdk/nodejs/examples/helm-kube-version/step1/index.ts @@ -0,0 +1,9 @@ +import * as k8s from "@pulumi/kubernetes"; + +const namespace = new k8s.core.v1.Namespace("test"); + +new k8s.helm.v3.Chart("kube-version", { + kubeVersion: "1.25.0", + namespace: namespace.metadata.name, + path: "helm-kube-version", +}); \ No newline at end of file diff --git a/tests/sdk/nodejs/examples/helm-kube-version/step1/package.json b/tests/sdk/nodejs/examples/helm-kube-version/step1/package.json new file mode 100644 index 0000000000..13965fa992 --- /dev/null +++ b/tests/sdk/nodejs/examples/helm-kube-version/step1/package.json @@ -0,0 +1,14 @@ +{ + "name": "nodeserver", + "version": "0.1.0", + "dependencies": { + "@pulumi/pulumi": "latest" + }, + "devDependencies": { + "@types/node": "^9.3.0" + }, + "peerDependencies": { + "@pulumi/kubernetes": "latest" + }, + "license": "MIT" +} diff --git a/tests/sdk/nodejs/examples/helm-kube-version/step1/tsconfig.json b/tests/sdk/nodejs/examples/helm-kube-version/step1/tsconfig.json new file mode 100644 index 0000000000..3086b63abd --- /dev/null +++ b/tests/sdk/nodejs/examples/helm-kube-version/step1/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "outDir": "bin", + "target": "es6", + "module": "commonjs", + "moduleResolution": "node", + "declaration": true, + "sourceMap": true, + "stripInternal": true, + "experimentalDecorators": true, + "pretty": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "forceConsistentCasingInFileNames": true, + "strictNullChecks": true + }, + "files": [ + "index.ts" + ] +} diff --git a/tests/sdk/python/helm-kube-version/step1/Pulumi.yaml b/tests/sdk/python/helm-kube-version/step1/Pulumi.yaml new file mode 100644 index 0000000000..dcefdd11a1 --- /dev/null +++ b/tests/sdk/python/helm-kube-version/step1/Pulumi.yaml @@ -0,0 +1,3 @@ +name: helm-local +description: A program that tests Helm chart creation from a local directory +runtime: python diff --git a/tests/sdk/python/helm-kube-version/step1/__main__.py b/tests/sdk/python/helm-kube-version/step1/__main__.py new file mode 100644 index 0000000000..945739081f --- /dev/null +++ b/tests/sdk/python/helm-kube-version/step1/__main__.py @@ -0,0 +1,23 @@ +# Copyright 2016-2020, Pulumi Corporation. +# +# 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. +from pulumi_kubernetes.core.v1 import Namespace +from pulumi_kubernetes.helm.v3 import Chart, LocalChartOpts + +namespace = Namespace("test") + +Chart("kube-version", LocalChartOpts( + kube_version="1.24.1", + namespace=namespace.metadata["name"], + path="helm-kube-version", +)) diff --git a/tests/sdk/python/helm-kube-version/step1/helm-kube-version/.helmignore b/tests/sdk/python/helm-kube-version/step1/helm-kube-version/.helmignore new file mode 100755 index 0000000000..f0c1319444 --- /dev/null +++ b/tests/sdk/python/helm-kube-version/step1/helm-kube-version/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/tests/sdk/python/helm-kube-version/step1/helm-kube-version/Chart.yaml b/tests/sdk/python/helm-kube-version/step1/helm-kube-version/Chart.yaml new file mode 100755 index 0000000000..ea9c3cc24f --- /dev/null +++ b/tests/sdk/python/helm-kube-version/step1/helm-kube-version/Chart.yaml @@ -0,0 +1,5 @@ +deprecated: true +description: Chart to test KubeVersion helm arg +name: kubeversion-test +version: 0.0.1 +kubernetesVersion: ">1.24.0, <1.24.2" \ No newline at end of file diff --git a/tests/sdk/python/helm-kube-version/step1/helm-kube-version/templates/test-pod.yaml b/tests/sdk/python/helm-kube-version/step1/helm-kube-version/templates/test-pod.yaml new file mode 100755 index 0000000000..29f2ad1e4c --- /dev/null +++ b/tests/sdk/python/helm-kube-version/step1/helm-kube-version/templates/test-pod.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Pod +metadata: + name: kube-version-test + namespace: {{ .Release.Namespace }} +spec: + containers: + - name: kube-version-test + image: nginx \ No newline at end of file diff --git a/tests/sdk/python/helm-kube-version/step1/helm-kube-version/values.yaml b/tests/sdk/python/helm-kube-version/step1/helm-kube-version/values.yaml new file mode 100755 index 0000000000..e69de29bb2 diff --git a/tests/sdk/python/helm-kube-version/step1/requirements.txt b/tests/sdk/python/helm-kube-version/step1/requirements.txt new file mode 100644 index 0000000000..bc4e43087b --- /dev/null +++ b/tests/sdk/python/helm-kube-version/step1/requirements.txt @@ -0,0 +1 @@ +pulumi>=3.0.0,<4.0.0 diff --git a/tests/sdk/python/python_test.go b/tests/sdk/python/python_test.go index 53c130f010..e32a48802f 100644 --- a/tests/sdk/python/python_test.go +++ b/tests/sdk/python/python_test.go @@ -429,6 +429,18 @@ func TestHelmApiVersions(t *testing.T) { integration.ProgramTest(t, &options) } +func TestHelmKubeVersion(t *testing.T) { + cwd, err := os.Getwd() + if !assert.NoError(t, err) { + t.FailNow() + } + options := baseOptions.With(integration.ProgramTestOptions{ + Dir: filepath.Join(cwd, "helm-kube-version", "step1"), + ExpectRefreshChanges: true, + }) + integration.ProgramTest(t, &options) +} + func TestHelmAllowCRDRendering(t *testing.T) { test := baseOptions.With(integration.ProgramTestOptions{ Dir: filepath.Join("helm-skip-crd-rendering", "step1"), From 62352b4f545ddd9a003092646c9853b73537f08c Mon Sep 17 00:00:00 2001 From: Henry Peteet Date: Mon, 9 Oct 2023 13:42:05 -0400 Subject: [PATCH 5/7] make tests more specific --- tests/sdk/dotnet/helm-kube-version/step1/Program.cs | 2 +- .../dotnet/helm-kube-version/step1/helm-kube-version/Chart.yaml | 2 +- tests/sdk/go/helm-kube-version/step1/kube-version/Chart.yaml | 2 +- .../helm-kube-version/step1/helm-kube-version/Chart.yaml | 2 +- tests/sdk/nodejs/examples/helm-kube-version/step1/index.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/sdk/dotnet/helm-kube-version/step1/Program.cs b/tests/sdk/dotnet/helm-kube-version/step1/Program.cs index 646294f581..f4bda93b1b 100644 --- a/tests/sdk/dotnet/helm-kube-version/step1/Program.cs +++ b/tests/sdk/dotnet/helm-kube-version/step1/Program.cs @@ -23,7 +23,7 @@ public HelmStack() new Chart("kube-version", new LocalChartArgs { - KubeVersion = "1.25.0" + KubeVersion = "1.24.2", Namespace = namespaceName, Path = "helm-kube-version" }, new ComponentResourceOptions diff --git a/tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/Chart.yaml b/tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/Chart.yaml index 2270752fa1..424bfc2b99 100755 --- a/tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/Chart.yaml +++ b/tests/sdk/dotnet/helm-kube-version/step1/helm-kube-version/Chart.yaml @@ -2,4 +2,4 @@ deprecated: true description: Chart to test KubeVersion name: apiversions-test version: 0.0.1 -kubernetesVersion: ">1.24.0" +kubernetesVersion: ">1.24.0, <1.24.2" \ No newline at end of file diff --git a/tests/sdk/go/helm-kube-version/step1/kube-version/Chart.yaml b/tests/sdk/go/helm-kube-version/step1/kube-version/Chart.yaml index 8cefd6298a..4070555015 100755 --- a/tests/sdk/go/helm-kube-version/step1/kube-version/Chart.yaml +++ b/tests/sdk/go/helm-kube-version/step1/kube-version/Chart.yaml @@ -2,4 +2,4 @@ deprecated: true description: Chart to test KubeVersion name: kubeversion-test version: 0.0.1 -kubernetesVersion: ">1.24.0" +kubernetesVersion: ">1.24.0, <1.24.2" \ No newline at end of file diff --git a/tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/Chart.yaml b/tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/Chart.yaml index 014118aab9..d60ab70b4c 100755 --- a/tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/Chart.yaml +++ b/tests/sdk/nodejs/examples/helm-kube-version/step1/helm-kube-version/Chart.yaml @@ -3,4 +3,4 @@ deprecated: true description: Chart to test helm --kube-version name: kubeversion-test version: 0.0.1 -kubernetesVersion: ">1.24.0" \ No newline at end of file +kubernetesVersion: ">1.24.0, <1.24.2" \ No newline at end of file diff --git a/tests/sdk/nodejs/examples/helm-kube-version/step1/index.ts b/tests/sdk/nodejs/examples/helm-kube-version/step1/index.ts index 672bc5b195..1a003be20c 100644 --- a/tests/sdk/nodejs/examples/helm-kube-version/step1/index.ts +++ b/tests/sdk/nodejs/examples/helm-kube-version/step1/index.ts @@ -3,7 +3,7 @@ import * as k8s from "@pulumi/kubernetes"; const namespace = new k8s.core.v1.Namespace("test"); new k8s.helm.v3.Chart("kube-version", { - kubeVersion: "1.25.0", + kubeVersion: "1.24.2", namespace: namespace.metadata.name, path: "helm-kube-version", }); \ No newline at end of file From 19c30b086fdecb468584f5d4183e003a039a7ff6 Mon Sep 17 00:00:00 2001 From: Henry Peteet Date: Mon, 9 Oct 2023 13:43:40 -0400 Subject: [PATCH 6/7] fix version string --- tests/sdk/dotnet/helm-kube-version/step1/Program.cs | 2 +- tests/sdk/nodejs/examples/helm-kube-version/step1/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/sdk/dotnet/helm-kube-version/step1/Program.cs b/tests/sdk/dotnet/helm-kube-version/step1/Program.cs index f4bda93b1b..97369e5f6d 100644 --- a/tests/sdk/dotnet/helm-kube-version/step1/Program.cs +++ b/tests/sdk/dotnet/helm-kube-version/step1/Program.cs @@ -23,7 +23,7 @@ public HelmStack() new Chart("kube-version", new LocalChartArgs { - KubeVersion = "1.24.2", + KubeVersion = "1.24.1", Namespace = namespaceName, Path = "helm-kube-version" }, new ComponentResourceOptions diff --git a/tests/sdk/nodejs/examples/helm-kube-version/step1/index.ts b/tests/sdk/nodejs/examples/helm-kube-version/step1/index.ts index 1a003be20c..a89529a132 100644 --- a/tests/sdk/nodejs/examples/helm-kube-version/step1/index.ts +++ b/tests/sdk/nodejs/examples/helm-kube-version/step1/index.ts @@ -3,7 +3,7 @@ import * as k8s from "@pulumi/kubernetes"; const namespace = new k8s.core.v1.Namespace("test"); new k8s.helm.v3.Chart("kube-version", { - kubeVersion: "1.24.2", + kubeVersion: "1.24.1", namespace: namespace.metadata.name, path: "helm-kube-version", }); \ No newline at end of file From a18ad7e05f5926ed414c75705492cb76d98ad0c6 Mon Sep 17 00:00:00 2001 From: Henry Peteet Date: Mon, 9 Oct 2023 13:46:24 -0400 Subject: [PATCH 7/7] one more fix --- tests/sdk/go/helm-kube-version/step1/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sdk/go/helm-kube-version/step1/main.go b/tests/sdk/go/helm-kube-version/step1/main.go index 3895154a2b..161c2657c9 100644 --- a/tests/sdk/go/helm-kube-version/step1/main.go +++ b/tests/sdk/go/helm-kube-version/step1/main.go @@ -14,7 +14,7 @@ func main() { } _, err = helm.NewChart(ctx, "kube-version", helm.ChartArgs{ - KubeVersion: pulumi.String("1.25.0"), + KubeVersion: pulumi.String("1.24.1"), Namespace: namespace.Metadata.Name().Elem(), Path: pulumi.String("kube-version"), })