Google Cloud (GCP) Classic

Pulumi Official
Package maintained by Pulumi
v6.32.0 published on Wednesday, Jul 20, 2022 by Pulumi

Feature

Import

Feature can be imported using any of these accepted formats

 $ pulumi import gcp:gkehub/feature:Feature default projects/{{project}}/locations/{{location}}/features/{{name}}
 $ pulumi import gcp:gkehub/feature:Feature default {{project}}/{{location}}/{{name}}
 $ pulumi import gcp:gkehub/feature:Feature default {{location}}/{{name}}

Example Usage

Multi Cluster Ingress

using Pulumi;
using Gcp = Pulumi.Gcp;

class MyStack : Stack
{
    public MyStack()
    {
        var cluster = new Gcp.Container.Cluster("cluster", new Gcp.Container.ClusterArgs
        {
            Location = "us-central1-a",
            InitialNodeCount = 1,
        }, new CustomResourceOptions
        {
            Provider = google_beta,
        });
        var membership = new Gcp.GkeHub.Membership("membership", new Gcp.GkeHub.MembershipArgs
        {
            MembershipId = "my-membership",
            Endpoint = new Gcp.GkeHub.Inputs.MembershipEndpointArgs
            {
                GkeCluster = new Gcp.GkeHub.Inputs.MembershipEndpointGkeClusterArgs
                {
                    ResourceLink = cluster.Id.Apply(id => $"//container.googleapis.com/{id}"),
                },
            },
            Description = "Membership",
        }, new CustomResourceOptions
        {
            Provider = google_beta,
        });
        var feature = new Gcp.GkeHub.Feature("feature", new Gcp.GkeHub.FeatureArgs
        {
            Location = "global",
            Spec = new Gcp.GkeHub.Inputs.FeatureSpecArgs
            {
                Multiclusteringress = new Gcp.GkeHub.Inputs.FeatureSpecMulticlusteringressArgs
                {
                    ConfigMembership = membership.Id,
                },
            },
        }, new CustomResourceOptions
        {
            Provider = google_beta,
        });
    }

}
package main

import (
	"fmt"

	"github.com/pulumi/pulumi-gcp/sdk/v6/go/gcp/container"
	"github.com/pulumi/pulumi-gcp/sdk/v6/go/gcp/gkehub"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		cluster, err := container.NewCluster(ctx, "cluster", &container.ClusterArgs{
			Location:         pulumi.String("us-central1-a"),
			InitialNodeCount: pulumi.Int(1),
		}, pulumi.Provider(google_beta))
		if err != nil {
			return err
		}
		membership, err := gkehub.NewMembership(ctx, "membership", &gkehub.MembershipArgs{
			MembershipId: pulumi.String("my-membership"),
			Endpoint: &gkehub.MembershipEndpointArgs{
				GkeCluster: &gkehub.MembershipEndpointGkeClusterArgs{
					ResourceLink: cluster.ID().ApplyT(func(id string) (string, error) {
						return fmt.Sprintf("%v%v", "//container.googleapis.com/", id), nil
					}).(pulumi.StringOutput),
				},
			},
			Description: pulumi.String("Membership"),
		}, pulumi.Provider(google_beta))
		if err != nil {
			return err
		}
		_, err = gkehub.NewFeature(ctx, "feature", &gkehub.FeatureArgs{
			Location: pulumi.String("global"),
			Spec: &gkehub.FeatureSpecArgs{
				Multiclusteringress: &gkehub.FeatureSpecMulticlusteringressArgs{
					ConfigMembership: membership.ID(),
				},
			},
		}, pulumi.Provider(google_beta))
		if err != nil {
			return err
		}
		return nil
	})
}
package generated_program;

