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&lt;string, object&gt; LoadBalancerToClusterIP(ImmutableDictionary&lt;string, object&gt; obj, CustomResourceOptions opts)\n        {\n            if ((string)obj[\"kind\"] == \"Service\" &amp;&amp; (string)obj[\"apiVersion\"] == \"v1\")\n            {\n                var spec = (ImmutableDictionary&lt;string, object&gt;)obj[\"spec\"];\n                if (spec != null &amp;&amp; (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&lt;string, object&gt; ResourceAlias(ImmutableDictionary&lt;string, object&gt; obj, CustomResourceOptions opts)\n        {\n            if ((string)obj[\"kind\"] == \"Deployment\")\n            {\n                opts.Aliases = new List&lt;Input&lt;Alias&gt;&gt; { 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&lt;string, object&gt; OmitTestPod(ImmutableDictionary&lt;string, object&gt; obj, CustomResourceOptions opts)\n        {\n            var metadata = (ImmutableDictionary&lt;string, object&gt;)obj[\"metadata\"];\n            if ((string)obj[\"kind\"] == \"Pod\" &amp;&amp; (string)metadata[\"name\"] == \"test\")\n            {\n                return new Dictionary&lt;string, object&gt;\n                {\n                    [\"apiVersion\"] = \"v1\",\n                    [\"kind\"] = \"List\",\n                    [\"items\"] = new Dictionary&lt;string, object&gt;(),\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&lt;string, object&gt; LoadBalancerToClusterIP(ImmutableDictionary&lt;string, object&gt; obj, CustomResourceOptions opts)
+        {
+            if ((string)obj["kind"] == "Service" &amp;&amp; (string)obj["apiVersion"] == "v1")
+            {
+                var spec = (ImmutableDictionary&lt;string, object&gt;)obj["spec"];
+                if (spec != null &amp;&amp; (string)spec["type"] == "LoadBalancer")
+                {
+                    return obj.SetItem("spec", spec.SetItem("type", "ClusterIP"));
+                }
+            }
+
+            return obj;
+        }
+
+        // Set a resource alias for a previous name.
+        ImmutableDictionary&lt;string, object&gt; ResourceAlias(ImmutableDictionary&lt;string, object&gt; obj, CustomResourceOptions opts)
+        {
+            if ((string)obj["kind"] == "Deployment")
+            {
+                opts.Aliases = new List&lt;Input&lt;Alias&gt;&gt; { new Alias { Name = "oldName" } };
+            }
+
+            return obj;
+        }
+
+        // Omit a resource from the Chart by transforming the specified resource definition to an empty List.
+        ImmutableDictionary&lt;string, object&gt; OmitTestPod(ImmutableDictionary&lt;string, object&gt; obj, CustomResourceOptions opts)
+        {
+            var metadata = (ImmutableDictionary&lt;string, object&gt;)obj["metadata"];
+            if ((string)obj["kind"] == "Pod" &amp;&amp; (string)metadata["name"] == "test")
+            {
+                return new Dictionary&lt;string, object&gt;
+                {
+                    ["apiVersion"] = "v1",
+                    ["kind"] = "List",
+                    ["items"] = new Dictionary&lt;string, object&gt;(),
+                }.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 '&gt;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 '&gt;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=