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 27c6f92f02..b9e0edac64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ ## Unreleased +- helm.v3.ChartOpts: Add KubeVersion field that can be passed to avoid asking the kubernetes API server for the version (https://github.com/pulumi/pulumi-kubernetes/pull/2593) + ## 4.4.0 (October 12, 2023) - Fix normalizing fields with empty objects/slices (https://github.com/pulumi/pulumi-kubernetes/pull/2576) 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 @@ public static Output> Unwrap(this U 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 Output> ParseTemplate(Un 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 Output> ParseTemplate(Un 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 @@ public static Output> Unwrap(this U 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 Output> ParseTemplate(Un 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 Output> ParseTemplate(Un 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 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/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..97369e5f6d --- /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.24.1", + 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..424bfc2b99 --- /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, <1.24.2" \ No newline at end of file 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 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..4070555015 --- /dev/null +++ b/tests/sdk/go/helm-kube-version/step1/kube-version/Chart.yaml @@ -0,0 +1,5 @@ +deprecated: true +description: Chart to test KubeVersion +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/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..161c2657c9 --- /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.24.1"), + Namespace: namespace.Metadata.Name().Elem(), + Path: pulumi.String("kube-version"), + }) + if err != nil { + return err + } + + return nil + }) +} diff --git a/tests/sdk/nodejs/examples/examples_test.go b/tests/sdk/nodejs/examples/examples_test.go index 00298c8444..137037d32c 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..d60ab70b4c --- /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, <1.24.2" \ 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..a89529a132 --- /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.24.1", + 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"),