import java.util.*;
import java.io.*;
import java.nio.*;
import com.pulumi.*;
import com.pulumi.resources.CustomResourceOptions;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var cluster = new Cluster("cluster", ClusterArgs.builder()        
            .location("us-central1-a")
            .initialNodeCount(1)
            .build(), CustomResourceOptions.builder()
                .provider(google_beta)
                .build());

        var membership = new Membership("membership", MembershipArgs.builder()        
            .membershipId("my-membership")
            .endpoint(MembershipEndpointArgs.builder()
                .gkeCluster(MembershipEndpointGkeClusterArgs.builder()
                    .resourceLink(cluster.id().apply(id -> String.format("//container.googleapis.com/%s", id)))
                    .build())
                .build())
            .description("Membership")
            .build(), CustomResourceOptions.builder()
                .provider(google_beta)
                .build());

        var feature = new Feature("feature", FeatureArgs.builder()        
            .location("global")
            .spec(FeatureSpecArgs.builder()
                .multiclusteringress(FeatureSpecMulticlusteringressArgs.builder()
                    .configMembership(membership.id())
                    .build())
                .build())
            .build(), CustomResourceOptions.builder()
                .provider(google_beta)
                .build());

    }
}
import pulumi
import pulumi_gcp as gcp

cluster = gcp.container.Cluster("cluster",
    location="us-central1-a",
    initial_node_count=1,
    opts=pulumi.ResourceOptions(provider=google_beta))
membership = gcp.gkehub.Membership("membership",
    membership_id="my-membership",
    endpoint=gcp.gkehub.MembershipEndpointArgs(
        gke_cluster=gcp.gkehub.MembershipEndpointGkeClusterArgs(
            resource_link=cluster.id.apply(lambda id: f"//container.googleapis.com/{id}"),
        ),
    ),
    description="Membership",
    opts=pulumi.ResourceOptions(provider=google_beta))
feature = gcp.gkehub.Feature("feature",
    location="global",
    spec=gcp.gkehub.FeatureSpecArgs(
        multiclusteringress=gcp.gkehub.FeatureSpecMulticlusteringressArgs(
            config_membership=membership.id,
        ),
    ),
    opts=pulumi.ResourceOptions(provider=google_beta))
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";

const cluster = new gcp.container.Cluster("cluster", {
    location: "us-central1-a",
    initialNodeCount: 1,
}, {
    provider: google_beta,
});
const membership = new gcp.gkehub.Membership("membership", {
    membershipId: "my-membership",
    endpoint: {
        gkeCluster: {
            resourceLink: pulumi.interpolate`//container.googleapis.com/${cluster.id}`,
        },
    },
    description: "Membership",
}, {
    provider: google_beta,
});
const feature = new gcp.gkehub.Feature("feature", {
    location: "global",
    spec: {
        multiclusteringress: {
            configMembership: membership.id,
        },
    },
}, {
    provider: google_beta,
});
resources:
  cluster:
    type: gcp:container:Cluster
    properties:
      location: us-central1-a
      initialNodeCount: 1
    options:
      provider: ${["google-beta"]}
  membership:
    type: gcp:gkehub:Membership
    properties:
      membershipId: my-membership
      endpoint:
        gkeCluster:
          resourceLink: //container.googleapis.com/${cluster.id}
      description: Membership
    options:
      provider: ${["google-beta"]}
  feature:
    type: gcp:gkehub:Feature
    properties:
      location: global
      spec:
        multiclusteringress:
          configMembership: ${membership.id}
    options:
      provider: ${["google-beta"]}

Multi Cluster Service Discovery

using Pulumi;
using Gcp = Pulumi.Gcp;

class MyStack : Stack
{
    public MyStack()
    {
        var feature = new Gcp.GkeHub.Feature("feature", new Gcp.GkeHub.FeatureArgs
        {
            Location = "global",
            Labels = 
            {
                { "foo", "bar" },
            },
        }, new CustomResourceOptions
        {
            Provider = google_beta,
        });
    }

}
package main

import (
	"github.com/pulumi/pulumi-gcp/sdk/v6/go/gcp/gkehub"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := gkehub.NewFeature(ctx, "feature", &gkehub.FeatureArgs{
			Location: pulumi.String("global"),
			Labels: pulumi.StringMap{
				"foo": pulumi.String("bar"),
			},
		}, pulumi.Provider(google_beta))
		if err != nil {
			return err
		}
		return nil
	})
}
package generated_program;

