From 3f7bfbbf5285e9379911da8f27b888f8554cf140 Mon Sep 17 00:00:00 2001 From: Levi Blackstone <levi@pulumi.com> Date: Mon, 8 Nov 2021 22:16:50 -0700 Subject: [PATCH] Updated codegen and overlays --- .../pulumi-resource-kubernetes/schema.json | 428 ++++++++++++++- provider/go.mod | 2 +- provider/go.sum | 5 +- .../gen/_go-templates/kustomize/directory.go | 2 +- provider/pkg/gen/examples/configFile.md | 254 +++++++++ provider/pkg/gen/examples/configGroup.md | 513 ++++++++++++++++++ .../pkg/gen/nodejs-templates/yaml/yaml.tmpl | 12 +- provider/pkg/gen/overlays.go | 488 ++++++++++++++++- provider/pkg/gen/schema.go | 12 +- sdk/dotnet/Helm/V2/Inputs/FetchOptsArgs.cs | 112 ++++ sdk/dotnet/Helm/V3/Inputs/FetchOptsArgs.cs | 112 ++++ sdk/go/kubernetes/apiextensions/init.go | 37 ++ sdk/go/kubernetes/helm/v2/init.go | 37 ++ sdk/go/kubernetes/kustomize/directory.go | 2 +- sdk/go/kubernetes/kustomize/init.go | 7 - sdk/go/kubernetes/yaml/init.go | 37 ++ sdk/nodejs/types/input.ts | 3 + sdk/nodejs/types/output.ts | 3 + sdk/nodejs/yaml/yaml.ts | 12 +- sdk/python/pulumi_kubernetes/__init__.py | 6 + .../pulumi_kubernetes/helm/v2/__init__.py | 1 + .../pulumi_kubernetes/helm/v2/_inputs.py | 262 +++++++++ .../pulumi_kubernetes/helm/v3/_inputs.py | 249 +++++++++ .../pulumi_kubernetes/kustomize/__init__.py | 6 + sdk/python/pulumi_kubernetes/yaml/__init__.py | 6 + tests/go.mod | 2 +- tests/go.sum | 5 +- 27 files changed, 2574 insertions(+), 41 deletions(-) create mode 100644 provider/pkg/gen/examples/configFile.md create mode 100644 provider/pkg/gen/examples/configGroup.md create mode 100644 sdk/dotnet/Helm/V2/Inputs/FetchOptsArgs.cs create mode 100644 sdk/dotnet/Helm/V3/Inputs/FetchOptsArgs.cs create mode 100644 sdk/go/kubernetes/apiextensions/init.go create mode 100644 sdk/go/kubernetes/helm/v2/init.go create mode 100644 sdk/go/kubernetes/yaml/init.go create mode 100644 sdk/python/pulumi_kubernetes/helm/v2/_inputs.py create mode 100644 sdk/python/pulumi_kubernetes/kustomize/__init__.py create mode 100644 sdk/python/pulumi_kubernetes/yaml/__init__.py diff --git a/provider/cmd/pulumi-resource-kubernetes/schema.json b/provider/cmd/pulumi-resource-kubernetes/schema.json index 9dba2f96de..d40b9cf3ce 100644 --- a/provider/cmd/pulumi-resource-kubernetes/schema.json +++ b/provider/cmd/pulumi-resource-kubernetes/schema.json @@ -22770,6 +22770,140 @@ } } }, + "kubernetes:helm.sh/v2:FetchOpts": { + "description": "Additional options to customize the fetching of the Helm chart.", + "properties": { + "caFile": { + "type": "string", + "description": "Verify certificates of HTTPS-enabled servers using this CA bundle." + }, + "certFile": { + "type": "string", + "description": "Identify HTTPS client using this SSL certificate file." + }, + "destination": { + "type": "string", + "description": "Location to write the chart. If this and tardir are specified, tardir is appended to this (default \".\")." + }, + "devel": { + "type": "boolean", + "description": "Use development versions, too. Equivalent to version '>0.0.0-0'. If –version is set, this is ignored." + }, + "home": { + "type": "string", + "description": "Location of your Helm config. Overrides $HELM_HOME (default \"/Users/abc/.helm\")." + }, + "keyFile": { + "type": "string", + "description": "Identify HTTPS client using this SSL key file." + }, + "keyring": { + "type": "string", + "description": "Keyring containing public keys (default “/Users/abc/.gnupg/pubring.gpg”)." + }, + "password": { + "type": "string", + "description": "Chart repository password." + }, + "prov": { + "type": "string", + "description": "Fetch the provenance file, but don’t perform verification." + }, + "repo": { + "type": "string", + "description": "Chart repository url where to locate the requested chart." + }, + "untar": { + "type": "boolean", + "description": "If set to false, will leave the chart as a tarball after downloading." + }, + "untardir": { + "type": "string", + "description": "If untar is specified, this flag specifies the name of the directory into which the chart is expanded (default \".\")." + }, + "username": { + "type": "string", + "description": "Chart repository username." + }, + "verify": { + "type": "boolean", + "description": "Verify the package against its signature." + }, + "version": { + "type": "string", + "description": "Specific version of a chart. Without this, the latest version is fetched." + } + }, + "type": "object", + "isOverlay": true + }, + "kubernetes:helm.sh/v3:FetchOpts": { + "description": "Additional options to customize the fetching of the Helm chart.", + "properties": { + "caFile": { + "type": "string", + "description": "Verify certificates of HTTPS-enabled servers using this CA bundle." + }, + "certFile": { + "type": "string", + "description": "Identify HTTPS client using this SSL certificate file." + }, + "destination": { + "type": "string", + "description": "Location to write the chart. If this and tardir are specified, tardir is appended to this (default \".\")." + }, + "devel": { + "type": "boolean", + "description": "Use development versions, too. Equivalent to version '>0.0.0-0'. If –version is set, this is ignored." + }, + "home": { + "type": "string", + "description": "Location of your Helm config. Overrides $HELM_HOME (default \"/Users/abc/.helm\")." + }, + "keyFile": { + "type": "string", + "description": "Identify HTTPS client using this SSL key file." + }, + "keyring": { + "type": "string", + "description": "Keyring containing public keys (default “/Users/abc/.gnupg/pubring.gpg”)." + }, + "password": { + "type": "string", + "description": "Chart repository password." + }, + "prov": { + "type": "string", + "description": "Fetch the provenance file, but don’t perform verification." + }, + "repo": { + "type": "string", + "description": "Chart repository url where to locate the requested chart." + }, + "untar": { + "type": "boolean", + "description": "If set to false, will leave the chart as a tarball after downloading." + }, + "untardir": { + "type": "string", + "description": "If untar is specified, this flag specifies the name of the directory into which the chart is expanded (default \".\")." + }, + "username": { + "type": "string", + "description": "Chart repository username." + }, + "verify": { + "type": "boolean", + "description": "Verify the package against its signature." + }, + "version": { + "type": "string", + "description": "Specific version of a chart. Without this, the latest version is fetched." + } + }, + "type": "object", + "isOverlay": true + }, "kubernetes:helm.sh/v3:Release": { "description": "A Release is an instance of a chart running in a Kubernetes cluster.\nA Chart is a Helm package. It contains all of the resource definitions necessary to run an application, tool, or service inside of a Kubernetes cluster.\nNote - Helm Release is currently in BETA and may change. Use in production environment is discouraged.", "properties": { @@ -30818,6 +30952,54 @@ "items" ] }, + "kubernetes:apiextensions.k8s.io:CustomResource": { + "description": "CustomResource represents an instance of a CustomResourceDefinition (CRD). For example, the\n CoreOS Prometheus operator exposes a CRD `monitoring.coreos.com/ServiceMonitor`; to\n instantiate this as a Pulumi resource, one could call `new CustomResource`, passing the\n `ServiceMonitor` resource definition as an argument.", + "properties": { + "apiVersion": { + "type": "string", + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" + }, + "kind": { + "type": "string", + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + }, + "metadata": { + "$ref": "#/types/kubernetes:meta/v1:ObjectMeta", + "description": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata." + } + }, + "type": "object", + "required": [ + "apiVersion", + "kind" + ], + "isOverlay": true, + "inputProperties": { + "apiVersion": { + "type": "string", + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" + }, + "kind": { + "type": "string", + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + }, + "metadata": { + "$ref": "#/types/kubernetes:meta/v1:ObjectMeta", + "description": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata." + }, + "others": { + "type": "object", + "additionalProperties": { + "$ref": "pulumi.json#/Any" + }, + "description": "This field is not an actual property. It is used to represent custom property names and their values that can be passed in addition to the other input properties." + } + }, + "requiredInputs": [ + "apiVersion", + "kind" + ] + }, "kubernetes:apiregistration.k8s.io/v1:APIService": { "description": "APIService represents a server for a particular GroupVersion. Name must be \"version.group\".", "properties": { @@ -39442,6 +39624,126 @@ "items" ] }, + "kubernetes:helm.sh/v2:Chart": { + "description": "Chart is a component representing a collection of resources described by an arbitrary Helm Chart.\n\nThe Chart can be fetched from any source that is accessible to the `helm` command line. Values in the `values.yml` file can be overridden using `ChartOpts.values` (equivalent to `--set` or having multiple `values.yml` files). Objects can be transformed arbitrarily by supplying callbacks to `ChartOpts.transformations`.\n\n`Chart` does not use Tiller. The Chart specified is copied and expanded locally; the semantics are equivalent to running `helm template` and then using Pulumi to manage the resulting YAML manifests. Any values that would be retrieved in-cluster are assigned fake values, and none of Tiller's server-side validity testing is executed.\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n### Local Chart Directory\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v2.Chart(\"nginx-ingress\", {\n path: \"./nginx-ingress\",\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v2 import Chart, LocalChartOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n LocalChartOpts(\n path=\"./nginx-ingress\",\n ),\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V2;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new LocalChartArgs\n {\n Path = \"./nginx-ingress\",\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v2\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tPath: pulumi.String(\"./nginx-ingress\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Remote Chart\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v2.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v2 import Chart, ChartOpts, FetchOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n ),\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V2;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n }\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v2\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.run(func(ctx *pulumi.context) error {\n\t\t_, err := helm.newchart(ctx, \"nginx-ingress\", helm.chartargs{\n\t\t\tchart: pulumi.string(\"nginx-ingress\"),\n\t\t\tversion: pulumi.string(\"1.24.4\"),\n\t\t\tfetchargs: helm.fetchargs{\n\t\t\t\trepo: pulumi.string(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n\n{{% /example %}}\n{{% example %}}\n### Set Chart Values\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v2.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n values: {\n controller: {\n metrics: {\n enabled: true,\n }\n }\n },\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v2 import Chart, ChartOpts, FetchOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n values={\n \"controller\": {\n \"metrics\": {\n \"enabled\": True,\n },\n },\n },\n ),\n)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V2;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var values = new Dictionary<string, object>\n {\n [\"controller\"] = new Dictionary<string, object>\n {\n [\"metrics\"] = new Dictionary<string, object>\n {\n [\"enabled\"] = true\n }\n },\n };\n\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n },\n Values = values,\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v2\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tChart: pulumi.String(\"nginx-ingress\"),\n\t\t\tVersion: pulumi.String(\"1.24.4\"),\n\t\t\tFetchArgs: helm.FetchArgs{\n\t\t\t\tRepo: pulumi.String(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t\tValues: pulumi.Map{\n\t\t\t\t\"controller\": pulumi.Map{\n\t\t\t\t\t\"metrics\": pulumi.Map{\n\t\t\t\t\t\t\"enabled\": pulumi.Bool(true),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Deploy Chart into Namespace\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v2.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n namespace: \"test-namespace\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v2 import Chart, ChartOpts, FetchOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n namespace=\"test-namespace\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n ),\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V2;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n Namespace = \"test-namespace\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n },\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v2\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tChart: pulumi.String(\"nginx-ingress\"),\n\t\t\tVersion: pulumi.String(\"1.24.4\"),\n\t\t\tNamespace: pulumi.String(\"test-namespace\"),\n\t\t\tFetchArgs: helm.FetchArgs{\n\t\t\t\tRepo: pulumi.String(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Chart with Transformations\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v2.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n transformations: [\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Service\" && obj.apiVersion === \"v1\") {\n if (obj.spec && obj.spec.type && obj.spec.type === \"LoadBalancer\") {\n obj.spec.type = \"ClusterIP\";\n }\n }\n },\n\n // Set a resource alias for a previous name.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Deployment\") {\n opts.aliases = [{ name: \"oldName\" }]\n }\n },\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Pod\" && obj.metadata.name === \"test\") {\n obj.apiVersion = \"v1\"\n obj.kind = \"List\"\n }\n },\n ],\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v2 import Chart, ChartOpts, FetchOpts\n\n# Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\ndef make_service_private(obj, opts):\n if obj[\"kind\"] == \"Service\" and obj[\"apiVersion\"] == \"v1\":\n try:\n t = obj[\"spec\"][\"type\"]\n if t == \"LoadBalancer\":\n obj[\"spec\"][\"type\"] = \"ClusterIP\"\n except KeyError:\n pass\n\n\n# Set a resource alias for a previous name.\ndef alias(obj, opts):\n if obj[\"kind\"] == \"Deployment\":\n opts.aliases = [\"oldName\"]\n\n\n# Omit a resource from the Chart by transforming the specified resource definition to an empty List.\ndef omit_resource(obj, opts):\n if obj[\"kind\"] == \"Pod\" and obj[\"metadata\"][\"name\"] == \"test\":\n obj[\"apiVersion\"] = \"v1\"\n obj[\"kind\"] = \"List\"\n\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n transformations=[make_service_private, alias, omit_resource],\n ),\n)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V2;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n },\n Transformations =\n {\n LoadBalancerToClusterIP,\n ResourceAlias,\n OmitTestPod,\n }\n\n });\n\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n ImmutableDictionary<string, object> LoadBalancerToClusterIP(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Service\" && (string)obj[\"apiVersion\"] == \"v1\")\n {\n var spec = (ImmutableDictionary<string, object>)obj[\"spec\"];\n if (spec != null && (string)spec[\"type\"] == \"LoadBalancer\")\n {\n return obj.SetItem(\"spec\", spec.SetItem(\"type\", \"ClusterIP\"));\n }\n }\n\n return obj;\n }\n\n // Set a resource alias for a previous name.\n ImmutableDictionary<string, object> ResourceAlias(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Deployment\")\n {\n opts.Aliases.Add(new Alias { Name = \"oldName\" });\n }\n\n return obj;\n }\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n ImmutableDictionary<string, object> OmitTestPod(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n var metadata = (ImmutableDictionary<string, object>)obj[\"metadata\"];\n if ((string)obj[\"kind\"] == \"Pod\" && (string)metadata[\"name\"] == \"test\")\n {\n return new Dictionary<string, object>\n {\n [\"apiVersion\"] = \"v1\",\n [\"kind\"] = \"List\",\n [\"items\"] = new Dictionary<string, object>(),\n }.ToImmutableDictionary();\n }\n\n return obj;\n }\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v2\"\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tChart: pulumi.String(\"nginx-ingress\"),\n\t\t\tVersion: pulumi.String(\"1.24.4\"),\n\t\t\tFetchArgs: helm.FetchArgs{\n\t\t\t\tRepo: pulumi.String(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t\tTransformations: []yaml.Transformation{\n\t\t\t\t// Make every service private to the cluster, i.e., turn all services into ClusterIP\n\t\t\t\t// instead of LoadBalancer.\n\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\tif state[\"kind\"] == \"Service\" {\n\t\t\t\t\t\tspec := state[\"spec\"].(map[string]interface{})\n\t\t\t\t\t\tspec[\"type\"] = \"ClusterIP\"\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// Set a resource alias for a previous name.\n\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\tif state[\"kind\"] == \"Deployment\" {\n\t\t\t\t\t\taliases := pulumi.Aliases([]pulumi.Alias{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName: pulumi.String(\"oldName\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t\topts = append(opts, aliases)\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// Omit a resource from the Chart by transforming the specified resource definition\n\t\t\t\t// to an empty List.\n\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\tname := state[\"metadata\"].(map[string]interface{})[\"name\"]\n\t\t\t\t\tif state[\"kind\"] == \"Pod\" && name == \"test\" {\n\t\t\t\t\t\tstate[\"apiVersion\"] = \"core/v1\"\n\t\t\t\t\t\tstate[\"kind\"] = \"List\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% /examples %}}\n\n\n\n", + "properties": { + "resources": { + "type": "string", + "description": "Resources created by the Chart." + }, + "urn": { + "type": "string", + "description": "The stable logical URN used to distinctly address a resource, both before and after deployments." + } + }, + "type": "object", + "isOverlay": true, + "inputProperties": { + "chart": { + "type": "string", + "description": "The name of the chart to deploy. If [repo] is provided, this chart name will be prefixed by the repo name. Example: repo: \"stable\", chart: \"nginx-ingress\" -> \"stable/nginx-ingress\" Example: chart: \"stable/nginx-ingress\" -> \"stable/nginx-ingress\"\n\nRequired if specifying `ChartOpts` for a remote chart." + }, + "fetchOpts": { + "$ref": "#/types/kubernetes:helm.sh/v2:FetchOpts", + "description": "Additional options to customize the fetching of the Helm chart." + }, + "namespace": { + "type": "string", + "description": "The optional namespace to install chart resources into." + }, + "path": { + "type": "string", + "description": "The path to the chart directory which contains the `Chart.yaml` file.\n\nRequired if specifying `LocalChartOpts`." + }, + "repo": { + "type": "string", + "description": "The repository name of the chart to deploy. Example: \"stable\".\n\nUsed only when specifying options for a remote chart." + }, + "resourcePrefix": { + "type": "string", + "description": "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\"foo\" would produce a resource named \"foo-resourceName\"." + }, + "transformations": { + "type": "array", + "items": { + "$ref": "pulumi.json#/Any" + }, + "description": "Optional array of transformations to apply to resources that will be created by this chart prior to creation. Allows customization of the chart behaviour without directly modifying the chart itself." + }, + "values": { + "type": "object", + "additionalProperties": { + "$ref": "pulumi.json#/Any" + }, + "description": "Overrides for chart values." + }, + "version": { + "type": "string", + "description": "The version of the chart to deploy. If not provided, the latest version will be deployed." + } + }, + "isComponent": true + }, + "kubernetes:helm.sh/v3:Chart": { + "description": "Chart is a component representing a collection of resources described by an arbitrary Helm Chart.\n\nThe Chart can be fetched from any source that is accessible to the `helm` command line. Values in the `values.yml` file can be overridden using `ChartOpts.values` (equivalent to `--set` or having multiple `values.yml` files). Objects can be transformed arbitrarily by supplying callbacks to `ChartOpts.transformations`.\n\n`Chart` does not use Tiller. The Chart specified is copied and expanded locally; the semantics are equivalent to running `helm template` and then using Pulumi to manage the resulting YAML manifests. Any values that would be retrieved in-cluster are assigned fake values, and none of Tiller's server-side validity testing is executed.\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n### Local Chart Directory\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v3.Chart(\"nginx-ingress\", {\n path: \"./nginx-ingress\",\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v3 import Chart, LocalChartOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n LocalChartOpts(\n path=\"./nginx-ingress\",\n ),\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V3;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new LocalChartArgs\n {\n Path = \"./nginx-ingress\",\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v3\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tPath: pulumi.String(\"./nginx-ingress\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Remote Chart\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v3.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v3 import Chart, ChartOpts, FetchOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n ),\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V3;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n }\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v3\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.run(func(ctx *pulumi.context) error {\n\t\t_, err := helm.newchart(ctx, \"nginx-ingress\", helm.chartargs{\n\t\t\tchart: pulumi.string(\"nginx-ingress\"),\n\t\t\tversion: pulumi.string(\"1.24.4\"),\n\t\t\tfetchargs: helm.fetchargs{\n\t\t\t\trepo: pulumi.string(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n\n{{% /example %}}\n{{% example %}}\n### Set Chart Values\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v3.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n values: {\n controller: {\n metrics: {\n enabled: true,\n }\n }\n },\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v3 import Chart, ChartOpts, FetchOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n values={\n \"controller\": {\n \"metrics\": {\n \"enabled\": True,\n },\n },\n },\n ),\n)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V3;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var values = new Dictionary<string, object>\n {\n [\"controller\"] = new Dictionary<string, object>\n {\n [\"metrics\"] = new Dictionary<string, object>\n {\n [\"enabled\"] = true\n }\n },\n };\n\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n },\n Values = values,\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v3\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tChart: pulumi.String(\"nginx-ingress\"),\n\t\t\tVersion: pulumi.String(\"1.24.4\"),\n\t\t\tFetchArgs: helm.FetchArgs{\n\t\t\t\tRepo: pulumi.String(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t\tValues: pulumi.Map{\n\t\t\t\t\"controller\": pulumi.Map{\n\t\t\t\t\t\"metrics\": pulumi.Map{\n\t\t\t\t\t\t\"enabled\": pulumi.Bool(true),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Deploy Chart into Namespace\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v3.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n namespace: \"test-namespace\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v3 import Chart, ChartOpts, FetchOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n namespace=\"test-namespace\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n ),\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V3;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n Namespace = \"test-namespace\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n },\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v3\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tChart: pulumi.String(\"nginx-ingress\"),\n\t\t\tVersion: pulumi.String(\"1.24.4\"),\n\t\t\tNamespace: pulumi.String(\"test-namespace\"),\n\t\t\tFetchArgs: helm.FetchArgs{\n\t\t\t\tRepo: pulumi.String(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Chart with Transformations\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v3.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n transformations: [\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Service\" && obj.apiVersion === \"v1\") {\n if (obj.spec && obj.spec.type && obj.spec.type === \"LoadBalancer\") {\n obj.spec.type = \"ClusterIP\";\n }\n }\n },\n\n // Set a resource alias for a previous name.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Deployment\") {\n opts.aliases = [{ name: \"oldName\" }]\n }\n },\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Pod\" && obj.metadata.name === \"test\") {\n obj.apiVersion = \"v1\"\n obj.kind = \"List\"\n }\n },\n ],\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v3 import Chart, ChartOpts, FetchOpts\n\n# Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\ndef make_service_private(obj, opts):\n if obj[\"kind\"] == \"Service\" and obj[\"apiVersion\"] == \"v1\":\n try:\n t = obj[\"spec\"][\"type\"]\n if t == \"LoadBalancer\":\n obj[\"spec\"][\"type\"] = \"ClusterIP\"\n except KeyError:\n pass\n\n\n# Set a resource alias for a previous name.\ndef alias(obj, opts):\n if obj[\"kind\"] == \"Deployment\":\n opts.aliases = [\"oldName\"]\n\n\n# Omit a resource from the Chart by transforming the specified resource definition to an empty List.\ndef omit_resource(obj, opts):\n if obj[\"kind\"] == \"Pod\" and obj[\"metadata\"][\"name\"] == \"test\":\n obj[\"apiVersion\"] = \"v1\"\n obj[\"kind\"] = \"List\"\n\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n transformations=[make_service_private, alias, omit_resource],\n ),\n)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V3;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n },\n Transformations =\n {\n LoadBalancerToClusterIP,\n ResourceAlias,\n OmitTestPod,\n }\n\n });\n\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n ImmutableDictionary<string, object> LoadBalancerToClusterIP(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Service\" && (string)obj[\"apiVersion\"] == \"v1\")\n {\n var spec = (ImmutableDictionary<string, object>)obj[\"spec\"];\n if (spec != null && (string)spec[\"type\"] == \"LoadBalancer\")\n {\n return obj.SetItem(\"spec\", spec.SetItem(\"type\", \"ClusterIP\"));\n }\n }\n\n return obj;\n }\n\n // Set a resource alias for a previous name.\n ImmutableDictionary<string, object> ResourceAlias(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Deployment\")\n {\n opts.Aliases.Add(new Alias { Name = \"oldName\" });\n }\n\n return obj;\n }\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n ImmutableDictionary<string, object> OmitTestPod(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n var metadata = (ImmutableDictionary<string, object>)obj[\"metadata\"];\n if ((string)obj[\"kind\"] == \"Pod\" && (string)metadata[\"name\"] == \"test\")\n {\n return new Dictionary<string, object>\n {\n [\"apiVersion\"] = \"v1\",\n [\"kind\"] = \"List\",\n [\"items\"] = new Dictionary<string, object>(),\n }.ToImmutableDictionary();\n }\n\n return obj;\n }\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v3\"\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tChart: pulumi.String(\"nginx-ingress\"),\n\t\t\tVersion: pulumi.String(\"1.24.4\"),\n\t\t\tFetchArgs: helm.FetchArgs{\n\t\t\t\tRepo: pulumi.String(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t\tTransformations: []yaml.Transformation{\n\t\t\t\t// Make every service private to the cluster, i.e., turn all services into ClusterIP\n\t\t\t\t// instead of LoadBalancer.\n\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\tif state[\"kind\"] == \"Service\" {\n\t\t\t\t\t\tspec := state[\"spec\"].(map[string]interface{})\n\t\t\t\t\t\tspec[\"type\"] = \"ClusterIP\"\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// Set a resource alias for a previous name.\n\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\tif state[\"kind\"] == \"Deployment\" {\n\t\t\t\t\t\taliases := pulumi.Aliases([]pulumi.Alias{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName: pulumi.String(\"oldName\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t\topts = append(opts, aliases)\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// Omit a resource from the Chart by transforming the specified resource definition\n\t\t\t\t// to an empty List.\n\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\tname := state[\"metadata\"].(map[string]interface{})[\"name\"]\n\t\t\t\t\tif state[\"kind\"] == \"Pod\" && name == \"test\" {\n\t\t\t\t\t\tstate[\"apiVersion\"] = \"core/v1\"\n\t\t\t\t\t\tstate[\"kind\"] = \"List\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% /examples %}}\n\n", + "properties": { + "resources": { + "type": "string", + "description": "Resources created by the Chart." + }, + "urn": { + "type": "string", + "description": "The stable logical URN used to distinctly address a resource, both before and after deployments." + } + }, + "type": "object", + "isOverlay": true, + "inputProperties": { + "chart": { + "type": "string", + "description": "The name of the chart to deploy. If [repo] is provided, this chart name will be prefixed by the repo name. Example: repo: \"stable\", chart: \"nginx-ingress\" -> \"stable/nginx-ingress\" Example: chart: \"stable/nginx-ingress\" -> \"stable/nginx-ingress\"\n\nRequired if specifying `ChartOpts` for a remote chart." + }, + "fetchOpts": { + "$ref": "#/types/kubernetes:helm.sh/v3:FetchOpts", + "description": "Additional options to customize the fetching of the Helm chart." + }, + "namespace": { + "type": "string", + "description": "The optional namespace to install chart resources into." + }, + "path": { + "type": "string", + "description": "The path to the chart directory which contains the `Chart.yaml` file.\n\nRequired if specifying `LocalChartOpts`." + }, + "repo": { + "type": "string", + "description": "The repository name of the chart to deploy. Example: \"stable\".\n\nUsed only when specifying options for a remote chart." + }, + "resourcePrefix": { + "type": "string", + "description": "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\"foo\" would produce a resource named \"foo-resourceName\"." + }, + "transformations": { + "type": "array", + "items": { + "$ref": "pulumi.json#/Any" + }, + "description": "Optional array of transformations to apply to resources that will be created by this chart prior to creation. Allows customization of the chart behaviour without directly modifying the chart itself." + }, + "values": { + "type": "object", + "additionalProperties": { + "$ref": "pulumi.json#/Any" + }, + "description": "Overrides for chart values." + }, + "version": { + "type": "string", + "description": "The version of the chart to deploy. If not provided, the latest version will be deployed." + } + }, + "isComponent": true + }, "kubernetes:helm.sh/v3:Release": { "description": "A Release is an instance of a chart running in a Kubernetes cluster.\n\nA Chart is a Helm package. It contains all of the resource definitions necessary to run an application, tool, or service inside of a Kubernetes cluster.", "properties": { @@ -39801,15 +40103,15 @@ ] }, "kubernetes:kustomize:Directory": { - "description": "Directory is a component representing a collection of resources described by a kustomize directory (kustomization).\\n\\n{{% examples %}}\\n## Example Usage\\n{{% example %}}\\n### Local Kustomize Directory\\n\\n```typescript\\nimport * as k8s from \\\"@pulumi/kubernetes\\\";\\n\\nconst helloWorld = new k8s.kustomize.Directory(\\\"helloWorldLocal\\\", {\\n directory: \\\"./helloWorld\\\",\\n});\\n```\\n```python\\nfrom pulumi_kubernetes.kustomize import Directory\\n\\nhello_world = Directory(\\n \\\"hello-world-local\\\",\\n directory=\\\"./helloWorld\\\",\\n)\\n```\\n```csharp\\nusing System.Threading.Tasks;\\nusing Pulumi;\\nusing Pulumi.Kubernetes.Kustomize;\\n\\nclass KustomizeStack : Stack\\n{\\n public KustomizeStack()\\n {\\n var helloWorld = new Directory(\\\"helloWorldLocal\\\", new DirectoryArgs\\n {\\n Directory = \\\"./helloWorld\\\",\\n });\\n }\\n}\\n```\\n```go\\npackage main\\n\\nimport (\\n\\t\\\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/kustomize\\\"\\n\\t\\\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\\\"\\n)\\n\\nfunc main() {\\n\\tpulumi.Run(func(ctx *pulumi.Context) error {\\n\\t\\t_, err := kustomize.NewDirectory(ctx, \\\"helloWorldLocal\\\",\\n\\t\\t\\tkustomize.DirectoryArgs{\\n\\t\\t\\t\\tDirectory: pulumi.String(\\\"./helloWorld\\\"),\\n\\t\\t\\t},\\n\\t\\t)\\n\\t\\tif err != nil {\\n\\t\\t\\treturn err\\n\\t\\t}\\n\\n\\t\\treturn nil\\n\\t})\\n}\\n```\\n{{% /example %}}\\n{{% example %}}\\n### Kustomize Directory from a Git Repo\\n\\n```typescript\\nimport * as k8s from \\\"@pulumi/kubernetes\\\";\\n\\nconst helloWorld = new k8s.kustomize.Directory(\\\"helloWorldRemote\\\", {\\n directory: \\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\",\\n});\\n```\\n```python\\nfrom pulumi_kubernetes.kustomize import Directory\\n\\nhello_world = Directory(\\n \\\"hello-world-remote\\\",\\n directory=\\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\",\\n)\\n```\\n```csharp\\nusing System.Threading.Tasks;\\nusing Pulumi;\\nusing Pulumi.Kubernetes.Kustomize;\\n\\nclass KustomizeStack : Stack\\n{\\n public KustomizeStack()\\n {\\n var helloWorld = new Directory(\\\"helloWorldRemote\\\", new DirectoryArgs\\n {\\n Directory = \\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\",\\n });\\n }\\n}\\n```\\n```go\\npackage main\\n\\nimport (\\n\\t\\\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/kustomize\\\"\\n\\t\\\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\\\"\\n)\\n\\nfunc main() {\\n\\tpulumi.Run(func(ctx *pulumi.Context) error {\\n\\t\\t_, err := kustomize.NewDirectory(ctx, \\\"helloWorldRemote\\\",\\n\\t\\t\\tkustomize.DirectoryArgs{\\n\\t\\t\\t\\tDirectory: pulumi.String(\\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\"),\\n\\t\\t\\t},\\n\\t\\t)\\n\\t\\tif err != nil {\\n\\t\\t\\treturn err\\n\\t\\t}\\n\\n\\t\\treturn nil\\n\\t})\\n}\\n```\\n{{% /example %}}\\n{{% example %}}\\n### Kustomize Directory with Transformations\\n\\n```typescript\\nimport * as k8s from \\\"@pulumi/kubernetes\\\";\\n\\nconst helloWorld = new k8s.kustomize.Directory(\\\"helloWorldRemote\\\", {\\n directory: \\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\",\\n transformations: [\\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\\n (obj: any, opts: pulumi.CustomResourceOptions) => {\\n if (obj.kind === \\\"Service\\\" && obj.apiVersion === \\\"v1\\\") {\\n if (obj.spec && obj.spec.type && obj.spec.type === \\\"LoadBalancer\\\") {\\n obj.spec.type = \\\"ClusterIP\\\";\\n }\\n }\\n },\\n\\n // Set a resource alias for a previous name.\\n (obj: any, opts: pulumi.CustomResourceOptions) => {\\n if (obj.kind === \\\"Deployment\\\") {\\n opts.aliases = [{ name: \\\"oldName\\\" }]\\n }\\n },\\n\\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\\n (obj: any, opts: pulumi.CustomResourceOptions) => {\\n if (obj.kind === \\\"Pod\\\" && obj.metadata.name === \\\"test\\\") {\\n obj.apiVersion = \\\"v1\\\"\\n obj.kind = \\\"List\\\"\\n }\\n },\\n ],\\n});\\n```\\n```python\\nfrom pulumi_kubernetes.helm.v3 import Chart, ChartOpts, FetchOpts\\n\\n# Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\\ndef make_service_private(obj, opts):\\n if obj[\\\"kind\\\"] == \\\"Service\\\" and obj[\\\"apiVersion\\\"] == \\\"v1\\\":\\n try:\\n t = obj[\\\"spec\\\"][\\\"type\\\"]\\n if t == \\\"LoadBalancer\\\":\\n obj[\\\"spec\\\"][\\\"type\\\"] = \\\"ClusterIP\\\"\\n except KeyError:\\n pass\\n\\n\\n# Set a resource alias for a previous name.\\ndef alias(obj, opts):\\n if obj[\\\"kind\\\"] == \\\"Deployment\\\":\\n opts.aliases = [\\\"oldName\\\"]\\n\\n\\n# Omit a resource from the Chart by transforming the specified resource definition to an empty List.\\ndef omit_resource(obj, opts):\\n if obj[\\\"kind\\\"] == \\\"Pod\\\" and obj[\\\"metadata\\\"][\\\"name\\\"] == \\\"test\\\":\\n obj[\\\"apiVersion\\\"] = \\\"v1\\\"\\n obj[\\\"kind\\\"] = \\\"List\\\"\\n\\n\\nhello_world = Directory(\\n \\\"hello-world-remote\\\",\\n directory=\\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\",\\n transformations=[make_service_private, alias, omit_resource],\\n)\\n```\\n```csharp\\nusing System.Collections.Generic;\\nusing System.Collections.Immutable;\\nusing System.Threading.Tasks;\\nusing Pulumi;\\nusing Pulumi.Kubernetes.Kustomize;\\n\\nclass KustomizeStack : Stack\\n{\\n public KustomizeStack()\\n {\\n var helloWorld = new Directory(\\\"helloWorldRemote\\\", new DirectoryArgs\\n {\\n Directory = \\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\",\\n Transformations =\\n {\\n LoadBalancerToClusterIP,\\n ResourceAlias,\\n OmitTestPod,\\n }\\n });\\n\\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\\n ImmutableDictionary<string, object> LoadBalancerToClusterIP(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\\n {\\n if ((string)obj[\\\"kind\\\"] == \\\"Service\\\" && (string)obj[\\\"apiVersion\\\"] == \\\"v1\\\")\\n {\\n var spec = (ImmutableDictionary<string, object>)obj[\\\"spec\\\"];\\n if (spec != null && (string)spec[\\\"type\\\"] == \\\"LoadBalancer\\\")\\n {\\n return obj.SetItem(\\\"spec\\\", spec.SetItem(\\\"type\\\", \\\"ClusterIP\\\"));\\n }\\n }\\n\\n return obj;\\n }\\n\\n // Set a resource alias for a previous name.\\n ImmutableDictionary<string, object> ResourceAlias(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\\n {\\n if ((string)obj[\\\"kind\\\"] == \\\"Deployment\\\")\\n {\\n opts.Aliases.Add(new Alias { Name = \\\"oldName\\\" });\\n }\\n\\n return obj;\\n }\\n\\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\\n ImmutableDictionary<string, object> OmitTestPod(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\\n {\\n var metadata = (ImmutableDictionary<string, object>)obj[\\\"metadata\\\"];\\n if ((string)obj[\\\"kind\\\"] == \\\"Pod\\\" && (string)metadata[\\\"name\\\"] == \\\"test\\\")\\n {\\n return new Dictionary<string, object>\\n {\\n [\\\"apiVersion\\\"] = \\\"v1\\\",\\n [\\\"kind\\\"] = \\\"List\\\",\\n [\\\"items\\\"] = new Dictionary<string, object>(),\\n }.ToImmutableDictionary();\\n }\\n\\n return obj;\\n }\\n }\\n}\\n```\\n```go\\npackage main\\n\\nimport (\\n\\t\\\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/kustomize\\\"\\n\\t\\\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\\\"\\n\\t\\\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\\\"\\n)\\n\\nfunc main() {\\n\\tpulumi.Run(func(ctx *pulumi.Context) error {\\n\\t\\t_, err := kustomize.NewDirectory(ctx, \\\"helloWorldRemote\\\",\\n\\t\\t\\tkustomize.DirectoryArgs{\\n\\t\\t\\t\\tDirectory: pulumi.String(\\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\"),\\n\\t\\t\\t\\tTransformations: []yaml.Transformation{\\n\\t\\t\\t\\t\\t// Make every service private to the cluster, i.e., turn all services into ClusterIP\\n\\t\\t\\t\\t\\t// instead of LoadBalancer.\\n\\t\\t\\t\\t\\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\\n\\t\\t\\t\\t\\t\\tif state[\\\"kind\\\"] == \\\"Service\\\" {\\n\\t\\t\\t\\t\\t\\t\\tspec := state[\\\"spec\\\"].(map[string]interface{})\\n\\t\\t\\t\\t\\t\\t\\tspec[\\\"type\\\"] = \\\"ClusterIP\\\"\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t\\t// Set a resource alias for a previous name.\\n\\t\\t\\t\\t\\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\\n\\t\\t\\t\\t\\t\\tif state[\\\"kind\\\"] == \\\"Deployment\\\" {\\n\\t\\t\\t\\t\\t\\t\\taliases := pulumi.Aliases([]pulumi.Alias{\\n\\t\\t\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tName: pulumi.String(\\\"oldName\\\"),\\n\\t\\t\\t\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t\\t\\t\\t})\\n\\t\\t\\t\\t\\t\\t\\topts = append(opts, aliases)\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t\\t// Omit a resource from the Chart by transforming the specified resource definition\\n\\t\\t\\t\\t\\t// to an empty List.\\n\\t\\t\\t\\t\\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\\n\\t\\t\\t\\t\\t\\tname := state[\\\"metadata\\\"].(map[string]interface{})[\\\"name\\\"]\\n\\t\\t\\t\\t\\t\\tif state[\\\"kind\\\"] == \\\"Pod\\\" && name == \\\"test\\\" {\\n\\t\\t\\t\\t\\t\\t\\tstate[\\\"apiVersion\\\"] = \\\"core/v1\\\"\\n\\t\\t\\t\\t\\t\\t\\tstate[\\\"kind\\\"] = \\\"List\\\"\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t},\\n\\t\\t\\t},\\n\\t\\t)\\n\\t\\tif err != nil {\\n\\t\\t\\treturn err\\n\\t\\t}\\n\\n\\t\\treturn nil\\n\\t})\\n}\\n```\\n{{% /example %}}\\n{{% /examples %}}\\n", + "description": "Directory is a component representing a collection of resources described by a kustomize directory (kustomization).\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n### Local Kustomize Directory\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst helloWorld = new k8s.kustomize.Directory(\"helloWorldLocal\", {\n directory: \"./helloWorld\",\n});\n```\n```python\nfrom pulumi_kubernetes.kustomize import Directory\n\nhello_world = Directory(\n \"hello-world-local\",\n directory=\"./helloWorld\",\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Kustomize;\n\nclass KustomizeStack : Stack\n{\n public KustomizeStack()\n {\n var helloWorld = new Directory(\"helloWorldLocal\", new DirectoryArgs\n {\n Directory = \"./helloWorld\",\n });\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/kustomize\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := kustomize.NewDirectory(ctx, \"helloWorldLocal\",\n\t\t\tkustomize.DirectoryArgs{\n\t\t\t\tDirectory: pulumi.String(\"./helloWorld\"),\n\t\t\t},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Kustomize Directory from a Git Repo\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst helloWorld = new k8s.kustomize.Directory(\"helloWorldRemote\", {\n directory: \"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\",\n});\n```\n```python\nfrom pulumi_kubernetes.kustomize import Directory\n\nhello_world = Directory(\n \"hello-world-remote\",\n directory=\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\",\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Kustomize;\n\nclass KustomizeStack : Stack\n{\n public KustomizeStack()\n {\n var helloWorld = new Directory(\"helloWorldRemote\", new DirectoryArgs\n {\n Directory = \"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\",\n });\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/kustomize\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := kustomize.NewDirectory(ctx, \"helloWorldRemote\",\n\t\t\tkustomize.DirectoryArgs{\n\t\t\t\tDirectory: pulumi.String(\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\"),\n\t\t\t},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Kustomize Directory with Transformations\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst helloWorld = new k8s.kustomize.Directory(\"helloWorldRemote\", {\n directory: \"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\",\n transformations: [\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Service\" && obj.apiVersion === \"v1\") {\n if (obj.spec && obj.spec.type && obj.spec.type === \"LoadBalancer\") {\n obj.spec.type = \"ClusterIP\";\n }\n }\n },\n\n // Set a resource alias for a previous name.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Deployment\") {\n opts.aliases = [{ name: \"oldName\" }]\n }\n },\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Pod\" && obj.metadata.name === \"test\") {\n obj.apiVersion = \"v1\"\n obj.kind = \"List\"\n }\n },\n ],\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v3 import Chart, ChartOpts, FetchOpts\n\n# Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\ndef make_service_private(obj, opts):\n if obj[\"kind\"] == \"Service\" and obj[\"apiVersion\"] == \"v1\":\n try:\n t = obj[\"spec\"][\"type\"]\n if t == \"LoadBalancer\":\n obj[\"spec\"][\"type\"] = \"ClusterIP\"\n except KeyError:\n pass\n\n\n# Set a resource alias for a previous name.\ndef alias(obj, opts):\n if obj[\"kind\"] == \"Deployment\":\n opts.aliases = [\"oldName\"]\n\n\n# Omit a resource from the Chart by transforming the specified resource definition to an empty List.\ndef omit_resource(obj, opts):\n if obj[\"kind\"] == \"Pod\" and obj[\"metadata\"][\"name\"] == \"test\":\n obj[\"apiVersion\"] = \"v1\"\n obj[\"kind\"] = \"List\"\n\n\nhello_world = Directory(\n \"hello-world-remote\",\n directory=\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\",\n transformations=[make_service_private, alias, omit_resource],\n)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Kustomize;\n\nclass KustomizeStack : Stack\n{\n public KustomizeStack()\n {\n var helloWorld = new Directory(\"helloWorldRemote\", new DirectoryArgs\n {\n Directory = \"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\",\n Transformations =\n {\n LoadBalancerToClusterIP,\n ResourceAlias,\n OmitTestPod,\n }\n });\n\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n ImmutableDictionary<string, object> LoadBalancerToClusterIP(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Service\" && (string)obj[\"apiVersion\"] == \"v1\")\n {\n var spec = (ImmutableDictionary<string, object>)obj[\"spec\"];\n if (spec != null && (string)spec[\"type\"] == \"LoadBalancer\")\n {\n return obj.SetItem(\"spec\", spec.SetItem(\"type\", \"ClusterIP\"));\n }\n }\n\n return obj;\n }\n\n // Set a resource alias for a previous name.\n ImmutableDictionary<string, object> ResourceAlias(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Deployment\")\n {\n opts.Aliases.Add(new Alias { Name = \"oldName\" });\n }\n\n return obj;\n }\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n ImmutableDictionary<string, object> OmitTestPod(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n var metadata = (ImmutableDictionary<string, object>)obj[\"metadata\"];\n if ((string)obj[\"kind\"] == \"Pod\" && (string)metadata[\"name\"] == \"test\")\n {\n return new Dictionary<string, object>\n {\n [\"apiVersion\"] = \"v1\",\n [\"kind\"] = \"List\",\n [\"items\"] = new Dictionary<string, object>(),\n }.ToImmutableDictionary();\n }\n\n return obj;\n }\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/kustomize\"\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := kustomize.NewDirectory(ctx, \"helloWorldRemote\",\n\t\t\tkustomize.DirectoryArgs{\n\t\t\t\tDirectory: pulumi.String(\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\"),\n\t\t\t\tTransformations: []yaml.Transformation{\n\t\t\t\t\t// Make every service private to the cluster, i.e., turn all services into ClusterIP\n\t\t\t\t\t// instead of LoadBalancer.\n\t\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\t\tif state[\"kind\"] == \"Service\" {\n\t\t\t\t\t\t\tspec := state[\"spec\"].(map[string]interface{})\n\t\t\t\t\t\t\tspec[\"type\"] = \"ClusterIP\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t// Set a resource alias for a previous name.\n\t\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\t\tif state[\"kind\"] == \"Deployment\" {\n\t\t\t\t\t\t\taliases := pulumi.Aliases([]pulumi.Alias{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tName: pulumi.String(\"oldName\"),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\topts = append(opts, aliases)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t// Omit a resource from the Chart by transforming the specified resource definition\n\t\t\t\t\t// to an empty List.\n\t\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\t\tname := state[\"metadata\"].(map[string]interface{})[\"name\"]\n\t\t\t\t\t\tif state[\"kind\"] == \"Pod\" && name == \"test\" {\n\t\t\t\t\t\t\tstate[\"apiVersion\"] = \"core/v1\"\n\t\t\t\t\t\t\tstate[\"kind\"] = \"List\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% /examples %}}\n", "properties": { "directory": { "type": "string", - "description": "The directory containing the kustomization to apply. The value can be a local directory or a folder in a\\ngit repository.\\nExample: ./helloWorld\\nExample: https://github.com/kubernetes-sigs/kustomize/tree/master/examples/helloWorld" + "description": "The directory containing the kustomization to apply. The value can be a local directory or a folder in a\ngit repository.\nExample: ./helloWorld\nExample: https://github.com/kubernetes-sigs/kustomize/tree/master/examples/helloWorld" }, "resourcePrefix": { "type": "string", - "description": "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\\\"foo\\\" would produce a resource named \\\"foo-resourceName\\\"." + "description": "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\"foo\" would produce a resource named \"foo-resourceName\"." }, "transformations": { "type": "array", @@ -39827,11 +40129,11 @@ "inputProperties": { "directory": { "type": "string", - "description": "The directory containing the kustomization to apply. The value can be a local directory or a folder in a\\ngit repository.\\nExample: ./helloWorld\\nExample: https://github.com/kubernetes-sigs/kustomize/tree/master/examples/helloWorld" + "description": "The directory containing the kustomization to apply. The value can be a local directory or a folder in a\ngit repository.\nExample: ./helloWorld\nExample: https://github.com/kubernetes-sigs/kustomize/tree/master/examples/helloWorld" }, "resourcePrefix": { "type": "string", - "description": "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\\\"foo\\\" would produce a resource named \\\"foo-resourceName\\\"." + "description": "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\"foo\" would produce a resource named \"foo-resourceName\"." }, "transformations": { "type": "array", @@ -39843,7 +40145,8 @@ }, "requiredInputs": [ "directory" - ] + ], + "isComponent": true }, "kubernetes:meta/v1:Status": { "description": "Status is a return value for calls that don't return other objects.", @@ -45387,6 +45690,105 @@ "requiredInputs": [ "items" ] + }, + "kubernetes:yaml:ConfigFile": { + "description": "ConfigFile creates a set of Kubernetes resources from a Kubernetes YAML file.\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n### Local File\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst example = new k8s.yaml.ConfigFile(\"example\", {\n file: \"foo.yaml\",\n});\n```\n```python\nfrom pulumi_kubernetes.yaml import ConfigFile\n\nexample = ConfigFile(\n \"example\",\n file=\"foo.yaml\",\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Yaml;\n\nclass YamlStack : Stack\n{\n public YamlStack()\n {\n var helloWorld = new ConfigFile(\"example\", new ConfigFileArgs\n {\n File = \"foo.yaml\",\n });\n }\n}\n```\n```go\npackage main\n\nimport (\n \"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\"\n \"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n pulumi.Run(func(ctx *pulumi.Context) error {\n _, err := yaml.NewConfigFile(ctx, \"example\",\n &yaml.ConfigFileArgs{\n File: \"foo.yaml\",\n },\n )\n if err != nil {\n return err\n }\n\n return nil\n })\n}\n```\n{{% /example %}}\n{{% example %}}\n### YAML with Transformations\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst example = new k8s.yaml.ConfigFile(\"example\", {\n file: \"foo.yaml\",\n transformations: [\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Service\" && obj.apiVersion === \"v1\") {\n if (obj.spec && obj.spec.type && obj.spec.type === \"LoadBalancer\") {\n obj.spec.type = \"ClusterIP\";\n }\n }\n },\n\n // Set a resource alias for a previous name.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Deployment\") {\n opts.aliases = [{name: \"oldName\"}]\n }\n },\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Pod\" && obj.metadata.name === \"test\") {\n obj.apiVersion = \"v1\"\n obj.kind = \"List\"\n }\n },\n ],\n});\n```\n```python\nfrom pulumi_kubernetes.yaml import ConfigFile\n\n# Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\ndef make_service_private(obj, opts):\n if obj[\"kind\"] == \"Service\" and obj[\"apiVersion\"] == \"v1\":\n try:\n t = obj[\"spec\"][\"type\"]\n if t == \"LoadBalancer\":\n obj[\"spec\"][\"type\"] = \"ClusterIP\"\n except KeyError:\n pass\n\n\n# Set a resource alias for a previous name.\ndef alias(obj, opts):\n if obj[\"kind\"] == \"Deployment\":\n opts.aliases = [\"oldName\"]\n\n\n# Omit a resource from the Chart by transforming the specified resource definition to an empty List.\ndef omit_resource(obj, opts):\n if obj[\"kind\"] == \"Pod\" and obj[\"metadata\"][\"name\"] == \"test\":\n obj[\"apiVersion\"] = \"v1\"\n obj[\"kind\"] = \"List\"\n\n\nexample = ConfigFile(\n \"example\",\n file=\"foo.yaml\",\n transformations=[make_service_private, alias, omit_resource],\n)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Yaml;\n\nclass YamlStack : Stack\n{\n public YamlStack()\n {\n var helloWorld = new ConfigFile(\"example\", new ConfigFileArgs\n {\n File = \"foo.yaml\",\n Transformations =\n {\n LoadBalancerToClusterIP,\n ResourceAlias,\n OmitTestPod,\n }\n });\n\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n ImmutableDictionary<string, object> LoadBalancerToClusterIP(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Service\" && (string)obj[\"apiVersion\"] == \"v1\")\n {\n var spec = (ImmutableDictionary<string, object>)obj[\"spec\"];\n if (spec != null && (string)spec[\"type\"] == \"LoadBalancer\")\n {\n return obj.SetItem(\"spec\", spec.SetItem(\"type\", \"ClusterIP\"));\n }\n }\n\n return obj;\n }\n\n // Set a resource alias for a previous name.\n ImmutableDictionary<string, object> ResourceAlias(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Deployment\")\n {\n opts.Aliases = new List<Input<Alias>> { new Alias { Name = \"oldName\" } };\n }\n\n return obj;\n }\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n ImmutableDictionary<string, object> OmitTestPod(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n var metadata = (ImmutableDictionary<string, object>)obj[\"metadata\"];\n if ((string)obj[\"kind\"] == \"Pod\" && (string)metadata[\"name\"] == \"test\")\n {\n return new Dictionary<string, object>\n {\n [\"apiVersion\"] = \"v1\",\n [\"kind\"] = \"List\",\n [\"items\"] = new Dictionary<string, object>(),\n }.ToImmutableDictionary();\n }\n\n return obj;\n }\n }\n}\n```\n```go\npackage main\n\nimport (\n \"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\"\n \"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n pulumi.Run(func(ctx *pulumi.Context) error {\n _, err := yaml.NewConfigFile(ctx, \"example\",\n &yaml.ConfigFileArgs{\n File: \"foo.yaml\",\n Transformations: []yaml.Transformation{\n // Make every service private to the cluster, i.e., turn all services into ClusterIP\n // instead of LoadBalancer.\n func(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n if state[\"kind\"] == \"Service\" {\n spec := state[\"spec\"].(map[string]interface{})\n spec[\"type\"] = \"ClusterIP\"\n }\n },\n\n // Set a resource alias for a previous name.\n func(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n if state[\"kind\"] == \"Deployment\" {\n aliases := pulumi.Aliases([]pulumi.Alias{\n {\n Name: pulumi.String(\"oldName\"),\n },\n })\n opts = append(opts, aliases)\n }\n },\n\n // Omit a resource from the Chart by transforming the specified resource definition\n // to an empty List.\n func(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n name := state[\"metadata\"].(map[string]interface{})[\"name\"]\n if state[\"kind\"] == \"Pod\" && name == \"test\" {\n state[\"apiVersion\"] = \"core/v1\"\n state[\"kind\"] = \"List\"\n }\n },\n },\n },\n )\n if err != nil {\n return err\n }\n\n return nil\n })\n}\n```\n{{% /example %}}\n{% /examples %}}\n", + "properties": { + "resources": { + "type": "string", + "description": "Resources created by the ConfigFile." + } + }, + "type": "object", + "isOverlay": true, + "inputProperties": { + "file": { + "type": "string", + "description": "Path or a URL that uniquely identifies a file." + }, + "resourcePrefix": { + "type": "string", + "description": "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\"foo\" would produce a resource named \"foo-resourceName\"." + }, + "transformations": { + "type": "array", + "items": { + "$ref": "pulumi.json#/Any" + }, + "description": "A set of transformations to apply to Kubernetes resource definitions before registering with engine." + } + }, + "requiredInputs": [ + "file" + ], + "isComponent": true + }, + "kubernetes:yaml:ConfigGroup": { + "description": "ConfigGroup creates a set of Kubernetes resources from Kubernetes YAML text. The YAML text\nmay be supplied using any of the following methods:\n\n1. Using a filename or a list of filenames:\n2. Using a file pattern or a list of file patterns:\n3. Using a literal string containing YAML, or a list of such strings:\n4. Any combination of files, patterns, or YAML strings:\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n### Local File\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst example = new k8s.yaml.ConfigGroup(\"example\", {\n files: \"foo.yaml\",\n});\n```\n```python\nfrom pulumi_kubernetes.yaml import ConfigGroup\n\nexample = ConfigGroup(\n \"example\",\n files=[\"foo.yaml\"],\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Yaml;\n\nclass YamlStack : Stack\n{\n public YamlStack()\n {\n var helloWorld = new ConfigGroup(\"example\", new ConfigGroupArgs\n {\n Files = new[] { \"foo.yaml\" }\n });\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := yaml.NewConfigGroup(ctx, \"example\",\n\t\t\t&yaml.ConfigGroupArgs{\n\t\t\t\tFiles: []string{\"foo.yaml\"},\n\t\t\t},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Multiple Local Files\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst example = new k8s.yaml.ConfigGroup(\"example\", {\n files: [\"foo.yaml\", \"bar.yaml\"],\n});\n```\n```python\nfrom pulumi_kubernetes.yaml import ConfigGroup\n\nexample = ConfigGroup(\n \"example\",\n files=[\"foo.yaml\", \"bar.yaml\"],\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Yaml;\n\nclass YamlStack : Stack\n{\n public YamlStack()\n {\n var helloWorld = new ConfigGroup(\"example\", new ConfigGroupArgs\n {\n Files = new[] { \"foo.yaml\", \"bar.yaml\" }\n });\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := yaml.NewConfigGroup(ctx, \"example\",\n\t\t\t&yaml.ConfigGroupArgs{\n\t\t\t\tFiles: []string{\"foo.yaml\", \"bar.yaml\"},\n\t\t\t},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Local File Pattern\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst example = new k8s.yaml.ConfigGroup(\"example\", {\n files: \"yaml/*.yaml\",\n});\n```\n```python\nfrom pulumi_kubernetes.yaml import ConfigGroup\n\nexample = ConfigGroup(\n \"example\",\n files=[\"yaml/*.yaml\"],\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Yaml;\n\nclass YamlStack : Stack\n{\n public YamlStack()\n {\n var helloWorld = new ConfigGroup(\"example\", new ConfigGroupArgs\n {\n Files = new[] { \"yaml/*.yaml\" }\n });\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := yaml.NewConfigGroup(ctx, \"example\",\n\t\t\t&yaml.ConfigGroupArgs{\n\t\t\t\tFiles: []string{\"yaml/*.yaml\"},\n\t\t\t},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Multiple Local File Patterns\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst example = new k8s.yaml.ConfigGroup(\"example\", {\n files: [\"foo/*.yaml\", \"bar/*.yaml\"],\n});\n```\n```python\nfrom pulumi_kubernetes.yaml import ConfigGroup\n\nexample = ConfigGroup(\n \"example\",\n files=[\"foo/*.yaml\", \"bar/*.yaml\"],\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Yaml;\n\nclass YamlStack : Stack\n{\n public YamlStack()\n {\n var helloWorld = new ConfigGroup(\"example\", new ConfigGroupArgs\n {\n Files = new[] { \"foo/*.yaml\", \"bar/*.yaml\" }\n });\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := yaml.NewConfigGroup(ctx, \"example\",\n\t\t\t&yaml.ConfigGroupArgs{\n\t\t\t\tFiles: []string{\"yaml/*.yaml\", \"bar/*.yaml\"},\n\t\t\t},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Literal YAML String\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst example = new k8s.yaml.ConfigGroup(\"example\", {\n yaml: `\napiVersion: v1\nkind: Namespace\nmetadata:\n name: foo\n`,\n})\n```\n```python\nfrom pulumi_kubernetes.yaml import ConfigGroup\n\nexample = ConfigGroup(\n \"example\",\n yaml=['''\napiVersion: v1\nkind: Namespace\nmetadata:\n name: foo\n''']\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Yaml;\n\nclass YamlStack : Stack\n{\n public YamlStack()\n {\n var helloWorld = new ConfigGroup(\"example\", new ConfigGroupArgs\n {\n Yaml = @\"\n apiVersion: v1\n kind: Namespace\n metadata:\n name: foo\n \",\n });\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := yaml.NewConfigGroup(ctx, \"example\",\n\t\t\t&yaml.ConfigGroupArgs{\n\t\t\t\tYAML: []string{\n\t\t\t\t\t`\napiVersion: v1\nkind: Namespace\nmetadata:\n name: foo\n`,\n\t\t\t\t},\n\t\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### YAML with Transformations\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst example = new k8s.yaml.ConfigGroup(\"example\", {\n files: \"foo.yaml\",\n transformations: [\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Service\" && obj.apiVersion === \"v1\") {\n if (obj.spec && obj.spec.type && obj.spec.type === \"LoadBalancer\") {\n obj.spec.type = \"ClusterIP\";\n }\n }\n },\n\n // Set a resource alias for a previous name.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Deployment\") {\n opts.aliases = [{ name: \"oldName\" }]\n }\n },\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Pod\" && obj.metadata.name === \"test\") {\n obj.apiVersion = \"v1\"\n obj.kind = \"List\"\n }\n },\n ],\n});\n```\n```python\nfrom pulumi_kubernetes.yaml import ConfigFile\n\n# Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\ndef make_service_private(obj, opts):\n if obj[\"kind\"] == \"Service\" and obj[\"apiVersion\"] == \"v1\":\n try:\n t = obj[\"spec\"][\"type\"]\n if t == \"LoadBalancer\":\n obj[\"spec\"][\"type\"] = \"ClusterIP\"\n except KeyError:\n pass\n\n\n# Set a resource alias for a previous name.\ndef alias(obj, opts):\n if obj[\"kind\"] == \"Deployment\":\n opts.aliases = [\"oldName\"]\n\n\n# Omit a resource from the Chart by transforming the specified resource definition to an empty List.\ndef omit_resource(obj, opts):\n if obj[\"kind\"] == \"Pod\" and obj[\"metadata\"][\"name\"] == \"test\":\n obj[\"apiVersion\"] = \"v1\"\n obj[\"kind\"] = \"List\"\n\n\nexample = ConfigGroup(\n \"example\",\n files=[\"foo.yaml\"],\n transformations=[make_service_private, alias, omit_resource],\n)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Yaml;\n\nclass YamlStack : Stack\n{\n public YamlStack()\n {\n var helloWorld = new ConfigGroup(\"example\", new ConfigGroupArgs\n {\n Files = new[] { \"foo.yaml\" },\n Transformations =\n {\n LoadBalancerToClusterIP,\n ResourceAlias,\n OmitTestPod,\n }\n });\n\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n ImmutableDictionary<string, object> LoadBalancerToClusterIP(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Service\" && (string)obj[\"apiVersion\"] == \"v1\")\n {\n var spec = (ImmutableDictionary<string, object>)obj[\"spec\"];\n if (spec != null && (string)spec[\"type\"] == \"LoadBalancer\")\n {\n return obj.SetItem(\"spec\", spec.SetItem(\"type\", \"ClusterIP\"));\n }\n }\n\n return obj;\n }\n\n // Set a resource alias for a previous name.\n ImmutableDictionary<string, object> ResourceAlias(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Deployment\")\n {\n opts.Aliases.Add(new Alias { Name = \"oldName\" });\n }\n\n return obj;\n }\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n ImmutableDictionary<string, object> OmitTestPod(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n var metadata = (ImmutableDictionary<string, object>)obj[\"metadata\"];\n if ((string)obj[\"kind\"] == \"Pod\" && (string)metadata[\"name\"] == \"test\")\n {\n return new Dictionary<string, object>\n {\n [\"apiVersion\"] = \"v1\",\n [\"kind\"] = \"List\",\n [\"items\"] = new Dictionary<string, object>(),\n }.ToImmutableDictionary();\n }\n\n return obj;\n }\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := yaml.NewConfigGroup(ctx, \"example\",\n\t\t\t&yaml.ConfigGroupArgs{\n\t\t\t\tFiles: []string{\"foo.yaml\"},\n\t\t\t\tTransformations: []yaml.Transformation{\n\t\t\t\t\t// Make every service private to the cluster, i.e., turn all services into ClusterIP\n\t\t\t\t\t// instead of LoadBalancer.\n\t\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\t\tif state[\"kind\"] == \"Service\" {\n\t\t\t\t\t\t\tspec := state[\"spec\"].(map[string]interface{})\n\t\t\t\t\t\t\tspec[\"type\"] = \"ClusterIP\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t// Set a resource alias for a previous name.\n\t\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\t\tif state[\"kind\"] == \"Deployment\" {\n\t\t\t\t\t\t\taliases := pulumi.Aliases([]pulumi.Alias{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tName: pulumi.String(\"oldName\"),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\topts = append(opts, aliases)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t// Omit a resource from the Chart by transforming the specified resource definition\n\t\t\t\t\t// to an empty List.\n\t\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\t\tname := state[\"metadata\"].(map[string]interface{})[\"name\"]\n\t\t\t\t\t\tif state[\"kind\"] == \"Pod\" && name == \"test\" {\n\t\t\t\t\t\t\tstate[\"apiVersion\"] = \"core/v1\"\n\t\t\t\t\t\t\tstate[\"kind\"] = \"List\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{% /examples %}}\n", + "properties": { + "resources": { + "type": "string", + "description": "Resources created by the ConfigGroup." + } + }, + "type": "object", + "isOverlay": true, + "inputProperties": { + "files": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], + "description": "Set of paths or a URLs that uniquely identify files." + }, + "objs": { + "oneOf": [ + { + "$ref": "pulumi.json#/Any" + }, + { + "type": "array", + "items": { + "$ref": "pulumi.json#/Any" + } + } + ], + "description": "Objects representing Kubernetes resources." + }, + "resourcePrefix": { + "type": "string", + "description": "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\"foo\" would produce a resource named \"foo-resourceName\"." + }, + "transformations": { + "type": "array", + "items": { + "$ref": "pulumi.json#/Any" + }, + "description": "A set of transformations to apply to Kubernetes resource definitions before registering with engine." + }, + "yaml": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], + "description": "YAML text containing Kubernetes resource definitions." + } + }, + "isComponent": true } }, "language": { @@ -45397,6 +45799,7 @@ "": "Provider", "admissionregistration.k8s.io/v1": "AdmissionRegistration.V1", "admissionregistration.k8s.io/v1beta1": "AdmissionRegistration.V1Beta1", + "apiextensions": "ApiExtensions", "apiextensions.k8s.io/v1": "ApiExtensions.V1", "apiextensions.k8s.io/v1beta1": "ApiExtensions.V1Beta1", "apiregistration.k8s.io/v1": "ApiRegistration.V1", @@ -45427,6 +45830,7 @@ "extensions/v1beta1": "Extensions.V1Beta1", "flowcontrol.apiserver.k8s.io/v1alpha1": "FlowControl.V1Alpha1", "flowcontrol.apiserver.k8s.io/v1beta1": "FlowControl.V1Beta1", + "helm.sh/v2": "Helm.V2", "helm.sh/v3": "Helm.V3", "meta/v1": "Meta.V1", "networking.k8s.io/v1": "Networking.V1", @@ -45446,7 +45850,8 @@ "settings.k8s.io/v1alpha1": "Settings.V1Alpha1", "storage.k8s.io/v1": "Storage.V1", "storage.k8s.io/v1alpha1": "Storage.V1Alpha1", - "storage.k8s.io/v1beta1": "Storage.V1Beta1" + "storage.k8s.io/v1beta1": "Storage.V1Beta1", + "yaml": "Yaml" }, "packageReferences": { "Glob": "1.1.5", @@ -45459,6 +45864,7 @@ "moduleToPackage": { "admissionregistration.k8s.io/v1": "admissionregistration/v1", "admissionregistration.k8s.io/v1beta1": "admissionregistration/v1beta1", + "apiextensions.k8s.io": "apiextensions", "apiextensions.k8s.io/v1": "apiextensions/v1", "apiextensions.k8s.io/v1beta1": "apiextensions/v1beta1", "apiregistration.k8s.io/v1": "apiregistration/v1", @@ -45489,6 +45895,8 @@ "extensions/v1beta1": "extensions/v1beta1", "flowcontrol.apiserver.k8s.io/v1alpha1": "flowcontrol/v1alpha1", "flowcontrol.apiserver.k8s.io/v1beta1": "flowcontrol/v1beta1", + "helm.sh": "helm", + "helm.sh/v2": "helm/v2", "helm.sh/v3": "helm/v3", "meta/v1": "meta/v1", "networking.k8s.io/v1": "networking/v1", @@ -45585,6 +45993,7 @@ "moduleToPackage": { "admissionregistration.k8s.io/v1": "admissionregistration/v1", "admissionregistration.k8s.io/v1beta1": "admissionregistration/v1beta1", + "apiextensions.k8s.io": "apiextensions", "apiextensions.k8s.io/v1": "apiextensions/v1", "apiextensions.k8s.io/v1beta1": "apiextensions/v1beta1", "apiregistration.k8s.io/v1": "apiregistration/v1", @@ -45615,6 +46024,8 @@ "extensions/v1beta1": "extensions/v1beta1", "flowcontrol.apiserver.k8s.io/v1alpha1": "flowcontrol/v1alpha1", "flowcontrol.apiserver.k8s.io/v1beta1": "flowcontrol/v1beta1", + "helm.sh": "helm", + "helm.sh/v2": "helm/v2", "helm.sh/v3": "helm/v3", "meta/v1": "meta/v1", "networking.k8s.io/v1": "networking/v1", @@ -45643,6 +46054,7 @@ "moduleNameOverrides": { "admissionregistration.k8s.io/v1": "admissionregistration/v1", "admissionregistration.k8s.io/v1beta1": "admissionregistration/v1beta1", + "apiextensions.k8s.io": "apiextensions", "apiextensions.k8s.io/v1": "apiextensions/v1", "apiextensions.k8s.io/v1beta1": "apiextensions/v1beta1", "apiregistration.k8s.io/v1": "apiregistration/v1", @@ -45673,6 +46085,8 @@ "extensions/v1beta1": "extensions/v1beta1", "flowcontrol.apiserver.k8s.io/v1alpha1": "flowcontrol/v1alpha1", "flowcontrol.apiserver.k8s.io/v1beta1": "flowcontrol/v1beta1", + "helm.sh": "helm", + "helm.sh/v2": "helm/v2", "helm.sh/v3": "helm/v3", "meta/v1": "meta/v1", "networking.k8s.io/v1": "networking/v1", diff --git a/provider/go.mod b/provider/go.mod index 76bdf5f942..30b07036d5 100644 --- a/provider/go.mod +++ b/provider/go.mod @@ -10,7 +10,7 @@ require ( github.com/imdario/mergo v0.3.12 github.com/mitchellh/mapstructure v1.4.1 github.com/pkg/errors v0.9.1 - github.com/pulumi/pulumi/pkg/v3 v3.17.1-0.20211103234737-a46dc02e013c + github.com/pulumi/pulumi/pkg/v3 v3.17.1-0.20211109050240-8bb56afef977 github.com/pulumi/pulumi/sdk/v3 v3.17.0 github.com/stretchr/testify v1.7.0 golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a diff --git a/provider/go.sum b/provider/go.sum index 82348100ef..68f531d949 100644 --- a/provider/go.sum +++ b/provider/go.sum @@ -946,10 +946,11 @@ github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/pulumi/pulumi/pkg/v3 v3.17.1-0.20211103234737-a46dc02e013c h1:iNS07XsllzKfEuQesMYXRww0K/D5IS31Yo0QhuKGTps= -github.com/pulumi/pulumi/pkg/v3 v3.17.1-0.20211103234737-a46dc02e013c/go.mod h1:tWkGLs8Xxo0I4CU5FK+FOuwvEeREbcRk46dtT6sE+rE= +github.com/pulumi/pulumi/pkg/v3 v3.17.1-0.20211109050240-8bb56afef977 h1:CSZSlXWzbdUi60GdV9TPKZOgRoIMvP8MzVY9Ahf6Ejk= +github.com/pulumi/pulumi/pkg/v3 v3.17.1-0.20211109050240-8bb56afef977/go.mod h1:cqMzfxnyy3h/fzN6aN0LnERXEVmKECFGP94Wd6g2oqU= github.com/pulumi/pulumi/sdk/v3 v3.17.0 h1:CxdgdmFEvo99JviXP6d332Y2AyAIPbLI6fu4K33vhAg= github.com/pulumi/pulumi/sdk/v3 v3.17.0/go.mod h1:252ou/zAU1g6E8iTwe2Y9ht7pb5BDl2fJlOuAgZCHiA= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rjeczalik/notify v0.9.2 h1:MiTWrPj55mNDHEiIX5YUSKefw/+lCQVoAFmD6oQm5w8= github.com/rjeczalik/notify v0.9.2/go.mod h1:aErll2f0sUX9PXZnVNyeiObbmTlk5jnMoCa4QEjJeqM= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= diff --git a/provider/pkg/gen/_go-templates/kustomize/directory.go b/provider/pkg/gen/_go-templates/kustomize/directory.go index c3c7f132df..3e774ddb9d 100644 --- a/provider/pkg/gen/_go-templates/kustomize/directory.go +++ b/provider/pkg/gen/_go-templates/kustomize/directory.go @@ -137,7 +137,7 @@ import ( type Directory struct { pulumi.ResourceState - Resources pulumi.Output + Resources pulumi.Output `pulumi:"resources"` } // NewDirectory registers a new resource with the given unique name, arguments, and options. diff --git a/provider/pkg/gen/examples/configFile.md b/provider/pkg/gen/examples/configFile.md new file mode 100644 index 0000000000..497ff25cda --- /dev/null +++ b/provider/pkg/gen/examples/configFile.md @@ -0,0 +1,254 @@ +ConfigFile creates a set of Kubernetes resources from a Kubernetes YAML file. + +{{% examples %}} +## Example Usage +{{% example %}} +### Local File + +```typescript +import * as k8s from "@pulumi/kubernetes"; + +const example = new k8s.yaml.ConfigFile("example", { + file: "foo.yaml", +}); +``` +```python +from pulumi_kubernetes.yaml import ConfigFile + +example = ConfigFile( + "example", + file="foo.yaml", +) +``` +```csharp +using System.Threading.Tasks; +using Pulumi; +using Pulumi.Kubernetes.Yaml; + +class YamlStack : Stack +{ + public YamlStack() + { + var helloWorld = new ConfigFile("example", new ConfigFileArgs + { + File = "foo.yaml", + }); + } +} +``` +```go +package main + +import ( + "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +func main() { + pulumi.Run(func(ctx *pulumi.Context) error { + _, err := yaml.NewConfigFile(ctx, "example", + &yaml.ConfigFileArgs{ + File: "foo.yaml", + }, + ) + if err != nil { + return err + } + + return nil + }) +} +``` +{{% /example %}} +{{% example %}} +### YAML with Transformations + +```typescript +import * as k8s from "@pulumi/kubernetes"; + +const example = new k8s.yaml.ConfigFile("example", { + file: "foo.yaml", + transformations: [ + // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer. + (obj: any, opts: pulumi.CustomResourceOptions) => { + if (obj.kind === "Service" && obj.apiVersion === "v1") { + if (obj.spec && obj.spec.type && obj.spec.type === "LoadBalancer") { + obj.spec.type = "ClusterIP"; + } + } + }, + + // Set a resource alias for a previous name. + (obj: any, opts: pulumi.CustomResourceOptions) => { + if (obj.kind === "Deployment") { + opts.aliases = [{name: "oldName"}] + } + }, + + // Omit a resource from the Chart by transforming the specified resource definition to an empty List. + (obj: any, opts: pulumi.CustomResourceOptions) => { + if (obj.kind === "Pod" && obj.metadata.name === "test") { + obj.apiVersion = "v1" + obj.kind = "List" + } + }, + ], +}); +``` +```python +from pulumi_kubernetes.yaml import ConfigFile + +# Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer. +def make_service_private(obj, opts): + if obj["kind"] == "Service" and obj["apiVersion"] == "v1": + try: + t = obj["spec"]["type"] + if t == "LoadBalancer": + obj["spec"]["type"] = "ClusterIP" + except KeyError: + pass + + +# Set a resource alias for a previous name. +def alias(obj, opts): + if obj["kind"] == "Deployment": + opts.aliases = ["oldName"] + + +# Omit a resource from the Chart by transforming the specified resource definition to an empty List. +def omit_resource(obj, opts): + if obj["kind"] == "Pod" and obj["metadata"]["name"] == "test": + obj["apiVersion"] = "v1" + obj["kind"] = "List" + + +example = ConfigFile( + "example", + file="foo.yaml", + transformations=[make_service_private, alias, omit_resource], +) +``` +```csharp +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi; +using Pulumi.Kubernetes.Yaml; + +class YamlStack : Stack +{ + public YamlStack() + { + var helloWorld = new ConfigFile("example", new ConfigFileArgs + { + File = "foo.yaml", + Transformations = + { + LoadBalancerToClusterIP, + ResourceAlias, + OmitTestPod, + } + }); + + // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer. + ImmutableDictionary<string, object> LoadBalancerToClusterIP(ImmutableDictionary<string, object> obj, CustomResourceOptions opts) + { + if ((string)obj["kind"] == "Service" && (string)obj["apiVersion"] == "v1") + { + var spec = (ImmutableDictionary<string, object>)obj["spec"]; + if (spec != null && (string)spec["type"] == "LoadBalancer") + { + return obj.SetItem("spec", spec.SetItem("type", "ClusterIP")); + } + } + + return obj; + } + + // Set a resource alias for a previous name. + ImmutableDictionary<string, object> ResourceAlias(ImmutableDictionary<string, object> obj, CustomResourceOptions opts) + { + if ((string)obj["kind"] == "Deployment") + { + opts.Aliases = new List<Input<Alias>> { new Alias { Name = "oldName" } }; + } + + return obj; + } + + // Omit a resource from the Chart by transforming the specified resource definition to an empty List. + ImmutableDictionary<string, object> OmitTestPod(ImmutableDictionary<string, object> obj, CustomResourceOptions opts) + { + var metadata = (ImmutableDictionary<string, object>)obj["metadata"]; + if ((string)obj["kind"] == "Pod" && (string)metadata["name"] == "test") + { + return new Dictionary<string, object> + { + ["apiVersion"] = "v1", + ["kind"] = "List", + ["items"] = new Dictionary<string, object>(), + }.ToImmutableDictionary(); + } + + return obj; + } + } +} +``` +```go +package main + +import ( + "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +func main() { + pulumi.Run(func(ctx *pulumi.Context) error { + _, err := yaml.NewConfigFile(ctx, "example", + &yaml.ConfigFileArgs{ + File: "foo.yaml", + Transformations: []yaml.Transformation{ + // Make every service private to the cluster, i.e., turn all services into ClusterIP + // instead of LoadBalancer. + func(state map[string]interface{}, opts ...pulumi.ResourceOption) { + if state["kind"] == "Service" { + spec := state["spec"].(map[string]interface{}) + spec["type"] = "ClusterIP" + } + }, + + // Set a resource alias for a previous name. + func(state map[string]interface{}, opts ...pulumi.ResourceOption) { + if state["kind"] == "Deployment" { + aliases := pulumi.Aliases([]pulumi.Alias{ + { + Name: pulumi.String("oldName"), + }, + }) + opts = append(opts, aliases) + } + }, + + // Omit a resource from the Chart by transforming the specified resource definition + // to an empty List. + func(state map[string]interface{}, opts ...pulumi.ResourceOption) { + name := state["metadata"].(map[string]interface{})["name"] + if state["kind"] == "Pod" && name == "test" { + state["apiVersion"] = "core/v1" + state["kind"] = "List" + } + }, + }, + }, + ) + if err != nil { + return err + } + + return nil + }) +} +``` +{{% /example %}} +{% /examples %}} diff --git a/provider/pkg/gen/examples/configGroup.md b/provider/pkg/gen/examples/configGroup.md new file mode 100644 index 0000000000..0cdf38edda --- /dev/null +++ b/provider/pkg/gen/examples/configGroup.md @@ -0,0 +1,513 @@ +ConfigGroup creates a set of Kubernetes resources from Kubernetes YAML text. The YAML text +may be supplied using any of the following methods: + +1. Using a filename or a list of filenames: +2. Using a file pattern or a list of file patterns: +3. Using a literal string containing YAML, or a list of such strings: +4. Any combination of files, patterns, or YAML strings: + +{{% examples %}} +## Example Usage +{{% example %}} +### Local File + +```typescript +import * as k8s from "@pulumi/kubernetes"; + +const example = new k8s.yaml.ConfigGroup("example", { + files: "foo.yaml", +}); +``` +```python +from pulumi_kubernetes.yaml import ConfigGroup + +example = ConfigGroup( + "example", + files=["foo.yaml"], +) +``` +```csharp +using System.Threading.Tasks; +using Pulumi; +using Pulumi.Kubernetes.Yaml; + +class YamlStack : Stack +{ + public YamlStack() + { + var helloWorld = new ConfigGroup("example", new ConfigGroupArgs + { + Files = new[] { "foo.yaml" } + }); + } +} +``` +```go +package main + +import ( + "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +func main() { + pulumi.Run(func(ctx *pulumi.Context) error { + _, err := yaml.NewConfigGroup(ctx, "example", + &yaml.ConfigGroupArgs{ + Files: []string{"foo.yaml"}, + }, + ) + if err != nil { + return err + } + + return nil + }) +} +``` +{{% /example %}} +{{% example %}} +### Multiple Local Files + +```typescript +import * as k8s from "@pulumi/kubernetes"; + +const example = new k8s.yaml.ConfigGroup("example", { + files: ["foo.yaml", "bar.yaml"], +}); +``` +```python +from pulumi_kubernetes.yaml import ConfigGroup + +example = ConfigGroup( + "example", + files=["foo.yaml", "bar.yaml"], +) +``` +```csharp +using System.Threading.Tasks; +using Pulumi; +using Pulumi.Kubernetes.Yaml; + +class YamlStack : Stack +{ + public YamlStack() + { + var helloWorld = new ConfigGroup("example", new ConfigGroupArgs + { + Files = new[] { "foo.yaml", "bar.yaml" } + }); + } +} +``` +```go +package main + +import ( + "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +func main() { + pulumi.Run(func(ctx *pulumi.Context) error { + _, err := yaml.NewConfigGroup(ctx, "example", + &yaml.ConfigGroupArgs{ + Files: []string{"foo.yaml", "bar.yaml"}, + }, + ) + if err != nil { + return err + } + + return nil + }) +} +``` +{{% /example %}} +{{% example %}} +### Local File Pattern + +```typescript +import * as k8s from "@pulumi/kubernetes"; + +const example = new k8s.yaml.ConfigGroup("example", { + files: "yaml/*.yaml", +}); +``` +```python +from pulumi_kubernetes.yaml import ConfigGroup + +example = ConfigGroup( + "example", + files=["yaml/*.yaml"], +) +``` +```csharp +using System.Threading.Tasks; +using Pulumi; +using Pulumi.Kubernetes.Yaml; + +class YamlStack : Stack +{ + public YamlStack() + { + var helloWorld = new ConfigGroup("example", new ConfigGroupArgs + { + Files = new[] { "yaml/*.yaml" } + }); + } +} +``` +```go +package main + +import ( + "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +func main() { + pulumi.Run(func(ctx *pulumi.Context) error { + _, err := yaml.NewConfigGroup(ctx, "example", + &yaml.ConfigGroupArgs{ + Files: []string{"yaml/*.yaml"}, + }, + ) + if err != nil { + return err + } + + return nil + }) +} +``` +{{% /example %}} +{{% example %}} +### Multiple Local File Patterns + +```typescript +import * as k8s from "@pulumi/kubernetes"; + +const example = new k8s.yaml.ConfigGroup("example", { + files: ["foo/*.yaml", "bar/*.yaml"], +}); +``` +```python +from pulumi_kubernetes.yaml import ConfigGroup + +example = ConfigGroup( + "example", + files=["foo/*.yaml", "bar/*.yaml"], +) +``` +```csharp +using System.Threading.Tasks; +using Pulumi; +using Pulumi.Kubernetes.Yaml; + +class YamlStack : Stack +{ + public YamlStack() + { + var helloWorld = new ConfigGroup("example", new ConfigGroupArgs + { + Files = new[] { "foo/*.yaml", "bar/*.yaml" } + }); + } +} +``` +```go +package main + +import ( + "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +func main() { + pulumi.Run(func(ctx *pulumi.Context) error { + _, err := yaml.NewConfigGroup(ctx, "example", + &yaml.ConfigGroupArgs{ + Files: []string{"yaml/*.yaml", "bar/*.yaml"}, + }, + ) + if err != nil { + return err + } + + return nil + }) +} +``` +{{% /example %}} +{{% example %}} +### Literal YAML String + +```typescript +import * as k8s from "@pulumi/kubernetes"; + +const example = new k8s.yaml.ConfigGroup("example", { + yaml: ` +apiVersion: v1 +kind: Namespace +metadata: + name: foo +`, +}) +``` +```python +from pulumi_kubernetes.yaml import ConfigGroup + +example = ConfigGroup( + "example", + yaml=[''' +apiVersion: v1 +kind: Namespace +metadata: + name: foo +'''] +) +``` +```csharp +using System.Threading.Tasks; +using Pulumi; +using Pulumi.Kubernetes.Yaml; + +class YamlStack : Stack +{ + public YamlStack() + { + var helloWorld = new ConfigGroup("example", new ConfigGroupArgs + { + Yaml = @" + apiVersion: v1 + kind: Namespace + metadata: + name: foo + ", + }); + } +} +``` +```go +package main + +import ( + "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +func main() { + pulumi.Run(func(ctx *pulumi.Context) error { + _, err := yaml.NewConfigGroup(ctx, "example", + &yaml.ConfigGroupArgs{ + YAML: []string{ + ` +apiVersion: v1 +kind: Namespace +metadata: + name: foo +`, + }, + }) + if err != nil { + return err + } + + return nil + }) +} +``` +{{% /example %}} +{{% example %}} +### YAML with Transformations + +```typescript +import * as k8s from "@pulumi/kubernetes"; + +const example = new k8s.yaml.ConfigGroup("example", { + files: "foo.yaml", + transformations: [ + // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer. + (obj: any, opts: pulumi.CustomResourceOptions) => { + if (obj.kind === "Service" && obj.apiVersion === "v1") { + if (obj.spec && obj.spec.type && obj.spec.type === "LoadBalancer") { + obj.spec.type = "ClusterIP"; + } + } + }, + + // Set a resource alias for a previous name. + (obj: any, opts: pulumi.CustomResourceOptions) => { + if (obj.kind === "Deployment") { + opts.aliases = [{ name: "oldName" }] + } + }, + + // Omit a resource from the Chart by transforming the specified resource definition to an empty List. + (obj: any, opts: pulumi.CustomResourceOptions) => { + if (obj.kind === "Pod" && obj.metadata.name === "test") { + obj.apiVersion = "v1" + obj.kind = "List" + } + }, + ], +}); +``` +```python +from pulumi_kubernetes.yaml import ConfigFile + +# Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer. +def make_service_private(obj, opts): + if obj["kind"] == "Service" and obj["apiVersion"] == "v1": + try: + t = obj["spec"]["type"] + if t == "LoadBalancer": + obj["spec"]["type"] = "ClusterIP" + except KeyError: + pass + + +# Set a resource alias for a previous name. +def alias(obj, opts): + if obj["kind"] == "Deployment": + opts.aliases = ["oldName"] + + +# Omit a resource from the Chart by transforming the specified resource definition to an empty List. +def omit_resource(obj, opts): + if obj["kind"] == "Pod" and obj["metadata"]["name"] == "test": + obj["apiVersion"] = "v1" + obj["kind"] = "List" + + +example = ConfigGroup( + "example", + files=["foo.yaml"], + transformations=[make_service_private, alias, omit_resource], +) +``` +```csharp +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi; +using Pulumi.Kubernetes.Yaml; + +class YamlStack : Stack +{ + public YamlStack() + { + var helloWorld = new ConfigGroup("example", new ConfigGroupArgs + { + Files = new[] { "foo.yaml" }, + Transformations = + { + LoadBalancerToClusterIP, + ResourceAlias, + OmitTestPod, + } + }); + + // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer. + ImmutableDictionary<string, object> LoadBalancerToClusterIP(ImmutableDictionary<string, object> obj, CustomResourceOptions opts) + { + if ((string)obj["kind"] == "Service" && (string)obj["apiVersion"] == "v1") + { + var spec = (ImmutableDictionary<string, object>)obj["spec"]; + if (spec != null && (string)spec["type"] == "LoadBalancer") + { + return obj.SetItem("spec", spec.SetItem("type", "ClusterIP")); + } + } + + return obj; + } + + // Set a resource alias for a previous name. + ImmutableDictionary<string, object> ResourceAlias(ImmutableDictionary<string, object> obj, CustomResourceOptions opts) + { + if ((string)obj["kind"] == "Deployment") + { + opts.Aliases.Add(new Alias { Name = "oldName" }); + } + + return obj; + } + + // Omit a resource from the Chart by transforming the specified resource definition to an empty List. + ImmutableDictionary<string, object> OmitTestPod(ImmutableDictionary<string, object> obj, CustomResourceOptions opts) + { + var metadata = (ImmutableDictionary<string, object>)obj["metadata"]; + if ((string)obj["kind"] == "Pod" && (string)metadata["name"] == "test") + { + return new Dictionary<string, object> + { + ["apiVersion"] = "v1", + ["kind"] = "List", + ["items"] = new Dictionary<string, object>(), + }.ToImmutableDictionary(); + } + + return obj; + } + } +} +``` +```go +package main + +import ( + "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +func main() { + pulumi.Run(func(ctx *pulumi.Context) error { + _, err := yaml.NewConfigGroup(ctx, "example", + &yaml.ConfigGroupArgs{ + Files: []string{"foo.yaml"}, + Transformations: []yaml.Transformation{ + // Make every service private to the cluster, i.e., turn all services into ClusterIP + // instead of LoadBalancer. + func(state map[string]interface{}, opts ...pulumi.ResourceOption) { + if state["kind"] == "Service" { + spec := state["spec"].(map[string]interface{}) + spec["type"] = "ClusterIP" + } + }, + + // Set a resource alias for a previous name. + func(state map[string]interface{}, opts ...pulumi.ResourceOption) { + if state["kind"] == "Deployment" { + aliases := pulumi.Aliases([]pulumi.Alias{ + { + Name: pulumi.String("oldName"), + }, + }) + opts = append(opts, aliases) + } + }, + + // Omit a resource from the Chart by transforming the specified resource definition + // to an empty List. + func(state map[string]interface{}, opts ...pulumi.ResourceOption) { + name := state["metadata"].(map[string]interface{})["name"] + if state["kind"] == "Pod" && name == "test" { + state["apiVersion"] = "core/v1" + state["kind"] = "List" + } + }, + }, + }, + ) + if err != nil { + return err + } + + return nil + }) +} +``` +{{% /example %}} +{% /examples %}} diff --git a/provider/pkg/gen/nodejs-templates/yaml/yaml.tmpl b/provider/pkg/gen/nodejs-templates/yaml/yaml.tmpl index e701a79f9c..e0a23f172e 100644 --- a/provider/pkg/gen/nodejs-templates/yaml/yaml.tmpl +++ b/provider/pkg/gen/nodejs-templates/yaml/yaml.tmpl @@ -238,15 +238,17 @@ export class ConfigGroup extends CollectionComponentResource { * * // Set a resource alias for a previous name. * (obj: any, opts: pulumi.CustomResourceOptions) => { - * if (obj.kind === "Deployment") { - * opts.aliases = [{ name: "oldName" }] + * if (obj.kind === "Deployment") { + * opts.aliases = [{name: "oldName"}] + * } * }, * * // Omit a resource from the Chart by transforming the specified resource definition to an empty List. * (obj: any, opts: pulumi.CustomResourceOptions) => { - * if (obj.kind === "Pod" && obj.metadata.name === "test") { - * obj.apiVersion = "v1" - * obj.kind = "List" + * if (obj.kind === "Pod" && obj.metadata.name === "test") { + * obj.apiVersion = "v1" + * obj.kind = "List" + * } * }, * ], * }); diff --git a/provider/pkg/gen/overlays.go b/provider/pkg/gen/overlays.go index 9501b26eee..ffe8e6dc12 100644 --- a/provider/pkg/gen/overlays.go +++ b/provider/pkg/gen/overlays.go @@ -15,6 +15,8 @@ package gen import ( + _ "embed" + pschema "github.com/pulumi/pulumi/pkg/v3/codegen/schema" v1 "k8s.io/api/core/v1" ) @@ -46,6 +48,176 @@ var serviceSpecType = pschema.ComplexTypeSpec{ }, } +var helmV2ChartResource = pschema.ResourceSpec{ + IsComponent: true, + ObjectTypeSpec: pschema.ObjectTypeSpec{ + IsOverlay: true, + Description: "Chart is a component representing a collection of resources described by an arbitrary Helm Chart.\n\nThe Chart can be fetched from any source that is accessible to the `helm` command line. Values in the `values.yml` file can be overridden using `ChartOpts.values` (equivalent to `--set` or having multiple `values.yml` files). Objects can be transformed arbitrarily by supplying callbacks to `ChartOpts.transformations`.\n\n`Chart` does not use Tiller. The Chart specified is copied and expanded locally; the semantics are equivalent to running `helm template` and then using Pulumi to manage the resulting YAML manifests. Any values that would be retrieved in-cluster are assigned fake values, and none of Tiller's server-side validity testing is executed.\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n### Local Chart Directory\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v2.Chart(\"nginx-ingress\", {\n path: \"./nginx-ingress\",\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v2 import Chart, LocalChartOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n LocalChartOpts(\n path=\"./nginx-ingress\",\n ),\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V2;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new LocalChartArgs\n {\n Path = \"./nginx-ingress\",\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v2\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tPath: pulumi.String(\"./nginx-ingress\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Remote Chart\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v2.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v2 import Chart, ChartOpts, FetchOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n ),\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V2;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n }\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v2\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.run(func(ctx *pulumi.context) error {\n\t\t_, err := helm.newchart(ctx, \"nginx-ingress\", helm.chartargs{\n\t\t\tchart: pulumi.string(\"nginx-ingress\"),\n\t\t\tversion: pulumi.string(\"1.24.4\"),\n\t\t\tfetchargs: helm.fetchargs{\n\t\t\t\trepo: pulumi.string(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n\n{{% /example %}}\n{{% example %}}\n### Set Chart Values\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v2.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n values: {\n controller: {\n metrics: {\n enabled: true,\n }\n }\n },\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v2 import Chart, ChartOpts, FetchOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n values={\n \"controller\": {\n \"metrics\": {\n \"enabled\": True,\n },\n },\n },\n ),\n)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V2;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var values = new Dictionary<string, object>\n {\n [\"controller\"] = new Dictionary<string, object>\n {\n [\"metrics\"] = new Dictionary<string, object>\n {\n [\"enabled\"] = true\n }\n },\n };\n\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n },\n Values = values,\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v2\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tChart: pulumi.String(\"nginx-ingress\"),\n\t\t\tVersion: pulumi.String(\"1.24.4\"),\n\t\t\tFetchArgs: helm.FetchArgs{\n\t\t\t\tRepo: pulumi.String(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t\tValues: pulumi.Map{\n\t\t\t\t\"controller\": pulumi.Map{\n\t\t\t\t\t\"metrics\": pulumi.Map{\n\t\t\t\t\t\t\"enabled\": pulumi.Bool(true),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Deploy Chart into Namespace\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v2.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n namespace: \"test-namespace\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v2 import Chart, ChartOpts, FetchOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n namespace=\"test-namespace\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n ),\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V2;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n Namespace = \"test-namespace\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n },\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v2\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tChart: pulumi.String(\"nginx-ingress\"),\n\t\t\tVersion: pulumi.String(\"1.24.4\"),\n\t\t\tNamespace: pulumi.String(\"test-namespace\"),\n\t\t\tFetchArgs: helm.FetchArgs{\n\t\t\t\tRepo: pulumi.String(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Chart with Transformations\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v2.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n transformations: [\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Service\" && obj.apiVersion === \"v1\") {\n if (obj.spec && obj.spec.type && obj.spec.type === \"LoadBalancer\") {\n obj.spec.type = \"ClusterIP\";\n }\n }\n },\n\n // Set a resource alias for a previous name.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Deployment\") {\n opts.aliases = [{ name: \"oldName\" }]\n }\n },\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Pod\" && obj.metadata.name === \"test\") {\n obj.apiVersion = \"v1\"\n obj.kind = \"List\"\n }\n },\n ],\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v2 import Chart, ChartOpts, FetchOpts\n\n# Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\ndef make_service_private(obj, opts):\n if obj[\"kind\"] == \"Service\" and obj[\"apiVersion\"] == \"v1\":\n try:\n t = obj[\"spec\"][\"type\"]\n if t == \"LoadBalancer\":\n obj[\"spec\"][\"type\"] = \"ClusterIP\"\n except KeyError:\n pass\n\n\n# Set a resource alias for a previous name.\ndef alias(obj, opts):\n if obj[\"kind\"] == \"Deployment\":\n opts.aliases = [\"oldName\"]\n\n\n# Omit a resource from the Chart by transforming the specified resource definition to an empty List.\ndef omit_resource(obj, opts):\n if obj[\"kind\"] == \"Pod\" and obj[\"metadata\"][\"name\"] == \"test\":\n obj[\"apiVersion\"] = \"v1\"\n obj[\"kind\"] = \"List\"\n\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n transformations=[make_service_private, alias, omit_resource],\n ),\n)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V2;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n },\n Transformations =\n {\n LoadBalancerToClusterIP,\n ResourceAlias,\n OmitTestPod,\n }\n\n });\n\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n ImmutableDictionary<string, object> LoadBalancerToClusterIP(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Service\" && (string)obj[\"apiVersion\"] == \"v1\")\n {\n var spec = (ImmutableDictionary<string, object>)obj[\"spec\"];\n if (spec != null && (string)spec[\"type\"] == \"LoadBalancer\")\n {\n return obj.SetItem(\"spec\", spec.SetItem(\"type\", \"ClusterIP\"));\n }\n }\n\n return obj;\n }\n\n // Set a resource alias for a previous name.\n ImmutableDictionary<string, object> ResourceAlias(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Deployment\")\n {\n opts.Aliases.Add(new Alias { Name = \"oldName\" });\n }\n\n return obj;\n }\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n ImmutableDictionary<string, object> OmitTestPod(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n var metadata = (ImmutableDictionary<string, object>)obj[\"metadata\"];\n if ((string)obj[\"kind\"] == \"Pod\" && (string)metadata[\"name\"] == \"test\")\n {\n return new Dictionary<string, object>\n {\n [\"apiVersion\"] = \"v1\",\n [\"kind\"] = \"List\",\n [\"items\"] = new Dictionary<string, object>(),\n }.ToImmutableDictionary();\n }\n\n return obj;\n }\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v2\"\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tChart: pulumi.String(\"nginx-ingress\"),\n\t\t\tVersion: pulumi.String(\"1.24.4\"),\n\t\t\tFetchArgs: helm.FetchArgs{\n\t\t\t\tRepo: pulumi.String(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t\tTransformations: []yaml.Transformation{\n\t\t\t\t// Make every service private to the cluster, i.e., turn all services into ClusterIP\n\t\t\t\t// instead of LoadBalancer.\n\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\tif state[\"kind\"] == \"Service\" {\n\t\t\t\t\t\tspec := state[\"spec\"].(map[string]interface{})\n\t\t\t\t\t\tspec[\"type\"] = \"ClusterIP\"\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// Set a resource alias for a previous name.\n\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\tif state[\"kind\"] == \"Deployment\" {\n\t\t\t\t\t\taliases := pulumi.Aliases([]pulumi.Alias{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName: pulumi.String(\"oldName\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t\topts = append(opts, aliases)\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// Omit a resource from the Chart by transforming the specified resource definition\n\t\t\t\t// to an empty List.\n\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\tname := state[\"metadata\"].(map[string]interface{})[\"name\"]\n\t\t\t\t\tif state[\"kind\"] == \"Pod\" && name == \"test\" {\n\t\t\t\t\t\tstate[\"apiVersion\"] = \"core/v1\"\n\t\t\t\t\t\tstate[\"kind\"] = \"List\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% /examples %}}\n\n\n\n", + Properties: map[string]pschema.PropertySpec{ + "resources": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Resources created by the Chart.", + }, + "urn": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "The stable logical URN used to distinctly address a resource, both before and after deployments.", + }, + }, + Type: "object", + }, + InputProperties: map[string]pschema.PropertySpec{ + "chart": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "The name of the chart to deploy. If [repo] is provided, this chart name will be prefixed by the repo name. Example: repo: \"stable\", chart: \"nginx-ingress\" -> \"stable/nginx-ingress\" Example: chart: \"stable/nginx-ingress\" -> \"stable/nginx-ingress\"\n\nRequired if specifying `ChartOpts` for a remote chart.", + }, + "fetchOpts": { + TypeSpec: pschema.TypeSpec{ + Ref: "#/types/kubernetes:helm.sh/v2:FetchOpts", + }, + Description: "Additional options to customize the fetching of the Helm chart.", + }, + "path": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "The path to the chart directory which contains the `Chart.yaml` file.\n\nRequired if specifying `LocalChartOpts`.", + }, + "namespace": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "The optional namespace to install chart resources into.", + }, + "repo": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "The repository name of the chart to deploy. Example: \"stable\".\n\nUsed only when specifying options for a remote chart.", + }, + "resourcePrefix": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\"foo\" would produce a resource named \"foo-resourceName\".", + }, + "transformations": { + TypeSpec: pschema.TypeSpec{ + Type: "array", + Items: &pschema.TypeSpec{ + Ref: "pulumi.json#/Any", + }, + }, + Description: "Optional array of transformations to apply to resources that will be created by this chart prior to creation. Allows customization of the chart behaviour without directly modifying the chart itself.", + }, + "values": { + TypeSpec: pschema.TypeSpec{ + Type: "object", + AdditionalProperties: &pschema.TypeSpec{ + Ref: "pulumi.json#/Any", + }, + }, + Description: "Overrides for chart values.", + }, + "version": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "The version of the chart to deploy. If not provided, the latest version will be deployed.", + }, + }, +} + +var helmV3ChartResource = pschema.ResourceSpec{ + IsComponent: true, + ObjectTypeSpec: pschema.ObjectTypeSpec{ + IsOverlay: true, + Description: "Chart is a component representing a collection of resources described by an arbitrary Helm Chart.\n\nThe Chart can be fetched from any source that is accessible to the `helm` command line. Values in the `values.yml` file can be overridden using `ChartOpts.values` (equivalent to `--set` or having multiple `values.yml` files). Objects can be transformed arbitrarily by supplying callbacks to `ChartOpts.transformations`.\n\n`Chart` does not use Tiller. The Chart specified is copied and expanded locally; the semantics are equivalent to running `helm template` and then using Pulumi to manage the resulting YAML manifests. Any values that would be retrieved in-cluster are assigned fake values, and none of Tiller's server-side validity testing is executed.\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n### Local Chart Directory\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v3.Chart(\"nginx-ingress\", {\n path: \"./nginx-ingress\",\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v3 import Chart, LocalChartOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n LocalChartOpts(\n path=\"./nginx-ingress\",\n ),\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V3;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new LocalChartArgs\n {\n Path = \"./nginx-ingress\",\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v3\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tPath: pulumi.String(\"./nginx-ingress\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Remote Chart\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v3.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v3 import Chart, ChartOpts, FetchOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n ),\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V3;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n }\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v3\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.run(func(ctx *pulumi.context) error {\n\t\t_, err := helm.newchart(ctx, \"nginx-ingress\", helm.chartargs{\n\t\t\tchart: pulumi.string(\"nginx-ingress\"),\n\t\t\tversion: pulumi.string(\"1.24.4\"),\n\t\t\tfetchargs: helm.fetchargs{\n\t\t\t\trepo: pulumi.string(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n\n{{% /example %}}\n{{% example %}}\n### Set Chart Values\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v3.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n values: {\n controller: {\n metrics: {\n enabled: true,\n }\n }\n },\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v3 import Chart, ChartOpts, FetchOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n values={\n \"controller\": {\n \"metrics\": {\n \"enabled\": True,\n },\n },\n },\n ),\n)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V3;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var values = new Dictionary<string, object>\n {\n [\"controller\"] = new Dictionary<string, object>\n {\n [\"metrics\"] = new Dictionary<string, object>\n {\n [\"enabled\"] = true\n }\n },\n };\n\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n },\n Values = values,\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v3\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tChart: pulumi.String(\"nginx-ingress\"),\n\t\t\tVersion: pulumi.String(\"1.24.4\"),\n\t\t\tFetchArgs: helm.FetchArgs{\n\t\t\t\tRepo: pulumi.String(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t\tValues: pulumi.Map{\n\t\t\t\t\"controller\": pulumi.Map{\n\t\t\t\t\t\"metrics\": pulumi.Map{\n\t\t\t\t\t\t\"enabled\": pulumi.Bool(true),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Deploy Chart into Namespace\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v3.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n namespace: \"test-namespace\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v3 import Chart, ChartOpts, FetchOpts\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n namespace=\"test-namespace\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n ),\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V3;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n Namespace = \"test-namespace\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n },\n });\n\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v3\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tChart: pulumi.String(\"nginx-ingress\"),\n\t\t\tVersion: pulumi.String(\"1.24.4\"),\n\t\t\tNamespace: pulumi.String(\"test-namespace\"),\n\t\t\tFetchArgs: helm.FetchArgs{\n\t\t\t\tRepo: pulumi.String(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Chart with Transformations\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst nginxIngress = new k8s.helm.v3.Chart(\"nginx-ingress\", {\n chart: \"nginx-ingress\",\n version: \"1.24.4\",\n fetchOpts:{\n repo: \"https://charts.helm.sh/stable//\",\n },\n transformations: [\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Service\" && obj.apiVersion === \"v1\") {\n if (obj.spec && obj.spec.type && obj.spec.type === \"LoadBalancer\") {\n obj.spec.type = \"ClusterIP\";\n }\n }\n },\n\n // Set a resource alias for a previous name.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Deployment\") {\n opts.aliases = [{ name: \"oldName\" }]\n }\n },\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Pod\" && obj.metadata.name === \"test\") {\n obj.apiVersion = \"v1\"\n obj.kind = \"List\"\n }\n },\n ],\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v3 import Chart, ChartOpts, FetchOpts\n\n# Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\ndef make_service_private(obj, opts):\n if obj[\"kind\"] == \"Service\" and obj[\"apiVersion\"] == \"v1\":\n try:\n t = obj[\"spec\"][\"type\"]\n if t == \"LoadBalancer\":\n obj[\"spec\"][\"type\"] = \"ClusterIP\"\n except KeyError:\n pass\n\n\n# Set a resource alias for a previous name.\ndef alias(obj, opts):\n if obj[\"kind\"] == \"Deployment\":\n opts.aliases = [\"oldName\"]\n\n\n# Omit a resource from the Chart by transforming the specified resource definition to an empty List.\ndef omit_resource(obj, opts):\n if obj[\"kind\"] == \"Pod\" and obj[\"metadata\"][\"name\"] == \"test\":\n obj[\"apiVersion\"] = \"v1\"\n obj[\"kind\"] = \"List\"\n\n\nnginx_ingress = Chart(\n \"nginx-ingress\",\n ChartOpts(\n chart=\"nginx-ingress\",\n version=\"1.24.4\",\n fetch_opts=FetchOpts(\n repo=\"https://charts.helm.sh/stable//\",\n ),\n transformations=[make_service_private, alias, omit_resource],\n ),\n)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Helm;\nusing Pulumi.Kubernetes.Helm.V3;\n\nclass HelmStack : Stack\n{\n public HelmStack()\n {\n var nginx = new Chart(\"nginx-ingress\", new ChartArgs\n {\n Chart = \"nginx-ingress\",\n Version = \"1.24.4\",\n FetchOptions = new ChartFetchArgs\n {\n Repo = \"https://charts.helm.sh/stable//\"\n },\n Transformations =\n {\n LoadBalancerToClusterIP,\n ResourceAlias,\n OmitTestPod,\n }\n\n });\n\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n ImmutableDictionary<string, object> LoadBalancerToClusterIP(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Service\" && (string)obj[\"apiVersion\"] == \"v1\")\n {\n var spec = (ImmutableDictionary<string, object>)obj[\"spec\"];\n if (spec != null && (string)spec[\"type\"] == \"LoadBalancer\")\n {\n return obj.SetItem(\"spec\", spec.SetItem(\"type\", \"ClusterIP\"));\n }\n }\n\n return obj;\n }\n\n // Set a resource alias for a previous name.\n ImmutableDictionary<string, object> ResourceAlias(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Deployment\")\n {\n opts.Aliases.Add(new Alias { Name = \"oldName\" });\n }\n\n return obj;\n }\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n ImmutableDictionary<string, object> OmitTestPod(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n var metadata = (ImmutableDictionary<string, object>)obj[\"metadata\"];\n if ((string)obj[\"kind\"] == \"Pod\" && (string)metadata[\"name\"] == \"test\")\n {\n return new Dictionary<string, object>\n {\n [\"apiVersion\"] = \"v1\",\n [\"kind\"] = \"List\",\n [\"items\"] = new Dictionary<string, object>(),\n }.ToImmutableDictionary();\n }\n\n return obj;\n }\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v3\"\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := helm.NewChart(ctx, \"nginx-ingress\", helm.ChartArgs{\n\t\t\tChart: pulumi.String(\"nginx-ingress\"),\n\t\t\tVersion: pulumi.String(\"1.24.4\"),\n\t\t\tFetchArgs: helm.FetchArgs{\n\t\t\t\tRepo: pulumi.String(\"https://charts.helm.sh/stable//\"),\n\t\t\t},\n\t\t\tTransformations: []yaml.Transformation{\n\t\t\t\t// Make every service private to the cluster, i.e., turn all services into ClusterIP\n\t\t\t\t// instead of LoadBalancer.\n\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\tif state[\"kind\"] == \"Service\" {\n\t\t\t\t\t\tspec := state[\"spec\"].(map[string]interface{})\n\t\t\t\t\t\tspec[\"type\"] = \"ClusterIP\"\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// Set a resource alias for a previous name.\n\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\tif state[\"kind\"] == \"Deployment\" {\n\t\t\t\t\t\taliases := pulumi.Aliases([]pulumi.Alias{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName: pulumi.String(\"oldName\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t\topts = append(opts, aliases)\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// Omit a resource from the Chart by transforming the specified resource definition\n\t\t\t\t// to an empty List.\n\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\tname := state[\"metadata\"].(map[string]interface{})[\"name\"]\n\t\t\t\t\tif state[\"kind\"] == \"Pod\" && name == \"test\" {\n\t\t\t\t\t\tstate[\"apiVersion\"] = \"core/v1\"\n\t\t\t\t\t\tstate[\"kind\"] = \"List\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% /examples %}}\n\n", + Properties: map[string]pschema.PropertySpec{ + "resources": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Resources created by the Chart.", + }, + "urn": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "The stable logical URN used to distinctly address a resource, both before and after deployments.", + }, + }, + Type: "object", + }, + InputProperties: map[string]pschema.PropertySpec{ + "chart": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "The name of the chart to deploy. If [repo] is provided, this chart name will be prefixed by the repo name. Example: repo: \"stable\", chart: \"nginx-ingress\" -> \"stable/nginx-ingress\" Example: chart: \"stable/nginx-ingress\" -> \"stable/nginx-ingress\"\n\nRequired if specifying `ChartOpts` for a remote chart.", + }, + "fetchOpts": { + TypeSpec: pschema.TypeSpec{ + Ref: "#/types/kubernetes:helm.sh/v3:FetchOpts", + }, + Description: "Additional options to customize the fetching of the Helm chart.", + }, + "path": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "The path to the chart directory which contains the `Chart.yaml` file.\n\nRequired if specifying `LocalChartOpts`.", + }, + "namespace": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "The optional namespace to install chart resources into.", + }, + "repo": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "The repository name of the chart to deploy. Example: \"stable\".\n\nUsed only when specifying options for a remote chart.", + }, + "resourcePrefix": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\"foo\" would produce a resource named \"foo-resourceName\".", + }, + "transformations": { + TypeSpec: pschema.TypeSpec{ + Type: "array", + Items: &pschema.TypeSpec{ + Ref: "pulumi.json#/Any", + }, + }, + Description: "Optional array of transformations to apply to resources that will be created by this chart prior to creation. Allows customization of the chart behaviour without directly modifying the chart itself.", + }, + "values": { + TypeSpec: pschema.TypeSpec{ + Type: "object", + AdditionalProperties: &pschema.TypeSpec{ + Ref: "pulumi.json#/Any", + }, + }, + Description: "Overrides for chart values.", + }, + "version": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "The version of the chart to deploy. If not provided, the latest version will be deployed.", + }, + }, +} + var helmV3Release = pschema.ComplexTypeSpec{ ObjectTypeSpec: pschema.ObjectTypeSpec{ Description: "A Release is an instance of a chart running in a Kubernetes cluster.\nA Chart is a Helm package. It contains all of the resource definitions necessary to run an application, tool, or service inside of a Kubernetes cluster.\nNote - Helm Release is currently in BETA and may change. Use in production environment is discouraged.", @@ -319,6 +491,106 @@ var helmV3Release = pschema.ComplexTypeSpec{ }, } +var helmV2FetchOpts = pschema.ComplexTypeSpec{ + ObjectTypeSpec: pschema.ObjectTypeSpec{ + IsOverlay: true, + Description: "Additional options to customize the fetching of the Helm chart.", + Properties: map[string]pschema.PropertySpec{ + "caFile": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Verify certificates of HTTPS-enabled servers using this CA bundle.", + }, + "certFile": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Identify HTTPS client using this SSL certificate file.", + }, + "destination": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Location to write the chart. If this and tardir are specified, tardir is appended to this (default \".\").", + }, + "devel": { + TypeSpec: pschema.TypeSpec{ + Type: "boolean", + }, + Description: "Use development versions, too. Equivalent to version '>0.0.0-0'. If –version is set, this is ignored.", + }, + "home": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Location of your Helm config. Overrides $HELM_HOME (default \"/Users/abc/.helm\").", + }, + "keyFile": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Identify HTTPS client using this SSL key file.", + }, + "keyring": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Keyring containing public keys (default “/Users/abc/.gnupg/pubring.gpg”).", + }, + "password": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Chart repository password.", + }, + "prov": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Fetch the provenance file, but don’t perform verification.", + }, + "repo": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Chart repository url where to locate the requested chart.", + }, + "untar": { + TypeSpec: pschema.TypeSpec{ + Type: "boolean", + }, + Description: "If set to false, will leave the chart as a tarball after downloading.", + }, + "untardir": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "If untar is specified, this flag specifies the name of the directory into which the chart is expanded (default \".\").", + }, + "username": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Chart repository username.", + }, + "verify": { + TypeSpec: pschema.TypeSpec{ + Type: "boolean", + }, + Description: "Verify the package against its signature.", + }, + "version": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Specific version of a chart. Without this, the latest version is fetched.", + }, + }, + Type: "object", + }, +} + var helmV3RepoOpts = pschema.ComplexTypeSpec{ ObjectTypeSpec: pschema.ObjectTypeSpec{ Description: "Specification defining the Helm chart repository to use.", @@ -1030,21 +1302,22 @@ var helmV3ReleaseResource = pschema.ResourceSpec{ } var kustomizeDirectoryResource = pschema.ResourceSpec{ + IsComponent: true, ObjectTypeSpec: pschema.ObjectTypeSpec{ - IsOverlay: true, - Description: "Directory is a component representing a collection of resources described by a kustomize directory (kustomization).\\n\\n{{% examples %}}\\n## Example Usage\\n{{% example %}}\\n### Local Kustomize Directory\\n\\n```typescript\\nimport * as k8s from \\\"@pulumi/kubernetes\\\";\\n\\nconst helloWorld = new k8s.kustomize.Directory(\\\"helloWorldLocal\\\", {\\n directory: \\\"./helloWorld\\\",\\n});\\n```\\n```python\\nfrom pulumi_kubernetes.kustomize import Directory\\n\\nhello_world = Directory(\\n \\\"hello-world-local\\\",\\n directory=\\\"./helloWorld\\\",\\n)\\n```\\n```csharp\\nusing System.Threading.Tasks;\\nusing Pulumi;\\nusing Pulumi.Kubernetes.Kustomize;\\n\\nclass KustomizeStack : Stack\\n{\\n public KustomizeStack()\\n {\\n var helloWorld = new Directory(\\\"helloWorldLocal\\\", new DirectoryArgs\\n {\\n Directory = \\\"./helloWorld\\\",\\n });\\n }\\n}\\n```\\n```go\\npackage main\\n\\nimport (\\n\\t\\\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/kustomize\\\"\\n\\t\\\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\\\"\\n)\\n\\nfunc main() {\\n\\tpulumi.Run(func(ctx *pulumi.Context) error {\\n\\t\\t_, err := kustomize.NewDirectory(ctx, \\\"helloWorldLocal\\\",\\n\\t\\t\\tkustomize.DirectoryArgs{\\n\\t\\t\\t\\tDirectory: pulumi.String(\\\"./helloWorld\\\"),\\n\\t\\t\\t},\\n\\t\\t)\\n\\t\\tif err != nil {\\n\\t\\t\\treturn err\\n\\t\\t}\\n\\n\\t\\treturn nil\\n\\t})\\n}\\n```\\n{{% /example %}}\\n{{% example %}}\\n### Kustomize Directory from a Git Repo\\n\\n```typescript\\nimport * as k8s from \\\"@pulumi/kubernetes\\\";\\n\\nconst helloWorld = new k8s.kustomize.Directory(\\\"helloWorldRemote\\\", {\\n directory: \\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\",\\n});\\n```\\n```python\\nfrom pulumi_kubernetes.kustomize import Directory\\n\\nhello_world = Directory(\\n \\\"hello-world-remote\\\",\\n directory=\\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\",\\n)\\n```\\n```csharp\\nusing System.Threading.Tasks;\\nusing Pulumi;\\nusing Pulumi.Kubernetes.Kustomize;\\n\\nclass KustomizeStack : Stack\\n{\\n public KustomizeStack()\\n {\\n var helloWorld = new Directory(\\\"helloWorldRemote\\\", new DirectoryArgs\\n {\\n Directory = \\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\",\\n });\\n }\\n}\\n```\\n```go\\npackage main\\n\\nimport (\\n\\t\\\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/kustomize\\\"\\n\\t\\\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\\\"\\n)\\n\\nfunc main() {\\n\\tpulumi.Run(func(ctx *pulumi.Context) error {\\n\\t\\t_, err := kustomize.NewDirectory(ctx, \\\"helloWorldRemote\\\",\\n\\t\\t\\tkustomize.DirectoryArgs{\\n\\t\\t\\t\\tDirectory: pulumi.String(\\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\"),\\n\\t\\t\\t},\\n\\t\\t)\\n\\t\\tif err != nil {\\n\\t\\t\\treturn err\\n\\t\\t}\\n\\n\\t\\treturn nil\\n\\t})\\n}\\n```\\n{{% /example %}}\\n{{% example %}}\\n### Kustomize Directory with Transformations\\n\\n```typescript\\nimport * as k8s from \\\"@pulumi/kubernetes\\\";\\n\\nconst helloWorld = new k8s.kustomize.Directory(\\\"helloWorldRemote\\\", {\\n directory: \\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\",\\n transformations: [\\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\\n (obj: any, opts: pulumi.CustomResourceOptions) => {\\n if (obj.kind === \\\"Service\\\" && obj.apiVersion === \\\"v1\\\") {\\n if (obj.spec && obj.spec.type && obj.spec.type === \\\"LoadBalancer\\\") {\\n obj.spec.type = \\\"ClusterIP\\\";\\n }\\n }\\n },\\n\\n // Set a resource alias for a previous name.\\n (obj: any, opts: pulumi.CustomResourceOptions) => {\\n if (obj.kind === \\\"Deployment\\\") {\\n opts.aliases = [{ name: \\\"oldName\\\" }]\\n }\\n },\\n\\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\\n (obj: any, opts: pulumi.CustomResourceOptions) => {\\n if (obj.kind === \\\"Pod\\\" && obj.metadata.name === \\\"test\\\") {\\n obj.apiVersion = \\\"v1\\\"\\n obj.kind = \\\"List\\\"\\n }\\n },\\n ],\\n});\\n```\\n```python\\nfrom pulumi_kubernetes.helm.v3 import Chart, ChartOpts, FetchOpts\\n\\n# Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\\ndef make_service_private(obj, opts):\\n if obj[\\\"kind\\\"] == \\\"Service\\\" and obj[\\\"apiVersion\\\"] == \\\"v1\\\":\\n try:\\n t = obj[\\\"spec\\\"][\\\"type\\\"]\\n if t == \\\"LoadBalancer\\\":\\n obj[\\\"spec\\\"][\\\"type\\\"] = \\\"ClusterIP\\\"\\n except KeyError:\\n pass\\n\\n\\n# Set a resource alias for a previous name.\\ndef alias(obj, opts):\\n if obj[\\\"kind\\\"] == \\\"Deployment\\\":\\n opts.aliases = [\\\"oldName\\\"]\\n\\n\\n# Omit a resource from the Chart by transforming the specified resource definition to an empty List.\\ndef omit_resource(obj, opts):\\n if obj[\\\"kind\\\"] == \\\"Pod\\\" and obj[\\\"metadata\\\"][\\\"name\\\"] == \\\"test\\\":\\n obj[\\\"apiVersion\\\"] = \\\"v1\\\"\\n obj[\\\"kind\\\"] = \\\"List\\\"\\n\\n\\nhello_world = Directory(\\n \\\"hello-world-remote\\\",\\n directory=\\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\",\\n transformations=[make_service_private, alias, omit_resource],\\n)\\n```\\n```csharp\\nusing System.Collections.Generic;\\nusing System.Collections.Immutable;\\nusing System.Threading.Tasks;\\nusing Pulumi;\\nusing Pulumi.Kubernetes.Kustomize;\\n\\nclass KustomizeStack : Stack\\n{\\n public KustomizeStack()\\n {\\n var helloWorld = new Directory(\\\"helloWorldRemote\\\", new DirectoryArgs\\n {\\n Directory = \\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\",\\n Transformations =\\n {\\n LoadBalancerToClusterIP,\\n ResourceAlias,\\n OmitTestPod,\\n }\\n });\\n\\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\\n ImmutableDictionary<string, object> LoadBalancerToClusterIP(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\\n {\\n if ((string)obj[\\\"kind\\\"] == \\\"Service\\\" && (string)obj[\\\"apiVersion\\\"] == \\\"v1\\\")\\n {\\n var spec = (ImmutableDictionary<string, object>)obj[\\\"spec\\\"];\\n if (spec != null && (string)spec[\\\"type\\\"] == \\\"LoadBalancer\\\")\\n {\\n return obj.SetItem(\\\"spec\\\", spec.SetItem(\\\"type\\\", \\\"ClusterIP\\\"));\\n }\\n }\\n\\n return obj;\\n }\\n\\n // Set a resource alias for a previous name.\\n ImmutableDictionary<string, object> ResourceAlias(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\\n {\\n if ((string)obj[\\\"kind\\\"] == \\\"Deployment\\\")\\n {\\n opts.Aliases.Add(new Alias { Name = \\\"oldName\\\" });\\n }\\n\\n return obj;\\n }\\n\\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\\n ImmutableDictionary<string, object> OmitTestPod(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\\n {\\n var metadata = (ImmutableDictionary<string, object>)obj[\\\"metadata\\\"];\\n if ((string)obj[\\\"kind\\\"] == \\\"Pod\\\" && (string)metadata[\\\"name\\\"] == \\\"test\\\")\\n {\\n return new Dictionary<string, object>\\n {\\n [\\\"apiVersion\\\"] = \\\"v1\\\",\\n [\\\"kind\\\"] = \\\"List\\\",\\n [\\\"items\\\"] = new Dictionary<string, object>(),\\n }.ToImmutableDictionary();\\n }\\n\\n return obj;\\n }\\n }\\n}\\n```\\n```go\\npackage main\\n\\nimport (\\n\\t\\\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/kustomize\\\"\\n\\t\\\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\\\"\\n\\t\\\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\\\"\\n)\\n\\nfunc main() {\\n\\tpulumi.Run(func(ctx *pulumi.Context) error {\\n\\t\\t_, err := kustomize.NewDirectory(ctx, \\\"helloWorldRemote\\\",\\n\\t\\t\\tkustomize.DirectoryArgs{\\n\\t\\t\\t\\tDirectory: pulumi.String(\\\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\\\"),\\n\\t\\t\\t\\tTransformations: []yaml.Transformation{\\n\\t\\t\\t\\t\\t// Make every service private to the cluster, i.e., turn all services into ClusterIP\\n\\t\\t\\t\\t\\t// instead of LoadBalancer.\\n\\t\\t\\t\\t\\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\\n\\t\\t\\t\\t\\t\\tif state[\\\"kind\\\"] == \\\"Service\\\" {\\n\\t\\t\\t\\t\\t\\t\\tspec := state[\\\"spec\\\"].(map[string]interface{})\\n\\t\\t\\t\\t\\t\\t\\tspec[\\\"type\\\"] = \\\"ClusterIP\\\"\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t\\t// Set a resource alias for a previous name.\\n\\t\\t\\t\\t\\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\\n\\t\\t\\t\\t\\t\\tif state[\\\"kind\\\"] == \\\"Deployment\\\" {\\n\\t\\t\\t\\t\\t\\t\\taliases := pulumi.Aliases([]pulumi.Alias{\\n\\t\\t\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tName: pulumi.String(\\\"oldName\\\"),\\n\\t\\t\\t\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t\\t\\t\\t})\\n\\t\\t\\t\\t\\t\\t\\topts = append(opts, aliases)\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t\\t// Omit a resource from the Chart by transforming the specified resource definition\\n\\t\\t\\t\\t\\t// to an empty List.\\n\\t\\t\\t\\t\\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\\n\\t\\t\\t\\t\\t\\tname := state[\\\"metadata\\\"].(map[string]interface{})[\\\"name\\\"]\\n\\t\\t\\t\\t\\t\\tif state[\\\"kind\\\"] == \\\"Pod\\\" && name == \\\"test\\\" {\\n\\t\\t\\t\\t\\t\\t\\tstate[\\\"apiVersion\\\"] = \\\"core/v1\\\"\\n\\t\\t\\t\\t\\t\\t\\tstate[\\\"kind\\\"] = \\\"List\\\"\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t},\\n\\t\\t\\t},\\n\\t\\t)\\n\\t\\tif err != nil {\\n\\t\\t\\treturn err\\n\\t\\t}\\n\\n\\t\\treturn nil\\n\\t})\\n}\\n```\\n{{% /example %}}\\n{{% /examples %}}\\n", + IsOverlay: true, + Description: "Directory is a component representing a collection of resources described by a kustomize directory (kustomization).\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n### Local Kustomize Directory\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst helloWorld = new k8s.kustomize.Directory(\"helloWorldLocal\", {\n directory: \"./helloWorld\",\n});\n```\n```python\nfrom pulumi_kubernetes.kustomize import Directory\n\nhello_world = Directory(\n \"hello-world-local\",\n directory=\"./helloWorld\",\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Kustomize;\n\nclass KustomizeStack : Stack\n{\n public KustomizeStack()\n {\n var helloWorld = new Directory(\"helloWorldLocal\", new DirectoryArgs\n {\n Directory = \"./helloWorld\",\n });\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/kustomize\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := kustomize.NewDirectory(ctx, \"helloWorldLocal\",\n\t\t\tkustomize.DirectoryArgs{\n\t\t\t\tDirectory: pulumi.String(\"./helloWorld\"),\n\t\t\t},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Kustomize Directory from a Git Repo\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst helloWorld = new k8s.kustomize.Directory(\"helloWorldRemote\", {\n directory: \"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\",\n});\n```\n```python\nfrom pulumi_kubernetes.kustomize import Directory\n\nhello_world = Directory(\n \"hello-world-remote\",\n directory=\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\",\n)\n```\n```csharp\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Kustomize;\n\nclass KustomizeStack : Stack\n{\n public KustomizeStack()\n {\n var helloWorld = new Directory(\"helloWorldRemote\", new DirectoryArgs\n {\n Directory = \"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\",\n });\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/kustomize\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := kustomize.NewDirectory(ctx, \"helloWorldRemote\",\n\t\t\tkustomize.DirectoryArgs{\n\t\t\t\tDirectory: pulumi.String(\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\"),\n\t\t\t},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% example %}}\n### Kustomize Directory with Transformations\n\n```typescript\nimport * as k8s from \"@pulumi/kubernetes\";\n\nconst helloWorld = new k8s.kustomize.Directory(\"helloWorldRemote\", {\n directory: \"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\",\n transformations: [\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Service\" && obj.apiVersion === \"v1\") {\n if (obj.spec && obj.spec.type && obj.spec.type === \"LoadBalancer\") {\n obj.spec.type = \"ClusterIP\";\n }\n }\n },\n\n // Set a resource alias for a previous name.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Deployment\") {\n opts.aliases = [{ name: \"oldName\" }]\n }\n },\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n (obj: any, opts: pulumi.CustomResourceOptions) => {\n if (obj.kind === \"Pod\" && obj.metadata.name === \"test\") {\n obj.apiVersion = \"v1\"\n obj.kind = \"List\"\n }\n },\n ],\n});\n```\n```python\nfrom pulumi_kubernetes.helm.v3 import Chart, ChartOpts, FetchOpts\n\n# Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\ndef make_service_private(obj, opts):\n if obj[\"kind\"] == \"Service\" and obj[\"apiVersion\"] == \"v1\":\n try:\n t = obj[\"spec\"][\"type\"]\n if t == \"LoadBalancer\":\n obj[\"spec\"][\"type\"] = \"ClusterIP\"\n except KeyError:\n pass\n\n\n# Set a resource alias for a previous name.\ndef alias(obj, opts):\n if obj[\"kind\"] == \"Deployment\":\n opts.aliases = [\"oldName\"]\n\n\n# Omit a resource from the Chart by transforming the specified resource definition to an empty List.\ndef omit_resource(obj, opts):\n if obj[\"kind\"] == \"Pod\" and obj[\"metadata\"][\"name\"] == \"test\":\n obj[\"apiVersion\"] = \"v1\"\n obj[\"kind\"] = \"List\"\n\n\nhello_world = Directory(\n \"hello-world-remote\",\n directory=\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\",\n transformations=[make_service_private, alias, omit_resource],\n)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.Threading.Tasks;\nusing Pulumi;\nusing Pulumi.Kubernetes.Kustomize;\n\nclass KustomizeStack : Stack\n{\n public KustomizeStack()\n {\n var helloWorld = new Directory(\"helloWorldRemote\", new DirectoryArgs\n {\n Directory = \"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\",\n Transformations =\n {\n LoadBalancerToClusterIP,\n ResourceAlias,\n OmitTestPod,\n }\n });\n\n // Make every service private to the cluster, i.e., turn all services into ClusterIP instead of LoadBalancer.\n ImmutableDictionary<string, object> LoadBalancerToClusterIP(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Service\" && (string)obj[\"apiVersion\"] == \"v1\")\n {\n var spec = (ImmutableDictionary<string, object>)obj[\"spec\"];\n if (spec != null && (string)spec[\"type\"] == \"LoadBalancer\")\n {\n return obj.SetItem(\"spec\", spec.SetItem(\"type\", \"ClusterIP\"));\n }\n }\n\n return obj;\n }\n\n // Set a resource alias for a previous name.\n ImmutableDictionary<string, object> ResourceAlias(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n if ((string)obj[\"kind\"] == \"Deployment\")\n {\n opts.Aliases.Add(new Alias { Name = \"oldName\" });\n }\n\n return obj;\n }\n\n // Omit a resource from the Chart by transforming the specified resource definition to an empty List.\n ImmutableDictionary<string, object> OmitTestPod(ImmutableDictionary<string, object> obj, CustomResourceOptions opts)\n {\n var metadata = (ImmutableDictionary<string, object>)obj[\"metadata\"];\n if ((string)obj[\"kind\"] == \"Pod\" && (string)metadata[\"name\"] == \"test\")\n {\n return new Dictionary<string, object>\n {\n [\"apiVersion\"] = \"v1\",\n [\"kind\"] = \"List\",\n [\"items\"] = new Dictionary<string, object>(),\n }.ToImmutableDictionary();\n }\n\n return obj;\n }\n }\n}\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/kustomize\"\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/yaml\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := kustomize.NewDirectory(ctx, \"helloWorldRemote\",\n\t\t\tkustomize.DirectoryArgs{\n\t\t\t\tDirectory: pulumi.String(\"https://github.com/kubernetes-sigs/kustomize/tree/v3.3.1/examples/helloWorld\"),\n\t\t\t\tTransformations: []yaml.Transformation{\n\t\t\t\t\t// Make every service private to the cluster, i.e., turn all services into ClusterIP\n\t\t\t\t\t// instead of LoadBalancer.\n\t\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\t\tif state[\"kind\"] == \"Service\" {\n\t\t\t\t\t\t\tspec := state[\"spec\"].(map[string]interface{})\n\t\t\t\t\t\t\tspec[\"type\"] = \"ClusterIP\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t// Set a resource alias for a previous name.\n\t\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\t\tif state[\"kind\"] == \"Deployment\" {\n\t\t\t\t\t\t\taliases := pulumi.Aliases([]pulumi.Alias{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tName: pulumi.String(\"oldName\"),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\topts = append(opts, aliases)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t// Omit a resource from the Chart by transforming the specified resource definition\n\t\t\t\t\t// to an empty List.\n\t\t\t\t\tfunc(state map[string]interface{}, opts ...pulumi.ResourceOption) {\n\t\t\t\t\t\tname := state[\"metadata\"].(map[string]interface{})[\"name\"]\n\t\t\t\t\t\tif state[\"kind\"] == \"Pod\" && name == \"test\" {\n\t\t\t\t\t\t\tstate[\"apiVersion\"] = \"core/v1\"\n\t\t\t\t\t\t\tstate[\"kind\"] = \"List\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n```\n{{% /example %}}\n{{% /examples %}}\n", Properties: map[string]pschema.PropertySpec{ "directory": { TypeSpec: pschema.TypeSpec{ Type: "string", }, - Description: "The directory containing the kustomization to apply. The value can be a local directory or a folder in a\\ngit repository.\\nExample: ./helloWorld\\nExample: https://github.com/kubernetes-sigs/kustomize/tree/master/examples/helloWorld", + Description: "The directory containing the kustomization to apply. The value can be a local directory or a folder in a\ngit repository.\nExample: ./helloWorld\nExample: https://github.com/kubernetes-sigs/kustomize/tree/master/examples/helloWorld", }, "resourcePrefix": { TypeSpec: pschema.TypeSpec{ Type: "string", }, - Description: "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\\\"foo\\\" would produce a resource named \\\"foo-resourceName\\\".", + Description: "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\"foo\" would produce a resource named \"foo-resourceName\".", }, "transformations": { TypeSpec: pschema.TypeSpec{ @@ -1066,13 +1339,13 @@ var kustomizeDirectoryResource = pschema.ResourceSpec{ TypeSpec: pschema.TypeSpec{ Type: "string", }, - Description: "The directory containing the kustomization to apply. The value can be a local directory or a folder in a\\ngit repository.\\nExample: ./helloWorld\\nExample: https://github.com/kubernetes-sigs/kustomize/tree/master/examples/helloWorld", + Description: "The directory containing the kustomization to apply. The value can be a local directory or a folder in a\ngit repository.\nExample: ./helloWorld\nExample: https://github.com/kubernetes-sigs/kustomize/tree/master/examples/helloWorld", }, "resourcePrefix": { TypeSpec: pschema.TypeSpec{ Type: "string", }, - Description: "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\\\"foo\\\" would produce a resource named \\\"foo-resourceName\\\".", + Description: "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\"foo\" would produce a resource named \"foo-resourceName\".", }, "transformations": { TypeSpec: pschema.TypeSpec{ @@ -1089,15 +1362,218 @@ var kustomizeDirectoryResource = pschema.ResourceSpec{ }, } +//go:embed examples/configFile.md +var configFileMD string + +var yamlConfigFileResource = pschema.ResourceSpec{ + IsComponent: true, + ObjectTypeSpec: pschema.ObjectTypeSpec{ + IsOverlay: true, + Description: configFileMD, + Properties: map[string]pschema.PropertySpec{ + "resources": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Resources created by the ConfigFile.", + }, + }, + Type: "object", + }, + InputProperties: map[string]pschema.PropertySpec{ + "file": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Path or a URL that uniquely identifies a file.", + }, + "resourcePrefix": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\"foo\" would produce a resource named \"foo-resourceName\".", + }, + "transformations": { + TypeSpec: pschema.TypeSpec{ + Type: "array", + Items: &pschema.TypeSpec{ + Ref: "pulumi.json#/Any", + }, + }, + Description: "A set of transformations to apply to Kubernetes resource definitions before registering with engine.", + }, + }, + RequiredInputs: []string{ + "file", + }, +} + +//go:embed examples/configGroup.md +var configGroupMD string + +var yamlConfigGroupResource = pschema.ResourceSpec{ + IsComponent: true, + ObjectTypeSpec: pschema.ObjectTypeSpec{ + IsOverlay: true, + Description: configGroupMD, + Properties: map[string]pschema.PropertySpec{ + "resources": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Resources created by the ConfigGroup.", + }, + }, + Type: "object", + }, + InputProperties: map[string]pschema.PropertySpec{ + "files": { + TypeSpec: pschema.TypeSpec{ + OneOf: []pschema.TypeSpec{ + { + Type: "string", + }, + { + Type: "array", + Items: &pschema.TypeSpec{ + Type: "string", + }, + }, + }, + }, + Description: "Set of paths or a URLs that uniquely identify files.", + }, + "objs": { + TypeSpec: pschema.TypeSpec{ + OneOf: []pschema.TypeSpec{ + { + Ref: "pulumi.json#/Any", + }, + { + Type: "array", + Items: &pschema.TypeSpec{ + Ref: "pulumi.json#/Any", + }, + }, + }, + }, + Description: "Objects representing Kubernetes resources.", + }, + "resourcePrefix": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "An optional prefix for the auto-generated resource names. Example: A resource created with resourcePrefix=\"foo\" would produce a resource named \"foo-resourceName\".", + }, + "transformations": { + TypeSpec: pschema.TypeSpec{ + Type: "array", + Items: &pschema.TypeSpec{ + Ref: "pulumi.json#/Any", + }, + }, + Description: "A set of transformations to apply to Kubernetes resource definitions before registering with engine.", + }, + "yaml": { + TypeSpec: pschema.TypeSpec{ + OneOf: []pschema.TypeSpec{ + { + Type: "string", + }, + { + Type: "array", + Items: &pschema.TypeSpec{ + Type: "string", + }, + }, + }, + }, + Description: "YAML text containing Kubernetes resource definitions.", + }, + }, +} + +var apiextentionsCustomResource = pschema.ResourceSpec{ + ObjectTypeSpec: pschema.ObjectTypeSpec{ + IsOverlay: true, + Description: "CustomResource represents an instance of a CustomResourceDefinition (CRD). For example, the\n CoreOS Prometheus operator exposes a CRD `monitoring.coreos.com/ServiceMonitor`; to\n instantiate this as a Pulumi resource, one could call `new CustomResource`, passing the\n `ServiceMonitor` resource definition as an argument.", + Properties: map[string]pschema.PropertySpec{ + "apiVersion": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + }, + "kind": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + }, + "metadata": { + TypeSpec: pschema.TypeSpec{ + Ref: "#/types/kubernetes:meta/v1:ObjectMeta", + }, + Description: "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata.", + }, + }, + Type: "object", + Required: []string{ + "apiVersion", + "kind", + }, + }, + InputProperties: map[string]pschema.PropertySpec{ + "apiVersion": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + }, + "kind": { + TypeSpec: pschema.TypeSpec{ + Type: "string", + }, + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + }, + "metadata": { + TypeSpec: pschema.TypeSpec{ + Ref: "#/types/kubernetes:meta/v1:ObjectMeta", + }, + Description: "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata.", + }, + "others": { + TypeSpec: pschema.TypeSpec{ + Type: "object", + AdditionalProperties: &pschema.TypeSpec{ + Ref: "pulumi.json#/Any", + }, + }, + Description: "This field is not an actual property. It is used to represent custom property names and their values that can be passed in addition to the other input properties.", + }, + }, + RequiredInputs: []string{ + "apiVersion", + "kind", + }, +} + func init() { typeOverlays["kubernetes:core/v1:ServiceSpec"] = serviceSpec typeOverlays["kubernetes:core/v1:ServiceSpecType"] = serviceSpecType + typeOverlays["kubernetes:helm.sh/v2:FetchOpts"] = helmV2FetchOpts + typeOverlays["kubernetes:helm.sh/v3:FetchOpts"] = helmV2FetchOpts // v2 fetch opts are identical to v3 typeOverlays["kubernetes:helm.sh/v3:Release"] = helmV3Release typeOverlays["kubernetes:helm.sh/v3:RepositoryOpts"] = helmV3RepoOpts typeOverlays["kubernetes:helm.sh/v3:ReleaseStatus"] = helmV3ReleaseStatus typeOverlays["kubernetes:index:KubeClientSettings"] = kubeClientSettings typeOverlays["kubernetes:index:HelmReleaseSettings"] = helmReleaseSettings + resourceOverlays["kubernetes:apiextensions.k8s.io:CustomResource"] = apiextentionsCustomResource + resourceOverlays["kubernetes:helm.sh/v2:Chart"] = helmV2ChartResource + resourceOverlays["kubernetes:helm.sh/v3:Chart"] = helmV3ChartResource resourceOverlays["kubernetes:helm.sh/v3:Release"] = helmV3ReleaseResource resourceOverlays["kubernetes:kustomize:Directory"] = kustomizeDirectoryResource + resourceOverlays["kubernetes:yaml:ConfigFile"] = yamlConfigFileResource + resourceOverlays["kubernetes:yaml:ConfigGroup"] = yamlConfigGroupResource } diff --git a/provider/pkg/gen/schema.go b/provider/pkg/gen/schema.go index ef5c6efbe5..5812e0f8a0 100644 --- a/provider/pkg/gen/schema.go +++ b/provider/pkg/gen/schema.go @@ -169,11 +169,17 @@ func PulumiSchema(swagger map[string]interface{}) pschema.PackageSpec { goImportPath := "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes" csharpNamespaces := map[string]string{ - "helm.sh/v3": "Helm.V3", - "": "Provider", + "apiextensions": "ApiExtensions", + "helm.sh/v2": "Helm.V2", + "helm.sh/v3": "Helm.V3", + "yaml": "Yaml", + "": "Provider", } modToPkg := map[string]string{ - "helm.sh/v3": "helm/v3", + "apiextensions.k8s.io": "apiextensions", + "helm.sh": "helm", + "helm.sh/v2": "helm/v2", + "helm.sh/v3": "helm/v3", } pkgImportAliases := map[string]string{ "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/helm/v3": "helmv3", diff --git a/sdk/dotnet/Helm/V2/Inputs/FetchOptsArgs.cs b/sdk/dotnet/Helm/V2/Inputs/FetchOptsArgs.cs new file mode 100644 index 0000000000..530f089f14 --- /dev/null +++ b/sdk/dotnet/Helm/V2/Inputs/FetchOptsArgs.cs @@ -0,0 +1,112 @@ +// *** WARNING: this file was generated by pulumigen. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; + +namespace Pulumi.Kubernetes.Types.Inputs.Helm.V2 +{ + + /// <summary> + /// Additional options to customize the fetching of the Helm chart. + /// </summary> + public class FetchOptsArgs : Pulumi.ResourceArgs + { + /// <summary> + /// Verify certificates of HTTPS-enabled servers using this CA bundle. + /// </summary> + [Input("caFile")] + public Input<string>? CaFile { get; set; } + + /// <summary> + /// Identify HTTPS client using this SSL certificate file. + /// </summary> + [Input("certFile")] + public Input<string>? CertFile { get; set; } + + /// <summary> + /// Location to write the chart. If this and tardir are specified, tardir is appended to this (default "."). + /// </summary> + [Input("destination")] + public Input<string>? Destination { get; set; } + + /// <summary> + /// Use development versions, too. Equivalent to version '>0.0.0-0'. If –version is set, this is ignored. + /// </summary> + [Input("devel")] + public Input<bool>? Devel { get; set; } + + /// <summary> + /// Location of your Helm config. Overrides $HELM_HOME (default "/Users/abc/.helm"). + /// </summary> + [Input("home")] + public Input<string>? Home { get; set; } + + /// <summary> + /// Identify HTTPS client using this SSL key file. + /// </summary> + [Input("keyFile")] + public Input<string>? KeyFile { get; set; } + + /// <summary> + /// Keyring containing public keys (default “/Users/abc/.gnupg/pubring.gpg”). + /// </summary> + [Input("keyring")] + public Input<string>? Keyring { get; set; } + + /// <summary> + /// Chart repository password. + /// </summary> + [Input("password")] + public Input<string>? Password { get; set; } + + /// <summary> + /// Fetch the provenance file, but don’t perform verification. + /// </summary> + [Input("prov")] + public Input<string>? Prov { get; set; } + + /// <summary> + /// Chart repository url where to locate the requested chart. + /// </summary> + [Input("repo")] + public Input<string>? Repo { get; set; } + + /// <summary> + /// If set to false, will leave the chart as a tarball after downloading. + /// </summary> + [Input("untar")] + public Input<bool>? Untar { get; set; } + + /// <summary> + /// If untar is specified, this flag specifies the name of the directory into which the chart is expanded (default "."). + /// </summary> + [Input("untardir")] + public Input<string>? Untardir { get; set; } + + /// <summary> + /// Chart repository username. + /// </summary> + [Input("username")] + public Input<string>? Username { get; set; } + + /// <summary> + /// Verify the package against its signature. + /// </summary> + [Input("verify")] + public Input<bool>? Verify { get; set; } + + /// <summary> + /// Specific version of a chart. Without this, the latest version is fetched. + /// </summary> + [Input("version")] + public Input<string>? Version { get; set; } + + public FetchOptsArgs() + { + } + } +} diff --git a/sdk/dotnet/Helm/V3/Inputs/FetchOptsArgs.cs b/sdk/dotnet/Helm/V3/Inputs/FetchOptsArgs.cs new file mode 100644 index 0000000000..8d86aa22d9 --- /dev/null +++ b/sdk/dotnet/Helm/V3/Inputs/FetchOptsArgs.cs @@ -0,0 +1,112 @@ +// *** WARNING: this file was generated by pulumigen. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; + +namespace Pulumi.Kubernetes.Types.Inputs.Helm.V3 +{ + + /// <summary> + /// Additional options to customize the fetching of the Helm chart. + /// </summary> + public class FetchOptsArgs : Pulumi.ResourceArgs + { + /// <summary> + /// Verify certificates of HTTPS-enabled servers using this CA bundle. + /// </summary> + [Input("caFile")] + public Input<string>? CaFile { get; set; } + + /// <summary> + /// Identify HTTPS client using this SSL certificate file. + /// </summary> + [Input("certFile")] + public Input<string>? CertFile { get; set; } + + /// <summary> + /// Location to write the chart. If this and tardir are specified, tardir is appended to this (default "."). + /// </summary> + [Input("destination")] + public Input<string>? Destination { get; set; } + + /// <summary> + /// Use development versions, too. Equivalent to version '>0.0.0-0'. If –version is set, this is ignored. + /// </summary> + [Input("devel")] + public Input<bool>? Devel { get; set; } + + /// <summary> + /// Location of your Helm config. Overrides $HELM_HOME (default "/Users/abc/.helm"). + /// </summary> + [Input("home")] + public Input<string>? Home { get; set; } + + /// <summary> + /// Identify HTTPS client using this SSL key file. + /// </summary> + [Input("keyFile")] + public Input<string>? KeyFile { get; set; } + + /// <summary> + /// Keyring containing public keys (default “/Users/abc/.gnupg/pubring.gpg”). + /// </summary> + [Input("keyring")] + public Input<string>? Keyring { get; set; } + + /// <summary> + /// Chart repository password. + /// </summary> + [Input("password")] + public Input<string>? Password { get; set; } + + /// <summary> + /// Fetch the provenance file, but don’t perform verification. + /// </summary> + [Input("prov")] + public Input<string>? Prov { get; set; } + + /// <summary> + /// Chart repository url where to locate the requested chart. + /// </summary> + [Input("repo")] + public Input<string>? Repo { get; set; } + + /// <summary> + /// If set to false, will leave the chart as a tarball after downloading. + /// </summary> + [Input("untar")] + public Input<bool>? Untar { get; set; } + + /// <summary> + /// If untar is specified, this flag specifies the name of the directory into which the chart is expanded (default "."). + /// </summary> + [Input("untardir")] + public Input<string>? Untardir { get; set; } + + /// <summary> + /// Chart repository username. + /// </summary> + [Input("username")] + public Input<string>? Username { get; set; } + + /// <summary> + /// Verify the package against its signature. + /// </summary> + [Input("verify")] + public Input<bool>? Verify { get; set; } + + /// <summary> + /// Specific version of a chart. Without this, the latest version is fetched. + /// </summary> + [Input("version")] + public Input<string>? Version { get; set; } + + public FetchOptsArgs() + { + } + } +} diff --git a/sdk/go/kubernetes/apiextensions/init.go b/sdk/go/kubernetes/apiextensions/init.go new file mode 100644 index 0000000000..2924e91166 --- /dev/null +++ b/sdk/go/kubernetes/apiextensions/init.go @@ -0,0 +1,37 @@ +// *** WARNING: this file was generated by pulumigen. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +package apiextensions + +import ( + "fmt" + + "github.com/blang/semver" + "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +type module struct { + version semver.Version +} + +func (m *module) Version() semver.Version { + return m.version +} + +func (m *module) Construct(ctx *pulumi.Context, name, typ, urn string) (r pulumi.Resource, err error) { + switch typ { + default: + return nil, fmt.Errorf("unknown resource type: %s", typ) + } + + err = ctx.RegisterResource(typ, name, nil, r, pulumi.URN_(urn)) + return +} + +func init() { + version, err := kubernetes.PkgVersion() + if err != nil { + fmt.Printf("failed to determine package version. defaulting to v1: %v\n", err) + } +} diff --git a/sdk/go/kubernetes/helm/v2/init.go b/sdk/go/kubernetes/helm/v2/init.go new file mode 100644 index 0000000000..c5c15519b5 --- /dev/null +++ b/sdk/go/kubernetes/helm/v2/init.go @@ -0,0 +1,37 @@ +// *** WARNING: this file was generated by pulumigen. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +package v2 + +import ( + "fmt" + + "github.com/blang/semver" + "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +type module struct { + version semver.Version +} + +func (m *module) Version() semver.Version { + return m.version +} + +func (m *module) Construct(ctx *pulumi.Context, name, typ, urn string) (r pulumi.Resource, err error) { + switch typ { + default: + return nil, fmt.Errorf("unknown resource type: %s", typ) + } + + err = ctx.RegisterResource(typ, name, nil, r, pulumi.URN_(urn)) + return +} + +func init() { + version, err := kubernetes.PkgVersion() + if err != nil { + fmt.Printf("failed to determine package version. defaulting to v1: %v\n", err) + } +} diff --git a/sdk/go/kubernetes/kustomize/directory.go b/sdk/go/kubernetes/kustomize/directory.go index c3c7f132df..3e774ddb9d 100644 --- a/sdk/go/kubernetes/kustomize/directory.go +++ b/sdk/go/kubernetes/kustomize/directory.go @@ -137,7 +137,7 @@ import ( type Directory struct { pulumi.ResourceState - Resources pulumi.Output + Resources pulumi.Output `pulumi:"resources"` } // NewDirectory registers a new resource with the given unique name, arguments, and options. diff --git a/sdk/go/kubernetes/kustomize/init.go b/sdk/go/kubernetes/kustomize/init.go index 6e1acfe1eb..22efb25ddc 100644 --- a/sdk/go/kubernetes/kustomize/init.go +++ b/sdk/go/kubernetes/kustomize/init.go @@ -21,8 +21,6 @@ func (m *module) Version() semver.Version { func (m *module) Construct(ctx *pulumi.Context, name, typ, urn string) (r pulumi.Resource, err error) { switch typ { - case "kubernetes:kustomize:Directory": - r = &Directory{} default: return nil, fmt.Errorf("unknown resource type: %s", typ) } @@ -36,9 +34,4 @@ func init() { if err != nil { fmt.Printf("failed to determine package version. defaulting to v1: %v\n", err) } - pulumi.RegisterResourceModule( - "kubernetes", - "kustomize", - &module{version}, - ) } diff --git a/sdk/go/kubernetes/yaml/init.go b/sdk/go/kubernetes/yaml/init.go new file mode 100644 index 0000000000..012d5815f6 --- /dev/null +++ b/sdk/go/kubernetes/yaml/init.go @@ -0,0 +1,37 @@ +// *** WARNING: this file was generated by pulumigen. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +package yaml + +import ( + "fmt" + + "github.com/blang/semver" + "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +type module struct { + version semver.Version +} + +func (m *module) Version() semver.Version { + return m.version +} + +func (m *module) Construct(ctx *pulumi.Context, name, typ, urn string) (r pulumi.Resource, err error) { + switch typ { + default: + return nil, fmt.Errorf("unknown resource type: %s", typ) + } + + err = ctx.RegisterResource(typ, name, nil, r, pulumi.URN_(urn)) + return +} + +func init() { + version, err := kubernetes.PkgVersion() + if err != nil { + fmt.Printf("failed to determine package version. defaulting to v1: %v\n", err) + } +} diff --git a/sdk/nodejs/types/input.ts b/sdk/nodejs/types/input.ts index 5b9e4c4299..009ee1cd88 100644 --- a/sdk/nodejs/types/input.ts +++ b/sdk/nodejs/types/input.ts @@ -12198,6 +12198,9 @@ export namespace flowcontrol { } export namespace helm { + export namespace v2 { + } + export namespace v3 { /** * Specification defining the Helm chart repository to use. diff --git a/sdk/nodejs/types/output.ts b/sdk/nodejs/types/output.ts index 3970d9f0c7..5b2c33cb69 100644 --- a/sdk/nodejs/types/output.ts +++ b/sdk/nodejs/types/output.ts @@ -12441,6 +12441,9 @@ export namespace flowcontrol { } export namespace helm { + export namespace v2 { + } + export namespace v3 { export interface ReleaseStatus { /** diff --git a/sdk/nodejs/yaml/yaml.ts b/sdk/nodejs/yaml/yaml.ts index 44044395cc..5be2e6f134 100644 --- a/sdk/nodejs/yaml/yaml.ts +++ b/sdk/nodejs/yaml/yaml.ts @@ -2686,15 +2686,17 @@ export class ConfigGroup extends CollectionComponentResource { * * // Set a resource alias for a previous name. * (obj: any, opts: pulumi.CustomResourceOptions) => { - * if (obj.kind === "Deployment") { - * opts.aliases = [{ name: "oldName" }] + * if (obj.kind === "Deployment") { + * opts.aliases = [{name: "oldName"}] + * } * }, * * // Omit a resource from the Chart by transforming the specified resource definition to an empty List. * (obj: any, opts: pulumi.CustomResourceOptions) => { - * if (obj.kind === "Pod" && obj.metadata.name === "test") { - * obj.apiVersion = "v1" - * obj.kind = "List" + * if (obj.kind === "Pod" && obj.metadata.name === "test") { + * obj.apiVersion = "v1" + * obj.kind = "List" + * } * }, * ], * }); diff --git a/sdk/python/pulumi_kubernetes/__init__.py b/sdk/python/pulumi_kubernetes/__init__.py index 49018073b0..c3f754fa80 100644 --- a/sdk/python/pulumi_kubernetes/__init__.py +++ b/sdk/python/pulumi_kubernetes/__init__.py @@ -46,6 +46,8 @@ flowcontrol = __flowcontrol import pulumi_kubernetes.helm as __helm helm = __helm + import pulumi_kubernetes.kustomize as __kustomize + kustomize = __kustomize import pulumi_kubernetes.meta as __meta meta = __meta import pulumi_kubernetes.networking as __networking @@ -62,6 +64,8 @@ settings = __settings import pulumi_kubernetes.storage as __storage storage = __storage + import pulumi_kubernetes.yaml as __yaml + yaml = __yaml else: admissionregistration = _utilities.lazy_import('pulumi_kubernetes.admissionregistration') apiextensions = _utilities.lazy_import('pulumi_kubernetes.apiextensions') @@ -80,6 +84,7 @@ extensions = _utilities.lazy_import('pulumi_kubernetes.extensions') flowcontrol = _utilities.lazy_import('pulumi_kubernetes.flowcontrol') helm = _utilities.lazy_import('pulumi_kubernetes.helm') + kustomize = _utilities.lazy_import('pulumi_kubernetes.kustomize') meta = _utilities.lazy_import('pulumi_kubernetes.meta') networking = _utilities.lazy_import('pulumi_kubernetes.networking') node = _utilities.lazy_import('pulumi_kubernetes.node') @@ -88,6 +93,7 @@ scheduling = _utilities.lazy_import('pulumi_kubernetes.scheduling') settings = _utilities.lazy_import('pulumi_kubernetes.settings') storage = _utilities.lazy_import('pulumi_kubernetes.storage') + yaml = _utilities.lazy_import('pulumi_kubernetes.yaml') _utilities.register( resource_modules=""" diff --git a/sdk/python/pulumi_kubernetes/helm/v2/__init__.py b/sdk/python/pulumi_kubernetes/helm/v2/__init__.py index 9a804ee9a7..5c77c4e58e 100644 --- a/sdk/python/pulumi_kubernetes/helm/v2/__init__.py +++ b/sdk/python/pulumi_kubernetes/helm/v2/__init__.py @@ -6,3 +6,4 @@ import typing # Export this package's modules as members: from .helm import * +from ._inputs import * diff --git a/sdk/python/pulumi_kubernetes/helm/v2/_inputs.py b/sdk/python/pulumi_kubernetes/helm/v2/_inputs.py new file mode 100644 index 0000000000..75ec10bebd --- /dev/null +++ b/sdk/python/pulumi_kubernetes/helm/v2/_inputs.py @@ -0,0 +1,262 @@ +# coding=utf-8 +# *** WARNING: this file was generated by pulumigen. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from ... import _utilities + +__all__ = [ + 'FetchOptsArgs', +] + +@pulumi.input_type +class FetchOptsArgs: + def __init__(__self__, *, + ca_file: Optional[pulumi.Input[str]] = None, + cert_file: Optional[pulumi.Input[str]] = None, + destination: Optional[pulumi.Input[str]] = None, + devel: Optional[pulumi.Input[bool]] = None, + home: Optional[pulumi.Input[str]] = None, + key_file: Optional[pulumi.Input[str]] = None, + keyring: Optional[pulumi.Input[str]] = None, + password: Optional[pulumi.Input[str]] = None, + prov: Optional[pulumi.Input[str]] = None, + repo: Optional[pulumi.Input[str]] = None, + untar: Optional[pulumi.Input[bool]] = None, + untardir: Optional[pulumi.Input[str]] = None, + username: Optional[pulumi.Input[str]] = None, + verify: Optional[pulumi.Input[bool]] = None, + version: Optional[pulumi.Input[str]] = None): + """ + Additional options to customize the fetching of the Helm chart. + :param pulumi.Input[str] ca_file: Verify certificates of HTTPS-enabled servers using this CA bundle. + :param pulumi.Input[str] cert_file: Identify HTTPS client using this SSL certificate file. + :param pulumi.Input[str] destination: Location to write the chart. If this and tardir are specified, tardir is appended to this (default "."). + :param pulumi.Input[bool] devel: Use development versions, too. Equivalent to version '>0.0.0-0'. If –version is set, this is ignored. + :param pulumi.Input[str] home: Location of your Helm config. Overrides $HELM_HOME (default "/Users/abc/.helm"). + :param pulumi.Input[str] key_file: Identify HTTPS client using this SSL key file. + :param pulumi.Input[str] keyring: Keyring containing public keys (default “/Users/abc/.gnupg/pubring.gpg”). + :param pulumi.Input[str] password: Chart repository password. + :param pulumi.Input[str] prov: Fetch the provenance file, but don’t perform verification. + :param pulumi.Input[str] repo: Chart repository url where to locate the requested chart. + :param pulumi.Input[bool] untar: If set to false, will leave the chart as a tarball after downloading. + :param pulumi.Input[str] untardir: If untar is specified, this flag specifies the name of the directory into which the chart is expanded (default "."). + :param pulumi.Input[str] username: Chart repository username. + :param pulumi.Input[bool] verify: Verify the package against its signature. + :param pulumi.Input[str] version: Specific version of a chart. Without this, the latest version is fetched. + """ + if ca_file is not None: + pulumi.set(__self__, "ca_file", ca_file) + if cert_file is not None: + pulumi.set(__self__, "cert_file", cert_file) + if destination is not None: + pulumi.set(__self__, "destination", destination) + if devel is not None: + pulumi.set(__self__, "devel", devel) + if home is not None: + pulumi.set(__self__, "home", home) + if key_file is not None: + pulumi.set(__self__, "key_file", key_file) + if keyring is not None: + pulumi.set(__self__, "keyring", keyring) + if password is not None: + pulumi.set(__self__, "password", password) + if prov is not None: + pulumi.set(__self__, "prov", prov) + if repo is not None: + pulumi.set(__self__, "repo", repo) + if untar is not None: + pulumi.set(__self__, "untar", untar) + if untardir is not None: + pulumi.set(__self__, "untardir", untardir) + if username is not None: + pulumi.set(__self__, "username", username) + if verify is not None: + pulumi.set(__self__, "verify", verify) + if version is not None: + pulumi.set(__self__, "version", version) + + @property + @pulumi.getter(name="caFile") + def ca_file(self) -> Optional[pulumi.Input[str]]: + """ + Verify certificates of HTTPS-enabled servers using this CA bundle. + """ + return pulumi.get(self, "ca_file") + + @ca_file.setter + def ca_file(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "ca_file", value) + + @property + @pulumi.getter(name="certFile") + def cert_file(self) -> Optional[pulumi.Input[str]]: + """ + Identify HTTPS client using this SSL certificate file. + """ + return pulumi.get(self, "cert_file") + + @cert_file.setter + def cert_file(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "cert_file", value) + + @property + @pulumi.getter + def destination(self) -> Optional[pulumi.Input[str]]: + """ + Location to write the chart. If this and tardir are specified, tardir is appended to this (default "."). + """ + return pulumi.get(self, "destination") + + @destination.setter + def destination(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "destination", value) + + @property + @pulumi.getter + def devel(self) -> Optional[pulumi.Input[bool]]: + """ + Use development versions, too. Equivalent to version '>0.0.0-0'. If –version is set, this is ignored. + """ + return pulumi.get(self, "devel") + + @devel.setter + def devel(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "devel", value) + + @property + @pulumi.getter + def home(self) -> Optional[pulumi.Input[str]]: + """ + Location of your Helm config. Overrides $HELM_HOME (default "/Users/abc/.helm"). + """ + return pulumi.get(self, "home") + + @home.setter + def home(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "home", value) + + @property + @pulumi.getter(name="keyFile") + def key_file(self) -> Optional[pulumi.Input[str]]: + """ + Identify HTTPS client using this SSL key file. + """ + return pulumi.get(self, "key_file") + + @key_file.setter + def key_file(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "key_file", value) + + @property + @pulumi.getter + def keyring(self) -> Optional[pulumi.Input[str]]: + """ + Keyring containing public keys (default “/Users/abc/.gnupg/pubring.gpg”). + """ + return pulumi.get(self, "keyring") + + @keyring.setter + def keyring(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "keyring", value) + + @property + @pulumi.getter + def password(self) -> Optional[pulumi.Input[str]]: + """ + Chart repository password. + """ + return pulumi.get(self, "password") + + @password.setter + def password(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "password", value) + + @property + @pulumi.getter + def prov(self) -> Optional[pulumi.Input[str]]: + """ + Fetch the provenance file, but don’t perform verification. + """ + return pulumi.get(self, "prov") + + @prov.setter + def prov(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "prov", value) + + @property + @pulumi.getter + def repo(self) -> Optional[pulumi.Input[str]]: + """ + Chart repository url where to locate the requested chart. + """ + return pulumi.get(self, "repo") + + @repo.setter + def repo(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "repo", value) + + @property + @pulumi.getter + def untar(self) -> Optional[pulumi.Input[bool]]: + """ + If set to false, will leave the chart as a tarball after downloading. + """ + return pulumi.get(self, "untar") + + @untar.setter + def untar(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "untar", value) + + @property + @pulumi.getter + def untardir(self) -> Optional[pulumi.Input[str]]: + """ + If untar is specified, this flag specifies the name of the directory into which the chart is expanded (default "."). + """ + return pulumi.get(self, "untardir") + + @untardir.setter + def untardir(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "untardir", value) + + @property + @pulumi.getter + def username(self) -> Optional[pulumi.Input[str]]: + """ + Chart repository username. + """ + return pulumi.get(self, "username") + + @username.setter + def username(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "username", value) + + @property + @pulumi.getter + def verify(self) -> Optional[pulumi.Input[bool]]: + """ + Verify the package against its signature. + """ + return pulumi.get(self, "verify") + + @verify.setter + def verify(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "verify", value) + + @property + @pulumi.getter + def version(self) -> Optional[pulumi.Input[str]]: + """ + Specific version of a chart. Without this, the latest version is fetched. + """ + return pulumi.get(self, "version") + + @version.setter + def version(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "version", value) + + diff --git a/sdk/python/pulumi_kubernetes/helm/v3/_inputs.py b/sdk/python/pulumi_kubernetes/helm/v3/_inputs.py index 1f3099313f..2cc68a361b 100644 --- a/sdk/python/pulumi_kubernetes/helm/v3/_inputs.py +++ b/sdk/python/pulumi_kubernetes/helm/v3/_inputs.py @@ -9,9 +9,258 @@ from ... import _utilities __all__ = [ + 'FetchOptsArgs', 'RepositoryOptsArgs', ] +@pulumi.input_type +class FetchOptsArgs: + def __init__(__self__, *, + ca_file: Optional[pulumi.Input[str]] = None, + cert_file: Optional[pulumi.Input[str]] = None, + destination: Optional[pulumi.Input[str]] = None, + devel: Optional[pulumi.Input[bool]] = None, + home: Optional[pulumi.Input[str]] = None, + key_file: Optional[pulumi.Input[str]] = None, + keyring: Optional[pulumi.Input[str]] = None, + password: Optional[pulumi.Input[str]] = None, + prov: Optional[pulumi.Input[str]] = None, + repo: Optional[pulumi.Input[str]] = None, + untar: Optional[pulumi.Input[bool]] = None, + untardir: Optional[pulumi.Input[str]] = None, + username: Optional[pulumi.Input[str]] = None, + verify: Optional[pulumi.Input[bool]] = None, + version: Optional[pulumi.Input[str]] = None): + """ + Additional options to customize the fetching of the Helm chart. + :param pulumi.Input[str] ca_file: Verify certificates of HTTPS-enabled servers using this CA bundle. + :param pulumi.Input[str] cert_file: Identify HTTPS client using this SSL certificate file. + :param pulumi.Input[str] destination: Location to write the chart. If this and tardir are specified, tardir is appended to this (default "."). + :param pulumi.Input[bool] devel: Use development versions, too. Equivalent to version '>0.0.0-0'. If –version is set, this is ignored. + :param pulumi.Input[str] home: Location of your Helm config. Overrides $HELM_HOME (default "/Users/abc/.helm"). + :param pulumi.Input[str] key_file: Identify HTTPS client using this SSL key file. + :param pulumi.Input[str] keyring: Keyring containing public keys (default “/Users/abc/.gnupg/pubring.gpg”). + :param pulumi.Input[str] password: Chart repository password. + :param pulumi.Input[str] prov: Fetch the provenance file, but don’t perform verification. + :param pulumi.Input[str] repo: Chart repository url where to locate the requested chart. + :param pulumi.Input[bool] untar: If set to false, will leave the chart as a tarball after downloading. + :param pulumi.Input[str] untardir: If untar is specified, this flag specifies the name of the directory into which the chart is expanded (default "."). + :param pulumi.Input[str] username: Chart repository username. + :param pulumi.Input[bool] verify: Verify the package against its signature. + :param pulumi.Input[str] version: Specific version of a chart. Without this, the latest version is fetched. + """ + if ca_file is not None: + pulumi.set(__self__, "ca_file", ca_file) + if cert_file is not None: + pulumi.set(__self__, "cert_file", cert_file) + if destination is not None: + pulumi.set(__self__, "destination", destination) + if devel is not None: + pulumi.set(__self__, "devel", devel) + if home is not None: + pulumi.set(__self__, "home", home) + if key_file is not None: + pulumi.set(__self__, "key_file", key_file) + if keyring is not None: + pulumi.set(__self__, "keyring", keyring) + if password is not None: + pulumi.set(__self__, "password", password) + if prov is not None: + pulumi.set(__self__, "prov", prov) + if repo is not None: + pulumi.set(__self__, "repo", repo) + if untar is not None: + pulumi.set(__self__, "untar", untar) + if untardir is not None: + pulumi.set(__self__, "untardir", untardir) + if username is not None: + pulumi.set(__self__, "username", username) + if verify is not None: + pulumi.set(__self__, "verify", verify) + if version is not None: + pulumi.set(__self__, "version", version) + + @property + @pulumi.getter(name="caFile") + def ca_file(self) -> Optional[pulumi.Input[str]]: + """ + Verify certificates of HTTPS-enabled servers using this CA bundle. + """ + return pulumi.get(self, "ca_file") + + @ca_file.setter + def ca_file(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "ca_file", value) + + @property + @pulumi.getter(name="certFile") + def cert_file(self) -> Optional[pulumi.Input[str]]: + """ + Identify HTTPS client using this SSL certificate file. + """ + return pulumi.get(self, "cert_file") + + @cert_file.setter + def cert_file(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "cert_file", value) + + @property + @pulumi.getter + def destination(self) -> Optional[pulumi.Input[str]]: + """ + Location to write the chart. If this and tardir are specified, tardir is appended to this (default "."). + """ + return pulumi.get(self, "destination") + + @destination.setter + def destination(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "destination", value) + + @property + @pulumi.getter + def devel(self) -> Optional[pulumi.Input[bool]]: + """ + Use development versions, too. Equivalent to version '>0.0.0-0'. If –version is set, this is ignored. + """ + return pulumi.get(self, "devel") + + @devel.setter + def devel(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "devel", value) + + @property + @pulumi.getter + def home(self) -> Optional[pulumi.Input[str]]: + """ + Location of your Helm config. Overrides $HELM_HOME (default "/Users/abc/.helm"). + """ + return pulumi.get(self, "home") + + @home.setter + def home(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "home", value) + + @property + @pulumi.getter(name="keyFile") + def key_file(self) -> Optional[pulumi.Input[str]]: + """ + Identify HTTPS client using this SSL key file. + """ + return pulumi.get(self, "key_file") + + @key_file.setter + def key_file(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "key_file", value) + + @property + @pulumi.getter + def keyring(self) -> Optional[pulumi.Input[str]]: + """ + Keyring containing public keys (default “/Users/abc/.gnupg/pubring.gpg”). + """ + return pulumi.get(self, "keyring") + + @keyring.setter + def keyring(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "keyring", value) + + @property + @pulumi.getter + def password(self) -> Optional[pulumi.Input[str]]: + """ + Chart repository password. + """ + return pulumi.get(self, "password") + + @password.setter + def password(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "password", value) + + @property + @pulumi.getter + def prov(self) -> Optional[pulumi.Input[str]]: + """ + Fetch the provenance file, but don’t perform verification. + """ + return pulumi.get(self, "prov") + + @prov.setter + def prov(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "prov", value) + + @property + @pulumi.getter + def repo(self) -> Optional[pulumi.Input[str]]: + """ + Chart repository url where to locate the requested chart. + """ + return pulumi.get(self, "repo") + + @repo.setter + def repo(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "repo", value) + + @property + @pulumi.getter + def untar(self) -> Optional[pulumi.Input[bool]]: + """ + If set to false, will leave the chart as a tarball after downloading. + """ + return pulumi.get(self, "untar") + + @untar.setter + def untar(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "untar", value) + + @property + @pulumi.getter + def untardir(self) -> Optional[pulumi.Input[str]]: + """ + If untar is specified, this flag specifies the name of the directory into which the chart is expanded (default "."). + """ + return pulumi.get(self, "untardir") + + @untardir.setter + def untardir(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "untardir", value) + + @property + @pulumi.getter + def username(self) -> Optional[pulumi.Input[str]]: + """ + Chart repository username. + """ + return pulumi.get(self, "username") + + @username.setter + def username(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "username", value) + + @property + @pulumi.getter + def verify(self) -> Optional[pulumi.Input[bool]]: + """ + Verify the package against its signature. + """ + return pulumi.get(self, "verify") + + @verify.setter + def verify(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "verify", value) + + @property + @pulumi.getter + def version(self) -> Optional[pulumi.Input[str]]: + """ + Specific version of a chart. Without this, the latest version is fetched. + """ + return pulumi.get(self, "version") + + @version.setter + def version(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "version", value) + + @pulumi.input_type class RepositoryOptsArgs: def __init__(__self__, *, diff --git a/sdk/python/pulumi_kubernetes/kustomize/__init__.py b/sdk/python/pulumi_kubernetes/kustomize/__init__.py new file mode 100644 index 0000000000..6ac5b83a0a --- /dev/null +++ b/sdk/python/pulumi_kubernetes/kustomize/__init__.py @@ -0,0 +1,6 @@ +# coding=utf-8 +# *** WARNING: this file was generated by pulumigen. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +from .. import _utilities +import typing diff --git a/sdk/python/pulumi_kubernetes/yaml/__init__.py b/sdk/python/pulumi_kubernetes/yaml/__init__.py new file mode 100644 index 0000000000..6ac5b83a0a --- /dev/null +++ b/sdk/python/pulumi_kubernetes/yaml/__init__.py @@ -0,0 +1,6 @@ +# coding=utf-8 +# *** WARNING: this file was generated by pulumigen. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +from .. import _utilities +import typing diff --git a/tests/go.mod b/tests/go.mod index 53254d0d92..8a83eee2df 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -12,7 +12,7 @@ replace ( require ( github.com/pulumi/pulumi-kubernetes/provider/v3 v3.0.0-rc.1 github.com/pulumi/pulumi-kubernetes/sdk/v3 v3.0.0-rc.1 - github.com/pulumi/pulumi/pkg/v3 v3.17.1-0.20211103234737-a46dc02e013c + github.com/pulumi/pulumi/pkg/v3 v3.17.1-0.20211109050240-8bb56afef977 github.com/pulumi/pulumi/sdk/v3 v3.17.0 github.com/stretchr/testify v1.7.0 ) diff --git a/tests/go.sum b/tests/go.sum index f08c39b491..c8a4de0cdb 100644 --- a/tests/go.sum +++ b/tests/go.sum @@ -968,11 +968,12 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/pulumi/pulumi/pkg/v3 v3.17.1-0.20211103234737-a46dc02e013c h1:iNS07XsllzKfEuQesMYXRww0K/D5IS31Yo0QhuKGTps= -github.com/pulumi/pulumi/pkg/v3 v3.17.1-0.20211103234737-a46dc02e013c/go.mod h1:tWkGLs8Xxo0I4CU5FK+FOuwvEeREbcRk46dtT6sE+rE= +github.com/pulumi/pulumi/pkg/v3 v3.17.1-0.20211109050240-8bb56afef977 h1:CSZSlXWzbdUi60GdV9TPKZOgRoIMvP8MzVY9Ahf6Ejk= +github.com/pulumi/pulumi/pkg/v3 v3.17.1-0.20211109050240-8bb56afef977/go.mod h1:cqMzfxnyy3h/fzN6aN0LnERXEVmKECFGP94Wd6g2oqU= github.com/pulumi/pulumi/sdk/v3 v3.16.0/go.mod h1:252ou/zAU1g6E8iTwe2Y9ht7pb5BDl2fJlOuAgZCHiA= github.com/pulumi/pulumi/sdk/v3 v3.17.0 h1:CxdgdmFEvo99JviXP6d332Y2AyAIPbLI6fu4K33vhAg= github.com/pulumi/pulumi/sdk/v3 v3.17.0/go.mod h1:252ou/zAU1g6E8iTwe2Y9ht7pb5BDl2fJlOuAgZCHiA= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rjeczalik/notify v0.9.2 h1:MiTWrPj55mNDHEiIX5YUSKefw/+lCQVoAFmD6oQm5w8= github.com/rjeczalik/notify v0.9.2/go.mod h1:aErll2f0sUX9PXZnVNyeiObbmTlk5jnMoCa4QEjJeqM= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=