import java.util.*;
import java.io.*;
import java.nio.*;
import com.pulumi.*;
import com.pulumi.resources.CustomResourceOptions;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var feature = new Feature("feature", FeatureArgs.builder()        
            .location("global")
            .labels(Map.of("foo", "bar"))
            .build(), CustomResourceOptions.builder()
                .provider(google_beta)
                .build());

    }
}
import pulumi
import pulumi_gcp as gcp

feature = gcp.gkehub.Feature("feature",
    location="global",
    labels={
        "foo": "bar",
    },
    opts=pulumi.ResourceOptions(provider=google_beta))
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";

const feature = new gcp.gkehub.Feature("feature", {
    location: "global",
    labels: {
        foo: "bar",
    },
}, {
    provider: google_beta,
});
resources:
  feature:
    type: gcp:gkehub:Feature
    properties:
      location: global
      labels:
        foo: bar
    options:
      provider: ${["google-beta"]}

Enable Anthos Service Mesh

using Pulumi;
using Gcp = Pulumi.Gcp;

class MyStack : Stack
{
    public MyStack()
    {
        var feature = new Gcp.GkeHub.Feature("feature", new Gcp.GkeHub.FeatureArgs
        {
            Location = "global",
        }, new CustomResourceOptions
        {
            Provider = google_beta,
        });
    }

}
package main

import (
	"github.com/pulumi/pulumi-gcp/sdk/v6/go/gcp/gkehub"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := gkehub.NewFeature(ctx, "feature", &gkehub.FeatureArgs{
			Location: pulumi.String("global"),
		}, pulumi.Provider(google_beta))
		if err != nil {
			return err
		}
		return nil
	})
}
package generated_program;

import java.util.*;
import java.io.*;
import java.nio.*;
import com.pulumi.*;
import com.pulumi.resources.CustomResourceOptions;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var feature = new Feature("feature", FeatureArgs.builder()        
            .location("global")
            .build(), CustomResourceOptions.builder()
                .provider(google_beta)
                .build());

    }
}
import pulumi
import pulumi_gcp as gcp

feature = gcp.gkehub.Feature("feature", location="global",
opts=pulumi.ResourceOptions(provider=google_beta))
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";

const feature = new gcp.gkehub.Feature("feature", {location: "global"}, {
    provider: google_beta,
});
resources:
  feature:
    type: gcp:gkehub:Feature
    properties:
      location: global
    options:
      provider: ${["google-beta"]}

Create a Feature Resource

new Feature(name: string, args: FeatureArgs, opts?: CustomResourceOptions);
@overload
def Feature(resource_name: str,
            opts: Optional[ResourceOptions] = None,
            labels: Optional[Mapping[str, str]] = None,
            location: Optional[str] = None,
            name: Optional[str] = None,
            project: Optional[str] = None,
            spec: Optional[FeatureSpecArgs] = None)
@overload
def Feature(resource_name: str,
            args: FeatureArgs,
            opts: Optional[ResourceOptions] = None)
func NewFeature(ctx *Context, name string, args FeatureArgs, opts ...ResourceOption) (*Feature, error)
public Feature(string name, FeatureArgs args, CustomResourceOptions? opts = null)
public Feature(String name, FeatureArgs args)
public Feature(String name, FeatureArgs args, CustomResourceOptions options)
type: gcp:gkehub:Feature
properties: # The arguments to resource properties.
options: # Bag of options to control resource's behavior.

name string
The unique name of the resource.
args FeatureArgs
The arguments to resource properties.
opts CustomResourceOptions
Bag of options to control resource's behavior.
resource_name str
The unique name of the resource.
args FeatureArgs
The arguments to resource properties.
opts ResourceOptions
Bag of options to control resource's behavior.
ctx Context
Context object for the current deployment.
name string
The unique name of the resource.
args FeatureArgs
The arguments to resource properties.
opts ResourceOption
Bag of options to control resource's behavior.
name string
The unique name of the resource.
args FeatureArgs
The arguments to resource properties.
opts CustomResourceOptions
Bag of options to control resource's behavior.
name String
The unique name of the resource.
args FeatureArgs
The arguments to resource properties.
options CustomResourceOptions
Bag of options to control resource's behavior.

Feature Resource Properties

To learn more about resource properties and how to use them, see Inputs and Outputs in the Architecture and Concepts docs.

Inputs

The Feature resource accepts the following input properties:

Location string

The location for the resource

Labels Dictionary<string, string>

GCP labels for this Feature.

Name string

The full, unique name of this Feature resource

Project string

The project for the resource

Spec FeatureSpecArgs

Optional. Hub-wide Feature configuration. If this Feature does not support any Hub-wide configuration, this field may be unused.

Location string

The location for the resource

Labels map[string]string

GCP labels for this Feature.

Name string

The full, unique name of this Feature resource

Project string

The project for the resource

Spec FeatureSpecArgs

Optional. Hub-wide Feature configuration. If this Feature does not support any Hub-wide configuration, this field may be unused.

location String

The location for the resource

labels Map<String,String>

GCP labels for this Feature.

name String

The full, unique name of this Feature resource

project String

The project for the resource

spec FeatureSpecArgs

Optional. Hub-wide Feature configuration. If this Feature does not support any Hub-wide configuration, this field may be unused.

location string

The location for the resource

labels {[key: string]: string}

GCP labels for this Feature.

name string

The full, unique name of this Feature resource

project string

The project for the resource

spec FeatureSpecArgs

Optional. Hub-wide Feature configuration. If this Feature does not support any Hub-wide configuration, this field may be unused.

location str

The location for the resource

labels Mapping[str, str]

GCP labels for this Feature.

name str

The full, unique name of this Feature resource

project str

The project for the resource

spec FeatureSpecArgs

Optional. Hub-wide Feature configuration. If this Feature does not support any Hub-wide configuration, this field may be unused.

location String

The location for the resource

labels Map<String>

GCP labels for this Feature.

name String

The full, unique name of this Feature resource

project String

The project for the resource

spec Property Map

Optional. Hub-wide Feature configuration. If this Feature does not support any Hub-wide configuration, this field may be unused.

Outputs

All input properties are implicitly available as output properties. Additionally, the Feature resource produces the following output properties:

CreateTime string

Output only. When the Feature resource was created.

DeleteTime string

Output only. When the Feature resource was deleted.

Id string

The provider-assigned unique ID for this managed resource.

ResourceStates List<FeatureResourceState>

State of the Feature resource itself.

States List<FeatureState>

Output only. The Hub-wide Feature state

UpdateTime string

Output only. When the Feature resource was last updated.

CreateTime string

Output only. When the Feature resource was created.

DeleteTime string

Output only. When the Feature resource was deleted.

Id string

The provider-assigned unique ID for this managed resource.

ResourceStates []FeatureResourceState

State of the Feature resource itself.

States []FeatureStateType

Output only. The Hub-wide Feature state

UpdateTime string

Output only. When the Feature resource was last updated.

createTime String

Output only. When the Feature resource was created.

deleteTime String

Output only. When the Feature resource was deleted.

id String

The provider-assigned unique ID for this managed resource.

resourceStates List<FeatureResourceState>

State of the Feature resource itself.

states List<FeatureState>

Output only. The Hub-wide Feature state

updateTime String

Output only. When the Feature resource was last updated.

createTime string

Output only. When the Feature resource was created.

deleteTime string

Output only. When the Feature resource was deleted.

id string

The provider-assigned unique ID for this managed resource.

resourceStates FeatureResourceState[]

State of the Feature resource itself.

states FeatureState[]

Output only. The Hub-wide Feature state

updateTime string

Output only. When the Feature resource was last updated.

create_time str

Output only. When the Feature resource was created.

delete_time str

Output only. When the Feature resource was deleted.

id str

The provider-assigned unique ID for this managed resource.

resource_states Sequence[FeatureResourceState]

State of the Feature resource itself.

states Sequence[FeatureState]

Output only. The Hub-wide Feature state

update_time str

Output only. When the Feature resource was last updated.

createTime String

Output only. When the Feature resource was created.

deleteTime String

Output only. When the Feature resource was deleted.

id String

The provider-assigned unique ID for this managed resource.

resourceStates List<Property Map>

State of the Feature resource itself.

states List<Property Map>

Output only. The Hub-wide Feature state

updateTime String

Output only. When the Feature resource was last updated.

Look up an Existing Feature Resource

Get an existing Feature resource’s state with the given name, ID, and optional extra properties used to qualify the lookup.

public static get(name: string, id: Input<ID>, state?: FeatureState, opts?: CustomResourceOptions): Feature
@staticmethod
def get(resource_name: str,
        id: str,
        opts: Optional[ResourceOptions] = None,
        create_time: Optional[str] = None,
        delete_time: Optional[str] = None,
        labels: Optional[Mapping[str, str]] = None,
        location: Optional[str] = None,
        name: Optional[str] = None,
        project: Optional[str] = None,
        resource_states: Optional[Sequence[FeatureResourceStateArgs]] = None,
        spec: Optional[FeatureSpecArgs] = None,
        states: Optional[Sequence[FeatureStateArgs]] = None,
        update_time: Optional[str] = None) -> Feature
func GetFeature(ctx *Context, name string, id IDInput, state *FeatureState, opts ...ResourceOption) (*Feature, error)
public static Feature Get(string name, Input<string> id, FeatureState? state, CustomResourceOptions? opts = null)
public static Feature get(String name, Output<String> id, FeatureState state, CustomResourceOptions options)
Resource lookup is not supported in YAML
name
The unique name of the resulting resource.
id
The unique provider ID of the resource to lookup.
state
Any extra arguments used during the lookup.
opts
A bag of options that control this resource's behavior.
resource_name
The unique name of the resulting resource.
id
The unique provider ID of the resource to lookup.
name
The unique name of the resulting resource.
id
The unique provider ID of the resource to lookup.
state
Any extra arguments used during the lookup.
opts
A bag of options that control this resource's behavior.
name
The unique name of the resulting resource.
id
The unique provider ID of the resource to lookup.
state
Any extra arguments used during the lookup.
opts
A bag of options that control this resource's behavior.
name
The unique name of the resulting resource.
id
The unique provider ID of the resource to lookup.
state
Any extra arguments used during the lookup.
opts
A bag of options that control this resource's behavior.
The following state arguments are supported:
CreateTime string

Output only. When the Feature resource was created.

DeleteTime string

Output only. When the Feature resource was deleted.

Labels Dictionary<string, string>

GCP labels for this Feature.

Location string

The location for the resource

Name string

The full, unique name of this Feature resource

Project string

The project for the resource

ResourceStates List<FeatureResourceStateArgs>

State of the Feature resource itself.

Spec FeatureSpecArgs

Optional. Hub-wide Feature configuration. If this Feature does not support any Hub-wide configuration, this field may be unused.

States List<FeatureStateArgs>

Output only. The Hub-wide Feature state

UpdateTime string

Output only. When the Feature resource was last updated.

CreateTime string

Output only. When the Feature resource was created.

DeleteTime string

Output only. When the Feature resource was deleted.

Labels map[string]string

GCP labels for this Feature.

Location string

The location for the resource

Name string

The full, unique name of this Feature resource

Project string

The project for the resource

ResourceStates []FeatureResourceStateArgs

State of the Feature resource itself.

Spec FeatureSpecArgs

Optional. Hub-wide Feature configuration. If this Feature does not support any Hub-wide configuration, this field may be unused.

States []FeatureStateTypeArgs

Output only. The Hub-wide Feature state

UpdateTime string

Output only. When the Feature resource was last updated.

createTime String

Output only. When the Feature resource was created.

deleteTime String

Output only. When the Feature resource was deleted.

labels Map<String,String>

GCP labels for this Feature.

location String

The location for the resource

name String

The full, unique name of this Feature resource

project String

The project for the resource

resourceStates List<FeatureResourceStateArgs>

State of the Feature resource itself.

spec FeatureSpecArgs

Optional. Hub-wide Feature configuration. If this Feature does not support any Hub-wide configuration, this field may be unused.

states List<FeatureStateArgs>

Output only. The Hub-wide Feature state

updateTime String

Output only. When the Feature resource was last updated.

createTime string

Output only. When the Feature resource was created.

deleteTime string

Output only. When the Feature resource was deleted.

labels {[key: string]: string}

GCP labels for this Feature.

location string

The location for the resource

name string

The full, unique name of this Feature resource

project string

The project for the resource

resourceStates FeatureResourceStateArgs[]

State of the Feature resource itself.

spec FeatureSpecArgs

Optional. Hub-wide Feature configuration. If this Feature does not support any Hub-wide configuration, this field may be unused.

states FeatureStateArgs[]

Output only. The Hub-wide Feature state

updateTime string

Output only. When the Feature resource was last updated.

create_time str

Output only. When the Feature resource was created.

delete_time str

Output only. When the Feature resource was deleted.

labels Mapping[str, str]

GCP labels for this Feature.

location str

The location for the resource

name str

The full, unique name of this Feature resource

project str

The project for the resource

resource_states Sequence[FeatureResourceStateArgs]

State of the Feature resource itself.

spec FeatureSpecArgs

Optional. Hub-wide Feature configuration. If this Feature does not support any Hub-wide configuration, this field may be unused.

states Sequence[FeatureStateArgs]

Output only. The Hub-wide Feature state

update_time str

Output only. When the Feature resource was last updated.

createTime String

Output only. When the Feature resource was created.

deleteTime String

Output only. When the Feature resource was deleted.

labels Map<String>

GCP labels for this Feature.

location String

The location for the resource

name String

The full, unique name of this Feature resource

project String

The project for the resource

resourceStates List<Property Map>

State of the Feature resource itself.

spec Property Map

Optional. Hub-wide Feature configuration. If this Feature does not support any Hub-wide configuration, this field may be unused.

states List<Property Map>

Output only. The Hub-wide Feature state

updateTime String

Output only. When the Feature resource was last updated.

Supporting Types

FeatureResourceState

HasResources bool
State string
HasResources bool
State string
hasResources Boolean
state String
hasResources boolean
state string
hasResources Boolean
state String

FeatureSpec

Multiclusteringress FeatureSpecMulticlusteringress

Multicluster Ingress-specific spec. The multiclusteringress block supports:

Multiclusteringress FeatureSpecMulticlusteringress

Multicluster Ingress-specific spec. The multiclusteringress block supports:

multiclusteringress FeatureSpecMulticlusteringress

Multicluster Ingress-specific spec. The multiclusteringress block supports:

multiclusteringress FeatureSpecMulticlusteringress

Multicluster Ingress-specific spec. The multiclusteringress block supports:

multiclusteringress FeatureSpecMulticlusteringress

Multicluster Ingress-specific spec. The multiclusteringress block supports:

multiclusteringress Property Map

Multicluster Ingress-specific spec. The multiclusteringress block supports:

FeatureSpecMulticlusteringress

ConfigMembership string

Fully-qualified Membership name which hosts the MultiClusterIngress CRD. Example: projects/foo-proj/locations/global/memberships/bar

ConfigMembership string

Fully-qualified Membership name which hosts the MultiClusterIngress CRD. Example: projects/foo-proj/locations/global/memberships/bar

configMembership String

Fully-qualified Membership name which hosts the MultiClusterIngress CRD. Example: projects/foo-proj/locations/global/memberships/bar

configMembership string

Fully-qualified Membership name which hosts the MultiClusterIngress CRD. Example: projects/foo-proj/locations/global/memberships/bar

config_membership str

Fully-qualified Membership name which hosts the MultiClusterIngress CRD. Example: projects/foo-proj/locations/global/memberships/bar

configMembership String

Fully-qualified Membership name which hosts the MultiClusterIngress CRD. Example: projects/foo-proj/locations/global/memberships/bar

FeatureState

FeatureStateState

Code string
Description string
UpdateTime string
Code string
Description string
UpdateTime string
code String
description String
updateTime String
code string
description string
updateTime string
code String
description String
updateTime String

Package Details

Repository
https://github.com/pulumi/pulumi-gcp
License
Apache-2.0
Notes

This Pulumi package is based on the google-beta Terraform Provider.