From 11fcf6e08502f3551758c924a4074ebead2ecfaf Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 10:10:54 -0500 Subject: [PATCH 01/25] chore: lint Go code under pkg/gen --- schemagen/pkg/gen/cloudtrail.go | 10 +- schemagen/pkg/gen/ec2.go | 185 +++++++++++++++++++------------- schemagen/pkg/gen/ecr.go | 83 ++++++++++---- schemagen/pkg/gen/ecsx.go | 118 ++++++++++++++------ schemagen/pkg/gen/iam.go | 10 +- schemagen/pkg/gen/lb.go | 40 +++---- 6 files changed, 297 insertions(+), 149 deletions(-) diff --git a/schemagen/pkg/gen/cloudtrail.go b/schemagen/pkg/gen/cloudtrail.go index d88d67c67..a3310f0a1 100644 --- a/schemagen/pkg/gen/cloudtrail.go +++ b/schemagen/pkg/gen/cloudtrail.go @@ -99,7 +99,11 @@ func generateCloudtrail(awsSpec schema.PackageSpec) schema.PackageSpec { }, }, "retentionInDays": { - Description: "Specifies the number of days you want to retain log events in the specified log group. Possible values are: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653, and 0. If you select 0, the events in the log group are always retained and never expire.", + Description: "Specifies the number of days you want to retain log events " + + "in the specified log group. Possible values are: 1, 3, 5, 7, " + + "14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 36" + + "53, and 0. If you select 0, the events in the log group are " + + "always retained and never expire.", TypeSpec: schema.TypeSpec{ Type: "integer", }, @@ -109,7 +113,9 @@ func generateCloudtrail(awsSpec schema.PackageSpec) schema.PackageSpec { Type: "object", AdditionalProperties: &schema.TypeSpec{Type: "string"}, }, - Description: "A map of tags to assign to the resource. If configured with provider defaultTags present, tags with matching keys will overwrite those defined at the provider-level.", + Description: "A map of tags to assign to the resource. If configured with " + + "provider defaultTags present, tags with matching keys will " + + "overwrite those defined at the provider-level.", }, }, }, diff --git a/schemagen/pkg/gen/ec2.go b/schemagen/pkg/gen/ec2.go index 35aa85260..3054ef474 100644 --- a/schemagen/pkg/gen/ec2.go +++ b/schemagen/pkg/gen/ec2.go @@ -15,10 +15,12 @@ package gen import ( - _ "embed" "fmt" "strings" + // revive:disable-next-line:blank-imports + _ "embed" + "github.com/pulumi/pulumi/pkg/v3/codegen/schema" ) @@ -50,11 +52,12 @@ const ( availabilityZoneNames = "availabilityZoneNames" ) -func defaultSecurityGroupArgs(awsSpec schema.PackageSpec) schema.ComplexTypeSpec { +func defaultSecurityGroupArgs(_ schema.PackageSpec) schema.ComplexTypeSpec { return schema.ComplexTypeSpec{ ObjectTypeSpec: schema.ObjectTypeSpec{ - Type: "object", - Description: "Security Group with default setup unless explicitly skipped or an existing security group id provided.", + Type: "object", + Description: "Security Group with default setup unless explicitly skipped " + + "or an existing security group id provided.", Properties: map[string]schema.PropertySpec{ "skip": { Description: "Skips creation of the security group if set to `true`.", @@ -64,7 +67,9 @@ func defaultSecurityGroupArgs(awsSpec schema.PackageSpec) schema.ComplexTypeSpec }, }, "securityGroupId": { - Description: "Id of existing security group to use instead of creating a new security group. Cannot be used in combination with `args` or `opts`.", + Description: "Id of existing security group to use instead of creating a " + + "new security group. Cannot be used in combination with `args` " + + "or `opts`.", TypeSpec: schema.TypeSpec{ Type: "string", }, @@ -100,23 +105,32 @@ func vpcResource(awsSpec schema.PackageSpec) schema.ResourceSpec { awsVpcResource := awsSpec.Resources["aws:ec2/vpc:Vpc"] inputProperties := map[string]schema.PropertySpec{ availabilityZoneNames: { - Description: fmt.Sprintf("A list of availability zone names to which the subnets defined in %v will be deployed. Optional, defaults to the first 3 AZs in the current region.", subnetSpecs), - TypeSpec: plainArrayOfPlainStrings(), + Description: fmt.Sprintf("A list of availability zone names to which the subnets "+ + "defined in %v will be deployed. Optional, defaults to the first "+ + "3 AZs in the current region.", subnetSpecs), + TypeSpec: plainArrayOfPlainStrings(), }, "numberOfAvailabilityZones": { - Description: fmt.Sprintf("A number of availability zones to which the subnets defined in %v will be deployed. Optional, defaults to the first 3 AZs in the current region.", subnetSpecs), - TypeSpec: plainInt(), + Description: fmt.Sprintf("A number of availability zones to which the subnets defined "+ + "in %v will be deployed. Optional, defaults to the first 3 AZs "+ + "in the current region.", subnetSpecs), + TypeSpec: plainInt(), }, "availabilityZoneCidrMask": { - Description: "The netmask for each available zone to be aligned to. This is optional, the default value is inferred based on an even distribution of available space from the VPC's CIDR block after being divided evenly by the number of availability zones.", - TypeSpec: plainInt(), + Description: "The netmask for each available zone to be aligned to. This " + + "is optional, the default value is inferred based on an even " + + "distribution of available space from the VPC's CIDR block after " + + "being divided evenly by the number of availability zones.", + TypeSpec: plainInt(), }, "cidrBlock": { Description: "The CIDR block for the VPC. Optional. Defaults to 10.0.0.0/16.", TypeSpec: plainString(), }, "natGateways": { - Description: "Configuration for NAT Gateways. Optional. If private and public subnets are both specified, defaults to one gateway per availability zone. Otherwise, no gateways will be created.", + Description: "Configuration for NAT Gateways. Optional. If private and public " + + "subnets are both specified, defaults to one gateway per " + + "availability zone. Otherwise, no gateways will be created.", TypeSpec: schema.TypeSpec{ Ref: localRef("ec2", "NatGatewayConfiguration"), Plain: true, @@ -130,8 +144,13 @@ func vpcResource(awsSpec schema.PackageSpec) schema.ResourceSpec { }, }, subnetSpecs: { - Description: fmt.Sprintf("A list of subnet specs that should be deployed to each AZ specified in %s. Optional. Defaults to a (smaller) public subnet and a (larger) private subnet based on the size of the CIDR block for the VPC. Private subnets are allocated CIDR block ranges first, followed by Public subnets, and Isolated subnets are allocated last.", availabilityZoneNames), - TypeSpec: plainArrayOfPlainComplexType("SubnetSpec"), + Description: fmt.Sprintf("A list of subnet specs that should be deployed to each AZ "+ + "specified in %s. Optional. Defaults to a (smaller) public subnet "+ + "and a (larger) private subnet based on the size of the CIDR "+ + "block for the VPC. Private subnets are allocated CIDR block "+ + "ranges first, followed by Public subnets, and Isolated subnets "+ + "are allocated last.", availabilityZoneNames), + TypeSpec: plainArrayOfPlainComplexType("SubnetSpec"), }, "vpcEndpointSpecs": { Description: "A list of VPC Endpoints specs to be deployed as part of the VPC", @@ -156,7 +175,7 @@ func vpcResource(awsSpec schema.PackageSpec) schema.ResourceSpec { Properties: map[string]schema.PropertySpec{ "vpc": { Description: "The VPC.", - TypeSpec: awsType(awsSpec, "ec2", "vpc"), + TypeSpec: awsResource(awsSpec, "aws:ec2/vpc:Vpc"), Language: map[string]schema.RawMessage{ "csharp": schema.RawMessage(`{ "name": "AwsVpc" @@ -165,35 +184,37 @@ func vpcResource(awsSpec schema.PackageSpec) schema.ResourceSpec { }, "vpcEndpoints": { Description: "The VPC Endpoints that are enabled", - TypeSpec: arrayOfAwsType(awsSpec, "ec2", "vpcEndpoint"), + TypeSpec: arrayOfAwsResource(awsSpec, "aws:ec2/vpcEndpoint:VpcEndpoint"), }, "subnets": { Description: "The VPC's subnets.", - TypeSpec: arrayOfAwsType(awsSpec, "ec2", "subnet"), + TypeSpec: arrayOfAwsResource(awsSpec, "aws:ec2/subnet:Subnet"), }, "routeTables": { Description: "The Route Tables for the VPC.", - TypeSpec: arrayOfAwsType(awsSpec, "ec2", "routeTable"), + TypeSpec: arrayOfAwsResource(awsSpec, "aws:ec2/routeTable:RouteTable"), }, "routeTableAssociations": { Description: "The Route Table Associations for the VPC.", - TypeSpec: arrayOfAwsType(awsSpec, "ec2", "routeTableAssociation"), + TypeSpec: arrayOfAwsResource(awsSpec, + "aws:ec2/routeTableAssociation:RouteTableAssociation"), }, "routes": { Description: "The Routes for the VPC.", - TypeSpec: arrayOfAwsType(awsSpec, "ec2", "route"), + TypeSpec: arrayOfAwsResource(awsSpec, "aws:ec2/route:Route"), }, "internetGateway": { Description: "The Internet Gateway for the VPC.", - TypeSpec: awsType(awsSpec, "ec2", "internetGateway"), + TypeSpec: awsResource(awsSpec, "aws:ec2/internetGateway:InternetGateway"), }, "natGateways": { Description: "The NAT Gateways for the VPC. If no NAT Gateways are specified, this will be an empty list.", - TypeSpec: arrayOfAwsType(awsSpec, "ec2", "natGateway"), + TypeSpec: arrayOfAwsResource(awsSpec, "aws:ec2/natGateway:NatGateway"), }, "eips": { - Description: "The EIPs for any NAT Gateways for the VPC. If no NAT Gateways are specified, this will be an empty list.", - TypeSpec: arrayOfAwsType(awsSpec, "ec2", "eip"), + Description: "The EIPs for any NAT Gateways for the VPC. If no NAT Gateways " + + "are specified, this will be an empty list.", + TypeSpec: arrayOfAwsResource(awsSpec, "aws:ec2/eip:Eip"), }, "subnetLayout": { Description: "The resolved subnet specs layout deployed to each availability zone.", @@ -241,33 +262,17 @@ func vpcResource(awsSpec schema.PackageSpec) schema.ResourceSpec { } } -func arrayOfAwsType(packageSpec schema.PackageSpec, awsNamespace, resourceNameCamelCase string) schema.TypeSpec { - awsRefInput := fmt.Sprintf( - "#/resources/aws:%s%s%s:%s", - strings.ToLower(awsNamespace), - "%2f", - resourceNameCamelCase, - strings.Title(resourceNameCamelCase), - ) - +func arrayOfAwsResource(packageSpec schema.PackageSpec, resourceToken string) schema.TypeSpec { + items := awsResource(packageSpec, resourceToken) return schema.TypeSpec{ - Type: "array", - Items: &schema.TypeSpec{ - Ref: packageRef(packageSpec, awsRefInput), - }, + Type: "array", + Items: &items, } } -func awsType(packageSpec schema.PackageSpec, awsNamespace, resourceNameCamelCase string) schema.TypeSpec { - awsRefInput := fmt.Sprintf( - "#/resources/aws:%s%s%s:%s", - strings.ToLower(awsNamespace), - "%2f", - resourceNameCamelCase, - strings.Title(resourceNameCamelCase), - ) +func awsResource(packageSpec schema.PackageSpec, resourceToken string) schema.TypeSpec { return schema.TypeSpec{ - Ref: packageRef(packageSpec, awsRefInput), + Ref: packageRef(packageSpec, "#/resources/"+strings.ReplaceAll(resourceToken, "/", "%2f")), } } @@ -278,7 +283,8 @@ func vpcEndpointSpec(awsSpec schema.PackageSpec) schema.ComplexTypeSpec { properties["serviceName"] = schema.PropertySpec{ Description: "The service name. For AWS services the service name is usually in the form " + - "`com.amazonaws..` (the SageMaker Notebook service is an exception to this rule, the " + + "`com.amazonaws..` (the SageMaker Notebook " + + "service is an exception to this rule, the " + "service name is in the form `aws.sagemaker..notebook`).", TypeSpec: schema.TypeSpec{ Type: "string", @@ -333,16 +339,27 @@ func subnetSpecType() schema.ComplexTypeSpec { "cidrMask": { // The validation rules are too difficult to concisely describe here, so we'll leave that job to any // error messages generated from the component itself. - Description: "The netmask for the subnet's CIDR block. This is optional, the default value is inferred from the `cidrMask`, `cidrBlocks` or based on an even distribution of available space from the VPC's CIDR block after being divided evenly by availability zone.", - TypeSpec: plainInt(), + Description: "The netmask for the subnet's CIDR block. This is optional, " + + "the default value is inferred from the `cidrMask`, `cidrBlocks` " + + "or based on an even distribution of available space from " + + "the VPC's CIDR block after being divided evenly by availability zone.", + TypeSpec: plainInt(), }, "cidrBlocks": { - Description: "An optional list of CIDR blocks to assign to the subnet spec for each AZ. If specified, the count must match the number of AZs being used for the VPC, and must also be specified for all other subnet specs.", - TypeSpec: plainArrayOfPlainStrings(), + Description: "An optional list of CIDR blocks to assign to the subnet spec " + + "for each AZ. If specified, the count must match the number " + + "of AZs being used for the VPC, and must also be specified for " + + "all other subnet specs.", + TypeSpec: plainArrayOfPlainStrings(), }, "size": { - Description: "Optional size of the subnet's CIDR block - the number of hosts. This value must be a power of 2 (e.g. 256, 512, 1024, etc.). This is optional, the default value is inferred from the `cidrMask`, `cidrBlocks` or based on an even distribution of available space from the VPC's CIDR block after being divided evenly by availability zone.", - TypeSpec: plainInt(), + Description: "Optional size of the subnet's CIDR block - the number of hosts. " + + "This value must be a power of 2 (e.g. 256, 512, 1024, " + + "etc.). This is optional, the default value is inferred from " + + "the `cidrMask`, `cidrBlocks` or based on an even distribution " + + "of available space from the VPC's CIDR block after being " + + "divided evenly by availability zone.", + TypeSpec: plainInt(), }, "tags": { TypeSpec: schema.TypeSpec{ @@ -376,19 +393,30 @@ func resolvedSubnetSpecType() schema.ComplexTypeSpec { "cidrMask": { // The validation rules are too difficult to concisely describe here, so we'll leave that job to any // error messages generated from the component itself. - Description: "The netmask for the subnet's CIDR block. This is optional, the default value is inferred from the `cidrMask`, `cidrBlocks` or based on an even distribution of available space from the VPC's CIDR block after being divided evenly by availability zone.", - TypeSpec: schema.TypeSpec{Type: "integer"}, + Description: "The netmask for the subnet's CIDR block. This is optional, " + + "the default value is inferred from the `cidrMask`, `cidrBlocks` " + + "or based on an even distribution of available space from " + + "the VPC's CIDR block after being divided evenly by availability zone.", + TypeSpec: schema.TypeSpec{Type: "integer"}, }, "cidrBlocks": { - Description: "An optional list of CIDR blocks to assign to the subnet spec for each AZ. If specified, the count must match the number of AZs being used for the VPC, and must also be specified for all other subnet specs.", + Description: "An optional list of CIDR blocks to assign to the subnet spec " + + "for each AZ. If specified, the count must match the number " + + "of AZs being used for the VPC, and must also be specified " + + "for all other subnet specs.", TypeSpec: schema.TypeSpec{ Type: "array", Items: &schema.TypeSpec{Type: "string"}, }, }, "size": { - Description: "Optional size of the subnet's CIDR block - the number of hosts. This value must be a power of 2 (e.g. 256, 512, 1024, etc.). This is optional, the default value is inferred from the `cidrMask`, `cidrBlocks` or based on an even distribution of available space from the VPC's CIDR block after being divided evenly by availability zone.", - TypeSpec: schema.TypeSpec{Type: "integer"}, + Description: "Optional size of the subnet's CIDR block - the number of hosts. " + + "This value must be a power of 2 (e.g. 256, 512, 1024, etc.). " + + "This is optional, the default value is inferred from the " + + "`cidrMask`, `cidrBlocks` or based on an even distribution " + + "of available space from the VPC's CIDR block after being " + + "divided evenly by availability zone.", + TypeSpec: schema.TypeSpec{Type: "integer"}, }, }, Required: []string{ @@ -410,8 +438,10 @@ func subnetType() schema.ComplexTypeSpec { Description: "A subnet whose hosts can directly communicate with the internet.", }, { - Value: "Private", - Description: "A subnet whose hosts can not directly communicate with the internet, but can initiate outbound network traffic via a NAT Gateway.", + Value: "Private", + Description: "A subnet whose hosts can not directly communicate with the " + + "internet, but can initiate outbound network traffic via a NAT " + + "Gateway.", }, { Value: "Isolated", @@ -462,8 +492,11 @@ func natGatewayConfigurationType() schema.ComplexTypeSpec { }, }, "elasticIpAllocationIds": { - Description: "A list of EIP allocation IDs to assign to the NAT Gateways. Optional. If specified, the number of supplied values must match the chosen strategy (either one, or the number of availability zones).", - TypeSpec: plainArrayOfPulumiStrings(), + Description: "A list of EIP allocation IDs to assign to the NAT Gateways. " + + "Optional. If specified, the number of supplied values must " + + "match the chosen strategy (either one, or the number of " + + "availability zones).", + TypeSpec: plainArrayOfPulumiStrings(), }, }, Required: []string{"strategy"}, @@ -479,26 +512,33 @@ func natGatewayStrategyType() schema.ComplexTypeSpec { }, Enum: []schema.EnumValueSpec{ { - Value: "None", - Description: "Do not create any NAT Gateways. Resources in private subnets will not be able to access the internet.", + Value: "None", + Description: "Do not create any NAT Gateways. Resources in private subnets " + + "will not be able to access the internet.", }, { - Value: "Single", - Description: "Create a single NAT Gateway for the entire VPC. This configuration is not recommended for production infrastructure as it creates a single point of failure.", + Value: "Single", + Description: "Create a single NAT Gateway for the entire VPC. This " + + "configuration is not recommended for production infrastructure as " + + "it creates a single point of failure.", }, { - Value: "OnePerAz", - Description: "Create a NAT Gateway in each availability zone. This is the recommended configuration for production infrastructure.", + Value: "OnePerAz", + Description: "Create a NAT Gateway in each availability zone. This is the " + + "recommended configuration for production infrastructure.", }, }, } } -func defaultVpcResource(spec schema.PackageSpec) schema.ResourceSpec { +func defaultVpcResource(_ schema.PackageSpec) schema.ResourceSpec { return schema.ResourceSpec{ IsComponent: true, ObjectTypeSpec: schema.ObjectTypeSpec{ - Description: "Pseudo resource representing the default VPC and associated subnets for an account and region. This does not create any resources. This will be replaced with `getDefaultVpc` in the future.", + Description: "Pseudo resource representing the default VPC and associated " + + "subnets for an account and region. This does not create any " + + "resources. This will be replaced with `getDefaultVpc` in the " + + "future.", Properties: map[string]schema.PropertySpec{ "vpcId": { Description: "The VPC ID for the default VPC", @@ -530,8 +570,9 @@ func defaultVpcResource(spec schema.PackageSpec) schema.ResourceSpec { func defaultVpcArgs() schema.FunctionSpec { spec := schema.FunctionSpec{ - Description: "[NOT YET IMPLEMENTED] Get the Default VPC for a region.", - DeprecationMessage: "Waiting for https://github.com/pulumi/pulumi/issues/7583. Use the DefaultVpc resource until resolved.", + Description: "[NOT YET IMPLEMENTED] Get the Default VPC for a region.", + DeprecationMessage: "Waiting for https://github.com/pulumi/pulumi/issues/7583. " + + "Use the DefaultVpc resource until resolved.", Inputs: &schema.ObjectTypeSpec{ Description: "Arguments for getting the default VPC", Properties: map[string]schema.PropertySpec{}, diff --git a/schemagen/pkg/gen/ecr.go b/schemagen/pkg/gen/ecr.go index c28fdddd1..09379fc22 100644 --- a/schemagen/pkg/gen/ecr.go +++ b/schemagen/pkg/gen/ecr.go @@ -38,7 +38,10 @@ func repository(awsSpec schema.PackageSpec) schema.ResourceSpec { originalSpec := awsSpec.Resources["aws:ecr/repository:Repository"] inputProperties := renameAwsPropertiesRefs(awsSpec, originalSpec.InputProperties) inputProperties["lifecyclePolicy"] = schema.PropertySpec{ - Description: "A lifecycle policy consists of one or more rules that determine which images in a repository should be expired. If not provided, this will default to untagged images expiring after 1 day.", + Description: "A lifecycle policy consists of one or more rules that determine " + + "which images in a repository should be expired. If not " + + "provided, this will default to untagged images expiring after " + + "1 day.", TypeSpec: schema.TypeSpec{ Ref: "#/types/awsx:ecr:lifecyclePolicy", Plain: true, @@ -49,8 +52,13 @@ func repository(awsSpec schema.PackageSpec) schema.ResourceSpec { IsComponent: true, InputProperties: inputProperties, ObjectTypeSpec: schema.ObjectTypeSpec{ - Type: "object", - Description: "A [Repository] represents an [aws.ecr.Repository] along with an associated [LifecyclePolicy] controlling how images are retained in the repo. \n\nDocker images can be built and pushed to the repo using the [buildAndPushImage] method. This will call into the `@pulumi/docker/buildAndPushImage` function using this repo as the appropriate destination registry.", + Type: "object", + Description: "A [Repository] represents an [aws.ecr.Repository] along with " + + "an associated [LifecyclePolicy] controlling how images are " + + "retained in the repo. \n\nDocker images can be built and pushed " + + "to the repo using the [buildAndPushImage] method. This " + + "will call into the `@pulumi/docker/buildAndPushImage` function " + + "using this repo as the appropriate destination registry.", Properties: map[string]schema.PropertySpec{ "repository": { Description: "Underlying Repository resource", @@ -64,7 +72,8 @@ func repository(awsSpec schema.PackageSpec) schema.ResourceSpec { }, }, "url": { - Description: "The URL of the repository (in the form aws_account_id.dkr.ecr.region.amazonaws.com/repositoryName).\n", + Description: "The URL of the repository (in the form aws_account_id.dkr." + + "ecr.region.amazonaws.com/repositoryName).\n", TypeSpec: schema.TypeSpec{ Type: "string", }, @@ -81,14 +90,20 @@ func repository(awsSpec schema.PackageSpec) schema.ResourceSpec { } } -func lifecyclePolicy(awsSpec schema.PackageSpec) schema.ComplexTypeSpec { +func lifecyclePolicy(_ schema.PackageSpec) schema.ComplexTypeSpec { return schema.ComplexTypeSpec{ ObjectTypeSpec: schema.ObjectTypeSpec{ - Type: "object", - Description: "Simplified lifecycle policy model consisting of one or more rules that determine which images in a repository should be expired. See https://docs.aws.amazon.com/AmazonECR/latest/userguide/lifecycle_policy_examples.html for more details.", + Type: "object", + Description: "Simplified lifecycle policy model consisting of one or more " + + "rules that determine which images in a repository should be " + + "expired. See https://docs.aws.amazon.com/AmazonECR/latest/" + + "userguide/lifecycle_policy_examples.html for more details.", Properties: map[string]schema.PropertySpec{ "rules": { - Description: "Specifies the rules to determine how images should be retired from this repository. Rules are ordered from lowest priority to highest. If there is a rule with a `selection` value of `any`, then it will have the highest priority.", + Description: "Specifies the rules to determine how images should be " + + "retired from this repository. Rules are ordered from lowest " + + "priority to highest. If there is a rule with a `selection` value " + + "of `any`, then it will have the highest priority.", TypeSpec: schema.TypeSpec{ Type: "array", Items: &schema.TypeSpec{ @@ -108,7 +123,7 @@ func lifecyclePolicy(awsSpec schema.PackageSpec) schema.ComplexTypeSpec { } } -func lifecyclePolicyRule(awsSpec schema.PackageSpec) schema.ComplexTypeSpec { +func lifecyclePolicyRule(_ schema.PackageSpec) schema.ComplexTypeSpec { return schema.ComplexTypeSpec{ ObjectTypeSpec: schema.ObjectTypeSpec{ Type: "object", @@ -121,25 +136,38 @@ func lifecyclePolicyRule(awsSpec schema.PackageSpec) schema.ComplexTypeSpec { }, }, "maximumNumberOfImages": { - Description: "The maximum number of images that you want to retain in your repository. Either [maximumNumberOfImages] or [maximumAgeLimit] must be provided.", + Description: "The maximum number of images that you want to retain in your " + + "repository. Either [maximumNumberOfImages] or " + + "[maximumAgeLimit] must be provided.", TypeSpec: schema.TypeSpec{ Type: "number", }, }, "maximumAgeLimit": { - Description: "The maximum age limit (in days) for your images. Either [maximumNumberOfImages] or [maximumAgeLimit] must be provided.", + Description: "The maximum age limit (in days) for your images. Either " + + "[maximumNumberOfImages] or [maximumAgeLimit] must be provided.", TypeSpec: schema.TypeSpec{ Type: "number", }, }, "tagStatus": { - Description: "Determines whether the lifecycle policy rule that you are adding specifies a tag for an image. Acceptable options are tagged, untagged, or any. If you specify any, then all images have the rule evaluated against them. If you specify tagged, then you must also specify a tagPrefixList value. If you specify untagged, then you must omit tagPrefixList.", + Description: "Determines whether the lifecycle policy rule that you are " + + "adding specifies a tag for an image. Acceptable options are " + + "tagged, untagged, or any. If you specify any, then all images " + + "have the rule evaluated against them. If you specify tagged, " + + "then you must also specify a tagPrefixList value. If you " + + "specify untagged, then you must omit tagPrefixList.", TypeSpec: schema.TypeSpec{ Ref: "#/types/awsx:ecr:lifecycleTagStatus", }, }, "tagPrefixList": { - Description: "A list of image tag prefixes on which to take action with your lifecycle policy. Only used if you specified \"tagStatus\": \"tagged\". For example, if your images are tagged as prod, prod1, prod2, and so on, you would use the tag prefix prod to specify all of them. If you specify multiple tags, only the images with all specified tags are selected.", + Description: "A list of image tag prefixes on which to take action with " + + "your lifecycle policy. Only used if you specified \"tagStatus\": " + + "\"tagged\". For example, if your images are tagged as prod, prod1, " + + "prod2, and so on, you would use the tag prefix prod to specify " + + "all of them. If you specify multiple tags, only the images " + + "with all specified tags are selected.", TypeSpec: schema.TypeSpec{ Type: "array", Items: &schema.TypeSpec{ @@ -153,7 +181,7 @@ func lifecyclePolicyRule(awsSpec schema.PackageSpec) schema.ComplexTypeSpec { } } -func lifecycleTagStatus(awsSpec schema.PackageSpec) schema.ComplexTypeSpec { +func lifecycleTagStatus(_ schema.PackageSpec) schema.ComplexTypeSpec { return schema.ComplexTypeSpec{ ObjectTypeSpec: schema.ObjectTypeSpec{ Type: "string", @@ -178,7 +206,7 @@ func lifecycleTagStatus(awsSpec schema.PackageSpec) schema.ComplexTypeSpec { } } -func ecrImage(awsSpec schema.PackageSpec, dockerSpec schema.PackageSpec) schema.ResourceSpec { +func ecrImage(_ schema.PackageSpec, dockerSpec schema.PackageSpec) schema.ResourceSpec { inputs := dockerBuildProperties(dockerSpec) inputs["repositoryUrl"] = schema.PropertySpec{ Description: "Url of the repository", @@ -187,7 +215,8 @@ func ecrImage(awsSpec schema.PackageSpec, dockerSpec schema.PackageSpec) schema. }, } inputs["registryId"] = schema.PropertySpec{ - Description: "ID of the ECR registry in which to store the image. If not provided, this will be inferred from the repository URL)", + Description: "ID of the ECR registry in which to store the image. If not " + + "provided, this will be inferred from the repository URL)", TypeSpec: schema.TypeSpec{ Type: "string", }, @@ -241,10 +270,13 @@ func builderVersion() schema.ComplexTypeSpec { } } -func dockerBuildProperties(dockerSpec schema.PackageSpec) map[string]schema.PropertySpec { +func dockerBuildProperties(_ schema.PackageSpec) map[string]schema.PropertySpec { return map[string]schema.PropertySpec{ "args": { - Description: "An optional map of named build-time argument variables to set during the Docker build. This flag allows you to pass built-time variables that can be accessed like environment variables inside the `RUN` instruction.", + Description: "An optional map of named build-time argument variables to " + + "set during the Docker build. This flag allows you to pass " + + "built-time variables that can be accessed like environment " + + "variables inside the `RUN` instruction.", TypeSpec: schema.TypeSpec{ Type: "object", AdditionalProperties: &schema.TypeSpec{ @@ -269,19 +301,28 @@ func dockerBuildProperties(dockerSpec schema.PackageSpec) map[string]schema.Prop }, }, "context": { - Description: "Path to a directory to use for the Docker build context, usually the directory in which the Dockerfile resides (although dockerfile may be used to choose a custom location independent of this choice). If not specified, the context defaults to the current working directory; if a relative path is used, it is relative to the current working directory that Pulumi is evaluating.", + Description: "Path to a directory to use for the Docker build context, " + + "usually the directory in which the Dockerfile resides (although " + + "dockerfile may be used to choose a custom location independent " + + "of this choice). If not specified, the context defaults " + + "to the current working directory; if a relative path is used, " + + "it is relative to the current working directory that Pulumi " + + "is evaluating.", TypeSpec: schema.TypeSpec{ Type: "string", }, }, "dockerfile": { - Description: "dockerfile may be used to override the default Dockerfile name and/or location. By default, it is assumed to be a file named Dockerfile in the root of the build context.", + Description: "dockerfile may be used to override the default Dockerfile " + + "name and/or location. By default, it is assumed to be a file " + + "named Dockerfile in the root of the build context.", TypeSpec: schema.TypeSpec{ Type: "string", }, }, "imageName": { - Description: "Custom name for the underlying Docker image resource. If omitted, the image tag assigned by the provider will be used", + Description: "Custom name for the underlying Docker image resource. If " + + "omitted, the image tag assigned by the provider will be used", TypeSpec: schema.TypeSpec{ Type: "string", }, diff --git a/schemagen/pkg/gen/ecsx.go b/schemagen/pkg/gen/ecsx.go index 0116fbc94..3a88cf54a 100644 --- a/schemagen/pkg/gen/ecsx.go +++ b/schemagen/pkg/gen/ecsx.go @@ -66,19 +66,26 @@ func ec2Service(awsSpec schema.PackageSpec) schema.ResourceSpec { delete(inputProperties, "launchType") delete(inputProperties, "capacityProviderStrategies") inputProperties["continueBeforeSteadyState"] = schema.PropertySpec{ - Description: "If `true`, this provider will not wait for the service to reach a steady state (like [`aws ecs wait services-stable`](https://docs.aws.amazon.com/cli/latest/reference/ecs/wait/services-stable.html)) before continuing. Default `false`.", + Description: "If `true`, this provider will not wait for the service to reach " + + "a steady state (like [`aws ecs wait services-stable`](" + + "https://docs.aws.amazon.com/cli/latest/reference/ecs/wait/" + + "services-stable.html)) before continuing. Default `false`.", TypeSpec: schema.TypeSpec{ Type: "boolean", }, } inputProperties["taskDefinition"] = schema.PropertySpec{ - Description: "Family and revision (`family:revision`) or full ARN of the task definition that you want to run in your service. Either [taskDefinition] or [taskDefinitionArgs] must be provided.", + Description: "Family and revision (`family:revision`) or full ARN of the " + + "task definition that you want to run in your service. Either " + + "[taskDefinition] or [taskDefinitionArgs] must be provided.", TypeSpec: schema.TypeSpec{ Type: "string", }, } inputProperties["taskDefinitionArgs"] = schema.PropertySpec{ - Description: "The args of task definition that you want to run in your service. Either [taskDefinition] or [taskDefinitionArgs] must be provided.", + Description: "The args of task definition that you want to run in your service. " + + "Either [taskDefinition] or [taskDefinitionArgs] must " + + "be provided.", TypeSpec: schema.TypeSpec{ Ref: "#/types/awsx:ecs:EC2ServiceTaskDefinition", Plain: true, @@ -88,7 +95,9 @@ func ec2Service(awsSpec schema.PackageSpec) schema.ResourceSpec { return schema.ResourceSpec{ IsComponent: true, ObjectTypeSpec: schema.ObjectTypeSpec{ - Description: "Create an ECS Service resource for EC2 with the given unique name, arguments, and options.\nCreates Task definition if `taskDefinitionArgs` is specified.", + Description: "Create an ECS Service resource for EC2 with the given unique " + + "name, arguments, and options.\nCreates Task definition if " + + "`taskDefinitionArgs` is specified.", Properties: map[string]schema.PropertySpec{ "service": { Description: "Underlying ECS Service resource", @@ -131,26 +140,34 @@ func fargateService(awsSpec schema.PackageSpec) schema.ResourceSpec { } inputProperties["continueBeforeSteadyState"] = schema.PropertySpec{ - Description: "If `true`, this provider will not wait for the service to reach a steady state (like [`aws ecs wait services-stable`](https://docs.aws.amazon.com/cli/latest/reference/ecs/wait/services-stable.html)) before continuing. Default `false`.", + Description: "If `true`, this provider will not wait for the service to reach " + + "a steady state (like [`aws ecs wait services-stable`](" + + "https://docs.aws.amazon.com/cli/latest/reference/ecs/wait/" + + "services-stable.html)) before continuing. Default `false`.", TypeSpec: schema.TypeSpec{ Type: "boolean", }, } inputProperties["taskDefinition"] = schema.PropertySpec{ - Description: "Family and revision (`family:revision`) or full ARN of the task definition that you want to run in your service. Either [taskDefinition] or [taskDefinitionArgs] must be provided.", + Description: "Family and revision (`family:revision`) or full ARN of the " + + "task definition that you want to run in your service. Either " + + "[taskDefinition] or [taskDefinitionArgs] must be provided.", TypeSpec: schema.TypeSpec{ Type: "string", }, } inputProperties["taskDefinitionArgs"] = schema.PropertySpec{ - Description: "The args of task definition that you want to run in your service. Either [taskDefinition] or [taskDefinitionArgs] must be provided.", + Description: "The args of task definition that you want to run in your service. " + + "Either [taskDefinition] or [taskDefinitionArgs] must " + + "be provided.", TypeSpec: schema.TypeSpec{ Ref: "#/types/awsx:ecs:FargateServiceTaskDefinition", Plain: true, }, } inputProperties["assignPublicIp"] = schema.PropertySpec{ - Description: "Assign a public IP address to the ENI (Fargate launch type only). Valid values are `true` or `false`. Default `false`.", + Description: "Assign a public IP address to the ENI (Fargate launch type " + + "only). Valid values are `true` or `false`. Default `false`.", TypeSpec: schema.TypeSpec{ Type: "boolean", }, @@ -159,7 +176,9 @@ func fargateService(awsSpec schema.PackageSpec) schema.ResourceSpec { return schema.ResourceSpec{ IsComponent: true, ObjectTypeSpec: schema.ObjectTypeSpec{ - Description: "Create an ECS Service resource for Fargate with the given unique name, arguments, and options.\nCreates Task definition if `taskDefinitionArgs` is specified.", + Description: "Create an ECS Service resource for Fargate with the given " + + "unique name, arguments, and options.\nCreates Task definition " + + "if `taskDefinitionArgs` is specified.", Properties: map[string]schema.PropertySpec{ "service": { Description: "Underlying ECS Service resource", @@ -196,14 +215,19 @@ func fargateTaskDefinition(awsSpec schema.PackageSpec) schema.ResourceSpec { delete(inputProperties, "requiresCompatibilities") // the requiresCompatibilities of FargateTaskDefinition is "FARGATE" inputProperties["container"] = schema.PropertySpec{ - Description: "Single container to make a TaskDefinition from. Useful for simple cases where there aren't\nmultiple containers, especially when creating a TaskDefinition to call [run] on.\n\nEither [container] or [containers] must be provided.", + Description: "Single container to make a TaskDefinition from. Useful for " + + "simple cases where there aren't\nmultiple containers, especially " + + "when creating a TaskDefinition to call [run] on.\n\n" + + "Either [container] or [containers] must be provided.", TypeSpec: schema.TypeSpec{ Ref: "#/types/awsx:ecs:TaskDefinitionContainerDefinition", Plain: true, }, } inputProperties["containers"] = schema.PropertySpec{ - Description: "All the containers to make a TaskDefinition from. Useful when creating a Service that will\ncontain many containers within.\n\nEither [container] or [containers] must be provided.", + Description: "All the containers to make a TaskDefinition from. Useful when " + + "creating a Service that will\ncontain many containers within." + + "\n\nEither [container] or [containers] must be provided.", TypeSpec: schema.TypeSpec{ Type: "object", AdditionalProperties: &schema.TypeSpec{ @@ -214,20 +238,25 @@ func fargateTaskDefinition(awsSpec schema.PackageSpec) schema.ResourceSpec { }, } inputProperties["cpu"] = schema.PropertySpec{ - Description: "The number of cpu units used by the task. If not provided, a default will be computed based on the cumulative needs specified by [containerDefinitions]", + Description: "The number of cpu units used by the task. If not provided, " + + "a default will be computed based on the cumulative needs specified " + + "by [containerDefinitions]", TypeSpec: schema.TypeSpec{ Type: "string", }, } inputProperties["executionRole"] = schema.PropertySpec{ - Description: "The execution role that the Amazon ECS container agent and the Docker daemon can assume.\nWill be created automatically if not defined.", + Description: "The execution role that the Amazon ECS container agent and " + + "the Docker daemon can assume.\nWill be created automatically " + + "if not defined.", TypeSpec: schema.TypeSpec{ Ref: "#/types/awsx:awsx:DefaultRoleWithPolicy", Plain: true, }, } inputProperties["family"] = schema.PropertySpec{ - Description: "An optional unique name for your task definition. If not specified, then a default will be created.", + Description: "An optional unique name for your task definition. If not specified, " + + "then a default will be created.", TypeSpec: schema.TypeSpec{ Type: "string", }, @@ -240,13 +269,17 @@ func fargateTaskDefinition(awsSpec schema.PackageSpec) schema.ResourceSpec { }, } inputProperties["memory"] = schema.PropertySpec{ - Description: "The amount (in MiB) of memory used by the task. If not provided, a default will be computed\nbased on the cumulative needs specified by [containerDefinitions]", + Description: "The amount (in MiB) of memory used by the task. If not provided, " + + "a default will be computed\nbased on the cumulative needs " + + "specified by [containerDefinitions]", TypeSpec: schema.TypeSpec{ Type: "string", }, } inputProperties["taskRole"] = schema.PropertySpec{ - Description: "IAM role that allows your Amazon ECS container task to make calls to other AWS services.\nWill be created automatically if not defined.", + Description: "IAM role that allows your Amazon ECS container task to make " + + "calls to other AWS services.\nWill be created automatically " + + "if not defined.", TypeSpec: schema.TypeSpec{ Ref: "#/types/awsx:awsx:DefaultRoleWithPolicy", Plain: true, @@ -256,7 +289,10 @@ func fargateTaskDefinition(awsSpec schema.PackageSpec) schema.ResourceSpec { return schema.ResourceSpec{ IsComponent: true, ObjectTypeSpec: schema.ObjectTypeSpec{ - Description: "Create a TaskDefinition resource with the given unique name, arguments, and options.\nCreates required log-group and task & execution roles.\nPresents required Service load balancers if target group included in port mappings.", + Description: "Create a TaskDefinition resource with the given unique name, " + + "arguments, and options.\nCreates required log-group and task " + + "& execution roles.\nPresents required Service load balancers " + + "if target group included in port mappings.", Properties: map[string]schema.PropertySpec{ "taskDefinition": { Description: "Underlying ECS Task Definition resource", @@ -271,13 +307,15 @@ func fargateTaskDefinition(awsSpec schema.PackageSpec) schema.ResourceSpec { }, }, "taskRole": { - Description: "Auto-created IAM role that allows your Amazon ECS container task to make calls to other AWS services.", + Description: "Auto-created IAM role that allows your Amazon ECS container " + + "task to make calls to other AWS services.", TypeSpec: schema.TypeSpec{ Ref: packageRef(awsSpec, "/resources/aws:iam%2Frole:Role"), }, }, "executionRole": { - Description: "Auto-created IAM task execution role that the Amazon ECS container agent and the Docker daemon can assume.", + Description: "Auto-created IAM task execution role that the Amazon ECS " + + "container agent and the Docker daemon can assume.", TypeSpec: schema.TypeSpec{ Ref: packageRef(awsSpec, "/resources/aws:iam%2Frole:Role"), }, @@ -313,14 +351,19 @@ func ec2TaskDefinition(awsSpec schema.PackageSpec) schema.ResourceSpec { delete(inputProperties, "requiresCompatibilities") // the requiresCompatibilities of EC2TaskDefinition is "EC2" inputProperties["container"] = schema.PropertySpec{ - Description: "Single container to make a TaskDefinition from. Useful for simple cases where there aren't\nmultiple containers, especially when creating a TaskDefinition to call [run] on.\n\nEither [container] or [containers] must be provided.", + Description: "Single container to make a TaskDefinition from. Useful for " + + "simple cases where there aren't\nmultiple containers, especially " + + "when creating a TaskDefinition to call [run] on.\n\n" + + "Either [container] or [containers] must be provided.", TypeSpec: schema.TypeSpec{ Ref: "#/types/awsx:ecs:TaskDefinitionContainerDefinition", Plain: true, }, } inputProperties["containers"] = schema.PropertySpec{ - Description: "All the containers to make a TaskDefinition from. Useful when creating a Service that will\ncontain many containers within.\n\nEither [container] or [containers] must be provided.", + Description: "All the containers to make a TaskDefinition from. Useful " + + "when creating a Service that will\ncontain many containers " + + "within.\n\nEither [container] or [containers] must be provided.", TypeSpec: schema.TypeSpec{ Type: "object", AdditionalProperties: &schema.TypeSpec{ @@ -331,20 +374,25 @@ func ec2TaskDefinition(awsSpec schema.PackageSpec) schema.ResourceSpec { }, } inputProperties["cpu"] = schema.PropertySpec{ - Description: "The number of cpu units used by the task. If not provided, a default will be computed based on the cumulative needs specified by [containerDefinitions]", + Description: "The number of cpu units used by the task. If not provided, " + + "a default will be computed based on the cumulative needs specified " + + "by [containerDefinitions]", TypeSpec: schema.TypeSpec{ Type: "string", }, } inputProperties["executionRole"] = schema.PropertySpec{ - Description: "The execution role that the Amazon ECS container agent and the Docker daemon can assume.\nWill be created automatically if not defined.", + Description: "The execution role that the Amazon ECS container agent and " + + "the Docker daemon can assume.\nWill be created automatically " + + "if not defined.", TypeSpec: schema.TypeSpec{ Ref: "#/types/awsx:awsx:DefaultRoleWithPolicy", Plain: true, }, } inputProperties["family"] = schema.PropertySpec{ - Description: "An optional unique name for your task definition. If not specified, then a default will be created.", + Description: "An optional unique name for your task definition. If not specified, " + + "then a default will be created.", TypeSpec: schema.TypeSpec{ Type: "string", }, @@ -357,13 +405,17 @@ func ec2TaskDefinition(awsSpec schema.PackageSpec) schema.ResourceSpec { }, } inputProperties["memory"] = schema.PropertySpec{ - Description: "The amount (in MiB) of memory used by the task. If not provided, a default will be computed\nbased on the cumulative needs specified by [containerDefinitions]", + Description: "The amount (in MiB) of memory used by the task. If not provided, " + + "a default will be computed\nbased on the cumulative needs " + + "specified by [containerDefinitions]", TypeSpec: schema.TypeSpec{ Type: "string", }, } inputProperties["taskRole"] = schema.PropertySpec{ - Description: "IAM role that allows your Amazon ECS container task to make calls to other AWS services.\nWill be created automatically if not defined.", + Description: "IAM role that allows your Amazon ECS container task to make " + + "calls to other AWS services.\nWill be created automatically " + + "if not defined.", TypeSpec: schema.TypeSpec{ Ref: "#/types/awsx:awsx:DefaultRoleWithPolicy", Plain: true, @@ -373,7 +425,10 @@ func ec2TaskDefinition(awsSpec schema.PackageSpec) schema.ResourceSpec { return schema.ResourceSpec{ IsComponent: true, ObjectTypeSpec: schema.ObjectTypeSpec{ - Description: "Create a TaskDefinition resource with the given unique name, arguments, and options.\nCreates required log-group and task & execution roles.\nPresents required Service load balancers if target group included in port mappings.", + Description: "Create a TaskDefinition resource with the given unique name, " + + "arguments, and options.\nCreates required log-group and task " + + "& execution roles.\nPresents required Service load balancers " + + "if target group included in port mappings.", Properties: map[string]schema.PropertySpec{ "taskDefinition": { Description: "Underlying ECS Task Definition resource", @@ -388,13 +443,15 @@ func ec2TaskDefinition(awsSpec schema.PackageSpec) schema.ResourceSpec { }, }, "taskRole": { - Description: "Auto-created IAM role that allows your Amazon ECS container task to make calls to other AWS services.", + Description: "Auto-created IAM role that allows your Amazon ECS container " + + "task to make calls to other AWS services.", TypeSpec: schema.TypeSpec{ Ref: packageRef(awsSpec, "/resources/aws:iam%2Frole:Role"), }, }, "executionRole": { - Description: "Auto-created IAM task execution role that the Amazon ECS container agent and the Docker daemon can assume.", + Description: "Auto-created IAM task execution role that the Amazon ECS " + + "container agent and the Docker daemon can assume.", TypeSpec: schema.TypeSpec{ Ref: packageRef(awsSpec, "/resources/aws:iam%2Frole:Role"), }, @@ -446,7 +503,8 @@ func containerDefinitionTypes(awsSpec, awsNativeSpec schema.PackageSpec) map[str } types := map[string]schema.ComplexTypeSpec{} for _, name := range names { - types["awsx:ecs:"+name] = renameComplexRefs(awsNativeSpec.Types["aws-native:ecs:"+name], "aws-native:ecs:", "awsx:ecs:") + types["awsx:ecs:"+name] = renameComplexRefs( + awsNativeSpec.Types["aws-native:ecs:"+name], "aws-native:ecs:", "awsx:ecs:") } types["awsx:ecs:TaskDefinitionPortMapping"].Properties["targetGroup"] = schema.PropertySpec{ TypeSpec: schema.TypeSpec{ diff --git a/schemagen/pkg/gen/iam.go b/schemagen/pkg/gen/iam.go index 4660145e4..ac267bd8a 100644 --- a/schemagen/pkg/gen/iam.go +++ b/schemagen/pkg/gen/iam.go @@ -27,11 +27,12 @@ func generateIam(awsSpec schema.PackageSpec) schema.PackageSpec { } } -func defaultRoleWithPolicyArgs(awsSpec schema.PackageSpec) schema.ComplexTypeSpec { +func defaultRoleWithPolicyArgs(_ schema.PackageSpec) schema.ComplexTypeSpec { return schema.ComplexTypeSpec{ ObjectTypeSpec: schema.ObjectTypeSpec{ - Type: "object", - Description: "Role and policy attachments with default setup unless explicitly skipped or an existing role ARN provided.", + Type: "object", + Description: "Role and policy attachments with default setup unless expli" + + "citly skipped or an existing role ARN provided.", Properties: map[string]schema.PropertySpec{ "skip": { Description: "Skips creation of the role if set to `true`.", @@ -41,7 +42,8 @@ func defaultRoleWithPolicyArgs(awsSpec schema.PackageSpec) schema.ComplexTypeSpe }, }, "roleArn": { - Description: "ARN of existing role to use instead of creating a new role. Cannot be used in combination with `args` or `opts`.", + Description: "ARN of existing role to use instead of creating a new role. " + + "Cannot be used in combination with `args` or `opts`.", TypeSpec: schema.TypeSpec{ Type: "string", }, diff --git a/schemagen/pkg/gen/lb.go b/schemagen/pkg/gen/lb.go index 697963ad4..491b3b014 100644 --- a/schemagen/pkg/gen/lb.go +++ b/schemagen/pkg/gen/lb.go @@ -51,7 +51,8 @@ func loadBalancer(awsSpec schema.PackageSpec, isNetworkLoadBalancer bool) schema // Allow passing actual subnets in inputProperties["subnetIds"] = inputProperties["subnets"] inputProperties["subnets"] = schema.PropertySpec{ - Description: "A list of subnets to attach to the LB. Only one of [subnets], [subnetIds] or [subnetMappings] can be specified", + Description: "A list of subnets to attach to the LB. Only one of [subnets], " + + "[subnetIds] or [subnetMappings] can be specified", TypeSpec: schema.TypeSpec{ Type: "array", Items: &schema.TypeSpec{ @@ -147,7 +148,8 @@ func loadBalancer(awsSpec schema.PackageSpec, isNetworkLoadBalancer bool) schema if isNetworkLoadBalancer { description = "Provides a Network Load Balancer resource with listeners and default target group." } else { - description = "Provides an Application Load Balancer resource with listeners, default target group and default security group." + description = "Provides an Application Load Balancer resource with listeners, " + + "default target group and default security group." } return schema.ResourceSpec{ @@ -173,25 +175,31 @@ func targetGroupAttachment(awsSpec schema.PackageSpec) schema.ResourceSpec { }, }, "targetGroupArn": { - Description: "ARN of the Target Group to attach to. Exactly one of [targetGroup] or [targetGroupArn] must be specified.", + Description: "ARN of the Target Group to attach to. Exactly one of " + + "[targetGroup] or [targetGroupArn] must be specified.", TypeSpec: schema.TypeSpec{ Type: "string", }, }, "instance": { - Description: "EC2 Instance to attach to the Target Group. Exactly 1 of [instance], [instanceId], [lambda] or [lambdaArn] must be provided.", + Description: "EC2 Instance to attach to the Target Group. Exactly 1 of " + + "[instance], [instanceId], [lambda] or [lambdaArn] must be provided.", TypeSpec: schema.TypeSpec{ Ref: packageRef(awsSpec, "/resources/aws:ec2%2finstance:Instance"), }, }, "instanceId": { - Description: "ID of an EC2 Instance to attach to the Target Group. Exactly 1 of [instance], [instanceId], [lambda] or [lambdaArn] must be provided.", + Description: "ID of an EC2 Instance to attach to the Target Group. Exactly " + + "1 of [instance], [instanceId], [lambda] or [lambdaArn] must " + + "be provided.", TypeSpec: schema.TypeSpec{ Type: "string", }, }, "lambda": { - Description: "Lambda Function to attach to the Target Group. Exactly 1 of [instance], [instanceId], [lambda] or [lambdaArn] must be provided.", + Description: "Lambda Function to attach to the Target Group. Exactly 1 of " + + "[instance], [instanceId], [lambda] or [lambdaArn] must be " + + "provided.", TypeSpec: schema.TypeSpec{ Ref: packageRef(awsSpec, "/resources/aws:lambda%2ffunction:Function"), }, @@ -202,15 +210,18 @@ func targetGroupAttachment(awsSpec schema.PackageSpec) schema.ResourceSpec { }, }, "lambdaArn": { - Description: "ARN of a Lambda Function to attach to the Target Group. Exactly 1 of [instance], [instanceId], [lambda] or [lambdaArn] must be provided.", + Description: "ARN of a Lambda Function to attach to the Target Group. " + + "Exactly 1 of [instance], [instanceId], [lambda] or [lambdaArn] " + + "must be provided.", TypeSpec: schema.TypeSpec{ Type: "string", }, }, }, ObjectTypeSpec: schema.ObjectTypeSpec{ - Type: "object", - Description: "Attach an EC2 instance or Lambda to a Load Balancer. This will create required permissions if attaching to a Lambda Function.", + Type: "object", + Description: "Attach an EC2 instance or Lambda to a Load Balancer. This " + + "will create required permissions if attaching to a Lambda Function.", Properties: map[string]schema.PropertySpec{ "targetGroupAttachment": { Description: "Underlying Target Group Attachment resource", @@ -259,14 +270,3 @@ func lbTargetGroup(awsSpec schema.PackageSpec) schema.ComplexTypeSpec { }, } } - -func lbTargetGroupTargetHealthState(awsSpec schema.PackageSpec) schema.ComplexTypeSpec { - spec := awsSpec.Resources["aws:lb/targetGroupTargetHealthState:TargetGroupTargetHealthState"] - return schema.ComplexTypeSpec{ - ObjectTypeSpec: schema.ObjectTypeSpec{ - Type: "object", - Description: spec.Description, - Properties: renameAwsPropertiesRefs(awsSpec, spec.InputProperties), - }, - } -} From 40cbc01245e15a685827f3ae0239d92bc428677f Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 10:18:34 -0500 Subject: [PATCH 02/25] Move schemagen files --- .../cmd/pulumi-gen-awsx/main.go | 0 .../pkg/schemagen}/cloudtrail.go | 0 .../pkg/schemagen}/cloudwatch.go | 0 .../gen => provider/pkg/schemagen}/ec2-vpc.md | 0 .../pkg/gen => provider/pkg/schemagen}/ec2.go | 0 .../pkg/gen => provider/pkg/schemagen}/ecr.go | 0 .../gen => provider/pkg/schemagen}/ecsx.go | 0 .../pkg/gen => provider/pkg/schemagen}/iam.go | 0 .../pkg/gen => provider/pkg/schemagen}/lb.go | 0 .../pkg/gen => provider/pkg/schemagen}/s3.go | 0 .../gen => provider/pkg/schemagen}/schema.go | 0 schemagen/go.mod | 103 -- schemagen/go.sum | 878 ------------------ 13 files changed, 981 deletions(-) rename {schemagen => provider}/cmd/pulumi-gen-awsx/main.go (100%) rename {schemagen/pkg/gen => provider/pkg/schemagen}/cloudtrail.go (100%) rename {schemagen/pkg/gen => provider/pkg/schemagen}/cloudwatch.go (100%) rename {schemagen/pkg/gen => provider/pkg/schemagen}/ec2-vpc.md (100%) rename {schemagen/pkg/gen => provider/pkg/schemagen}/ec2.go (100%) rename {schemagen/pkg/gen => provider/pkg/schemagen}/ecr.go (100%) rename {schemagen/pkg/gen => provider/pkg/schemagen}/ecsx.go (100%) rename {schemagen/pkg/gen => provider/pkg/schemagen}/iam.go (100%) rename {schemagen/pkg/gen => provider/pkg/schemagen}/lb.go (100%) rename {schemagen/pkg/gen => provider/pkg/schemagen}/s3.go (100%) rename {schemagen/pkg/gen => provider/pkg/schemagen}/schema.go (100%) delete mode 100644 schemagen/go.mod delete mode 100644 schemagen/go.sum diff --git a/schemagen/cmd/pulumi-gen-awsx/main.go b/provider/cmd/pulumi-gen-awsx/main.go similarity index 100% rename from schemagen/cmd/pulumi-gen-awsx/main.go rename to provider/cmd/pulumi-gen-awsx/main.go diff --git a/schemagen/pkg/gen/cloudtrail.go b/provider/pkg/schemagen/cloudtrail.go similarity index 100% rename from schemagen/pkg/gen/cloudtrail.go rename to provider/pkg/schemagen/cloudtrail.go diff --git a/schemagen/pkg/gen/cloudwatch.go b/provider/pkg/schemagen/cloudwatch.go similarity index 100% rename from schemagen/pkg/gen/cloudwatch.go rename to provider/pkg/schemagen/cloudwatch.go diff --git a/schemagen/pkg/gen/ec2-vpc.md b/provider/pkg/schemagen/ec2-vpc.md similarity index 100% rename from schemagen/pkg/gen/ec2-vpc.md rename to provider/pkg/schemagen/ec2-vpc.md diff --git a/schemagen/pkg/gen/ec2.go b/provider/pkg/schemagen/ec2.go similarity index 100% rename from schemagen/pkg/gen/ec2.go rename to provider/pkg/schemagen/ec2.go diff --git a/schemagen/pkg/gen/ecr.go b/provider/pkg/schemagen/ecr.go similarity index 100% rename from schemagen/pkg/gen/ecr.go rename to provider/pkg/schemagen/ecr.go diff --git a/schemagen/pkg/gen/ecsx.go b/provider/pkg/schemagen/ecsx.go similarity index 100% rename from schemagen/pkg/gen/ecsx.go rename to provider/pkg/schemagen/ecsx.go diff --git a/schemagen/pkg/gen/iam.go b/provider/pkg/schemagen/iam.go similarity index 100% rename from schemagen/pkg/gen/iam.go rename to provider/pkg/schemagen/iam.go diff --git a/schemagen/pkg/gen/lb.go b/provider/pkg/schemagen/lb.go similarity index 100% rename from schemagen/pkg/gen/lb.go rename to provider/pkg/schemagen/lb.go diff --git a/schemagen/pkg/gen/s3.go b/provider/pkg/schemagen/s3.go similarity index 100% rename from schemagen/pkg/gen/s3.go rename to provider/pkg/schemagen/s3.go diff --git a/schemagen/pkg/gen/schema.go b/provider/pkg/schemagen/schema.go similarity index 100% rename from schemagen/pkg/gen/schema.go rename to provider/pkg/schemagen/schema.go diff --git a/schemagen/go.mod b/schemagen/go.mod deleted file mode 100644 index 3dca6903a..000000000 --- a/schemagen/go.mod +++ /dev/null @@ -1,103 +0,0 @@ -module github.com/pulumi/pulumi-awsx/schemagen - -go 1.21 - -require ( - github.com/pkg/errors v0.9.1 - github.com/pulumi/pulumi/pkg/v3 v3.144.1 - github.com/pulumi/pulumi/sdk/v3 v3.144.1 -) - -require ( - dario.cat/mergo v1.0.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect - github.com/BurntSushi/toml v1.2.1 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/ProtonMail/go-crypto v1.0.0 // indirect - github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect - github.com/agext/levenshtein v1.2.3 // indirect - github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect - github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect - github.com/atotto/clipboard v0.1.4 // indirect - github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/charmbracelet/bubbles v0.16.1 // indirect - github.com/charmbracelet/bubbletea v0.25.0 // indirect - github.com/charmbracelet/lipgloss v0.7.1 // indirect - github.com/cheggaaa/pb v1.0.29 // indirect - github.com/cloudflare/circl v1.3.7 // indirect - github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/deckarep/golang-set/v2 v2.5.0 // indirect - github.com/djherbis/times v1.5.0 // indirect - github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/emirpasic/gods v1.18.1 // indirect - github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect - github.com/go-git/go-git/v5 v5.12.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.2.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/hcl/v2 v2.22.0 // indirect - github.com/iancoleman/strcase v0.2.0 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect - github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-localereader v0.0.1 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/mitchellh/go-ps v1.0.0 // indirect - github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect - github.com/muesli/cancelreader v0.2.2 // indirect - github.com/muesli/reflow v0.3.0 // indirect - github.com/muesli/termenv v0.15.2 // indirect - github.com/natefinch/atomic v1.0.1 // indirect - github.com/opentracing/basictracer-go v1.1.0 // indirect - github.com/opentracing/opentracing-go v1.2.0 // indirect - github.com/pgavlin/fx v0.1.6 // indirect - github.com/pgavlin/goldmark v1.1.33-0.20200616210433-b5eb04559386 // indirect - github.com/pjbgf/sha1cd v0.3.0 // indirect - github.com/pkg/term v1.1.0 // indirect - github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 // indirect - github.com/pulumi/esc v0.10.0 // indirect - github.com/pulumi/inflector v0.1.1 // indirect - github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect - github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 // indirect - github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 // indirect - github.com/segmentio/asm v1.1.3 // indirect - github.com/segmentio/encoding v0.3.5 // indirect - github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect - github.com/skeema/knownhosts v1.2.2 // indirect - github.com/spf13/afero v1.9.5 // indirect - github.com/spf13/cobra v1.8.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/objx v0.5.2 // indirect - github.com/texttheater/golang-levenshtein v1.0.1 // indirect - github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect - github.com/uber/jaeger-lib v2.4.1+incompatible // indirect - github.com/xanzy/ssh-agent v0.3.3 // indirect - github.com/zclconf/go-cty v1.13.2 // indirect - go.uber.org/atomic v1.9.0 // indirect - golang.org/x/crypto v0.31.0 // indirect - golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect - golang.org/x/mod v0.18.0 // indirect - golang.org/x/net v0.33.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.28.0 // indirect - golang.org/x/term v0.27.0 // indirect - golang.org/x/text v0.21.0 // indirect - golang.org/x/tools v0.22.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect - google.golang.org/grpc v1.67.1 // indirect - google.golang.org/protobuf v1.35.1 // indirect - gopkg.in/warnings.v0 v0.1.2 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - lukechampine.com/frand v1.4.2 // indirect -) diff --git a/schemagen/go.sum b/schemagen/go.sum deleted file mode 100644 index fcd74f375..000000000 --- a/schemagen/go.sum +++ /dev/null @@ -1,878 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= -cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.25.0 h1:H1/4SqSUhjPFE7L5ddzHOfY2bCAvjwNRZPNl6Ni5oYU= -cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= -cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= -cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= -cloud.google.com/go/kms v1.15.7 h1:7caV9K3yIxvlQPAcaFffhlT7d1qpxjB1wHBtjWa13SM= -cloud.google.com/go/kms v1.15.7/go.mod h1:ub54lbsa6tDkUwnu4W7Yt1aAIFLnspgh0kPGToDukeI= -cloud.google.com/go/logging v1.9.0 h1:iEIOXFO9EmSiTjDmfpbRjOxECO7R8C7b8IXUGOj7xZw= -cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= -cloud.google.com/go/longrunning v0.5.5 h1:GOE6pZFdSrTb4KAiKnXsJBtlE6mEyaW44oKyMILWnOg= -cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.39.1 h1:MvraqHKhogCOTXTlct/9C3K3+Uy2jBmFYb3/Sp6dVtY= -cloud.google.com/go/storage v1.39.1/go.mod h1:xK6xZmxZmo+fyP7+DEF6FhNc24/JAe95OLyOHCXFH1o= -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= -github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0 h1:m/sWOGCREuSBqg2htVQTBY8nOZpyajYztF0vUvSZTuM= -github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0/go.mod h1:Pu5Zksi2KrU7LPbZbNINx6fuVrUp/ffvpxdDj+i8LeE= -github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 h1:FbH3BbSb4bvGluTesZZ+ttN/MDsnMmQP36OSnDuSXqw= -github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1/go.mod h1:9V2j0jn9jDEkCkv8w/bKTNppX/d0FVA1ud77xCIP4KA= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= -github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= -github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= -github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= -github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= -github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= -github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= -github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= -github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= -github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= -github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= -github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= -github.com/aws/aws-sdk-go v1.50.36 h1:PjWXHwZPuTLMR1NIb8nEjLucZBMzmf84TLoLbD8BZqk= -github.com/aws/aws-sdk-go v1.50.36/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= -github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/config v1.27.11 h1:f47rANd2LQEYHda2ddSCKYId18/8BhSRM4BULGmfgNA= -github.com/aws/aws-sdk-go-v2/config v1.27.11/go.mod h1:SMsV78RIOYdve1vf36z8LmnszlRWkwMQtomCAI0/mIE= -github.com/aws/aws-sdk-go-v2/credentials v1.17.11 h1:YuIB1dJNf1Re822rriUOTxopaHHvIq0l/pX3fwO+Tzs= -github.com/aws/aws-sdk-go-v2/credentials v1.17.11/go.mod h1:AQtFPsDH9bI2O+71anW6EKL+NcD7LG3dpKGMV4SShgo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 h1:ogRAwT1/gxJBcSWDMZlgyFUM962F51A5CRhDLbxLdmo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7/go.mod h1:YCsIZhXfRPLFFCl5xxY+1T9RKzOKjCut+28JSX2DnAk= -github.com/aws/aws-sdk-go-v2/service/kms v1.30.1 h1:SBn4I0fJXF9FYOVRSVMWuhvEKoAHDikjGpS3wlmw5DE= -github.com/aws/aws-sdk-go-v2/service/kms v1.30.1/go.mod h1:2snWQJQUKsbN66vAawJuOGX7dr37pfOq9hb0tZDGIqQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 h1:vN8hEbpRnL7+Hopy9dzmRle1xmDc7o8tmY0klsr175w= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.5/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 h1:Jux+gDDyi1Lruk+KHF91tK2KCuY61kzoCpvtvJJBtOE= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4/go.mod h1:mUYPBhaF2lGiukDEjJX2BLRRKTmoUSitGDUgM4tRxak= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 h1:cwIxeBttqPN3qkaAjcEcsh8NYr8n2HZPkcKgPAi1phU= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.6/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= -github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= -github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M= -github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/charmbracelet/bubbles v0.16.1 h1:6uzpAAaT9ZqKssntbvZMlksWHruQLNxg49H5WdeuYSY= -github.com/charmbracelet/bubbles v0.16.1/go.mod h1:2QCp9LFlEsBQMvIYERr7Ww2H2bA7xen1idUDIzm/+Xc= -github.com/charmbracelet/bubbletea v0.25.0 h1:bAfwk7jRz7FKFl9RzlIULPkStffg5k6pNt5dywy4TcM= -github.com/charmbracelet/bubbletea v0.25.0/go.mod h1:EN3QDR1T5ZdWmdfDzYcqOCAps45+QIJbLOBxmVNWNNg= -github.com/charmbracelet/lipgloss v0.7.1 h1:17WMwi7N1b1rVWOjMT+rCh7sQkvDU75B2hbZpc5Kc1E= -github.com/charmbracelet/lipgloss v0.7.1/go.mod h1:yG0k3giv8Qj8edTCbbg6AlQ5e8KNWpFujkNawKNhE2c= -github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= -github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= -github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= -github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.5.0 h1:hn6cEZtQ0h3J8kFrHR/NrzyOoTnjgW1+FmNJzQ7y/sA= -github.com/deckarep/golang-set/v2 v2.5.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/djherbis/times v1.5.0 h1:79myA211VwPhFTqUk8xehWrsEO+zcIZj0zT8mXPVARU= -github.com/djherbis/times v1.5.0/go.mod h1:5q7FDLvbNg1L/KaBmPcWlVR9NmoKo3+ucqUA3ijQhA0= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= -github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= -github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= -github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= -github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= -github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= -github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= -github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= -github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= -github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= -github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= -github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI= -github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= -github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU= -github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= -github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= -github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8 h1:iBt4Ew4XEGLfh6/bPk4rSYmuZJGizr6/x/AEizP0CQc= -github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8/go.mod h1:aiJI+PIApBRQG7FZTEBx5GiiX+HbOHilUdNxUZi4eV0= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= -github.com/hashicorp/go-sockaddr v1.0.6 h1:RSG8rKU28VTUTvEKghe5gIhIQpv8evvNpnDEyqO4u9I= -github.com/hashicorp/go-sockaddr v1.0.6/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/hcl/v2 v2.22.0 h1:hkZ3nCtqeJsDhPRFz5EA9iwcG1hNWGePOTw6oyul12M= -github.com/hashicorp/hcl/v2 v2.22.0/go.mod h1:62ZYHrXgPoX8xBnzl8QzbWq4dyDsDtfCRgIq1rbJEvA= -github.com/hashicorp/vault/api v1.12.0 h1:meCpJSesvzQyao8FCOgk2fGdoADAnbDu2WPJN1lDLJ4= -github.com/hashicorp/vault/api v1.12.0/go.mod h1:si+lJCYO7oGkIoNPAN8j3azBLTn9SjMGS+jFaHd1Cck= -github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= -github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= -github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= -github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= -github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= -github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= -github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= -github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= -github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= -github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= -github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= -github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= -github.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A= -github.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/opentracing/basictracer-go v1.1.0 h1:Oa1fTSBvAl8pa3U+IJYqrKm0NALwH9OsgwOqDv4xJW0= -github.com/opentracing/basictracer-go v1.1.0/go.mod h1:V2HZueSJEp879yv285Aap1BS69fQMD+MNP1mRs6mBQc= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/pgavlin/fx v0.1.6 h1:r9jEg69DhNoCd3Xh0+5mIbdbS3PqWrVWujkY76MFRTU= -github.com/pgavlin/fx v0.1.6/go.mod h1:KWZJ6fqBBSh8GxHYqwYCf3rYE7Gp2p0N8tJp8xv9u9M= -github.com/pgavlin/goldmark v1.1.33-0.20200616210433-b5eb04559386 h1:LoCV5cscNVWyK5ChN/uCoIFJz8jZD63VQiGJIRgr6uo= -github.com/pgavlin/goldmark v1.1.33-0.20200616210433-b5eb04559386/go.mod h1:MRxHTJrf9FhdfNQ8Hdeh9gmHevC9RJE/fu8M3JIGjoE= -github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= -github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= -github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 h1:vkHw5I/plNdTr435cARxCW6q9gc0S/Yxz7Mkd38pOb0= -github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231/go.mod h1:murToZ2N9hNJzewjHBgfFdXhZKjY3z5cYC1VXk+lbFE= -github.com/pulumi/esc v0.10.0 h1:jzBKzkLVW0mePeanDRfqSQoCJ5yrkux0jIwAkUxpRKE= -github.com/pulumi/esc v0.10.0/go.mod h1:2Bfa+FWj/xl8CKqRTWbWgDX0SOD4opdQgvYSURTGK2c= -github.com/pulumi/inflector v0.1.1 h1:dvlxlWtXwOJTUUtcYDvwnl6Mpg33prhK+7mzeF+SobA= -github.com/pulumi/inflector v0.1.1/go.mod h1:HUFCjcPTz96YtTuUlwG3i3EZG4WlniBvR9bd+iJxCUY= -github.com/pulumi/pulumi/pkg/v3 v3.144.1 h1:64mVLQDEZa2GN52rTKSyXlA3r+APoqDXrNdkzlASyvs= -github.com/pulumi/pulumi/pkg/v3 v3.144.1/go.mod h1:q2wZOcwXVI/+OBtEXD6mLS7shhRMgsIGTo/uWfo0q04= -github.com/pulumi/pulumi/sdk/v3 v3.144.1 h1:QQtCDERihhlfvcmRzqHeBmOER1Fg1VkFj9933Lxqv00= -github.com/pulumi/pulumi/sdk/v3 v3.144.1/go.mod h1:/6gxU2XirnLlImBy5OoqV6I4HcjOf+IznNIZNZExZzo= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= -github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI= -github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs= -github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 h1:TToq11gyfNlrMFZiYujSekIsPd9AmsA2Bj/iv+s4JHE= -github.com/santhosh-tekuri/jsonschema/v5 v5.0.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= -github.com/segmentio/asm v1.1.3 h1:WM03sfUOENvvKexOLp+pCqgb/WDjsi7EK8gIsICtzhc= -github.com/segmentio/asm v1.1.3/go.mod h1:Ld3L4ZXGNcSLRg4JBsZ3//1+f/TjYl0Mzen/DQy1EJg= -github.com/segmentio/encoding v0.3.5 h1:UZEiaZ55nlXGDL92scoVuw00RmiRCazIEmvPSbSvt8Y= -github.com/segmentio/encoding v0.3.5/go.mod h1:n0JeuIqEQrQoPDGsjo8UNd1iA0U8d8+oHAA4E3G3OxM= -github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= -github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= -github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= -github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= -github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/texttheater/golang-levenshtein v1.0.1 h1:+cRNoVrfiwufQPhoMzB6N0Yf/Mqajr6t1lOv8GyGE2U= -github.com/texttheater/golang-levenshtein v1.0.1/go.mod h1:PYAKrbF5sAiq9wd+H82hs7gNaen0CplQ9uvm6+enD/8= -github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= -github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= -github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= -github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zclconf/go-cty v1.13.2 h1:4GvrUxe/QUDYuJKAav4EYqdM47/kZa672LwmXFmEKT0= -github.com/zclconf/go-cty v1.13.2/go.mod h1:YKQzy/7pZ7iq2jNFzy5go57xdxdWoLLpaEp4u238AE0= -github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= -github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -gocloud.dev v0.37.0 h1:XF1rN6R0qZI/9DYjN16Uy0durAmSlf58DHOcb28GPro= -gocloud.dev v0.37.0/go.mod h1:7/O4kqdInCNsc6LqgmuFnS0GRew4XNNYWpA44yQnwco= -gocloud.dev/secrets/hashivault v0.37.0 h1:5ehGtUBP29DFAgAs6bPw7fVSgqQ3TxaoK2xVcLp1x+c= -gocloud.dev/secrets/hashivault v0.37.0/go.mod h1:4ClUWjBfP8wLdGts56acjHz3mWLuATMoH9vi74FjIv8= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuhGX/+R1ZpfJ4/ia80JM= -golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= -golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= -google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20240311173647-c811ad7063a7 h1:ImUcDPHjTrAqNhlOkSocDLfG9rrNHH7w7uoKWPaWZ8s= -google.golang.org/genproto v0.0.0-20240311173647-c811ad7063a7/go.mod h1:/3XmxOjePkvmKrHuBy4zNFw7IzxJXtAgdpXi8Ll990U= -google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8= -google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -lukechampine.com/frand v1.4.2 h1:RzFIpOvkMXuPMBb9maa4ND4wjBn71E1Jpf8BzJHMaVw= -lukechampine.com/frand v1.4.2/go.mod h1:4S/TM2ZgrKejMcKMbeLjISpJMO+/eZ1zu3vYX9dtj3s= -pgregory.net/rapid v0.6.1 h1:4eyrDxyht86tT4Ztm+kvlyNBLIk071gR+ZQdhphc9dQ= -pgregory.net/rapid v0.6.1/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= From 51c8f3b47b9dd30833b290263b2e5dda1f169c95 Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 10:23:07 -0500 Subject: [PATCH 03/25] Rewrite code generator to accept bridge calling conventions --- provider/cmd/pulumi-gen-awsx/main.go | 177 +++++++++++++++++---------- 1 file changed, 112 insertions(+), 65 deletions(-) diff --git a/provider/cmd/pulumi-gen-awsx/main.go b/provider/cmd/pulumi-gen-awsx/main.go index 2192b67d1..b0dd80817 100644 --- a/provider/cmd/pulumi-gen-awsx/main.go +++ b/provider/cmd/pulumi-gen-awsx/main.go @@ -1,4 +1,4 @@ -// Copyright 2016-2020, Pulumi Corporation. +// Copyright 2016-2024, Pulumi Corporation. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -23,15 +23,22 @@ import ( "strings" "github.com/pkg/errors" - "github.com/pulumi/pulumi-awsx/schemagen/pkg/gen" + "github.com/spf13/cobra" + dotnetgen "github.com/pulumi/pulumi/pkg/v3/codegen/dotnet" gogen "github.com/pulumi/pulumi/pkg/v3/codegen/go" nodegen "github.com/pulumi/pulumi/pkg/v3/codegen/nodejs" pygen "github.com/pulumi/pulumi/pkg/v3/codegen/python" "github.com/pulumi/pulumi/pkg/v3/codegen/schema" + + gen "github.com/pulumi/pulumi-awsx/provider/v2/pkg/schemagen" + "github.com/pulumi/pulumi-awsx/provider/v2/pkg/version" ) -const Tool = "pulumi-gen-awsx" +const ( + Tool = "pulumi-gen-awsx" + packageDir = "awsx" +) // Language is the SDK language. type Language string @@ -44,94 +51,121 @@ const ( Nodejs Language = "nodejs" ) -func main() { - printUsage := func() { - fmt.Printf("Usage: %s [schema-file] [version]\n", os.Args[0]) +func parseLanguage(text string) (Language, error) { + switch text { + case "dotnet": + return DotNet, nil + case "go": + return Go, nil + case "python": + return Python, nil + case "nodejs": + return Nodejs, nil + case "schema": + return Schema, nil + default: + allLangs := []Language{DotNet, Go, Python, Schema, Nodejs} + allLangStrings := []string{} + for _, lang := range allLangs { + allLangStrings = append(allLangStrings, string(lang)) + } + all := strings.Join(allLangStrings, ", ") + return "", fmt.Errorf(`Invalid language: %q, supported values include: %s`, text, all) } +} - args := os.Args[1:] - if len(args) < 2 { - printUsage() - os.Exit(1) +func rootCmd() *cobra.Command { + var outDir string + cmd := &cobra.Command{ + Use: Tool, + Short: "Pulumi Package Schema and SDK generator for pulumi-awsx", + Args: func(_ *cobra.Command, args []string) error { + if len(args) != 1 { + return fmt.Errorf("accepts %d arg(s), received %d", 1, len(args)) + } + if _, err := parseLanguage(args[0]); err != nil { + return err + } + return nil + }, + RunE: func(_ *cobra.Command, args []string) error { + cwd, err := os.Getwd() + if err != nil { + return err + } + lang, err := parseLanguage(args[0]) + if err != nil { + return err + } + return generate(lang, cwd, outDir) + }, } + cmd.PersistentFlags().StringVarP(&outDir, "out", "o", "", "Emit the generated code to this directory") + return cmd +} - language, outDir := Language(args[0]), args[1] - - var schemaFile string - var version string - if language != Schema { - if len(args) < 4 { - printUsage() - os.Exit(1) - } - schemaFile, version = args[2], args[3] +func generate(language Language, cwd, outDir string) error { + pkgSpec := gen.GenerateSchema(filepath.Join(cwd, packageDir)) + if language == Schema { + return writePulumiSchema(pkgSpec, outDir) + } + // Following Makefile expectations from the bridged providers re-generate the schema on the fly. + // Once that is refactored could instead load a pre-generated schema from a file. + schema, err := bindSchema(pkgSpec, version.Version) + if err != nil { + return err } - switch language { case DotNet: - genDotNet(readSchema(schemaFile, version), outDir) + return genDotNet(schema, outDir) case Go: - genGo(readSchema(schemaFile, version), outDir) + return genGo(schema, outDir) case Python: - genPython(readSchema(schemaFile, version), outDir) + return genPython(schema, outDir) case Nodejs: - genNodejs(readSchema(schemaFile, version), outDir) - case Schema: - pkgSpec := gen.GenerateSchema(filepath.Join(outDir, "awsx")) - mustWritePulumiSchema(pkgSpec, outDir) + return genNodejs(schema, outDir) default: - panic(fmt.Sprintf("Unrecognized language %q", language)) + return fmt.Errorf("Unrecognized language %q", language) } } -func readSchema(schemaPath string, version string) *schema.Package { - // Read in, decode, and import the schema. - schemaBytes, err := os.ReadFile(schemaPath) - if err != nil { - panic(err) - } - - var pkgSpec schema.PackageSpec - if err = json.Unmarshal(schemaBytes, &pkgSpec); err != nil { - panic(err) - } +func bindSchema(pkgSpec schema.PackageSpec, version string) (*schema.Package, error) { pkgSpec.Version = version - pkg, err := schema.ImportSpec(pkgSpec, nil) if err != nil { - panic(err) + return nil, err } - return pkg + return pkg, nil } -func genDotNet(pkg *schema.Package, outdir string) { +func genDotNet(pkg *schema.Package, outdir string) error { files, err := dotnetgen.GeneratePackage(Tool, pkg, map[string][]byte{}, nil) if err != nil { - panic(err) + return err } - mustWriteFiles(outdir, files) + return writeFiles(outdir, files) } -func genGo(pkg *schema.Package, outdir string) { +func genGo(pkg *schema.Package, outdir string) error { files, err := gogen.GeneratePackage(Tool, pkg, nil) if err != nil { - panic(err) + return err } - mustWriteFiles(outdir, files) + return writeFiles(outdir, files) } -func genPython(pkg *schema.Package, outdir string) { +func genPython(pkg *schema.Package, outdir string) error { files, err := pygen.GeneratePackage(Tool, pkg, map[string][]byte{}) if err != nil { - panic(err) + return err } - mustWriteFiles(outdir, files) + return writeFiles(outdir, files) } -func genNodejs(pkg *schema.Package, outdir string) { +func genNodejs(pkg *schema.Package, outdir string) error { extraFiles := map[string][]byte{} root := filepath.Join(outdir, "..", "..", "awsx-classic") - filepath.Walk(root, func(path string, info fs.FileInfo, err error) error { + err := filepath.Walk(root, func(path string, info fs.FileInfo, err error) error { if err != nil { return err } @@ -157,36 +191,49 @@ func genNodejs(pkg *schema.Package, outdir string) { extraFiles[filepath.Join("classic", rel)] = content return nil }) + if err != nil { + return err + } localDependencies := map[string]string{} files, err := nodegen.GeneratePackage(Tool, pkg, extraFiles, localDependencies, false) if err != nil { - panic(err) + return err } - mustWriteFiles(outdir, files) + return writeFiles(outdir, files) } -func mustWriteFiles(rootDir string, files map[string][]byte) { +func writeFiles(rootDir string, files map[string][]byte) error { for filename, contents := range files { - mustWriteFile(rootDir, filename, contents) + if err := writeFile(rootDir, filename, contents); err != nil { + return err + } } + return nil } -func mustWriteFile(rootDir, filename string, contents []byte) { +func writeFile(rootDir, filename string, contents []byte) error { outPath := filepath.Join(rootDir, filename) - if err := os.MkdirAll(filepath.Dir(outPath), 0755); err != nil { - panic(err) + return err } err := os.WriteFile(outPath, contents, 0600) if err != nil { - panic(err) + return err } + return nil } -func mustWritePulumiSchema(pkgSpec schema.PackageSpec, outdir string) { +func writePulumiSchema(pkgSpec schema.PackageSpec, outdir string) error { schemaJSON, err := json.MarshalIndent(pkgSpec, "", " ") if err != nil { - panic(errors.Wrap(err, "marshaling Pulumi schema")) + return errors.Wrap(err, "marshaling Pulumi schema") + } + return writeFile(outdir, "schema.json", schemaJSON) +} + +func main() { + if err := rootCmd().Execute(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) } - mustWriteFile(outdir, "schema.json", schemaJSON) } From 24d1c50d6a52be44bf4aae27315d5c3761ec1abd Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 10:26:42 -0500 Subject: [PATCH 04/25] chore: lint provider/provider_test.go --- provider/provider_test.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/provider/provider_test.go b/provider/provider_test.go index 0cdbb49a4..2f65b3a10 100644 --- a/provider/provider_test.go +++ b/provider/provider_test.go @@ -19,12 +19,13 @@ import ( "path/filepath" "testing" + "github.com/stretchr/testify/require" + "github.com/pulumi/providertest" "github.com/pulumi/providertest/optproviderupgrade" "github.com/pulumi/providertest/pulumitest" "github.com/pulumi/providertest/pulumitest/assertpreview" "github.com/pulumi/providertest/pulumitest/opttest" - "github.com/stretchr/testify/require" ) func TestReportUpgradeCoverage(t *testing.T) { @@ -49,8 +50,8 @@ func testProviderUpgrade(t *testing.T, dir string, opts *testProviderUpgradeOpti t.Parallel() t.Helper() var ( - providerName string = "awsx" - baselineVersion string = "1.0.6" + providerName = "awsx" + baselineVersion = "1.0.6" // need to supply v5.42.0 version of AWS as a dependency yeah ) From 7cca7e2fa9c35b99a2d2d40da73355fd85c4602e Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 10:32:50 -0500 Subject: [PATCH 05/25] Move schema.json into bridge-expected location, compute schema-embed.json --- awsx/scripts/generate-provider-types.ts | 2 +- provider/cmd/pulumi-resource-awsx/.gitignore | 1 + provider/cmd/pulumi-resource-awsx/generate.go | 53 + provider/cmd/pulumi-resource-awsx/main.go | 17 + provider/cmd/pulumi-resource-awsx/schema.json | 1 - schema.json | 3364 ----------------- 6 files changed, 72 insertions(+), 3366 deletions(-) create mode 100644 provider/cmd/pulumi-resource-awsx/.gitignore create mode 100644 provider/cmd/pulumi-resource-awsx/generate.go create mode 100644 provider/cmd/pulumi-resource-awsx/main.go delete mode 120000 provider/cmd/pulumi-resource-awsx/schema.json delete mode 100644 schema.json diff --git a/awsx/scripts/generate-provider-types.ts b/awsx/scripts/generate-provider-types.ts index 8e1a66b4a..e1c92baff 100644 --- a/awsx/scripts/generate-provider-types.ts +++ b/awsx/scripts/generate-provider-types.ts @@ -574,6 +574,6 @@ export function generateProviderTypes(args: { schema: string; out: string }) { } generateProviderTypes({ - schema: "../schema.json", + schema: "../provider/cmd/pulumi-resource-awsx/schema.json", out: "schema-types.ts", }); diff --git a/provider/cmd/pulumi-resource-awsx/.gitignore b/provider/cmd/pulumi-resource-awsx/.gitignore new file mode 100644 index 000000000..7ba7cf406 --- /dev/null +++ b/provider/cmd/pulumi-resource-awsx/.gitignore @@ -0,0 +1 @@ +schema-embed.json diff --git a/provider/cmd/pulumi-resource-awsx/generate.go b/provider/cmd/pulumi-resource-awsx/generate.go new file mode 100644 index 000000000..f9ef04b96 --- /dev/null +++ b/provider/cmd/pulumi-resource-awsx/generate.go @@ -0,0 +1,53 @@ +// Copyright 2016-2024, Pulumi Corporation. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build ignore + +package main + +import ( + "encoding/json" + "log" + "os" + + "github.com/pulumi/pulumi/pkg/v3/codegen/schema" +) + +func main() { + version, found := os.LookupEnv("VERSION") + if !found { + log.Fatal("version not found") + } + + schemaContents, err := os.ReadFile("./schema.json") + if err != nil { + log.Fatal(err) + } + + var packageSpec schema.PackageSpec + err = json.Unmarshal(schemaContents, &packageSpec) + if err != nil { + log.Fatalf("cannot deserialize schema: %v", err) + } + + packageSpec.Version = version + versionedContents, err := json.Marshal(packageSpec) + if err != nil { + log.Fatalf("cannot reserialize schema: %v", err) + } + + if err = os.WriteFile("./schema-embed.json", versionedContents, 0600); err != nil { + log.Fatal(err) + } +} diff --git a/provider/cmd/pulumi-resource-awsx/main.go b/provider/cmd/pulumi-resource-awsx/main.go new file mode 100644 index 000000000..ff1fd81e8 --- /dev/null +++ b/provider/cmd/pulumi-resource-awsx/main.go @@ -0,0 +1,17 @@ +// Copyright 2016-2024, Pulumi Corporation. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate go run ./generate.go + +package main diff --git a/provider/cmd/pulumi-resource-awsx/schema.json b/provider/cmd/pulumi-resource-awsx/schema.json deleted file mode 120000 index fbfb5f161..000000000 --- a/provider/cmd/pulumi-resource-awsx/schema.json +++ /dev/null @@ -1 +0,0 @@ -../../../schema.json \ No newline at end of file diff --git a/schema.json b/schema.json deleted file mode 100644 index 621a34bcf..000000000 --- a/schema.json +++ /dev/null @@ -1,3364 +0,0 @@ -{ - "name": "awsx", - "displayName": "AWSx (Pulumi Crosswalk for AWS)", - "description": "Pulumi Amazon Web Services (AWS) AWSX Components.", - "keywords": [ - "pulumi", - "aws", - "awsx", - "kind/component", - "category/cloud" - ], - "homepage": "https://pulumi.com", - "license": "Apache-2.0", - "repository": "https://github.com/pulumi/pulumi-awsx", - "publisher": "Pulumi", - "language": { - "csharp": { - "liftSingleValueMethodReturns": true, - "packageReferences": { - "Pulumi": "3.*", - "Pulumi.Aws": "6.*", - "Pulumi.Docker": "4.*" - }, - "respectSchemaVersion": true - }, - "go": { - "generateResourceContainerTypes": true, - "importBasePath": "github.com/pulumi/pulumi-awsx/sdk/v2/go/awsx", - "internalDependencies": [ - "github.com/pulumi/pulumi-docker-build/sdk/go/dockerbuild" - ], - "liftSingleValueMethodReturns": true, - "respectSchemaVersion": true - }, - "java": { - "dependencies": { - "com.pulumi:aws": "6.66.2", - "com.pulumi:docker-build": "0.0.8" - } - }, - "nodejs": { - "dependencies": { - "@aws-sdk/client-ecs": "^3.405.0", - "@pulumi/aws": "^6.66.2", - "@pulumi/docker-build": "^0.0.8", - "@types/aws-lambda": "^8.10.23", - "docker-classic": "npm:@pulumi/docker@3.6.1", - "mime": "^2.0.0" - }, - "devDependencies": { - "@types/mime": "^2.0.0", - "@types/node": "^18", - "typescript": "^4.6.2" - }, - "respectSchemaVersion": true - }, - "python": { - "liftSingleValueMethodReturns": true, - "pyproject": { - "enabled": true - }, - "readme": "Pulumi Amazon Web Services (AWS) AWSX Components.", - "requires": { - "pulumi-aws": "\u003e=6.0.4,\u003c7.0.0", - "pulumi-docker-build": "\u003e=0.0.8,\u003c1.0.0" - }, - "respectSchemaVersion": true, - "usesIOClasses": true - } - }, - "config": {}, - "types": { - "awsx:awsx:Bucket": { - "description": "The set of arguments for constructing a Bucket resource.", - "properties": { - "accelerationStatus": { - "type": "string", - "description": "Sets the accelerate configuration of an existing bucket. Can be `Enabled` or `Suspended`.\n" - }, - "acl": { - "type": "string", - "description": "The [canned ACL](https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl) to apply. Valid values are `private`, `public-read`, `public-read-write`, `aws-exec-read`, `authenticated-read`, and `log-delivery-write`. Defaults to `private`. Conflicts with `grant`.\n" - }, - "arn": { - "type": "string", - "description": "The ARN of the bucket. Will be of format `arn:aws:s3:::bucketname`.\n" - }, - "bucket": { - "type": "string", - "description": "The name of the bucket. If omitted, this provider will assign a random, unique name. Must be lowercase and less than or equal to 63 characters in length. A full list of bucket naming rules [may be found here](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html).\n", - "language": { - "csharp": { - "name": "BucketName" - } - }, - "willReplaceOnChanges": true - }, - "bucketPrefix": { - "type": "string", - "description": "Creates a unique bucket name beginning with the specified prefix. Conflicts with `bucket`. Must be lowercase and less than or equal to 37 characters in length. A full list of bucket naming rules [may be found here](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html).\n", - "willReplaceOnChanges": true - }, - "corsRules": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketCorsRule:BucketCorsRule" - }, - "description": "A rule of [Cross-Origin Resource Sharing](https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html) (documented below).\n" - }, - "forceDestroy": { - "type": "boolean", - "description": "A boolean that indicates all objects (including any [locked objects](https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock-overview.html)) should be deleted from the bucket so that the bucket can be destroyed without error. These objects are *not* recoverable.\n" - }, - "grants": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketGrant:BucketGrant" - }, - "description": "An [ACL policy grant](https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#sample-acl) (documented below). Conflicts with `acl`.\n" - }, - "hostedZoneId": { - "type": "string", - "description": "The [Route 53 Hosted Zone ID](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_website_region_endpoints) for this bucket's region.\n" - }, - "lifecycleRules": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketLifecycleRule:BucketLifecycleRule" - }, - "description": "A configuration of [object lifecycle management](http://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html) (documented below).\n" - }, - "loggings": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketLogging:BucketLogging" - }, - "description": "A settings of [bucket logging](https://docs.aws.amazon.com/AmazonS3/latest/UG/ManagingBucketLogging.html) (documented below).\n" - }, - "objectLockConfiguration": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketObjectLockConfiguration:BucketObjectLockConfiguration", - "description": "A configuration of [S3 object locking](https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html) (documented below)\n\n\u003e **NOTE:** You cannot use `acceleration_status` in `cn-north-1` or `us-gov-west-1`\n" - }, - "policy": { - "type": "string", - "description": "A valid [bucket policy](https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html) JSON document. Note that if the policy document is not specific enough (but still valid), this provider may view the policy as constantly changing in a `pulumi preview`. In this case, please make sure you use the verbose/specific version of the policy.\n" - }, - "replicationConfiguration": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketReplicationConfiguration:BucketReplicationConfiguration", - "description": "A configuration of [replication configuration](http://docs.aws.amazon.com/AmazonS3/latest/dev/crr.html) (documented below).\n" - }, - "requestPayer": { - "type": "string", - "description": "Specifies who should bear the cost of Amazon S3 data transfer.\nCan be either `BucketOwner` or `Requester`. By default, the owner of the S3 bucket would incur\nthe costs of any data transfer. See [Requester Pays Buckets](http://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html)\ndeveloper guide for more information.\n" - }, - "serverSideEncryptionConfiguration": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketServerSideEncryptionConfiguration:BucketServerSideEncryptionConfiguration", - "description": "A configuration of [server-side encryption configuration](http://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html) (documented below)\n" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "A map of tags to assign to the bucket. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - }, - "versioning": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketVersioning:BucketVersioning", - "description": "A state of [versioning](https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html) (documented below)\n" - }, - "website": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketWebsite:BucketWebsite", - "description": "A website object (documented below).\n" - }, - "websiteDomain": { - "type": "string", - "description": "The domain of the website endpoint, if the bucket is configured with a website. If not, this will be an empty string. This is used to create Route 53 alias records.\n" - }, - "websiteEndpoint": { - "type": "string", - "description": "The website endpoint, if the bucket is configured with a website. If not, this will be an empty string.\n" - } - }, - "type": "object" - }, - "awsx:awsx:DefaultBucket": { - "description": "Bucket with default setup unless explicitly skipped.", - "properties": { - "args": { - "$ref": "#/types/awsx:awsx:Bucket", - "plain": true, - "description": "Arguments to use instead of the default values during creation." - }, - "existing": { - "$ref": "#/types/awsx:awsx:ExistingBucket", - "plain": true, - "description": "Identity of an existing bucket to use. Cannot be used in combination with `args`." - }, - "skip": { - "type": "boolean", - "plain": true, - "description": "Skip creation of the bucket." - } - }, - "type": "object" - }, - "awsx:awsx:DefaultLogGroup": { - "description": "Log group with default setup unless explicitly skipped.", - "properties": { - "args": { - "$ref": "#/types/awsx:awsx:LogGroup", - "plain": true, - "description": "Arguments to use instead of the default values during creation." - }, - "existing": { - "$ref": "#/types/awsx:awsx:ExistingLogGroup", - "plain": true, - "description": "Identity of an existing log group to use. Cannot be used in combination with `args` or `opts`." - }, - "skip": { - "type": "boolean", - "plain": true, - "description": "Skip creation of the log group." - } - }, - "type": "object" - }, - "awsx:awsx:DefaultRoleWithPolicy": { - "description": "Role and policy attachments with default setup unless explicitly skipped or an existing role ARN provided.", - "properties": { - "args": { - "$ref": "#/types/awsx:awsx:RoleWithPolicy", - "plain": true, - "description": "Args to use when creating the role and policies. Can't be specified if `roleArn` is used." - }, - "roleArn": { - "type": "string", - "description": "ARN of existing role to use instead of creating a new role. Cannot be used in combination with `args` or `opts`." - }, - "skip": { - "type": "boolean", - "plain": true, - "description": "Skips creation of the role if set to `true`." - } - }, - "type": "object" - }, - "awsx:awsx:DefaultSecurityGroup": { - "description": "Security Group with default setup unless explicitly skipped or an existing security group id provided.", - "properties": { - "args": { - "$ref": "#/types/awsx:awsx:SecurityGroup", - "plain": true, - "description": "Args to use when creating the security group. Can't be specified if `securityGroupId` is used." - }, - "securityGroupId": { - "type": "string", - "description": "Id of existing security group to use instead of creating a new security group. Cannot be used in combination with `args` or `opts`." - }, - "skip": { - "type": "boolean", - "plain": true, - "description": "Skips creation of the security group if set to `true`." - } - }, - "type": "object" - }, - "awsx:awsx:ExistingBucket": { - "description": "Reference to an existing bucket.", - "properties": { - "arn": { - "type": "string", - "description": "Arn of the bucket. Only one of [arn] or [name] can be specified." - }, - "name": { - "type": "string", - "description": "Name of the bucket. Only one of [arn] or [name] can be specified." - } - }, - "type": "object" - }, - "awsx:awsx:ExistingLogGroup": { - "description": "Reference to an existing log group.", - "properties": { - "arn": { - "type": "string", - "description": "Arn of the log group. Only one of [arn] or [name] can be specified." - }, - "name": { - "type": "string", - "description": "Name of the log group. Only one of [arn] or [name] can be specified." - }, - "region": { - "type": "string", - "description": "Region of the log group. If not specified, the provider region will be used." - } - }, - "type": "object" - }, - "awsx:awsx:LogGroup": { - "description": "The set of arguments for constructing a LogGroup resource.", - "properties": { - "kmsKeyId": { - "type": "string", - "description": "The ARN of the KMS Key to use when encrypting log data. Please note, after the AWS KMS CMK is disassociated from the log group,\nAWS CloudWatch Logs stops encrypting newly ingested data for the log group. All previously ingested data remains encrypted, and AWS CloudWatch Logs requires\npermissions for the CMK whenever the encrypted data is requested.\n" - }, - "logGroupClass": { - "type": "string", - "description": "Specified the log class of the log group. Possible values are: `STANDARD` or `INFREQUENT_ACCESS`.\n", - "willReplaceOnChanges": true - }, - "name": { - "type": "string", - "description": "The name of the log group. If omitted, this provider will assign a random, unique name.\n", - "willReplaceOnChanges": true - }, - "namePrefix": { - "type": "string", - "description": "Creates a unique name beginning with the specified prefix. Conflicts with `name`.\n", - "willReplaceOnChanges": true - }, - "retentionInDays": { - "type": "integer", - "description": "Specifies the number of days\nyou want to retain log events in the specified log group. Possible values are: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1096, 1827, 2192, 2557, 2922, 3288, 3653, and 0.\nIf you select 0, the events in the log group are always retained and never expire.\n" - }, - "skipDestroy": { - "type": "boolean", - "description": "Set to true if you do not wish the log group (and any logs it may contain) to be deleted at destroy time, and instead just remove the log group from the state.\n" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "A map of tags to assign to the resource. .If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - } - }, - "type": "object" - }, - "awsx:awsx:OptionalLogGroup": { - "description": "Log group which is only created if enabled.", - "properties": { - "args": { - "$ref": "#/types/awsx:awsx:LogGroup", - "plain": true, - "description": "Arguments to use instead of the default values during creation." - }, - "enable": { - "type": "boolean", - "plain": true, - "description": "Enable creation of the log group." - }, - "existing": { - "$ref": "#/types/awsx:awsx:ExistingLogGroup", - "plain": true, - "description": "Identity of an existing log group to use. Cannot be used in combination with `args` or `opts`." - } - }, - "type": "object" - }, - "awsx:awsx:RequiredBucket": { - "description": "Bucket with default setup.", - "properties": { - "args": { - "$ref": "#/types/awsx:awsx:Bucket", - "plain": true, - "description": "Arguments to use instead of the default values during creation." - }, - "existing": { - "$ref": "#/types/awsx:awsx:ExistingBucket", - "plain": true, - "description": "Identity of an existing bucket to use. Cannot be used in combination with `args`." - } - }, - "type": "object" - }, - "awsx:awsx:RequiredLogGroup": { - "description": "Log group with default setup.", - "properties": { - "args": { - "$ref": "#/types/awsx:awsx:LogGroup", - "plain": true, - "description": "Arguments to use instead of the default values during creation." - }, - "existing": { - "$ref": "#/types/awsx:awsx:ExistingLogGroup", - "plain": true, - "description": "Identity of an existing log group to use. Cannot be used in combination with `args` or `opts`." - } - }, - "type": "object" - }, - "awsx:awsx:RoleWithPolicy": { - "description": "The set of arguments for constructing a Role resource and Policy attachments.", - "properties": { - "description": { - "type": "string", - "description": "Description of the role.\n" - }, - "forceDetachPolicies": { - "type": "boolean", - "description": "Whether to force detaching any policies the role has before destroying it. Defaults to `false`.\n" - }, - "inlinePolicies": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:iam/RoleInlinePolicy:RoleInlinePolicy" - }, - "description": "Configuration block defining an exclusive set of IAM inline policies associated with the IAM role. See below. If no blocks are configured, Pulumi will not manage any inline policies in this resource. Configuring one empty block (i.e., `inline_policy {}`) will cause Pulumi to remove _all_ inline policies added out of band on `apply`.\n" - }, - "managedPolicyArns": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Set of exclusive IAM managed policy ARNs to attach to the IAM role. If this attribute is not configured, Pulumi will ignore policy attachments to this resource. When configured, Pulumi will align the role's managed policy attachments with this set by attaching or detaching managed policies. Configuring an empty set (i.e., `managed_policy_arns = []`) will cause Pulumi to remove _all_ managed policy attachments.\n" - }, - "maxSessionDuration": { - "type": "integer", - "description": "Maximum session duration (in seconds) that you want to set for the specified role. If you do not specify a value for this setting, the default maximum of one hour is applied. This setting can have a value from 1 hour to 12 hours.\n" - }, - "name": { - "type": "string", - "description": "Friendly name of the role. If omitted, the provider will assign a random, unique name. See [IAM Identifiers](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html) for more information.\n", - "willReplaceOnChanges": true - }, - "namePrefix": { - "type": "string", - "description": "Creates a unique friendly name beginning with the specified prefix. Conflicts with `name`.\n", - "willReplaceOnChanges": true - }, - "path": { - "type": "string", - "description": "Path to the role. See [IAM Identifiers](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html) for more information.\n", - "willReplaceOnChanges": true - }, - "permissionsBoundary": { - "type": "string", - "description": "ARN of the policy that is used to set the permissions boundary for the role.\n" - }, - "policyArns": { - "type": "array", - "items": { - "type": "string", - "plain": true - }, - "plain": true, - "description": "ARNs of the policies to attach to the created role." - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Key-value mapping of tags for the IAM role. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - } - }, - "type": "object" - }, - "awsx:awsx:SecurityGroup": { - "description": "The set of arguments for constructing a Security Group resource.", - "properties": { - "description": { - "type": "string", - "description": "Security group description. Defaults to `Managed by Pulumi`. Cannot be `\"\"`. **NOTE**: This field maps to the AWS `GroupDescription` attribute, for which there is no Update API. If you'd like to classify your security groups in a way that can be updated, use `tags`.\n", - "default": "Managed by Pulumi", - "willReplaceOnChanges": true - }, - "egress": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ec2/SecurityGroupEgress:SecurityGroupEgress" - }, - "description": "Configuration block for egress rules. Can be specified multiple times for each egress rule. Each egress block supports fields documented below. This argument is processed in attribute-as-blocks mode.\n" - }, - "ingress": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ec2/SecurityGroupIngress:SecurityGroupIngress" - }, - "description": "Configuration block for ingress rules. Can be specified multiple times for each ingress rule. Each ingress block supports fields documented below. This argument is processed in attribute-as-blocks mode.\n" - }, - "name": { - "type": "string", - "description": "Name of the security group. If omitted, the provider will assign a random, unique name.\n", - "willReplaceOnChanges": true - }, - "namePrefix": { - "type": "string", - "description": "Creates a unique name beginning with the specified prefix. Conflicts with `name`.\n", - "willReplaceOnChanges": true - }, - "revokeRulesOnDelete": { - "type": "boolean", - "description": "Instruct the provider to revoke all of the Security Groups attached ingress and egress rules before deleting the rule itself. This is normally not needed, however certain AWS services such as Elastic Map Reduce may automatically add required rules to security groups used with the service, and those rules may contain a cyclic dependency that prevent the security groups from being destroyed without removing the dependency first. Default `false`.\n" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Map of tags to assign to the resource. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - }, - "vpcId": { - "type": "string", - "description": "VPC ID. Defaults to the region's default VPC.\n", - "willReplaceOnChanges": true - } - }, - "type": "object" - }, - "awsx:cloudtrail:LogGroup": { - "description": "Defines the log group configuration for the CloudWatch Log Group to send logs to.", - "properties": { - "kmsKeyId": { - "type": "string", - "description": "The ARN of the KMS Key to use when encrypting log data." - }, - "namePrefix": { - "type": "string", - "description": "Creates a unique name beginning with the specified prefix" - }, - "retentionInDays": { - "type": "integer", - "description": "Specifies the number of days you want to retain log events in the specified log group. Possible values are: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653, and 0. If you select 0, the events in the log group are always retained and never expire." - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "A map of tags to assign to the resource. If configured with provider defaultTags present, tags with matching keys will overwrite those defined at the provider-level." - } - }, - "type": "object" - }, - "awsx:ec2:NatGatewayConfiguration": { - "description": "Configuration for NAT Gateways.", - "properties": { - "elasticIpAllocationIds": { - "type": "array", - "items": { - "type": "string" - }, - "plain": true, - "description": "A list of EIP allocation IDs to assign to the NAT Gateways. Optional. If specified, the number of supplied values must match the chosen strategy (either one, or the number of availability zones)." - }, - "strategy": { - "$ref": "#/types/awsx:ec2:NatGatewayStrategy", - "plain": true, - "description": "The strategy for deploying NAT Gateways." - } - }, - "type": "object", - "required": [ - "strategy" - ] - }, - "awsx:ec2:NatGatewayStrategy": { - "description": "A strategy for creating NAT Gateways for private subnets within a VPC.", - "type": "string", - "enum": [ - { - "description": "Do not create any NAT Gateways. Resources in private subnets will not be able to access the internet.", - "value": "None" - }, - { - "description": "Create a single NAT Gateway for the entire VPC. This configuration is not recommended for production infrastructure as it creates a single point of failure.", - "value": "Single" - }, - { - "description": "Create a NAT Gateway in each availability zone. This is the recommended configuration for production infrastructure.", - "value": "OnePerAz" - } - ] - }, - "awsx:ec2:ResolvedSubnetSpec": { - "description": "Configuration for a VPC subnet spec.", - "properties": { - "cidrBlocks": { - "type": "array", - "items": { - "type": "string" - }, - "description": "An optional list of CIDR blocks to assign to the subnet spec for each AZ. If specified, the count must match the number of AZs being used for the VPC, and must also be specified for all other subnet specs." - }, - "cidrMask": { - "type": "integer", - "description": "The netmask for the subnet's CIDR block. This is optional, the default value is inferred from the `cidrMask`, `cidrBlocks` or based on an even distribution of available space from the VPC's CIDR block after being divided evenly by availability zone." - }, - "name": { - "type": "string", - "description": "The subnet's name. Will be templated upon creation." - }, - "size": { - "type": "integer", - "description": "Optional size of the subnet's CIDR block - the number of hosts. This value must be a power of 2 (e.g. 256, 512, 1024, etc.). This is optional, the default value is inferred from the `cidrMask`, `cidrBlocks` or based on an even distribution of available space from the VPC's CIDR block after being divided evenly by availability zone." - }, - "type": { - "$ref": "#/types/awsx:ec2:SubnetType", - "description": "The type of subnet." - } - }, - "type": "object", - "required": [ - "type" - ] - }, - "awsx:ec2:SubnetAllocationStrategy": { - "description": "Strategy for calculating subnet ranges from the subnet specifications.", - "type": "string", - "enum": [ - { - "description": "Group private subnets first, followed by public subnets, followed by isolated subnets.", - "value": "Legacy" - }, - { - "description": "Order remains as specified by specs, allowing gaps where required.", - "value": "Auto" - }, - { - "description": "Whole range of VPC must be accounted for, using \"Unused\" spec types for deliberate gaps.", - "value": "Exact" - } - ] - }, - "awsx:ec2:SubnetSpec": { - "description": "Configuration for a VPC subnet.", - "properties": { - "cidrBlocks": { - "type": "array", - "items": { - "type": "string", - "plain": true - }, - "plain": true, - "description": "An optional list of CIDR blocks to assign to the subnet spec for each AZ. If specified, the count must match the number of AZs being used for the VPC, and must also be specified for all other subnet specs." - }, - "cidrMask": { - "type": "integer", - "plain": true, - "description": "The netmask for the subnet's CIDR block. This is optional, the default value is inferred from the `cidrMask`, `cidrBlocks` or based on an even distribution of available space from the VPC's CIDR block after being divided evenly by availability zone." - }, - "name": { - "type": "string", - "plain": true, - "description": "The subnet's name. Will be templated upon creation." - }, - "size": { - "type": "integer", - "plain": true, - "description": "Optional size of the subnet's CIDR block - the number of hosts. This value must be a power of 2 (e.g. 256, 512, 1024, etc.). This is optional, the default value is inferred from the `cidrMask`, `cidrBlocks` or based on an even distribution of available space from the VPC's CIDR block after being divided evenly by availability zone." - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "A map of tags to assign to the resource." - }, - "type": { - "$ref": "#/types/awsx:ec2:SubnetType", - "plain": true, - "description": "The type of subnet." - } - }, - "type": "object", - "required": [ - "type" - ] - }, - "awsx:ec2:SubnetType": { - "description": "A type of subnet within a VPC.", - "type": "string", - "enum": [ - { - "description": "A subnet whose hosts can directly communicate with the internet.", - "value": "Public" - }, - { - "description": "A subnet whose hosts can not directly communicate with the internet, but can initiate outbound network traffic via a NAT Gateway.", - "value": "Private" - }, - { - "description": "A subnet whose hosts have no connectivity with the internet.", - "value": "Isolated" - }, - { - "description": "A subnet range which is reserved, but no subnet will be created.", - "value": "Unused" - } - ] - }, - "awsx:ec2:VpcEndpointSpec": { - "description": "Provides a VPC Endpoint resource.\n\n\u003e **NOTE on VPC Endpoints and VPC Endpoint Associations:** The provider provides both standalone VPC Endpoint Associations for\nRoute Tables - (an association between a VPC endpoint and a single `route_table_id`),\nSecurity Groups - (an association between a VPC endpoint and a single `security_group_id`),\nand Subnets - (an association between a VPC endpoint and a single `subnet_id`) and\na VPC Endpoint resource with `route_table_ids` and `subnet_ids` attributes.\nDo not use the same resource ID in both a VPC Endpoint resource and a VPC Endpoint Association resource.\nDoing so will cause a conflict of associations and will overwrite the association.\n\n## Example Usage\n\n### Basic\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst s3 = new aws.ec2.VpcEndpoint(\"s3\", {\n vpcId: main.id,\n serviceName: \"com.amazonaws.us-west-2.s3\",\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\ns3 = aws.ec2.VpcEndpoint(\"s3\",\n vpc_id=main[\"id\"],\n service_name=\"com.amazonaws.us-west-2.s3\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var s3 = new Aws.Ec2.VpcEndpoint(\"s3\", new()\n {\n VpcId = main.Id,\n ServiceName = \"com.amazonaws.us-west-2.s3\",\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2\"\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 := ec2.NewVpcEndpoint(ctx, \"s3\", \u0026ec2.VpcEndpointArgs{\n\t\t\tVpcId: pulumi.Any(main.Id),\n\t\t\tServiceName: pulumi.String(\"com.amazonaws.us-west-2.s3\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.ec2.VpcEndpoint;\nimport com.pulumi.aws.ec2.VpcEndpointArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var s3 = new VpcEndpoint(\"s3\", VpcEndpointArgs.builder()\n .vpcId(main.id())\n .serviceName(\"com.amazonaws.us-west-2.s3\")\n .build());\n\n }\n}\n```\n```yaml\nresources:\n s3:\n type: aws:ec2:VpcEndpoint\n properties:\n vpcId: ${main.id}\n serviceName: com.amazonaws.us-west-2.s3\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Basic w/ Tags\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst s3 = new aws.ec2.VpcEndpoint(\"s3\", {\n vpcId: main.id,\n serviceName: \"com.amazonaws.us-west-2.s3\",\n tags: {\n Environment: \"test\",\n },\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\ns3 = aws.ec2.VpcEndpoint(\"s3\",\n vpc_id=main[\"id\"],\n service_name=\"com.amazonaws.us-west-2.s3\",\n tags={\n \"Environment\": \"test\",\n })\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var s3 = new Aws.Ec2.VpcEndpoint(\"s3\", new()\n {\n VpcId = main.Id,\n ServiceName = \"com.amazonaws.us-west-2.s3\",\n Tags = \n {\n { \"Environment\", \"test\" },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2\"\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 := ec2.NewVpcEndpoint(ctx, \"s3\", \u0026ec2.VpcEndpointArgs{\n\t\t\tVpcId: pulumi.Any(main.Id),\n\t\t\tServiceName: pulumi.String(\"com.amazonaws.us-west-2.s3\"),\n\t\t\tTags: pulumi.StringMap{\n\t\t\t\t\"Environment\": pulumi.String(\"test\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.ec2.VpcEndpoint;\nimport com.pulumi.aws.ec2.VpcEndpointArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var s3 = new VpcEndpoint(\"s3\", VpcEndpointArgs.builder()\n .vpcId(main.id())\n .serviceName(\"com.amazonaws.us-west-2.s3\")\n .tags(Map.of(\"Environment\", \"test\"))\n .build());\n\n }\n}\n```\n```yaml\nresources:\n s3:\n type: aws:ec2:VpcEndpoint\n properties:\n vpcId: ${main.id}\n serviceName: com.amazonaws.us-west-2.s3\n tags:\n Environment: test\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Interface Endpoint Type\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst ec2 = new aws.ec2.VpcEndpoint(\"ec2\", {\n vpcId: main.id,\n serviceName: \"com.amazonaws.us-west-2.ec2\",\n vpcEndpointType: \"Interface\",\n securityGroupIds: [sg1.id],\n privateDnsEnabled: true,\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nec2 = aws.ec2.VpcEndpoint(\"ec2\",\n vpc_id=main[\"id\"],\n service_name=\"com.amazonaws.us-west-2.ec2\",\n vpc_endpoint_type=\"Interface\",\n security_group_ids=[sg1[\"id\"]],\n private_dns_enabled=True)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var ec2 = new Aws.Ec2.VpcEndpoint(\"ec2\", new()\n {\n VpcId = main.Id,\n ServiceName = \"com.amazonaws.us-west-2.ec2\",\n VpcEndpointType = \"Interface\",\n SecurityGroupIds = new[]\n {\n sg1.Id,\n },\n PrivateDnsEnabled = true,\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2\"\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 := ec2.NewVpcEndpoint(ctx, \"ec2\", \u0026ec2.VpcEndpointArgs{\n\t\t\tVpcId: pulumi.Any(main.Id),\n\t\t\tServiceName: pulumi.String(\"com.amazonaws.us-west-2.ec2\"),\n\t\t\tVpcEndpointType: pulumi.String(\"Interface\"),\n\t\t\tSecurityGroupIds: pulumi.StringArray{\n\t\t\t\tsg1.Id,\n\t\t\t},\n\t\t\tPrivateDnsEnabled: pulumi.Bool(true),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.ec2.VpcEndpoint;\nimport com.pulumi.aws.ec2.VpcEndpointArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var ec2 = new VpcEndpoint(\"ec2\", VpcEndpointArgs.builder()\n .vpcId(main.id())\n .serviceName(\"com.amazonaws.us-west-2.ec2\")\n .vpcEndpointType(\"Interface\")\n .securityGroupIds(sg1.id())\n .privateDnsEnabled(true)\n .build());\n\n }\n}\n```\n```yaml\nresources:\n ec2:\n type: aws:ec2:VpcEndpoint\n properties:\n vpcId: ${main.id}\n serviceName: com.amazonaws.us-west-2.ec2\n vpcEndpointType: Interface\n securityGroupIds:\n - ${sg1.id}\n privateDnsEnabled: true\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Interface Endpoint Type with User-Defined IP Address\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst ec2 = new aws.ec2.VpcEndpoint(\"ec2\", {\n vpcId: example.id,\n serviceName: \"com.amazonaws.us-west-2.ec2\",\n vpcEndpointType: \"Interface\",\n subnetConfigurations: [\n {\n ipv4: \"10.0.1.10\",\n subnetId: example1.id,\n },\n {\n ipv4: \"10.0.2.10\",\n subnetId: example2.id,\n },\n ],\n subnetIds: [\n example1.id,\n example2.id,\n ],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nec2 = aws.ec2.VpcEndpoint(\"ec2\",\n vpc_id=example[\"id\"],\n service_name=\"com.amazonaws.us-west-2.ec2\",\n vpc_endpoint_type=\"Interface\",\n subnet_configurations=[\n {\n \"ipv4\": \"10.0.1.10\",\n \"subnet_id\": example1[\"id\"],\n },\n {\n \"ipv4\": \"10.0.2.10\",\n \"subnet_id\": example2[\"id\"],\n },\n ],\n subnet_ids=[\n example1[\"id\"],\n example2[\"id\"],\n ])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var ec2 = new Aws.Ec2.VpcEndpoint(\"ec2\", new()\n {\n VpcId = example.Id,\n ServiceName = \"com.amazonaws.us-west-2.ec2\",\n VpcEndpointType = \"Interface\",\n SubnetConfigurations = new[]\n {\n new Aws.Ec2.Inputs.VpcEndpointSubnetConfigurationArgs\n {\n Ipv4 = \"10.0.1.10\",\n SubnetId = example1.Id,\n },\n new Aws.Ec2.Inputs.VpcEndpointSubnetConfigurationArgs\n {\n Ipv4 = \"10.0.2.10\",\n SubnetId = example2.Id,\n },\n },\n SubnetIds = new[]\n {\n example1.Id,\n example2.Id,\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2\"\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 := ec2.NewVpcEndpoint(ctx, \"ec2\", \u0026ec2.VpcEndpointArgs{\n\t\t\tVpcId: pulumi.Any(example.Id),\n\t\t\tServiceName: pulumi.String(\"com.amazonaws.us-west-2.ec2\"),\n\t\t\tVpcEndpointType: pulumi.String(\"Interface\"),\n\t\t\tSubnetConfigurations: ec2.VpcEndpointSubnetConfigurationArray{\n\t\t\t\t\u0026ec2.VpcEndpointSubnetConfigurationArgs{\n\t\t\t\t\tIpv4: pulumi.String(\"10.0.1.10\"),\n\t\t\t\t\tSubnetId: pulumi.Any(example1.Id),\n\t\t\t\t},\n\t\t\t\t\u0026ec2.VpcEndpointSubnetConfigurationArgs{\n\t\t\t\t\tIpv4: pulumi.String(\"10.0.2.10\"),\n\t\t\t\t\tSubnetId: pulumi.Any(example2.Id),\n\t\t\t\t},\n\t\t\t},\n\t\t\tSubnetIds: pulumi.StringArray{\n\t\t\t\texample1.Id,\n\t\t\t\texample2.Id,\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.ec2.VpcEndpoint;\nimport com.pulumi.aws.ec2.VpcEndpointArgs;\nimport com.pulumi.aws.ec2.inputs.VpcEndpointSubnetConfigurationArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var ec2 = new VpcEndpoint(\"ec2\", VpcEndpointArgs.builder()\n .vpcId(example.id())\n .serviceName(\"com.amazonaws.us-west-2.ec2\")\n .vpcEndpointType(\"Interface\")\n .subnetConfigurations( \n VpcEndpointSubnetConfigurationArgs.builder()\n .ipv4(\"10.0.1.10\")\n .subnetId(example1.id())\n .build(),\n VpcEndpointSubnetConfigurationArgs.builder()\n .ipv4(\"10.0.2.10\")\n .subnetId(example2.id())\n .build())\n .subnetIds( \n example1.id(),\n example2.id())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n ec2:\n type: aws:ec2:VpcEndpoint\n properties:\n vpcId: ${example.id}\n serviceName: com.amazonaws.us-west-2.ec2\n vpcEndpointType: Interface\n subnetConfigurations:\n - ipv4: 10.0.1.10\n subnetId: ${example1.id}\n - ipv4: 10.0.2.10\n subnetId: ${example2.id}\n subnetIds:\n - ${example1.id}\n - ${example2.id}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Gateway Load Balancer Endpoint Type\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst current = aws.getCallerIdentity({});\nconst example = new aws.ec2.VpcEndpointService(\"example\", {\n acceptanceRequired: false,\n allowedPrincipals: [current.then(current =\u003e current.arn)],\n gatewayLoadBalancerArns: [exampleAwsLb.arn],\n});\nconst exampleVpcEndpoint = new aws.ec2.VpcEndpoint(\"example\", {\n serviceName: example.serviceName,\n subnetIds: [exampleAwsSubnet.id],\n vpcEndpointType: example.serviceType,\n vpcId: exampleAwsVpc.id,\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\ncurrent = aws.get_caller_identity()\nexample = aws.ec2.VpcEndpointService(\"example\",\n acceptance_required=False,\n allowed_principals=[current.arn],\n gateway_load_balancer_arns=[example_aws_lb[\"arn\"]])\nexample_vpc_endpoint = aws.ec2.VpcEndpoint(\"example\",\n service_name=example.service_name,\n subnet_ids=[example_aws_subnet[\"id\"]],\n vpc_endpoint_type=example.service_type,\n vpc_id=example_aws_vpc[\"id\"])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var current = Aws.GetCallerIdentity.Invoke();\n\n var example = new Aws.Ec2.VpcEndpointService(\"example\", new()\n {\n AcceptanceRequired = false,\n AllowedPrincipals = new[]\n {\n current.Apply(getCallerIdentityResult =\u003e getCallerIdentityResult.Arn),\n },\n GatewayLoadBalancerArns = new[]\n {\n exampleAwsLb.Arn,\n },\n });\n\n var exampleVpcEndpoint = new Aws.Ec2.VpcEndpoint(\"example\", new()\n {\n ServiceName = example.ServiceName,\n SubnetIds = new[]\n {\n exampleAwsSubnet.Id,\n },\n VpcEndpointType = example.ServiceType,\n VpcId = exampleAwsVpc.Id,\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws\"\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tcurrent, err := aws.GetCallerIdentity(ctx, \u0026aws.GetCallerIdentityArgs{}, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\texample, err := ec2.NewVpcEndpointService(ctx, \"example\", \u0026ec2.VpcEndpointServiceArgs{\n\t\t\tAcceptanceRequired: pulumi.Bool(false),\n\t\t\tAllowedPrincipals: pulumi.StringArray{\n\t\t\t\tpulumi.String(current.Arn),\n\t\t\t},\n\t\t\tGatewayLoadBalancerArns: pulumi.StringArray{\n\t\t\t\texampleAwsLb.Arn,\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ec2.NewVpcEndpoint(ctx, \"example\", \u0026ec2.VpcEndpointArgs{\n\t\t\tServiceName: example.ServiceName,\n\t\t\tSubnetIds: pulumi.StringArray{\n\t\t\t\texampleAwsSubnet.Id,\n\t\t\t},\n\t\t\tVpcEndpointType: example.ServiceType,\n\t\t\tVpcId: pulumi.Any(exampleAwsVpc.Id),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.AwsFunctions;\nimport com.pulumi.aws.inputs.GetCallerIdentityArgs;\nimport com.pulumi.aws.ec2.VpcEndpointService;\nimport com.pulumi.aws.ec2.VpcEndpointServiceArgs;\nimport com.pulumi.aws.ec2.VpcEndpoint;\nimport com.pulumi.aws.ec2.VpcEndpointArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n final var current = AwsFunctions.getCallerIdentity();\n\n var example = new VpcEndpointService(\"example\", VpcEndpointServiceArgs.builder()\n .acceptanceRequired(false)\n .allowedPrincipals(current.applyValue(getCallerIdentityResult -\u003e getCallerIdentityResult.arn()))\n .gatewayLoadBalancerArns(exampleAwsLb.arn())\n .build());\n\n var exampleVpcEndpoint = new VpcEndpoint(\"exampleVpcEndpoint\", VpcEndpointArgs.builder()\n .serviceName(example.serviceName())\n .subnetIds(exampleAwsSubnet.id())\n .vpcEndpointType(example.serviceType())\n .vpcId(exampleAwsVpc.id())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n example:\n type: aws:ec2:VpcEndpointService\n properties:\n acceptanceRequired: false\n allowedPrincipals:\n - ${current.arn}\n gatewayLoadBalancerArns:\n - ${exampleAwsLb.arn}\n exampleVpcEndpoint:\n type: aws:ec2:VpcEndpoint\n name: example\n properties:\n serviceName: ${example.serviceName}\n subnetIds:\n - ${exampleAwsSubnet.id}\n vpcEndpointType: ${example.serviceType}\n vpcId: ${exampleAwsVpc.id}\nvariables:\n current:\n fn::invoke:\n function: aws:getCallerIdentity\n arguments: {}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nUsing `pulumi import`, import VPC Endpoints using the VPC endpoint `id`. For example:\n\n```sh\n$ pulumi import aws:ec2/vpcEndpoint:VpcEndpoint endpoint1 vpce-3ecf2a57\n```\n", - "properties": { - "autoAccept": { - "type": "boolean", - "plain": true, - "description": "Accept the VPC endpoint (the VPC endpoint and service need to be in the same AWS account)." - }, - "dnsOptions": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ec2/VpcEndpointDnsOptions:VpcEndpointDnsOptions", - "description": "The DNS options for the endpoint. See dns_options below.\n" - }, - "ipAddressType": { - "type": "string", - "description": "The IP address type for the endpoint. Valid values are `ipv4`, `dualstack`, and `ipv6`.\n" - }, - "policy": { - "type": "string", - "description": "A policy to attach to the endpoint that controls access to the service. This is a JSON formatted string. Defaults to full access. All `Gateway` and some `Interface` endpoints support policies - see the [relevant AWS documentation](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-access.html) for more details.\n" - }, - "privateDnsEnabled": { - "type": "boolean", - "plain": true, - "description": "Whether or not to associate a private hosted zone with the specified VPC. Applicable for endpoints of type Interface. Defaults to `false`." - }, - "routeTableIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "One or more route table IDs. Applicable for endpoints of type `Gateway`.\n" - }, - "securityGroupIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "The ID of one or more security groups to associate with the network interface. Applicable for endpoints of type `Interface`.\nIf no security groups are specified, the VPC's [default security group](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#DefaultSecurityGroup) is associated with the endpoint.\n" - }, - "serviceName": { - "type": "string", - "plain": true, - "description": "The service name. For AWS services the service name is usually in the form `com.amazonaws.\u003cregion\u003e.\u003cservice\u003e` (the SageMaker Notebook service is an exception to this rule, the service name is in the form `aws.sagemaker.\u003cregion\u003e.notebook`)." - }, - "serviceRegion": { - "type": "string", - "description": "The AWS region of the VPC Endpoint Service. If specified, the VPC endpoint will connect to the service in the provided region. Applicable for endpoints of type `Interface`.\n", - "willReplaceOnChanges": true - }, - "subnetConfigurations": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ec2/VpcEndpointSubnetConfiguration:VpcEndpointSubnetConfiguration" - }, - "description": "Subnet configuration for the endpoint, used to select specific IPv4 and/or IPv6 addresses to the endpoint. See subnet_configuration below.\n" - }, - "subnetIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "The ID of one or more subnets in which to create a network interface for the endpoint. Applicable for endpoints of type `GatewayLoadBalancer` and `Interface`. Interface type endpoints cannot function without being assigned to a subnet.\n" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "A map of tags to assign to the resource. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - }, - "vpcEndpointType": { - "type": "string", - "description": "The VPC endpoint type, `Gateway`, `GatewayLoadBalancer`, or `Interface`. Defaults to `Gateway`.\n", - "willReplaceOnChanges": true - } - }, - "type": "object", - "required": [ - "serviceName" - ] - }, - "awsx:ecr:BuilderVersion": { - "description": "The version of the Docker builder", - "type": "string", - "enum": [ - { - "description": "The first generation builder for Docker Daemon.", - "value": "BuilderV1" - }, - { - "description": "The builder based on moby/buildkit project", - "value": "BuilderBuildKit" - } - ] - }, - "awsx:ecr:DockerBuild": { - "description": "Arguments for building a docker image", - "properties": { - "args": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "An optional map of named build-time argument variables to set during the Docker build. This flag allows you to pass built-time variables that can be accessed like environment variables inside the `RUN` instruction." - }, - "builderVersion": { - "$ref": "#/types/awsx:ecr:BuilderVersion", - "plain": true, - "description": "The version of the Docker builder." - }, - "cacheFrom": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Images to consider as cache sources" - }, - "context": { - "type": "string", - "description": "Path to a directory to use for the Docker build context, usually the directory in which the Dockerfile resides (although dockerfile may be used to choose a custom location independent of this choice). If not specified, the context defaults to the current working directory; if a relative path is used, it is relative to the current working directory that Pulumi is evaluating." - }, - "dockerfile": { - "type": "string", - "description": "dockerfile may be used to override the default Dockerfile name and/or location. By default, it is assumed to be a file named Dockerfile in the root of the build context." - }, - "imageName": { - "type": "string", - "description": "Custom name for the underlying Docker image resource. If omitted, the image tag assigned by the provider will be used" - }, - "imageTag": { - "type": "string", - "description": "Custom image tag for the resulting docker image. If omitted a random string will be used" - }, - "platform": { - "type": "string", - "description": "The architecture of the platform you want to build this image for, e.g. `linux/arm64`." - }, - "target": { - "type": "string", - "description": "The target of the dockerfile to build" - } - }, - "type": "object" - }, - "awsx:ecr:lifecyclePolicy": { - "description": "Simplified lifecycle policy model consisting of one or more rules that determine which images in a repository should be expired. See https://docs.aws.amazon.com/AmazonECR/latest/userguide/lifecycle_policy_examples.html for more details.", - "properties": { - "rules": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ecr:lifecyclePolicyRule" - }, - "description": "Specifies the rules to determine how images should be retired from this repository. Rules are ordered from lowest priority to highest. If there is a rule with a `selection` value of `any`, then it will have the highest priority." - }, - "skip": { - "type": "boolean", - "plain": true, - "description": "Skips creation of the policy if set to `true`." - } - }, - "type": "object" - }, - "awsx:ecr:lifecyclePolicyRule": { - "description": "A lifecycle policy rule that determine which images in a repository should be expired.", - "properties": { - "description": { - "type": "string", - "description": "Describes the purpose of a rule within a lifecycle policy." - }, - "maximumAgeLimit": { - "type": "number", - "description": "The maximum age limit (in days) for your images. Either [maximumNumberOfImages] or [maximumAgeLimit] must be provided." - }, - "maximumNumberOfImages": { - "type": "number", - "description": "The maximum number of images that you want to retain in your repository. Either [maximumNumberOfImages] or [maximumAgeLimit] must be provided." - }, - "tagPrefixList": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of image tag prefixes on which to take action with your lifecycle policy. Only used if you specified \"tagStatus\": \"tagged\". For example, if your images are tagged as prod, prod1, prod2, and so on, you would use the tag prefix prod to specify all of them. If you specify multiple tags, only the images with all specified tags are selected." - }, - "tagStatus": { - "$ref": "#/types/awsx:ecr:lifecycleTagStatus", - "description": "Determines whether the lifecycle policy rule that you are adding specifies a tag for an image. Acceptable options are tagged, untagged, or any. If you specify any, then all images have the rule evaluated against them. If you specify tagged, then you must also specify a tagPrefixList value. If you specify untagged, then you must omit tagPrefixList." - } - }, - "type": "object", - "required": [ - "tagStatus" - ] - }, - "awsx:ecr:lifecycleTagStatus": { - "type": "string", - "enum": [ - { - "name": "any", - "description": "Evaluate rule against all images", - "value": "any" - }, - { - "name": "untagged", - "description": "Only evaluate rule against untagged images", - "value": "untagged" - }, - { - "name": "tagged", - "description": "Only evaluated rule against images with specified prefixes", - "value": "tagged" - } - ] - }, - "awsx:ecs:EC2ServiceTaskDefinition": { - "description": "Create a TaskDefinition resource with the given unique name, arguments, and options.\nCreates required log-group and task \u0026 execution roles.\nPresents required Service load balancers if target group included in port mappings.", - "properties": { - "container": { - "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", - "plain": true, - "description": "Single container to make a TaskDefinition from. Useful for simple cases where there aren't\nmultiple containers, especially when creating a TaskDefinition to call [run] on.\n\nEither [container] or [containers] must be provided." - }, - "containers": { - "type": "object", - "additionalProperties": { - "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", - "plain": true - }, - "plain": true, - "description": "All the containers to make a TaskDefinition from. Useful when creating a Service that will\ncontain many containers within.\n\nEither [container] or [containers] must be provided." - }, - "cpu": { - "type": "string", - "description": "The number of cpu units used by the task. If not provided, a default will be computed based on the cumulative needs specified by [containerDefinitions]" - }, - "ephemeralStorage": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionEphemeralStorage:TaskDefinitionEphemeralStorage", - "description": "The amount of ephemeral storage to allocate for the task. This parameter is used to expand the total amount of ephemeral storage available, beyond the default amount, for tasks hosted on AWS Fargate. See Ephemeral Storage.\n", - "willReplaceOnChanges": true - }, - "executionRole": { - "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", - "plain": true, - "description": "The execution role that the Amazon ECS container agent and the Docker daemon can assume.\nWill be created automatically if not defined." - }, - "family": { - "type": "string", - "description": "An optional unique name for your task definition. If not specified, then a default will be created." - }, - "inferenceAccelerators": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionInferenceAccelerator:TaskDefinitionInferenceAccelerator" - }, - "description": "Configuration block(s) with Inference Accelerators settings. Detailed below.\n", - "willReplaceOnChanges": true - }, - "ipcMode": { - "type": "string", - "description": "IPC resource namespace to be used for the containers in the task The valid values are `host`, `task`, and `none`.\n", - "willReplaceOnChanges": true - }, - "logGroup": { - "$ref": "#/types/awsx:awsx:DefaultLogGroup", - "plain": true, - "description": "A set of volume blocks that containers in your task may use." - }, - "memory": { - "type": "string", - "description": "The amount (in MiB) of memory used by the task. If not provided, a default will be computed\nbased on the cumulative needs specified by [containerDefinitions]" - }, - "networkMode": { - "type": "string", - "description": "Docker networking mode to use for the containers in the task. Valid values are `none`, `bridge`, `awsvpc`, and `host`.\n", - "willReplaceOnChanges": true - }, - "pidMode": { - "type": "string", - "description": "Process namespace to use for the containers in the task. The valid values are `host` and `task`.\n", - "willReplaceOnChanges": true - }, - "placementConstraints": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionPlacementConstraint:TaskDefinitionPlacementConstraint" - }, - "description": "Configuration block for rules that are taken into consideration during task placement. Maximum number of `placement_constraints` is `10`. Detailed below.\n", - "willReplaceOnChanges": true - }, - "proxyConfiguration": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionProxyConfiguration:TaskDefinitionProxyConfiguration", - "description": "Configuration block for the App Mesh proxy. Detailed below.\n", - "willReplaceOnChanges": true - }, - "runtimePlatform": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionRuntimePlatform:TaskDefinitionRuntimePlatform", - "description": "Configuration block for runtime_platform that containers in your task may use.\n", - "willReplaceOnChanges": true - }, - "skipDestroy": { - "type": "boolean", - "description": "Whether to retain the old revision when the resource is destroyed or replacement is necessary. Default is `false`.\n" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Key-value map of resource tags. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - }, - "taskRole": { - "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", - "plain": true, - "description": "IAM role that allows your Amazon ECS container task to make calls to other AWS services.\nWill be created automatically if not defined." - }, - "trackLatest": { - "type": "boolean", - "description": "Whether should track latest `ACTIVE` task definition on AWS or the one created with the resource stored in state. Default is `false`. Useful in the event the task definition is modified outside of this resource.\n" - }, - "volumes": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionVolume:TaskDefinitionVolume" - }, - "description": "Configuration block for volumes that containers in your task may use. Detailed below.\n", - "willReplaceOnChanges": true - } - }, - "type": "object" - }, - "awsx:ecs:FargateServiceTaskDefinition": { - "description": "Create a TaskDefinition resource with the given unique name, arguments, and options.\nCreates required log-group and task \u0026 execution roles.\nPresents required Service load balancers if target group included in port mappings.", - "properties": { - "container": { - "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", - "plain": true, - "description": "Single container to make a TaskDefinition from. Useful for simple cases where there aren't\nmultiple containers, especially when creating a TaskDefinition to call [run] on.\n\nEither [container] or [containers] must be provided." - }, - "containers": { - "type": "object", - "additionalProperties": { - "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", - "plain": true - }, - "plain": true, - "description": "All the containers to make a TaskDefinition from. Useful when creating a Service that will\ncontain many containers within.\n\nEither [container] or [containers] must be provided." - }, - "cpu": { - "type": "string", - "description": "The number of cpu units used by the task. If not provided, a default will be computed based on the cumulative needs specified by [containerDefinitions]" - }, - "ephemeralStorage": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionEphemeralStorage:TaskDefinitionEphemeralStorage", - "description": "The amount of ephemeral storage to allocate for the task. This parameter is used to expand the total amount of ephemeral storage available, beyond the default amount, for tasks hosted on AWS Fargate. See Ephemeral Storage.\n", - "willReplaceOnChanges": true - }, - "executionRole": { - "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", - "plain": true, - "description": "The execution role that the Amazon ECS container agent and the Docker daemon can assume.\nWill be created automatically if not defined." - }, - "family": { - "type": "string", - "description": "An optional unique name for your task definition. If not specified, then a default will be created." - }, - "inferenceAccelerators": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionInferenceAccelerator:TaskDefinitionInferenceAccelerator" - }, - "description": "Configuration block(s) with Inference Accelerators settings. Detailed below.\n", - "willReplaceOnChanges": true - }, - "ipcMode": { - "type": "string", - "description": "IPC resource namespace to be used for the containers in the task The valid values are `host`, `task`, and `none`.\n", - "willReplaceOnChanges": true - }, - "logGroup": { - "$ref": "#/types/awsx:awsx:DefaultLogGroup", - "plain": true, - "description": "A set of volume blocks that containers in your task may use." - }, - "memory": { - "type": "string", - "description": "The amount (in MiB) of memory used by the task. If not provided, a default will be computed\nbased on the cumulative needs specified by [containerDefinitions]" - }, - "pidMode": { - "type": "string", - "description": "Process namespace to use for the containers in the task. The valid values are `host` and `task`.\n", - "willReplaceOnChanges": true - }, - "placementConstraints": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionPlacementConstraint:TaskDefinitionPlacementConstraint" - }, - "description": "Configuration block for rules that are taken into consideration during task placement. Maximum number of `placement_constraints` is `10`. Detailed below.\n", - "willReplaceOnChanges": true - }, - "proxyConfiguration": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionProxyConfiguration:TaskDefinitionProxyConfiguration", - "description": "Configuration block for the App Mesh proxy. Detailed below.\n", - "willReplaceOnChanges": true - }, - "runtimePlatform": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionRuntimePlatform:TaskDefinitionRuntimePlatform", - "description": "Configuration block for runtime_platform that containers in your task may use.\n", - "willReplaceOnChanges": true - }, - "skipDestroy": { - "type": "boolean", - "description": "Whether to retain the old revision when the resource is destroyed or replacement is necessary. Default is `false`.\n" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Key-value map of resource tags. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - }, - "taskRole": { - "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", - "plain": true, - "description": "IAM role that allows your Amazon ECS container task to make calls to other AWS services.\nWill be created automatically if not defined." - }, - "trackLatest": { - "type": "boolean", - "description": "Whether should track latest `ACTIVE` task definition on AWS or the one created with the resource stored in state. Default is `false`. Useful in the event the task definition is modified outside of this resource.\n" - }, - "volumes": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionVolume:TaskDefinitionVolume" - }, - "description": "Configuration block for volumes that containers in your task may use. Detailed below.\n", - "willReplaceOnChanges": true - } - }, - "type": "object" - }, - "awsx:ecs:TaskDefinitionContainerDefinition": { - "description": "List of container definitions that are passed to the Docker daemon on a container instance", - "properties": { - "command": { - "type": "array", - "items": { - "type": "string" - } - }, - "cpu": { - "type": "integer" - }, - "dependsOn": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDependency" - } - }, - "disableNetworking": { - "type": "boolean" - }, - "dnsSearchDomains": { - "type": "array", - "items": { - "type": "string" - } - }, - "dnsServers": { - "type": "array", - "items": { - "type": "string" - } - }, - "dockerLabels": { - "$ref": "pulumi.json#/Any" - }, - "dockerSecurityOptions": { - "type": "array", - "items": { - "type": "string" - } - }, - "entryPoint": { - "type": "array", - "items": { - "type": "string" - } - }, - "environment": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ecs:TaskDefinitionKeyValuePair" - }, - "description": "The environment variables to pass to a container" - }, - "environmentFiles": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ecs:TaskDefinitionEnvironmentFile" - }, - "description": "The list of one or more files that contain the environment variables to pass to a container" - }, - "essential": { - "type": "boolean" - }, - "extraHosts": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ecs:TaskDefinitionHostEntry" - } - }, - "firelensConfiguration": { - "$ref": "#/types/awsx:ecs:TaskDefinitionFirelensConfiguration" - }, - "healthCheck": { - "$ref": "#/types/awsx:ecs:TaskDefinitionHealthCheck" - }, - "hostname": { - "type": "string" - }, - "image": { - "type": "string", - "description": "The image used to start a container. This string is passed directly to the Docker daemon." - }, - "interactive": { - "type": "boolean" - }, - "links": { - "type": "array", - "items": { - "type": "string" - } - }, - "linuxParameters": { - "$ref": "#/types/awsx:ecs:TaskDefinitionLinuxParameters" - }, - "logConfiguration": { - "$ref": "#/types/awsx:ecs:TaskDefinitionLogConfiguration" - }, - "memory": { - "type": "integer", - "description": "The amount (in MiB) of memory to present to the container. If your container attempts to exceed the memory specified here, the container is killed." - }, - "memoryReservation": { - "type": "integer" - }, - "mountPoints": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ecs:TaskDefinitionMountPoint" - } - }, - "name": { - "type": "string", - "description": "The name of a container. Up to 255 letters (uppercase and lowercase), numbers, hyphens, and underscores are allowed" - }, - "portMappings": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ecs:TaskDefinitionPortMapping" - }, - "description": "Port mappings allow containers to access ports on the host container instance to send or receive traffic." - }, - "privileged": { - "type": "boolean" - }, - "pseudoTerminal": { - "type": "boolean" - }, - "readonlyRootFilesystem": { - "type": "boolean" - }, - "repositoryCredentials": { - "$ref": "#/types/awsx:ecs:TaskDefinitionRepositoryCredentials" - }, - "resourceRequirements": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ecs:TaskDefinitionResourceRequirement" - } - }, - "secrets": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ecs:TaskDefinitionSecret" - } - }, - "startTimeout": { - "type": "integer" - }, - "stopTimeout": { - "type": "integer" - }, - "systemControls": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ecs:TaskDefinitionSystemControl" - } - }, - "ulimits": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ecs:TaskDefinitionUlimit" - } - }, - "user": { - "type": "string" - }, - "volumesFrom": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ecs:TaskDefinitionVolumeFrom" - } - }, - "workingDirectory": { - "type": "string" - } - }, - "type": "object", - "required": [ - "image", - "name" - ] - }, - "awsx:ecs:TaskDefinitionContainerDependency": { - "properties": { - "condition": { - "type": "string" - }, - "containerName": { - "type": "string" - } - }, - "type": "object" - }, - "awsx:ecs:TaskDefinitionDevice": { - "properties": { - "containerPath": { - "type": "string" - }, - "hostPath": { - "type": "string" - }, - "permissions": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "type": "object" - }, - "awsx:ecs:TaskDefinitionEnvironmentFile": { - "properties": { - "type": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "type": "object" - }, - "awsx:ecs:TaskDefinitionFirelensConfiguration": { - "properties": { - "options": { - "$ref": "pulumi.json#/Any" - }, - "type": { - "type": "string" - } - }, - "type": "object" - }, - "awsx:ecs:TaskDefinitionHealthCheck": { - "description": "The health check command and associated configuration parameters for the container.", - "properties": { - "command": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A string array representing the command that the container runs to determine if it is healthy." - }, - "interval": { - "type": "integer", - "description": "The time period in seconds between each health check execution. You may specify between 5 and 300 seconds. The default value is 30 seconds." - }, - "retries": { - "type": "integer", - "description": "The number of times to retry a failed health check before the container is considered unhealthy. You may specify between 1 and 10 retries. The default value is three retries." - }, - "startPeriod": { - "type": "integer", - "description": "The optional grace period within which to provide containers time to bootstrap before failed health checks count towards the maximum number of retries. You may specify between 0 and 300 seconds. The startPeriod is disabled by default." - }, - "timeout": { - "type": "integer", - "description": "The time period in seconds to wait for a health check to succeed before it is considered a failure. You may specify between 2 and 60 seconds. The default value is 5 seconds." - } - }, - "type": "object" - }, - "awsx:ecs:TaskDefinitionHostEntry": { - "properties": { - "hostname": { - "type": "string" - }, - "ipAddress": { - "type": "string" - } - }, - "type": "object" - }, - "awsx:ecs:TaskDefinitionKernelCapabilities": { - "properties": { - "add": { - "type": "array", - "items": { - "type": "string" - } - }, - "drop": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "type": "object" - }, - "awsx:ecs:TaskDefinitionKeyValuePair": { - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "type": "object" - }, - "awsx:ecs:TaskDefinitionLinuxParameters": { - "properties": { - "capabilities": { - "$ref": "#/types/awsx:ecs:TaskDefinitionKernelCapabilities" - }, - "devices": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ecs:TaskDefinitionDevice" - } - }, - "initProcessEnabled": { - "type": "boolean" - }, - "maxSwap": { - "type": "integer" - }, - "sharedMemorySize": { - "type": "integer" - }, - "swappiness": { - "type": "integer" - }, - "tmpfs": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ecs:TaskDefinitionTmpfs" - } - } - }, - "type": "object" - }, - "awsx:ecs:TaskDefinitionLogConfiguration": { - "properties": { - "logDriver": { - "type": "string" - }, - "options": { - "$ref": "pulumi.json#/Any" - }, - "secretOptions": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ecs:TaskDefinitionSecret" - } - } - }, - "type": "object", - "required": [ - "logDriver" - ] - }, - "awsx:ecs:TaskDefinitionMountPoint": { - "properties": { - "containerPath": { - "type": "string" - }, - "readOnly": { - "type": "boolean" - }, - "sourceVolume": { - "type": "string" - } - }, - "type": "object" - }, - "awsx:ecs:TaskDefinitionPortMapping": { - "properties": { - "appProtocol": { - "$ref": "#/types/awsx:ecs:TaskDefinitionPortMappingAppProtocol" - }, - "containerPort": { - "type": "integer" - }, - "containerPortRange": { - "type": "string" - }, - "hostPort": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "protocol": { - "type": "string" - }, - "targetGroup": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2FtargetGroup:TargetGroup" - } - }, - "type": "object" - }, - "awsx:ecs:TaskDefinitionPortMappingAppProtocol": { - "type": "string", - "enum": [ - { - "name": "Http", - "value": "http" - }, - { - "name": "Http2", - "value": "http2" - }, - { - "name": "Grpc", - "value": "grpc" - } - ] - }, - "awsx:ecs:TaskDefinitionRepositoryCredentials": { - "properties": { - "credentialsParameter": { - "type": "string" - } - }, - "type": "object" - }, - "awsx:ecs:TaskDefinitionResourceRequirement": { - "properties": { - "type": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "type": "object", - "required": [ - "type", - "value" - ] - }, - "awsx:ecs:TaskDefinitionSecret": { - "properties": { - "name": { - "type": "string" - }, - "valueFrom": { - "type": "string" - } - }, - "type": "object", - "required": [ - "name", - "valueFrom" - ] - }, - "awsx:ecs:TaskDefinitionSystemControl": { - "properties": { - "namespace": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "type": "object" - }, - "awsx:ecs:TaskDefinitionTmpfs": { - "properties": { - "containerPath": { - "type": "string" - }, - "mountOptions": { - "type": "array", - "items": { - "type": "string" - } - }, - "size": { - "type": "integer" - } - }, - "type": "object", - "required": [ - "size" - ] - }, - "awsx:ecs:TaskDefinitionUlimit": { - "properties": { - "hardLimit": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "softLimit": { - "type": "integer" - } - }, - "type": "object", - "required": [ - "hardLimit", - "name", - "softLimit" - ] - }, - "awsx:ecs:TaskDefinitionVolumeFrom": { - "properties": { - "readOnly": { - "type": "boolean" - }, - "sourceContainer": { - "type": "string" - } - }, - "type": "object" - }, - "awsx:lb:Listener": { - "description": "Provides a Load Balancer Listener resource.\n\n\u003e **Note:** `aws.alb.Listener` is known as `aws.lb.Listener`. The functionality is identical.\n\n## Example Usage\n\n### Forward Action\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst frontEnd = new aws.lb.LoadBalancer(\"front_end\", {});\nconst frontEndTargetGroup = new aws.lb.TargetGroup(\"front_end\", {});\nconst frontEndListener = new aws.lb.Listener(\"front_end\", {\n loadBalancerArn: frontEnd.arn,\n port: 443,\n protocol: \"HTTPS\",\n sslPolicy: \"ELBSecurityPolicy-2016-08\",\n certificateArn: \"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\",\n defaultActions: [{\n type: \"forward\",\n targetGroupArn: frontEndTargetGroup.arn,\n }],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nfront_end = aws.lb.LoadBalancer(\"front_end\")\nfront_end_target_group = aws.lb.TargetGroup(\"front_end\")\nfront_end_listener = aws.lb.Listener(\"front_end\",\n load_balancer_arn=front_end.arn,\n port=443,\n protocol=\"HTTPS\",\n ssl_policy=\"ELBSecurityPolicy-2016-08\",\n certificate_arn=\"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\",\n default_actions=[{\n \"type\": \"forward\",\n \"target_group_arn\": front_end_target_group.arn,\n }])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var frontEnd = new Aws.LB.LoadBalancer(\"front_end\");\n\n var frontEndTargetGroup = new Aws.LB.TargetGroup(\"front_end\");\n\n var frontEndListener = new Aws.LB.Listener(\"front_end\", new()\n {\n LoadBalancerArn = frontEnd.Arn,\n Port = 443,\n Protocol = \"HTTPS\",\n SslPolicy = \"ELBSecurityPolicy-2016-08\",\n CertificateArn = \"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\",\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"forward\",\n TargetGroupArn = frontEndTargetGroup.Arn,\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tfrontEnd, err := lb.NewLoadBalancer(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfrontEndTargetGroup, err := lb.NewTargetGroup(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewListener(ctx, \"front_end\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: frontEnd.Arn,\n\t\t\tPort: pulumi.Int(443),\n\t\t\tProtocol: pulumi.String(\"HTTPS\"),\n\t\t\tSslPolicy: pulumi.String(\"ELBSecurityPolicy-2016-08\"),\n\t\t\tCertificateArn: pulumi.String(\"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\"),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"forward\"),\n\t\t\t\t\tTargetGroupArn: frontEndTargetGroup.Arn,\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.LoadBalancer;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var frontEnd = new LoadBalancer(\"frontEnd\");\n\n var frontEndTargetGroup = new TargetGroup(\"frontEndTargetGroup\");\n\n var frontEndListener = new Listener(\"frontEndListener\", ListenerArgs.builder()\n .loadBalancerArn(frontEnd.arn())\n .port(\"443\")\n .protocol(\"HTTPS\")\n .sslPolicy(\"ELBSecurityPolicy-2016-08\")\n .certificateArn(\"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\")\n .defaultActions(ListenerDefaultActionArgs.builder()\n .type(\"forward\")\n .targetGroupArn(frontEndTargetGroup.arn())\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n frontEnd:\n type: aws:lb:LoadBalancer\n name: front_end\n frontEndTargetGroup:\n type: aws:lb:TargetGroup\n name: front_end\n frontEndListener:\n type: aws:lb:Listener\n name: front_end\n properties:\n loadBalancerArn: ${frontEnd.arn}\n port: '443'\n protocol: HTTPS\n sslPolicy: ELBSecurityPolicy-2016-08\n certificateArn: arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\n defaultActions:\n - type: forward\n targetGroupArn: ${frontEndTargetGroup.arn}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\nTo a NLB:\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst frontEnd = new aws.lb.Listener(\"front_end\", {\n loadBalancerArn: frontEndAwsLb.arn,\n port: 443,\n protocol: \"TLS\",\n sslPolicy: \"ELBSecurityPolicy-2016-08\",\n certificateArn: \"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\",\n alpnPolicy: \"HTTP2Preferred\",\n defaultActions: [{\n type: \"forward\",\n targetGroupArn: frontEndAwsLbTargetGroup.arn,\n }],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nfront_end = aws.lb.Listener(\"front_end\",\n load_balancer_arn=front_end_aws_lb[\"arn\"],\n port=443,\n protocol=\"TLS\",\n ssl_policy=\"ELBSecurityPolicy-2016-08\",\n certificate_arn=\"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\",\n alpn_policy=\"HTTP2Preferred\",\n default_actions=[{\n \"type\": \"forward\",\n \"target_group_arn\": front_end_aws_lb_target_group[\"arn\"],\n }])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var frontEnd = new Aws.LB.Listener(\"front_end\", new()\n {\n LoadBalancerArn = frontEndAwsLb.Arn,\n Port = 443,\n Protocol = \"TLS\",\n SslPolicy = \"ELBSecurityPolicy-2016-08\",\n CertificateArn = \"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\",\n AlpnPolicy = \"HTTP2Preferred\",\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"forward\",\n TargetGroupArn = frontEndAwsLbTargetGroup.Arn,\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\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 := lb.NewListener(ctx, \"front_end\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: pulumi.Any(frontEndAwsLb.Arn),\n\t\t\tPort: pulumi.Int(443),\n\t\t\tProtocol: pulumi.String(\"TLS\"),\n\t\t\tSslPolicy: pulumi.String(\"ELBSecurityPolicy-2016-08\"),\n\t\t\tCertificateArn: pulumi.String(\"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\"),\n\t\t\tAlpnPolicy: pulumi.String(\"HTTP2Preferred\"),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"forward\"),\n\t\t\t\t\tTargetGroupArn: pulumi.Any(frontEndAwsLbTargetGroup.Arn),\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var frontEnd = new Listener(\"frontEnd\", ListenerArgs.builder()\n .loadBalancerArn(frontEndAwsLb.arn())\n .port(\"443\")\n .protocol(\"TLS\")\n .sslPolicy(\"ELBSecurityPolicy-2016-08\")\n .certificateArn(\"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\")\n .alpnPolicy(\"HTTP2Preferred\")\n .defaultActions(ListenerDefaultActionArgs.builder()\n .type(\"forward\")\n .targetGroupArn(frontEndAwsLbTargetGroup.arn())\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n frontEnd:\n type: aws:lb:Listener\n name: front_end\n properties:\n loadBalancerArn: ${frontEndAwsLb.arn}\n port: '443'\n protocol: TLS\n sslPolicy: ELBSecurityPolicy-2016-08\n certificateArn: arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\n alpnPolicy: HTTP2Preferred\n defaultActions:\n - type: forward\n targetGroupArn: ${frontEndAwsLbTargetGroup.arn}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Redirect Action\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst frontEnd = new aws.lb.LoadBalancer(\"front_end\", {});\nconst frontEndListener = new aws.lb.Listener(\"front_end\", {\n loadBalancerArn: frontEnd.arn,\n port: 80,\n protocol: \"HTTP\",\n defaultActions: [{\n type: \"redirect\",\n redirect: {\n port: \"443\",\n protocol: \"HTTPS\",\n statusCode: \"HTTP_301\",\n },\n }],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nfront_end = aws.lb.LoadBalancer(\"front_end\")\nfront_end_listener = aws.lb.Listener(\"front_end\",\n load_balancer_arn=front_end.arn,\n port=80,\n protocol=\"HTTP\",\n default_actions=[{\n \"type\": \"redirect\",\n \"redirect\": {\n \"port\": \"443\",\n \"protocol\": \"HTTPS\",\n \"status_code\": \"HTTP_301\",\n },\n }])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var frontEnd = new Aws.LB.LoadBalancer(\"front_end\");\n\n var frontEndListener = new Aws.LB.Listener(\"front_end\", new()\n {\n LoadBalancerArn = frontEnd.Arn,\n Port = 80,\n Protocol = \"HTTP\",\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"redirect\",\n Redirect = new Aws.LB.Inputs.ListenerDefaultActionRedirectArgs\n {\n Port = \"443\",\n Protocol = \"HTTPS\",\n StatusCode = \"HTTP_301\",\n },\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tfrontEnd, err := lb.NewLoadBalancer(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewListener(ctx, \"front_end\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: frontEnd.Arn,\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"HTTP\"),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"redirect\"),\n\t\t\t\t\tRedirect: \u0026lb.ListenerDefaultActionRedirectArgs{\n\t\t\t\t\t\tPort: pulumi.String(\"443\"),\n\t\t\t\t\t\tProtocol: pulumi.String(\"HTTPS\"),\n\t\t\t\t\t\tStatusCode: pulumi.String(\"HTTP_301\"),\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.LoadBalancer;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionRedirectArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var frontEnd = new LoadBalancer(\"frontEnd\");\n\n var frontEndListener = new Listener(\"frontEndListener\", ListenerArgs.builder()\n .loadBalancerArn(frontEnd.arn())\n .port(\"80\")\n .protocol(\"HTTP\")\n .defaultActions(ListenerDefaultActionArgs.builder()\n .type(\"redirect\")\n .redirect(ListenerDefaultActionRedirectArgs.builder()\n .port(\"443\")\n .protocol(\"HTTPS\")\n .statusCode(\"HTTP_301\")\n .build())\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n frontEnd:\n type: aws:lb:LoadBalancer\n name: front_end\n frontEndListener:\n type: aws:lb:Listener\n name: front_end\n properties:\n loadBalancerArn: ${frontEnd.arn}\n port: '80'\n protocol: HTTP\n defaultActions:\n - type: redirect\n redirect:\n port: '443'\n protocol: HTTPS\n statusCode: HTTP_301\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Fixed-response Action\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst frontEnd = new aws.lb.LoadBalancer(\"front_end\", {});\nconst frontEndListener = new aws.lb.Listener(\"front_end\", {\n loadBalancerArn: frontEnd.arn,\n port: 80,\n protocol: \"HTTP\",\n defaultActions: [{\n type: \"fixed-response\",\n fixedResponse: {\n contentType: \"text/plain\",\n messageBody: \"Fixed response content\",\n statusCode: \"200\",\n },\n }],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nfront_end = aws.lb.LoadBalancer(\"front_end\")\nfront_end_listener = aws.lb.Listener(\"front_end\",\n load_balancer_arn=front_end.arn,\n port=80,\n protocol=\"HTTP\",\n default_actions=[{\n \"type\": \"fixed-response\",\n \"fixed_response\": {\n \"content_type\": \"text/plain\",\n \"message_body\": \"Fixed response content\",\n \"status_code\": \"200\",\n },\n }])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var frontEnd = new Aws.LB.LoadBalancer(\"front_end\");\n\n var frontEndListener = new Aws.LB.Listener(\"front_end\", new()\n {\n LoadBalancerArn = frontEnd.Arn,\n Port = 80,\n Protocol = \"HTTP\",\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"fixed-response\",\n FixedResponse = new Aws.LB.Inputs.ListenerDefaultActionFixedResponseArgs\n {\n ContentType = \"text/plain\",\n MessageBody = \"Fixed response content\",\n StatusCode = \"200\",\n },\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tfrontEnd, err := lb.NewLoadBalancer(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewListener(ctx, \"front_end\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: frontEnd.Arn,\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"HTTP\"),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"fixed-response\"),\n\t\t\t\t\tFixedResponse: \u0026lb.ListenerDefaultActionFixedResponseArgs{\n\t\t\t\t\t\tContentType: pulumi.String(\"text/plain\"),\n\t\t\t\t\t\tMessageBody: pulumi.String(\"Fixed response content\"),\n\t\t\t\t\t\tStatusCode: pulumi.String(\"200\"),\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.LoadBalancer;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionFixedResponseArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var frontEnd = new LoadBalancer(\"frontEnd\");\n\n var frontEndListener = new Listener(\"frontEndListener\", ListenerArgs.builder()\n .loadBalancerArn(frontEnd.arn())\n .port(\"80\")\n .protocol(\"HTTP\")\n .defaultActions(ListenerDefaultActionArgs.builder()\n .type(\"fixed-response\")\n .fixedResponse(ListenerDefaultActionFixedResponseArgs.builder()\n .contentType(\"text/plain\")\n .messageBody(\"Fixed response content\")\n .statusCode(\"200\")\n .build())\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n frontEnd:\n type: aws:lb:LoadBalancer\n name: front_end\n frontEndListener:\n type: aws:lb:Listener\n name: front_end\n properties:\n loadBalancerArn: ${frontEnd.arn}\n port: '80'\n protocol: HTTP\n defaultActions:\n - type: fixed-response\n fixedResponse:\n contentType: text/plain\n messageBody: Fixed response content\n statusCode: '200'\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Authenticate-cognito Action\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst frontEnd = new aws.lb.LoadBalancer(\"front_end\", {});\nconst frontEndTargetGroup = new aws.lb.TargetGroup(\"front_end\", {});\nconst pool = new aws.cognito.UserPool(\"pool\", {});\nconst client = new aws.cognito.UserPoolClient(\"client\", {});\nconst domain = new aws.cognito.UserPoolDomain(\"domain\", {});\nconst frontEndListener = new aws.lb.Listener(\"front_end\", {\n loadBalancerArn: frontEnd.arn,\n port: 80,\n protocol: \"HTTP\",\n defaultActions: [\n {\n type: \"authenticate-cognito\",\n authenticateCognito: {\n userPoolArn: pool.arn,\n userPoolClientId: client.id,\n userPoolDomain: domain.domain,\n },\n },\n {\n type: \"forward\",\n targetGroupArn: frontEndTargetGroup.arn,\n },\n ],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nfront_end = aws.lb.LoadBalancer(\"front_end\")\nfront_end_target_group = aws.lb.TargetGroup(\"front_end\")\npool = aws.cognito.UserPool(\"pool\")\nclient = aws.cognito.UserPoolClient(\"client\")\ndomain = aws.cognito.UserPoolDomain(\"domain\")\nfront_end_listener = aws.lb.Listener(\"front_end\",\n load_balancer_arn=front_end.arn,\n port=80,\n protocol=\"HTTP\",\n default_actions=[\n {\n \"type\": \"authenticate-cognito\",\n \"authenticate_cognito\": {\n \"user_pool_arn\": pool.arn,\n \"user_pool_client_id\": client.id,\n \"user_pool_domain\": domain.domain,\n },\n },\n {\n \"type\": \"forward\",\n \"target_group_arn\": front_end_target_group.arn,\n },\n ])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var frontEnd = new Aws.LB.LoadBalancer(\"front_end\");\n\n var frontEndTargetGroup = new Aws.LB.TargetGroup(\"front_end\");\n\n var pool = new Aws.Cognito.UserPool(\"pool\");\n\n var client = new Aws.Cognito.UserPoolClient(\"client\");\n\n var domain = new Aws.Cognito.UserPoolDomain(\"domain\");\n\n var frontEndListener = new Aws.LB.Listener(\"front_end\", new()\n {\n LoadBalancerArn = frontEnd.Arn,\n Port = 80,\n Protocol = \"HTTP\",\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"authenticate-cognito\",\n AuthenticateCognito = new Aws.LB.Inputs.ListenerDefaultActionAuthenticateCognitoArgs\n {\n UserPoolArn = pool.Arn,\n UserPoolClientId = client.Id,\n UserPoolDomain = domain.Domain,\n },\n },\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"forward\",\n TargetGroupArn = frontEndTargetGroup.Arn,\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/cognito\"\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tfrontEnd, err := lb.NewLoadBalancer(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfrontEndTargetGroup, err := lb.NewTargetGroup(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tpool, err := cognito.NewUserPool(ctx, \"pool\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tclient, err := cognito.NewUserPoolClient(ctx, \"client\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdomain, err := cognito.NewUserPoolDomain(ctx, \"domain\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewListener(ctx, \"front_end\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: frontEnd.Arn,\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"HTTP\"),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"authenticate-cognito\"),\n\t\t\t\t\tAuthenticateCognito: \u0026lb.ListenerDefaultActionAuthenticateCognitoArgs{\n\t\t\t\t\t\tUserPoolArn: pool.Arn,\n\t\t\t\t\t\tUserPoolClientId: client.ID(),\n\t\t\t\t\t\tUserPoolDomain: domain.Domain,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"forward\"),\n\t\t\t\t\tTargetGroupArn: frontEndTargetGroup.Arn,\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.LoadBalancer;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.cognito.UserPool;\nimport com.pulumi.aws.cognito.UserPoolClient;\nimport com.pulumi.aws.cognito.UserPoolDomain;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionAuthenticateCognitoArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var frontEnd = new LoadBalancer(\"frontEnd\");\n\n var frontEndTargetGroup = new TargetGroup(\"frontEndTargetGroup\");\n\n var pool = new UserPool(\"pool\");\n\n var client = new UserPoolClient(\"client\");\n\n var domain = new UserPoolDomain(\"domain\");\n\n var frontEndListener = new Listener(\"frontEndListener\", ListenerArgs.builder()\n .loadBalancerArn(frontEnd.arn())\n .port(\"80\")\n .protocol(\"HTTP\")\n .defaultActions( \n ListenerDefaultActionArgs.builder()\n .type(\"authenticate-cognito\")\n .authenticateCognito(ListenerDefaultActionAuthenticateCognitoArgs.builder()\n .userPoolArn(pool.arn())\n .userPoolClientId(client.id())\n .userPoolDomain(domain.domain())\n .build())\n .build(),\n ListenerDefaultActionArgs.builder()\n .type(\"forward\")\n .targetGroupArn(frontEndTargetGroup.arn())\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n frontEnd:\n type: aws:lb:LoadBalancer\n name: front_end\n frontEndTargetGroup:\n type: aws:lb:TargetGroup\n name: front_end\n pool:\n type: aws:cognito:UserPool\n client:\n type: aws:cognito:UserPoolClient\n domain:\n type: aws:cognito:UserPoolDomain\n frontEndListener:\n type: aws:lb:Listener\n name: front_end\n properties:\n loadBalancerArn: ${frontEnd.arn}\n port: '80'\n protocol: HTTP\n defaultActions:\n - type: authenticate-cognito\n authenticateCognito:\n userPoolArn: ${pool.arn}\n userPoolClientId: ${client.id}\n userPoolDomain: ${domain.domain}\n - type: forward\n targetGroupArn: ${frontEndTargetGroup.arn}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Authenticate-OIDC Action\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst frontEnd = new aws.lb.LoadBalancer(\"front_end\", {});\nconst frontEndTargetGroup = new aws.lb.TargetGroup(\"front_end\", {});\nconst frontEndListener = new aws.lb.Listener(\"front_end\", {\n loadBalancerArn: frontEnd.arn,\n port: 80,\n protocol: \"HTTP\",\n defaultActions: [\n {\n type: \"authenticate-oidc\",\n authenticateOidc: {\n authorizationEndpoint: \"https://example.com/authorization_endpoint\",\n clientId: \"client_id\",\n clientSecret: \"client_secret\",\n issuer: \"https://example.com\",\n tokenEndpoint: \"https://example.com/token_endpoint\",\n userInfoEndpoint: \"https://example.com/user_info_endpoint\",\n },\n },\n {\n type: \"forward\",\n targetGroupArn: frontEndTargetGroup.arn,\n },\n ],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nfront_end = aws.lb.LoadBalancer(\"front_end\")\nfront_end_target_group = aws.lb.TargetGroup(\"front_end\")\nfront_end_listener = aws.lb.Listener(\"front_end\",\n load_balancer_arn=front_end.arn,\n port=80,\n protocol=\"HTTP\",\n default_actions=[\n {\n \"type\": \"authenticate-oidc\",\n \"authenticate_oidc\": {\n \"authorization_endpoint\": \"https://example.com/authorization_endpoint\",\n \"client_id\": \"client_id\",\n \"client_secret\": \"client_secret\",\n \"issuer\": \"https://example.com\",\n \"token_endpoint\": \"https://example.com/token_endpoint\",\n \"user_info_endpoint\": \"https://example.com/user_info_endpoint\",\n },\n },\n {\n \"type\": \"forward\",\n \"target_group_arn\": front_end_target_group.arn,\n },\n ])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var frontEnd = new Aws.LB.LoadBalancer(\"front_end\");\n\n var frontEndTargetGroup = new Aws.LB.TargetGroup(\"front_end\");\n\n var frontEndListener = new Aws.LB.Listener(\"front_end\", new()\n {\n LoadBalancerArn = frontEnd.Arn,\n Port = 80,\n Protocol = \"HTTP\",\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"authenticate-oidc\",\n AuthenticateOidc = new Aws.LB.Inputs.ListenerDefaultActionAuthenticateOidcArgs\n {\n AuthorizationEndpoint = \"https://example.com/authorization_endpoint\",\n ClientId = \"client_id\",\n ClientSecret = \"client_secret\",\n Issuer = \"https://example.com\",\n TokenEndpoint = \"https://example.com/token_endpoint\",\n UserInfoEndpoint = \"https://example.com/user_info_endpoint\",\n },\n },\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"forward\",\n TargetGroupArn = frontEndTargetGroup.Arn,\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tfrontEnd, err := lb.NewLoadBalancer(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfrontEndTargetGroup, err := lb.NewTargetGroup(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewListener(ctx, \"front_end\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: frontEnd.Arn,\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"HTTP\"),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"authenticate-oidc\"),\n\t\t\t\t\tAuthenticateOidc: \u0026lb.ListenerDefaultActionAuthenticateOidcArgs{\n\t\t\t\t\t\tAuthorizationEndpoint: pulumi.String(\"https://example.com/authorization_endpoint\"),\n\t\t\t\t\t\tClientId: pulumi.String(\"client_id\"),\n\t\t\t\t\t\tClientSecret: pulumi.String(\"client_secret\"),\n\t\t\t\t\t\tIssuer: pulumi.String(\"https://example.com\"),\n\t\t\t\t\t\tTokenEndpoint: pulumi.String(\"https://example.com/token_endpoint\"),\n\t\t\t\t\t\tUserInfoEndpoint: pulumi.String(\"https://example.com/user_info_endpoint\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"forward\"),\n\t\t\t\t\tTargetGroupArn: frontEndTargetGroup.Arn,\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.LoadBalancer;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionAuthenticateOidcArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var frontEnd = new LoadBalancer(\"frontEnd\");\n\n var frontEndTargetGroup = new TargetGroup(\"frontEndTargetGroup\");\n\n var frontEndListener = new Listener(\"frontEndListener\", ListenerArgs.builder()\n .loadBalancerArn(frontEnd.arn())\n .port(\"80\")\n .protocol(\"HTTP\")\n .defaultActions( \n ListenerDefaultActionArgs.builder()\n .type(\"authenticate-oidc\")\n .authenticateOidc(ListenerDefaultActionAuthenticateOidcArgs.builder()\n .authorizationEndpoint(\"https://example.com/authorization_endpoint\")\n .clientId(\"client_id\")\n .clientSecret(\"client_secret\")\n .issuer(\"https://example.com\")\n .tokenEndpoint(\"https://example.com/token_endpoint\")\n .userInfoEndpoint(\"https://example.com/user_info_endpoint\")\n .build())\n .build(),\n ListenerDefaultActionArgs.builder()\n .type(\"forward\")\n .targetGroupArn(frontEndTargetGroup.arn())\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n frontEnd:\n type: aws:lb:LoadBalancer\n name: front_end\n frontEndTargetGroup:\n type: aws:lb:TargetGroup\n name: front_end\n frontEndListener:\n type: aws:lb:Listener\n name: front_end\n properties:\n loadBalancerArn: ${frontEnd.arn}\n port: '80'\n protocol: HTTP\n defaultActions:\n - type: authenticate-oidc\n authenticateOidc:\n authorizationEndpoint: https://example.com/authorization_endpoint\n clientId: client_id\n clientSecret: client_secret\n issuer: https://example.com\n tokenEndpoint: https://example.com/token_endpoint\n userInfoEndpoint: https://example.com/user_info_endpoint\n - type: forward\n targetGroupArn: ${frontEndTargetGroup.arn}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Gateway Load Balancer Listener\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst example = new aws.lb.LoadBalancer(\"example\", {\n loadBalancerType: \"gateway\",\n name: \"example\",\n subnetMappings: [{\n subnetId: exampleAwsSubnet.id,\n }],\n});\nconst exampleTargetGroup = new aws.lb.TargetGroup(\"example\", {\n name: \"example\",\n port: 6081,\n protocol: \"GENEVE\",\n vpcId: exampleAwsVpc.id,\n healthCheck: {\n port: \"80\",\n protocol: \"HTTP\",\n },\n});\nconst exampleListener = new aws.lb.Listener(\"example\", {\n loadBalancerArn: example.id,\n defaultActions: [{\n targetGroupArn: exampleTargetGroup.id,\n type: \"forward\",\n }],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nexample = aws.lb.LoadBalancer(\"example\",\n load_balancer_type=\"gateway\",\n name=\"example\",\n subnet_mappings=[{\n \"subnet_id\": example_aws_subnet[\"id\"],\n }])\nexample_target_group = aws.lb.TargetGroup(\"example\",\n name=\"example\",\n port=6081,\n protocol=\"GENEVE\",\n vpc_id=example_aws_vpc[\"id\"],\n health_check={\n \"port\": \"80\",\n \"protocol\": \"HTTP\",\n })\nexample_listener = aws.lb.Listener(\"example\",\n load_balancer_arn=example.id,\n default_actions=[{\n \"target_group_arn\": example_target_group.id,\n \"type\": \"forward\",\n }])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var example = new Aws.LB.LoadBalancer(\"example\", new()\n {\n LoadBalancerType = \"gateway\",\n Name = \"example\",\n SubnetMappings = new[]\n {\n new Aws.LB.Inputs.LoadBalancerSubnetMappingArgs\n {\n SubnetId = exampleAwsSubnet.Id,\n },\n },\n });\n\n var exampleTargetGroup = new Aws.LB.TargetGroup(\"example\", new()\n {\n Name = \"example\",\n Port = 6081,\n Protocol = \"GENEVE\",\n VpcId = exampleAwsVpc.Id,\n HealthCheck = new Aws.LB.Inputs.TargetGroupHealthCheckArgs\n {\n Port = \"80\",\n Protocol = \"HTTP\",\n },\n });\n\n var exampleListener = new Aws.LB.Listener(\"example\", new()\n {\n LoadBalancerArn = example.Id,\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n TargetGroupArn = exampleTargetGroup.Id,\n Type = \"forward\",\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\texample, err := lb.NewLoadBalancer(ctx, \"example\", \u0026lb.LoadBalancerArgs{\n\t\t\tLoadBalancerType: pulumi.String(\"gateway\"),\n\t\t\tName: pulumi.String(\"example\"),\n\t\t\tSubnetMappings: lb.LoadBalancerSubnetMappingArray{\n\t\t\t\t\u0026lb.LoadBalancerSubnetMappingArgs{\n\t\t\t\t\tSubnetId: pulumi.Any(exampleAwsSubnet.Id),\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\t\texampleTargetGroup, err := lb.NewTargetGroup(ctx, \"example\", \u0026lb.TargetGroupArgs{\n\t\t\tName: pulumi.String(\"example\"),\n\t\t\tPort: pulumi.Int(6081),\n\t\t\tProtocol: pulumi.String(\"GENEVE\"),\n\t\t\tVpcId: pulumi.Any(exampleAwsVpc.Id),\n\t\t\tHealthCheck: \u0026lb.TargetGroupHealthCheckArgs{\n\t\t\t\tPort: pulumi.String(\"80\"),\n\t\t\t\tProtocol: pulumi.String(\"HTTP\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewListener(ctx, \"example\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: example.ID(),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tTargetGroupArn: exampleTargetGroup.ID(),\n\t\t\t\t\tType: pulumi.String(\"forward\"),\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.LoadBalancer;\nimport com.pulumi.aws.lb.LoadBalancerArgs;\nimport com.pulumi.aws.lb.inputs.LoadBalancerSubnetMappingArgs;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.TargetGroupArgs;\nimport com.pulumi.aws.lb.inputs.TargetGroupHealthCheckArgs;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var example = new LoadBalancer(\"example\", LoadBalancerArgs.builder()\n .loadBalancerType(\"gateway\")\n .name(\"example\")\n .subnetMappings(LoadBalancerSubnetMappingArgs.builder()\n .subnetId(exampleAwsSubnet.id())\n .build())\n .build());\n\n var exampleTargetGroup = new TargetGroup(\"exampleTargetGroup\", TargetGroupArgs.builder()\n .name(\"example\")\n .port(6081)\n .protocol(\"GENEVE\")\n .vpcId(exampleAwsVpc.id())\n .healthCheck(TargetGroupHealthCheckArgs.builder()\n .port(80)\n .protocol(\"HTTP\")\n .build())\n .build());\n\n var exampleListener = new Listener(\"exampleListener\", ListenerArgs.builder()\n .loadBalancerArn(example.id())\n .defaultActions(ListenerDefaultActionArgs.builder()\n .targetGroupArn(exampleTargetGroup.id())\n .type(\"forward\")\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n example:\n type: aws:lb:LoadBalancer\n properties:\n loadBalancerType: gateway\n name: example\n subnetMappings:\n - subnetId: ${exampleAwsSubnet.id}\n exampleTargetGroup:\n type: aws:lb:TargetGroup\n name: example\n properties:\n name: example\n port: 6081\n protocol: GENEVE\n vpcId: ${exampleAwsVpc.id}\n healthCheck:\n port: 80\n protocol: HTTP\n exampleListener:\n type: aws:lb:Listener\n name: example\n properties:\n loadBalancerArn: ${example.id}\n defaultActions:\n - targetGroupArn: ${exampleTargetGroup.id}\n type: forward\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Mutual TLS Authentication\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst example = new aws.lb.LoadBalancer(\"example\", {loadBalancerType: \"application\"});\nconst exampleTargetGroup = new aws.lb.TargetGroup(\"example\", {});\nconst exampleListener = new aws.lb.Listener(\"example\", {\n loadBalancerArn: example.id,\n defaultActions: [{\n targetGroupArn: exampleTargetGroup.id,\n type: \"forward\",\n }],\n mutualAuthentication: {\n mode: \"verify\",\n trustStoreArn: \"...\",\n },\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nexample = aws.lb.LoadBalancer(\"example\", load_balancer_type=\"application\")\nexample_target_group = aws.lb.TargetGroup(\"example\")\nexample_listener = aws.lb.Listener(\"example\",\n load_balancer_arn=example.id,\n default_actions=[{\n \"target_group_arn\": example_target_group.id,\n \"type\": \"forward\",\n }],\n mutual_authentication={\n \"mode\": \"verify\",\n \"trust_store_arn\": \"...\",\n })\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var example = new Aws.LB.LoadBalancer(\"example\", new()\n {\n LoadBalancerType = \"application\",\n });\n\n var exampleTargetGroup = new Aws.LB.TargetGroup(\"example\");\n\n var exampleListener = new Aws.LB.Listener(\"example\", new()\n {\n LoadBalancerArn = example.Id,\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n TargetGroupArn = exampleTargetGroup.Id,\n Type = \"forward\",\n },\n },\n MutualAuthentication = new Aws.LB.Inputs.ListenerMutualAuthenticationArgs\n {\n Mode = \"verify\",\n TrustStoreArn = \"...\",\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\texample, err := lb.NewLoadBalancer(ctx, \"example\", \u0026lb.LoadBalancerArgs{\n\t\t\tLoadBalancerType: pulumi.String(\"application\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\texampleTargetGroup, err := lb.NewTargetGroup(ctx, \"example\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewListener(ctx, \"example\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: example.ID(),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tTargetGroupArn: exampleTargetGroup.ID(),\n\t\t\t\t\tType: pulumi.String(\"forward\"),\n\t\t\t\t},\n\t\t\t},\n\t\t\tMutualAuthentication: \u0026lb.ListenerMutualAuthenticationArgs{\n\t\t\t\tMode: pulumi.String(\"verify\"),\n\t\t\t\tTrustStoreArn: pulumi.String(\"...\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.LoadBalancer;\nimport com.pulumi.aws.lb.LoadBalancerArgs;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport com.pulumi.aws.lb.inputs.ListenerMutualAuthenticationArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var example = new LoadBalancer(\"example\", LoadBalancerArgs.builder()\n .loadBalancerType(\"application\")\n .build());\n\n var exampleTargetGroup = new TargetGroup(\"exampleTargetGroup\");\n\n var exampleListener = new Listener(\"exampleListener\", ListenerArgs.builder()\n .loadBalancerArn(example.id())\n .defaultActions(ListenerDefaultActionArgs.builder()\n .targetGroupArn(exampleTargetGroup.id())\n .type(\"forward\")\n .build())\n .mutualAuthentication(ListenerMutualAuthenticationArgs.builder()\n .mode(\"verify\")\n .trustStoreArn(\"...\")\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n example:\n type: aws:lb:LoadBalancer\n properties:\n loadBalancerType: application\n exampleTargetGroup:\n type: aws:lb:TargetGroup\n name: example\n exampleListener:\n type: aws:lb:Listener\n name: example\n properties:\n loadBalancerArn: ${example.id}\n defaultActions:\n - targetGroupArn: ${exampleTargetGroup.id}\n type: forward\n mutualAuthentication:\n mode: verify\n trustStoreArn: '...'\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nUsing `pulumi import`, import listeners using their ARN. For example:\n\n```sh\n$ pulumi import aws:lb/listener:Listener front_end arn:aws:elasticloadbalancing:us-west-2:187416307283:listener/app/front-end-alb/8e4497da625e2d8a/9ab28ade35828f96\n```\n", - "properties": { - "alpnPolicy": { - "type": "string", - "description": "Name of the Application-Layer Protocol Negotiation (ALPN) policy. Can be set if `protocol` is `TLS`. Valid values are `HTTP1Only`, `HTTP2Only`, `HTTP2Optional`, `HTTP2Preferred`, and `None`.\n" - }, - "certificateArn": { - "type": "string", - "description": "ARN of the default SSL server certificate. Exactly one certificate is required if the protocol is HTTPS. For adding additional SSL certificates, see the `aws.lb.ListenerCertificate` resource.\n" - }, - "defaultActions": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/ListenerDefaultAction:ListenerDefaultAction" - }, - "description": "Configuration block for default actions. See below.\n" - }, - "mutualAuthentication": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/ListenerMutualAuthentication:ListenerMutualAuthentication", - "description": "The mutual authentication configuration information. See below.\n" - }, - "port": { - "type": "integer", - "description": "Port on which the load balancer is listening. Not valid for Gateway Load Balancers.\n" - }, - "protocol": { - "type": "string", - "description": "Protocol for connections from clients to the load balancer. For Application Load Balancers, valid values are `HTTP` and `HTTPS`, with a default of `HTTP`. For Network Load Balancers, valid values are `TCP`, `TLS`, `UDP`, and `TCP_UDP`. Not valid to use `UDP` or `TCP_UDP` if dual-stack mode is enabled. Not valid for Gateway Load Balancers.\n" - }, - "sslPolicy": { - "type": "string", - "description": "Name of the SSL Policy for the listener. Required if `protocol` is `HTTPS` or `TLS`. Default is `ELBSecurityPolicy-2016-08`.\n" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "A map of tags to assign to the resource. .If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n\n\u003e **Note::** When a `Name` key is specified in the map, the AWS Console maps the value to the `Name Tag` column value inside the `Listener Rules` table within a specific load balancer listener page. Otherwise, the value resolves to `Default`.\n" - }, - "tcpIdleTimeoutSeconds": { - "type": "integer", - "description": "TCP idle timeout value in seconds. Can only be set if protocol is `TCP` on Network Load Balancer, or with a Gateway Load Balancer. Not supported for Application Load Balancers. Valid values are between `60` and `6000` inclusive. Default: `350`.\n" - } - }, - "type": "object" - }, - "awsx:lb:TargetGroup": { - "description": "Provides a Target Group resource for use with Load Balancer resources.\n\n\u003e **Note:** `aws.alb.TargetGroup` is known as `aws.lb.TargetGroup`. The functionality is identical.\n\n## Example Usage\n\n### Instance Target Group\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst main = new aws.ec2.Vpc(\"main\", {cidrBlock: \"10.0.0.0/16\"});\nconst test = new aws.lb.TargetGroup(\"test\", {\n name: \"tf-example-lb-tg\",\n port: 80,\n protocol: \"HTTP\",\n vpcId: main.id,\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nmain = aws.ec2.Vpc(\"main\", cidr_block=\"10.0.0.0/16\")\ntest = aws.lb.TargetGroup(\"test\",\n name=\"tf-example-lb-tg\",\n port=80,\n protocol=\"HTTP\",\n vpc_id=main.id)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var main = new Aws.Ec2.Vpc(\"main\", new()\n {\n CidrBlock = \"10.0.0.0/16\",\n });\n\n var test = new Aws.LB.TargetGroup(\"test\", new()\n {\n Name = \"tf-example-lb-tg\",\n Port = 80,\n Protocol = \"HTTP\",\n VpcId = main.Id,\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2\"\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tmain, err := ec2.NewVpc(ctx, \"main\", \u0026ec2.VpcArgs{\n\t\t\tCidrBlock: pulumi.String(\"10.0.0.0/16\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewTargetGroup(ctx, \"test\", \u0026lb.TargetGroupArgs{\n\t\t\tName: pulumi.String(\"tf-example-lb-tg\"),\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"HTTP\"),\n\t\t\tVpcId: main.ID(),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.ec2.Vpc;\nimport com.pulumi.aws.ec2.VpcArgs;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.TargetGroupArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var main = new Vpc(\"main\", VpcArgs.builder()\n .cidrBlock(\"10.0.0.0/16\")\n .build());\n\n var test = new TargetGroup(\"test\", TargetGroupArgs.builder()\n .name(\"tf-example-lb-tg\")\n .port(80)\n .protocol(\"HTTP\")\n .vpcId(main.id())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n test:\n type: aws:lb:TargetGroup\n properties:\n name: tf-example-lb-tg\n port: 80\n protocol: HTTP\n vpcId: ${main.id}\n main:\n type: aws:ec2:Vpc\n properties:\n cidrBlock: 10.0.0.0/16\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### IP Target Group\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst main = new aws.ec2.Vpc(\"main\", {cidrBlock: \"10.0.0.0/16\"});\nconst ip_example = new aws.lb.TargetGroup(\"ip-example\", {\n name: \"tf-example-lb-tg\",\n port: 80,\n protocol: \"HTTP\",\n targetType: \"ip\",\n vpcId: main.id,\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nmain = aws.ec2.Vpc(\"main\", cidr_block=\"10.0.0.0/16\")\nip_example = aws.lb.TargetGroup(\"ip-example\",\n name=\"tf-example-lb-tg\",\n port=80,\n protocol=\"HTTP\",\n target_type=\"ip\",\n vpc_id=main.id)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var main = new Aws.Ec2.Vpc(\"main\", new()\n {\n CidrBlock = \"10.0.0.0/16\",\n });\n\n var ip_example = new Aws.LB.TargetGroup(\"ip-example\", new()\n {\n Name = \"tf-example-lb-tg\",\n Port = 80,\n Protocol = \"HTTP\",\n TargetType = \"ip\",\n VpcId = main.Id,\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2\"\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tmain, err := ec2.NewVpc(ctx, \"main\", \u0026ec2.VpcArgs{\n\t\t\tCidrBlock: pulumi.String(\"10.0.0.0/16\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewTargetGroup(ctx, \"ip-example\", \u0026lb.TargetGroupArgs{\n\t\t\tName: pulumi.String(\"tf-example-lb-tg\"),\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"HTTP\"),\n\t\t\tTargetType: pulumi.String(\"ip\"),\n\t\t\tVpcId: main.ID(),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.ec2.Vpc;\nimport com.pulumi.aws.ec2.VpcArgs;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.TargetGroupArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var main = new Vpc(\"main\", VpcArgs.builder()\n .cidrBlock(\"10.0.0.0/16\")\n .build());\n\n var ip_example = new TargetGroup(\"ip-example\", TargetGroupArgs.builder()\n .name(\"tf-example-lb-tg\")\n .port(80)\n .protocol(\"HTTP\")\n .targetType(\"ip\")\n .vpcId(main.id())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n ip-example:\n type: aws:lb:TargetGroup\n properties:\n name: tf-example-lb-tg\n port: 80\n protocol: HTTP\n targetType: ip\n vpcId: ${main.id}\n main:\n type: aws:ec2:Vpc\n properties:\n cidrBlock: 10.0.0.0/16\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Lambda Target Group\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst lambda_example = new aws.lb.TargetGroup(\"lambda-example\", {\n name: \"tf-example-lb-tg\",\n targetType: \"lambda\",\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nlambda_example = aws.lb.TargetGroup(\"lambda-example\",\n name=\"tf-example-lb-tg\",\n target_type=\"lambda\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var lambda_example = new Aws.LB.TargetGroup(\"lambda-example\", new()\n {\n Name = \"tf-example-lb-tg\",\n TargetType = \"lambda\",\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\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 := lb.NewTargetGroup(ctx, \"lambda-example\", \u0026lb.TargetGroupArgs{\n\t\t\tName: pulumi.String(\"tf-example-lb-tg\"),\n\t\t\tTargetType: pulumi.String(\"lambda\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.TargetGroupArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var lambda_example = new TargetGroup(\"lambda-example\", TargetGroupArgs.builder()\n .name(\"tf-example-lb-tg\")\n .targetType(\"lambda\")\n .build());\n\n }\n}\n```\n```yaml\nresources:\n lambda-example:\n type: aws:lb:TargetGroup\n properties:\n name: tf-example-lb-tg\n targetType: lambda\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### ALB Target Group\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst alb_example = new aws.lb.TargetGroup(\"alb-example\", {\n name: \"tf-example-lb-alb-tg\",\n targetType: \"alb\",\n port: 80,\n protocol: \"TCP\",\n vpcId: main.id,\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nalb_example = aws.lb.TargetGroup(\"alb-example\",\n name=\"tf-example-lb-alb-tg\",\n target_type=\"alb\",\n port=80,\n protocol=\"TCP\",\n vpc_id=main[\"id\"])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var alb_example = new Aws.LB.TargetGroup(\"alb-example\", new()\n {\n Name = \"tf-example-lb-alb-tg\",\n TargetType = \"alb\",\n Port = 80,\n Protocol = \"TCP\",\n VpcId = main.Id,\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\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 := lb.NewTargetGroup(ctx, \"alb-example\", \u0026lb.TargetGroupArgs{\n\t\t\tName: pulumi.String(\"tf-example-lb-alb-tg\"),\n\t\t\tTargetType: pulumi.String(\"alb\"),\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"TCP\"),\n\t\t\tVpcId: pulumi.Any(main.Id),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.TargetGroupArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var alb_example = new TargetGroup(\"alb-example\", TargetGroupArgs.builder()\n .name(\"tf-example-lb-alb-tg\")\n .targetType(\"alb\")\n .port(80)\n .protocol(\"TCP\")\n .vpcId(main.id())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n alb-example:\n type: aws:lb:TargetGroup\n properties:\n name: tf-example-lb-alb-tg\n targetType: alb\n port: 80\n protocol: TCP\n vpcId: ${main.id}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Target group with unhealthy connection termination disabled\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst tcp_example = new aws.lb.TargetGroup(\"tcp-example\", {\n name: \"tf-example-lb-nlb-tg\",\n port: 25,\n protocol: \"TCP\",\n vpcId: main.id,\n targetHealthStates: [{\n enableUnhealthyConnectionTermination: false,\n }],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\ntcp_example = aws.lb.TargetGroup(\"tcp-example\",\n name=\"tf-example-lb-nlb-tg\",\n port=25,\n protocol=\"TCP\",\n vpc_id=main[\"id\"],\n target_health_states=[{\n \"enable_unhealthy_connection_termination\": False,\n }])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var tcp_example = new Aws.LB.TargetGroup(\"tcp-example\", new()\n {\n Name = \"tf-example-lb-nlb-tg\",\n Port = 25,\n Protocol = \"TCP\",\n VpcId = main.Id,\n TargetHealthStates = new[]\n {\n new Aws.LB.Inputs.TargetGroupTargetHealthStateArgs\n {\n EnableUnhealthyConnectionTermination = false,\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\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 := lb.NewTargetGroup(ctx, \"tcp-example\", \u0026lb.TargetGroupArgs{\n\t\t\tName: pulumi.String(\"tf-example-lb-nlb-tg\"),\n\t\t\tPort: pulumi.Int(25),\n\t\t\tProtocol: pulumi.String(\"TCP\"),\n\t\t\tVpcId: pulumi.Any(main.Id),\n\t\t\tTargetHealthStates: lb.TargetGroupTargetHealthStateArray{\n\t\t\t\t\u0026lb.TargetGroupTargetHealthStateArgs{\n\t\t\t\t\tEnableUnhealthyConnectionTermination: pulumi.Bool(false),\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.TargetGroupArgs;\nimport com.pulumi.aws.lb.inputs.TargetGroupTargetHealthStateArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var tcp_example = new TargetGroup(\"tcp-example\", TargetGroupArgs.builder()\n .name(\"tf-example-lb-nlb-tg\")\n .port(25)\n .protocol(\"TCP\")\n .vpcId(main.id())\n .targetHealthStates(TargetGroupTargetHealthStateArgs.builder()\n .enableUnhealthyConnectionTermination(false)\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n tcp-example:\n type: aws:lb:TargetGroup\n properties:\n name: tf-example-lb-nlb-tg\n port: 25\n protocol: TCP\n vpcId: ${main.id}\n targetHealthStates:\n - enableUnhealthyConnectionTermination: false\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Target group with health requirements\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst tcp_example = new aws.lb.TargetGroup(\"tcp-example\", {\n name: \"tf-example-lb-nlb-tg\",\n port: 80,\n protocol: \"TCP\",\n vpcId: main.id,\n targetGroupHealth: {\n dnsFailover: {\n minimumHealthyTargetsCount: \"1\",\n minimumHealthyTargetsPercentage: \"off\",\n },\n unhealthyStateRouting: {\n minimumHealthyTargetsCount: 1,\n minimumHealthyTargetsPercentage: \"off\",\n },\n },\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\ntcp_example = aws.lb.TargetGroup(\"tcp-example\",\n name=\"tf-example-lb-nlb-tg\",\n port=80,\n protocol=\"TCP\",\n vpc_id=main[\"id\"],\n target_group_health={\n \"dns_failover\": {\n \"minimum_healthy_targets_count\": \"1\",\n \"minimum_healthy_targets_percentage\": \"off\",\n },\n \"unhealthy_state_routing\": {\n \"minimum_healthy_targets_count\": 1,\n \"minimum_healthy_targets_percentage\": \"off\",\n },\n })\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var tcp_example = new Aws.LB.TargetGroup(\"tcp-example\", new()\n {\n Name = \"tf-example-lb-nlb-tg\",\n Port = 80,\n Protocol = \"TCP\",\n VpcId = main.Id,\n TargetGroupHealth = new Aws.LB.Inputs.TargetGroupTargetGroupHealthArgs\n {\n DnsFailover = new Aws.LB.Inputs.TargetGroupTargetGroupHealthDnsFailoverArgs\n {\n MinimumHealthyTargetsCount = \"1\",\n MinimumHealthyTargetsPercentage = \"off\",\n },\n UnhealthyStateRouting = new Aws.LB.Inputs.TargetGroupTargetGroupHealthUnhealthyStateRoutingArgs\n {\n MinimumHealthyTargetsCount = 1,\n MinimumHealthyTargetsPercentage = \"off\",\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\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 := lb.NewTargetGroup(ctx, \"tcp-example\", \u0026lb.TargetGroupArgs{\n\t\t\tName: pulumi.String(\"tf-example-lb-nlb-tg\"),\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"TCP\"),\n\t\t\tVpcId: pulumi.Any(main.Id),\n\t\t\tTargetGroupHealth: \u0026lb.TargetGroupTargetGroupHealthArgs{\n\t\t\t\tDnsFailover: \u0026lb.TargetGroupTargetGroupHealthDnsFailoverArgs{\n\t\t\t\t\tMinimumHealthyTargetsCount: pulumi.String(\"1\"),\n\t\t\t\t\tMinimumHealthyTargetsPercentage: pulumi.String(\"off\"),\n\t\t\t\t},\n\t\t\t\tUnhealthyStateRouting: \u0026lb.TargetGroupTargetGroupHealthUnhealthyStateRoutingArgs{\n\t\t\t\t\tMinimumHealthyTargetsCount: pulumi.Int(1),\n\t\t\t\t\tMinimumHealthyTargetsPercentage: pulumi.String(\"off\"),\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.TargetGroupArgs;\nimport com.pulumi.aws.lb.inputs.TargetGroupTargetGroupHealthArgs;\nimport com.pulumi.aws.lb.inputs.TargetGroupTargetGroupHealthDnsFailoverArgs;\nimport com.pulumi.aws.lb.inputs.TargetGroupTargetGroupHealthUnhealthyStateRoutingArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var tcp_example = new TargetGroup(\"tcp-example\", TargetGroupArgs.builder()\n .name(\"tf-example-lb-nlb-tg\")\n .port(80)\n .protocol(\"TCP\")\n .vpcId(main.id())\n .targetGroupHealth(TargetGroupTargetGroupHealthArgs.builder()\n .dnsFailover(TargetGroupTargetGroupHealthDnsFailoverArgs.builder()\n .minimumHealthyTargetsCount(\"1\")\n .minimumHealthyTargetsPercentage(\"off\")\n .build())\n .unhealthyStateRouting(TargetGroupTargetGroupHealthUnhealthyStateRoutingArgs.builder()\n .minimumHealthyTargetsCount(\"1\")\n .minimumHealthyTargetsPercentage(\"off\")\n .build())\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n tcp-example:\n type: aws:lb:TargetGroup\n properties:\n name: tf-example-lb-nlb-tg\n port: 80\n protocol: TCP\n vpcId: ${main.id}\n targetGroupHealth:\n dnsFailover:\n minimumHealthyTargetsCount: '1'\n minimumHealthyTargetsPercentage: off\n unhealthyStateRouting:\n minimumHealthyTargetsCount: '1'\n minimumHealthyTargetsPercentage: off\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nUsing `pulumi import`, import Target Groups using their ARN. For example:\n\n```sh\n$ pulumi import aws:lb/targetGroup:TargetGroup app_front_end arn:aws:elasticloadbalancing:us-west-2:187416307283:targetgroup/app-front-end/20cfe21448b66314\n```\n", - "properties": { - "connectionTermination": { - "type": "boolean", - "description": "Whether to terminate connections at the end of the deregistration timeout on Network Load Balancers. See [doc](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#deregistration-delay) for more information. Default is `false`.\n" - }, - "deregistrationDelay": { - "type": "integer", - "description": "Amount time for Elastic Load Balancing to wait before changing the state of a deregistering target from draining to unused. The range is 0-3600 seconds. The default value is 300 seconds.\n" - }, - "healthCheck": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/TargetGroupHealthCheck:TargetGroupHealthCheck", - "description": "Health Check configuration block. Detailed below.\n" - }, - "ipAddressType": { - "type": "string", - "description": "The type of IP addresses used by the target group, only supported when target type is set to `ip`. Possible values are `ipv4` or `ipv6`.\n", - "willReplaceOnChanges": true - }, - "lambdaMultiValueHeadersEnabled": { - "type": "boolean", - "description": "Whether the request and response headers exchanged between the load balancer and the Lambda function include arrays of values or strings. Only applies when `target_type` is `lambda`. Default is `false`.\n" - }, - "loadBalancingAlgorithmType": { - "type": "string", - "description": "Determines how the load balancer selects targets when routing requests. Only applicable for Application Load Balancer Target Groups. The value is `round_robin`, `least_outstanding_requests`, or `weighted_random`. The default is `round_robin`.\n" - }, - "loadBalancingAnomalyMitigation": { - "type": "string", - "description": "Determines whether to enable target anomaly mitigation. Target anomaly mitigation is only supported by the `weighted_random` load balancing algorithm type. See [doc](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html#automatic-target-weights) for more information. The value is `\"on\"` or `\"off\"`. The default is `\"off\"`.\n" - }, - "loadBalancingCrossZoneEnabled": { - "type": "string", - "description": "Indicates whether cross zone load balancing is enabled. The value is `\"true\"`, `\"false\"` or `\"use_load_balancer_configuration\"`. The default is `\"use_load_balancer_configuration\"`.\n" - }, - "name": { - "type": "string", - "description": "Name of the target group. If omitted, this provider will assign a random, unique name. This name must be unique per region per account, can have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and must not begin or end with a hyphen.\n", - "willReplaceOnChanges": true - }, - "namePrefix": { - "type": "string", - "description": "Creates a unique name beginning with the specified prefix. Conflicts with `name`. Cannot be longer than 6 characters.\n", - "willReplaceOnChanges": true - }, - "port": { - "type": "integer", - "description": "Port on which targets receive traffic, unless overridden when registering a specific target. Required when `target_type` is `instance`, `ip` or `alb`. Does not apply when `target_type` is `lambda`.\n", - "willReplaceOnChanges": true - }, - "preserveClientIp": { - "type": "string", - "description": "Whether client IP preservation is enabled. See [doc](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#client-ip-preservation) for more information.\n" - }, - "protocol": { - "type": "string", - "description": "Protocol to use for routing traffic to the targets.\nShould be one of `GENEVE`, `HTTP`, `HTTPS`, `TCP`, `TCP_UDP`, `TLS`, or `UDP`.\nRequired when `target_type` is `instance`, `ip`, or `alb`.\nDoes not apply when `target_type` is `lambda`.\n", - "willReplaceOnChanges": true - }, - "protocolVersion": { - "type": "string", - "description": "Only applicable when `protocol` is `HTTP` or `HTTPS`. The protocol version. Specify `GRPC` to send requests to targets using gRPC. Specify `HTTP2` to send requests to targets using HTTP/2. The default is `HTTP1`, which sends requests to targets using HTTP/1.1\n", - "willReplaceOnChanges": true - }, - "proxyProtocolV2": { - "type": "boolean", - "description": "Whether to enable support for proxy protocol v2 on Network Load Balancers. See [doc](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#proxy-protocol) for more information. Default is `false`.\n" - }, - "slowStart": { - "type": "integer", - "description": "Amount time for targets to warm up before the load balancer sends them a full share of requests. The range is 30-900 seconds or 0 to disable. The default value is 0 seconds.\n" - }, - "stickiness": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/TargetGroupStickiness:TargetGroupStickiness", - "description": "Stickiness configuration block. Detailed below.\n" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Map of tags to assign to the resource. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - }, - "targetFailovers": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/TargetGroupTargetFailover:TargetGroupTargetFailover" - }, - "description": "Target failover block. Only applicable for Gateway Load Balancer target groups. See target_failover for more information.\n" - }, - "targetGroupHealth": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/TargetGroupTargetGroupHealth:TargetGroupTargetGroupHealth", - "description": "Target health requirements block. See target_group_health for more information.\n" - }, - "targetHealthStates": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/TargetGroupTargetHealthState:TargetGroupTargetHealthState" - }, - "description": "Target health state block. Only applicable for Network Load Balancer target groups when `protocol` is `TCP` or `TLS`. See target_health_state for more information.\n" - }, - "targetType": { - "type": "string", - "description": "Type of target that you must specify when registering targets with this target group.\nSee [doc](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_CreateTargetGroup.html) for supported values.\nThe default is `instance`.\n\nNote that you can't specify targets for a target group using both instance IDs and IP addresses.\n\nIf the target type is `ip`, specify IP addresses from the subnets of the virtual private cloud (VPC) for the target group, the RFC 1918 range (10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16), and the RFC 6598 range (100.64.0.0/10). You can't specify publicly routable IP addresses.\n\nNetwork Load Balancers do not support the `lambda` target type.\n\nApplication Load Balancers do not support the `alb` target type.\n", - "willReplaceOnChanges": true - }, - "vpcId": { - "type": "string", - "description": "Identifier of the VPC in which to create the target group. Required when `target_type` is `instance`, `ip` or `alb`. Does not apply when `target_type` is `lambda`.\n", - "willReplaceOnChanges": true - } - }, - "type": "object" - } - }, - "provider": {}, - "resources": { - "awsx:cloudtrail:Trail": { - "properties": { - "bucket": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:s3%2Fbucket:Bucket", - "description": "The managed S3 Bucket where the Trail will place its logs." - }, - "logGroup": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:cloudwatch%2FlogGroup:LogGroup", - "description": "The managed Cloudwatch Log Group." - }, - "trail": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:cloudtrail%2Ftrail:Trail", - "description": "The CloudTrail Trail.", - "language": { - "csharp": { - "name": "AwsTrail" - } - } - } - }, - "required": [ - "trail" - ], - "inputProperties": { - "advancedEventSelectors": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:cloudtrail/TrailAdvancedEventSelector:TrailAdvancedEventSelector" - }, - "description": "Specifies an advanced event selector for enabling data event logging. Fields documented below. Conflicts with `event_selector`.\n" - }, - "cloudWatchLogsGroup": { - "$ref": "#/types/awsx:awsx:OptionalLogGroup", - "plain": true, - "description": "Log group to which CloudTrail logs will be delivered." - }, - "enableLogFileValidation": { - "type": "boolean", - "description": "Whether log file integrity validation is enabled. Defaults to `false`.\n" - }, - "enableLogging": { - "type": "boolean", - "description": "Enables logging for the trail. Defaults to `true`. Setting this to `false` will pause logging.\n" - }, - "eventSelectors": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:cloudtrail/TrailEventSelector:TrailEventSelector" - }, - "description": "Specifies an event selector for enabling data event logging. Fields documented below. Please note the [CloudTrail limits](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/WhatIsCloudTrail-Limits.html) when configuring these. Conflicts with `advanced_event_selector`.\n" - }, - "includeGlobalServiceEvents": { - "type": "boolean", - "description": "Whether the trail is publishing events from global services such as IAM to the log files. Defaults to `true`.\n" - }, - "insightSelectors": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:cloudtrail/TrailInsightSelector:TrailInsightSelector" - }, - "description": "Configuration block for identifying unusual operational activity. See details below.\n" - }, - "isMultiRegionTrail": { - "type": "boolean", - "description": "Whether the trail is created in the current region or in all regions. Defaults to `false`.\n" - }, - "isOrganizationTrail": { - "type": "boolean", - "description": "Whether the trail is an AWS Organizations trail. Organization trails log events for the master account and all member accounts. Can only be created in the organization master account. Defaults to `false`.\n" - }, - "kmsKeyId": { - "type": "string", - "description": "KMS key ARN to use to encrypt the logs delivered by CloudTrail.\n" - }, - "name": { - "type": "string", - "description": "Name of the trail.\n", - "willReplaceOnChanges": true - }, - "s3Bucket": { - "$ref": "#/types/awsx:awsx:RequiredBucket", - "plain": true, - "description": "S3 bucket designated for publishing log files." - }, - "s3KeyPrefix": { - "type": "string", - "description": "S3 key prefix that follows the name of the bucket you have designated for log file delivery.\n" - }, - "snsTopicName": { - "type": "string", - "description": "Name of the Amazon SNS topic defined for notification of log file delivery.\n" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Map of tags to assign to the trail. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - } - }, - "isComponent": true - }, - "awsx:ec2:DefaultVpc": { - "description": "Pseudo resource representing the default VPC and associated subnets for an account and region. This does not create any resources. This will be replaced with `getDefaultVpc` in the future.", - "properties": { - "privateSubnetIds": { - "type": "array", - "items": { - "type": "string" - } - }, - "publicSubnetIds": { - "type": "array", - "items": { - "type": "string" - } - }, - "vpcId": { - "type": "string", - "description": "The VPC ID for the default VPC" - } - }, - "required": [ - "vpcId", - "publicSubnetIds", - "privateSubnetIds" - ], - "isComponent": true - }, - "awsx:ec2:Vpc": { - "description": "The VPC component provides a VPC with configured subnets and NAT gateways.\n\n{{% examples %}}\n\n## Example Usage\n\n{{% example %}}\n\nBasic usage:\n\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as awsx from \"@pulumi/awsx\";\n\nconst vpc = new awsx.ec2.Vpc(\"vpc\", {});\nexport const vpcId = vpc.vpcId;\nexport const vpcPrivateSubnetIds = vpc.privateSubnetIds;\nexport const vpcPublicSubnetIds = vpc.publicSubnetIds;\n```\n\n```python\nimport pulumi\nimport pulumi_awsx as awsx\n\nvpc = awsx.ec2.Vpc(\"vpc\")\npulumi.export(\"vpcId\", vpc.vpc_id)\npulumi.export(\"vpcPrivateSubnetIds\", vpc.private_subnet_ids)\npulumi.export(\"vpcPublicSubnetIds\", vpc.public_subnet_ids)\n```\n\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Awsx = Pulumi.Awsx;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var vpc = new Awsx.Ec2.Vpc(\"vpc\");\n\n return new Dictionary\u003cstring, object?\u003e\n {\n [\"vpcId\"] = vpc.VpcId,\n [\"vpcPrivateSubnetIds\"] = vpc.PrivateSubnetIds,\n [\"vpcPublicSubnetIds\"] = vpc.PublicSubnetIds,\n };\n});\n```\n\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-awsx/sdk/v2/go/awsx/ec2\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tvpc, err := ec2.NewVpc(ctx, \"vpc\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tctx.Export(\"vpcId\", vpc.VpcId)\n\t\tctx.Export(\"vpcPrivateSubnetIds\", vpc.PrivateSubnetIds)\n\t\tctx.Export(\"vpcPublicSubnetIds\", vpc.PublicSubnetIds)\n\t\treturn nil\n\t})\n}\n```\n\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.awsx.ec2.Vpc;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var vpc = new Vpc(\"vpc\");\n\n ctx.export(\"vpcId\", vpc.vpcId());\n ctx.export(\"vpcPrivateSubnetIds\", vpc.privateSubnetIds());\n ctx.export(\"vpcPublicSubnetIds\", vpc.publicSubnetIds());\n }\n}\n```\n\n```yaml\nresources:\n vpc:\n type: awsx:ec2:Vpc\noutputs:\n vpcId: ${vpc.vpcId}\n vpcPrivateSubnetIds: ${vpc.privateSubnetIds}\n vpcPublicSubnetIds: ${vpc.publicSubnetIds}\n```\n\n{{% /example %}}\n{{% /examples %}}\n\n## Subnet Layout Strategies\n\nIf no subnet arguments are passed, then a public and private subnet will be created in each AZ with default sizing. The layout of these subnets can be customised by specifying additional arguments.\n\nAll strategies are designed to help build a uniform layout of subnets each each availability zone.\n\nIf no strategy is specified, \"Legacy\" will be used for backward compatibility reasons. In the next major version this will change to defaulting to \"Auto\".\n\n### Auto\n\nThe \"Auto\" strategy divides the VPC space evenly between the availability zones. Within each availability zone it allocates each subnet in the order they were specified. If a CIDR mask or size was not specified it will default to an even division of the availability zone range. If subnets have different sizes, spaces will be automatically added to ensure subnets don't overlap (e.g. where a previous subnet is smaller than the next).\n\n### Exact\n\nThe \"Exact\" strategy is the same as \"Auto\" with the additional requirement to explicitly specify what the whole of each zone's range will be used for. Where you expect to have a gap between or after subnets, these must be passed using the subnet specification type \"Unused\" to show all space has been properly accounted for.\n\n### Explicit CIDR Blocks\n\nIf you prefer to do your CIDR block calculations yourself, you can specify a list of CIDR blocks for each subnet spec which it will be allocated for in each availability zone. If using explicit layouts, all subnet specs must be declared with explicit CIDR blocks. Each list of CIDR blocks must have the same length as the number of availability zones for the VPC.\n\n### Legacy\n\nThe \"Legacy\" works similarly to the \"Auto\" strategy except that within each availability zone it allocates the private subnet first, followed by the public subnets, and lastly the isolated subnets. The order of subnet specifications of the same type can be changed, but the ordering of private, public, isolated is not overridable. For more flexibility we recommend moving to the \"Auto\" strategy. The output property `subnetLayout` shows the configuration required if specifying the \"Auto\" strategy to maintain the current layout.\n", - "properties": { - "eips": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2feip:Eip" - }, - "description": "The EIPs for any NAT Gateways for the VPC. If no NAT Gateways are specified, this will be an empty list." - }, - "internetGateway": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2finternetGateway:InternetGateway", - "description": "The Internet Gateway for the VPC." - }, - "isolatedSubnetIds": { - "type": "array", - "items": { - "type": "string" - } - }, - "natGateways": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2fnatGateway:NatGateway" - }, - "description": "The NAT Gateways for the VPC. If no NAT Gateways are specified, this will be an empty list." - }, - "privateSubnetIds": { - "type": "array", - "items": { - "type": "string" - } - }, - "publicSubnetIds": { - "type": "array", - "items": { - "type": "string" - } - }, - "routeTableAssociations": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2frouteTableAssociation:RouteTableAssociation" - }, - "description": "The Route Table Associations for the VPC." - }, - "routeTables": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2frouteTable:RouteTable" - }, - "description": "The Route Tables for the VPC." - }, - "routes": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2froute:Route" - }, - "description": "The Routes for the VPC." - }, - "subnetLayout": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ec2:ResolvedSubnetSpec" - }, - "description": "The resolved subnet specs layout deployed to each availability zone." - }, - "subnets": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2fsubnet:Subnet" - }, - "description": "The VPC's subnets." - }, - "vpc": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2fvpc:Vpc", - "description": "The VPC.", - "language": { - "csharp": { - "name": "AwsVpc" - } - } - }, - "vpcEndpoints": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2fvpcEndpoint:VpcEndpoint" - }, - "description": "The VPC Endpoints that are enabled" - }, - "vpcId": { - "type": "string" - } - }, - "required": [ - "vpc", - "subnets", - "routeTables", - "routeTableAssociations", - "routes", - "internetGateway", - "natGateways", - "eips", - "subnetLayout", - "publicSubnetIds", - "privateSubnetIds", - "isolatedSubnetIds", - "vpcId", - "vpcEndpoints" - ], - "inputProperties": { - "assignGeneratedIpv6CidrBlock": { - "type": "boolean", - "description": "Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for the VPC. You cannot specify the range of IP addresses, or the size of the CIDR block. Default is `false`. Conflicts with `ipv6_ipam_pool_id`\n" - }, - "availabilityZoneCidrMask": { - "type": "integer", - "plain": true, - "description": "The netmask for each available zone to be aligned to. This is optional, the default value is inferred based on an even distribution of available space from the VPC's CIDR block after being divided evenly by the number of availability zones." - }, - "availabilityZoneNames": { - "type": "array", - "items": { - "type": "string", - "plain": true - }, - "plain": true, - "description": "A list of availability zone names to which the subnets defined in subnetSpecs will be deployed. Optional, defaults to the first 3 AZs in the current region." - }, - "cidrBlock": { - "type": "string", - "plain": true, - "description": "The CIDR block for the VPC. Optional. Defaults to 10.0.0.0/16." - }, - "enableDnsHostnames": { - "type": "boolean", - "description": "A boolean flag to enable/disable DNS hostnames in the VPC. Defaults false.\n" - }, - "enableDnsSupport": { - "type": "boolean", - "description": "A boolean flag to enable/disable DNS support in the VPC. Defaults to true.\n" - }, - "enableNetworkAddressUsageMetrics": { - "type": "boolean", - "description": "Indicates whether Network Address Usage metrics are enabled for your VPC. Defaults to false.\n" - }, - "instanceTenancy": { - "type": "string", - "description": "A tenancy option for instances launched into the VPC. Default is `default`, which ensures that EC2 instances launched in this VPC use the EC2 instance tenancy attribute specified when the EC2 instance is launched. The only other option is `dedicated`, which ensures that EC2 instances launched in this VPC are run on dedicated tenancy instances regardless of the tenancy attribute specified at launch. This has a dedicated per region fee of $2 per hour, plus an hourly per instance usage fee.\n" - }, - "ipv4IpamPoolId": { - "type": "string", - "description": "The ID of an IPv4 IPAM pool you want to use for allocating this VPC's CIDR. IPAM is a VPC feature that you can use to automate your IP address management workflows including assigning, tracking, troubleshooting, and auditing IP addresses across AWS Regions and accounts. Using IPAM you can monitor IP address usage throughout your AWS Organization.\n", - "willReplaceOnChanges": true - }, - "ipv4NetmaskLength": { - "type": "integer", - "description": "The netmask length of the IPv4 CIDR you want to allocate to this VPC. Requires specifying a `ipv4_ipam_pool_id`.\n", - "willReplaceOnChanges": true - }, - "ipv6CidrBlock": { - "type": "string", - "description": "IPv6 CIDR block to request from an IPAM Pool. Can be set explicitly or derived from IPAM using `ipv6_netmask_length`.\n" - }, - "ipv6CidrBlockNetworkBorderGroup": { - "type": "string", - "description": "By default when an IPv6 CIDR is assigned to a VPC a default ipv6_cidr_block_network_border_group will be set to the region of the VPC. This can be changed to restrict advertisement of public addresses to specific Network Border Groups such as LocalZones.\n" - }, - "ipv6IpamPoolId": { - "type": "string", - "description": "IPAM Pool ID for a IPv6 pool. Conflicts with `assign_generated_ipv6_cidr_block`.\n" - }, - "ipv6NetmaskLength": { - "type": "integer", - "description": "Netmask length to request from IPAM Pool. Conflicts with `ipv6_cidr_block`. This can be omitted if IPAM pool as a `allocation_default_netmask_length` set. Valid values are from `44` to `60` in increments of 4.\n" - }, - "natGateways": { - "$ref": "#/types/awsx:ec2:NatGatewayConfiguration", - "plain": true, - "description": "Configuration for NAT Gateways. Optional. If private and public subnets are both specified, defaults to one gateway per availability zone. Otherwise, no gateways will be created." - }, - "numberOfAvailabilityZones": { - "type": "integer", - "plain": true, - "description": "A number of availability zones to which the subnets defined in subnetSpecs will be deployed. Optional, defaults to the first 3 AZs in the current region." - }, - "subnetSpecs": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ec2:SubnetSpec", - "plain": true - }, - "plain": true, - "description": "A list of subnet specs that should be deployed to each AZ specified in availabilityZoneNames. Optional. Defaults to a (smaller) public subnet and a (larger) private subnet based on the size of the CIDR block for the VPC. Private subnets are allocated CIDR block ranges first, followed by Public subnets, and Isolated subnets are allocated last." - }, - "subnetStrategy": { - "$ref": "#/types/awsx:ec2:SubnetAllocationStrategy", - "plain": true, - "description": "The strategy to use when allocating subnets for the VPC. Optional. Defaults to `Legacy`." - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "A map of tags to assign to the resource. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - }, - "vpcEndpointSpecs": { - "type": "array", - "items": { - "$ref": "#/types/awsx:ec2:VpcEndpointSpec", - "plain": true - }, - "plain": true, - "description": "A list of VPC Endpoints specs to be deployed as part of the VPC" - } - }, - "isComponent": true - }, - "awsx:ecr:Image": { - "description": "Builds a docker image and pushes to the ECR repository", - "properties": { - "imageUri": { - "type": "string", - "description": "Unique identifier of the pushed image" - } - }, - "type": "object", - "required": [ - "imageUri" - ], - "inputProperties": { - "args": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "An optional map of named build-time argument variables to set during the Docker build. This flag allows you to pass built-time variables that can be accessed like environment variables inside the `RUN` instruction." - }, - "builderVersion": { - "$ref": "#/types/awsx:ecr:BuilderVersion", - "plain": true, - "description": "The version of the Docker builder." - }, - "cacheFrom": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Images to consider as cache sources" - }, - "context": { - "type": "string", - "description": "Path to a directory to use for the Docker build context, usually the directory in which the Dockerfile resides (although dockerfile may be used to choose a custom location independent of this choice). If not specified, the context defaults to the current working directory; if a relative path is used, it is relative to the current working directory that Pulumi is evaluating." - }, - "dockerfile": { - "type": "string", - "description": "dockerfile may be used to override the default Dockerfile name and/or location. By default, it is assumed to be a file named Dockerfile in the root of the build context." - }, - "imageName": { - "type": "string", - "description": "Custom name for the underlying Docker image resource. If omitted, the image tag assigned by the provider will be used" - }, - "imageTag": { - "type": "string", - "description": "Custom image tag for the resulting docker image. If omitted a random string will be used" - }, - "platform": { - "type": "string", - "description": "The architecture of the platform you want to build this image for, e.g. `linux/arm64`." - }, - "registryId": { - "type": "string", - "description": "ID of the ECR registry in which to store the image. If not provided, this will be inferred from the repository URL)" - }, - "repositoryUrl": { - "type": "string", - "description": "Url of the repository" - }, - "target": { - "type": "string", - "description": "The target of the dockerfile to build" - } - }, - "requiredInputs": [ - "repositoryUrl" - ], - "isComponent": true - }, - "awsx:ecr:Repository": { - "description": "A [Repository] represents an [aws.ecr.Repository] along with an associated [LifecyclePolicy] controlling how images are retained in the repo. \n\nDocker images can be built and pushed to the repo using the [buildAndPushImage] method. This will call into the `@pulumi/docker/buildAndPushImage` function using this repo as the appropriate destination registry.", - "properties": { - "lifecyclePolicy": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecr%2flifecyclePolicy:LifecyclePolicy", - "description": "Underlying repository lifecycle policy" - }, - "repository": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecr%2frepository:Repository", - "description": "Underlying Repository resource", - "language": { - "csharp": { - "name": "AwsRepository" - } - } - }, - "url": { - "type": "string", - "description": "The URL of the repository (in the form aws_account_id.dkr.ecr.region.amazonaws.com/repositoryName).\n" - } - }, - "type": "object", - "required": [ - "repository", - "url" - ], - "inputProperties": { - "encryptionConfigurations": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecr/RepositoryEncryptionConfiguration:RepositoryEncryptionConfiguration" - }, - "description": "Encryption configuration for the repository. See below for schema.\n", - "willReplaceOnChanges": true - }, - "forceDelete": { - "type": "boolean", - "description": "If `true`, will delete the repository even if it contains images.\nDefaults to `false`.\n" - }, - "imageScanningConfiguration": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecr/RepositoryImageScanningConfiguration:RepositoryImageScanningConfiguration", - "description": "Configuration block that defines image scanning configuration for the repository. By default, image scanning must be manually triggered. See the [ECR User Guide](https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning.html) for more information about image scanning.\n" - }, - "imageTagMutability": { - "type": "string", - "description": "The tag mutability setting for the repository. Must be one of: `MUTABLE` or `IMMUTABLE`. Defaults to `MUTABLE`.\n" - }, - "lifecyclePolicy": { - "$ref": "#/types/awsx:ecr:lifecyclePolicy", - "plain": true, - "description": "A lifecycle policy consists of one or more rules that determine which images in a repository should be expired. If not provided, this will default to untagged images expiring after 1 day." - }, - "name": { - "type": "string", - "description": "Name of the repository.\n", - "willReplaceOnChanges": true - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "A map of tags to assign to the resource. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - } - }, - "isComponent": true - }, - "awsx:ecs:EC2Service": { - "description": "Create an ECS Service resource for EC2 with the given unique name, arguments, and options.\nCreates Task definition if `taskDefinitionArgs` is specified.", - "properties": { - "service": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecs%2fservice:Service", - "description": "Underlying ECS Service resource" - }, - "taskDefinition": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecs%2FtaskDefinition:TaskDefinition", - "description": "Underlying EC2 Task definition component resource if created from args" - } - }, - "required": [ - "service" - ], - "inputProperties": { - "alarms": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceAlarms:ServiceAlarms", - "description": "Information about the CloudWatch alarms. See below.\n" - }, - "availabilityZoneRebalancing": { - "type": "string", - "description": "ECS automatically redistributes tasks within a service across Availability Zones (AZs) to mitigate the risk of impaired application availability due to underlying infrastructure failures and task lifecycle activities. The valid values are `ENABLED` and `DISABLED`. Defaults to `DISABLED`.\n" - }, - "cluster": { - "type": "string", - "description": "ARN of an ECS cluster.\n", - "willReplaceOnChanges": true - }, - "continueBeforeSteadyState": { - "type": "boolean", - "description": "If `true`, this provider will not wait for the service to reach a steady state (like [`aws ecs wait services-stable`](https://docs.aws.amazon.com/cli/latest/reference/ecs/wait/services-stable.html)) before continuing. Default `false`." - }, - "deploymentCircuitBreaker": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceDeploymentCircuitBreaker:ServiceDeploymentCircuitBreaker", - "description": "Configuration block for deployment circuit breaker. See below.\n" - }, - "deploymentController": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceDeploymentController:ServiceDeploymentController", - "description": "Configuration block for deployment controller configuration. See below.\n" - }, - "deploymentMaximumPercent": { - "type": "integer", - "description": "Upper limit (as a percentage of the service's desiredCount) of the number of running tasks that can be running in a service during a deployment. Not valid when using the `DAEMON` scheduling strategy.\n" - }, - "deploymentMinimumHealthyPercent": { - "type": "integer", - "description": "Lower limit (as a percentage of the service's desiredCount) of the number of running tasks that must remain running and healthy in a service during a deployment.\n" - }, - "desiredCount": { - "type": "integer", - "description": "Number of instances of the task definition to place and keep running. Defaults to 0. Do not specify if using the `DAEMON` scheduling strategy.\n" - }, - "enableEcsManagedTags": { - "type": "boolean", - "description": "Whether to enable Amazon ECS managed tags for the tasks within the service.\n" - }, - "enableExecuteCommand": { - "type": "boolean", - "description": "Whether to enable Amazon ECS Exec for the tasks within the service.\n" - }, - "forceDelete": { - "type": "boolean", - "description": "Enable to delete a service even if it wasn't scaled down to zero tasks. It's only necessary to use this if the service uses the `REPLICA` scheduling strategy.\n" - }, - "forceNewDeployment": { - "type": "boolean", - "description": "Enable to force a new task deployment of the service. This can be used to update tasks to use a newer Docker image with same image/tag combination (e.g., `myimage:latest`), roll Fargate tasks onto a newer platform version, or immediately deploy `ordered_placement_strategy` and `placement_constraints` updates.\nWhen using the forceNewDeployment property you also need to configure the triggers property.\n" - }, - "healthCheckGracePeriodSeconds": { - "type": "integer", - "description": "Seconds to ignore failing load balancer health checks on newly instantiated tasks to prevent premature shutdown, up to 2147483647. Only valid for services configured to use load balancers.\n" - }, - "iamRole": { - "type": "string", - "description": "ARN of the IAM role that allows Amazon ECS to make calls to your load balancer on your behalf. This parameter is required if you are using a load balancer with your service, but only if your task definition does not use the `awsvpc` network mode. If using `awsvpc` network mode, do not specify this role. If your account has already created the Amazon ECS service-linked role, that role is used by default for your service unless you specify a role here.\n", - "willReplaceOnChanges": true - }, - "loadBalancers": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceLoadBalancer:ServiceLoadBalancer" - }, - "description": "Configuration block for load balancers. See below.\n" - }, - "name": { - "type": "string", - "description": "Name of the service (up to 255 letters, numbers, hyphens, and underscores)\n\nThe following arguments are optional:\n", - "willReplaceOnChanges": true - }, - "networkConfiguration": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceNetworkConfiguration:ServiceNetworkConfiguration", - "description": "Network configuration for the service. This parameter is required for task definitions that use the `awsvpc` network mode to receive their own Elastic Network Interface, and it is not supported for other network modes. See below.\n" - }, - "orderedPlacementStrategies": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceOrderedPlacementStrategy:ServiceOrderedPlacementStrategy" - }, - "description": "Service level strategy rules that are taken into consideration during task placement. List from top to bottom in order of precedence. Updates to this configuration will take effect next task deployment unless `force_new_deployment` is enabled. The maximum number of `ordered_placement_strategy` blocks is `5`. See below.\n" - }, - "placementConstraints": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServicePlacementConstraint:ServicePlacementConstraint" - }, - "description": "Rules that are taken into consideration during task placement. Updates to this configuration will take effect next task deployment unless `force_new_deployment` is enabled. Maximum number of `placement_constraints` is `10`. See below.\n" - }, - "platformVersion": { - "type": "string", - "description": "Platform version on which to run your service. Only applicable for `launch_type` set to `FARGATE`. Defaults to `LATEST`. More information about Fargate platform versions can be found in the [AWS ECS User Guide](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html).\n" - }, - "propagateTags": { - "type": "string", - "description": "Whether to propagate the tags from the task definition or the service to the tasks. The valid values are `SERVICE` and `TASK_DEFINITION`.\n" - }, - "schedulingStrategy": { - "type": "string", - "description": "Scheduling strategy to use for the service. The valid values are `REPLICA` and `DAEMON`. Defaults to `REPLICA`. Note that [*Tasks using the Fargate launch type or the `CODE_DEPLOY` or `EXTERNAL` deployment controller types don't support the `DAEMON` scheduling strategy*](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html).\n", - "willReplaceOnChanges": true - }, - "serviceConnectConfiguration": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceServiceConnectConfiguration:ServiceServiceConnectConfiguration", - "description": "ECS Service Connect configuration for this service to discover and connect to services, and be discovered by, and connected from, other services within a namespace. See below.\n" - }, - "serviceRegistries": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceServiceRegistries:ServiceServiceRegistries", - "description": "Service discovery registries for the service. The maximum number of `service_registries` blocks is `1`. See below.\n" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Key-value map of resource tags. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - }, - "taskDefinition": { - "type": "string", - "description": "Family and revision (`family:revision`) or full ARN of the task definition that you want to run in your service. Either [taskDefinition] or [taskDefinitionArgs] must be provided." - }, - "taskDefinitionArgs": { - "$ref": "#/types/awsx:ecs:EC2ServiceTaskDefinition", - "plain": true, - "description": "The args of task definition that you want to run in your service. Either [taskDefinition] or [taskDefinitionArgs] must be provided." - }, - "triggers": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Map of arbitrary keys and values that, when changed, will trigger an in-place update (redeployment). Useful with `\"plantimestamp()\"`. When using the triggers property you also need to set the forceNewDeployment property to True.\n" - }, - "volumeConfiguration": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceVolumeConfiguration:ServiceVolumeConfiguration", - "description": "Configuration for a volume specified in the task definition as a volume that is configured at launch time. Currently, the only supported volume type is an Amazon EBS volume. See below.\n" - }, - "vpcLatticeConfigurations": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceVpcLatticeConfiguration:ServiceVpcLatticeConfiguration" - }, - "description": "The VPC Lattice configuration for your service that allows Lattice to connect, secure, and monitor your service across multiple accounts and VPCs. See below.\n" - } - }, - "isComponent": true - }, - "awsx:ecs:EC2TaskDefinition": { - "description": "Create a TaskDefinition resource with the given unique name, arguments, and options.\nCreates required log-group and task \u0026 execution roles.\nPresents required Service load balancers if target group included in port mappings.", - "properties": { - "executionRole": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:iam%2Frole:Role", - "description": "Auto-created IAM task execution role that the Amazon ECS container agent and the Docker daemon can assume." - }, - "loadBalancers": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs%2FServiceLoadBalancer:ServiceLoadBalancer" - }, - "description": "Computed load balancers from target groups specified of container port mappings." - }, - "logGroup": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:cloudwatch%2FlogGroup:LogGroup", - "description": "Auto-created Log Group resource for use by containers." - }, - "taskDefinition": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecs%2FtaskDefinition:TaskDefinition", - "description": "Underlying ECS Task Definition resource" - }, - "taskRole": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:iam%2Frole:Role", - "description": "Auto-created IAM role that allows your Amazon ECS container task to make calls to other AWS services." - } - }, - "required": [ - "taskDefinition", - "loadBalancers" - ], - "inputProperties": { - "container": { - "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", - "plain": true, - "description": "Single container to make a TaskDefinition from. Useful for simple cases where there aren't\nmultiple containers, especially when creating a TaskDefinition to call [run] on.\n\nEither [container] or [containers] must be provided." - }, - "containers": { - "type": "object", - "additionalProperties": { - "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", - "plain": true - }, - "plain": true, - "description": "All the containers to make a TaskDefinition from. Useful when creating a Service that will\ncontain many containers within.\n\nEither [container] or [containers] must be provided." - }, - "cpu": { - "type": "string", - "description": "The number of cpu units used by the task. If not provided, a default will be computed based on the cumulative needs specified by [containerDefinitions]" - }, - "ephemeralStorage": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionEphemeralStorage:TaskDefinitionEphemeralStorage", - "description": "The amount of ephemeral storage to allocate for the task. This parameter is used to expand the total amount of ephemeral storage available, beyond the default amount, for tasks hosted on AWS Fargate. See Ephemeral Storage.\n", - "willReplaceOnChanges": true - }, - "executionRole": { - "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", - "plain": true, - "description": "The execution role that the Amazon ECS container agent and the Docker daemon can assume.\nWill be created automatically if not defined." - }, - "family": { - "type": "string", - "description": "An optional unique name for your task definition. If not specified, then a default will be created." - }, - "inferenceAccelerators": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionInferenceAccelerator:TaskDefinitionInferenceAccelerator" - }, - "description": "Configuration block(s) with Inference Accelerators settings. Detailed below.\n", - "willReplaceOnChanges": true - }, - "ipcMode": { - "type": "string", - "description": "IPC resource namespace to be used for the containers in the task The valid values are `host`, `task`, and `none`.\n", - "willReplaceOnChanges": true - }, - "logGroup": { - "$ref": "#/types/awsx:awsx:DefaultLogGroup", - "plain": true, - "description": "A set of volume blocks that containers in your task may use." - }, - "memory": { - "type": "string", - "description": "The amount (in MiB) of memory used by the task. If not provided, a default will be computed\nbased on the cumulative needs specified by [containerDefinitions]" - }, - "networkMode": { - "type": "string", - "description": "Docker networking mode to use for the containers in the task. Valid values are `none`, `bridge`, `awsvpc`, and `host`.\n", - "willReplaceOnChanges": true - }, - "pidMode": { - "type": "string", - "description": "Process namespace to use for the containers in the task. The valid values are `host` and `task`.\n", - "willReplaceOnChanges": true - }, - "placementConstraints": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionPlacementConstraint:TaskDefinitionPlacementConstraint" - }, - "description": "Configuration block for rules that are taken into consideration during task placement. Maximum number of `placement_constraints` is `10`. Detailed below.\n", - "willReplaceOnChanges": true - }, - "proxyConfiguration": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionProxyConfiguration:TaskDefinitionProxyConfiguration", - "description": "Configuration block for the App Mesh proxy. Detailed below.\n", - "willReplaceOnChanges": true - }, - "runtimePlatform": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionRuntimePlatform:TaskDefinitionRuntimePlatform", - "description": "Configuration block for runtime_platform that containers in your task may use.\n", - "willReplaceOnChanges": true - }, - "skipDestroy": { - "type": "boolean", - "description": "Whether to retain the old revision when the resource is destroyed or replacement is necessary. Default is `false`.\n" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Key-value map of resource tags. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - }, - "taskRole": { - "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", - "plain": true, - "description": "IAM role that allows your Amazon ECS container task to make calls to other AWS services.\nWill be created automatically if not defined." - }, - "trackLatest": { - "type": "boolean", - "description": "Whether should track latest `ACTIVE` task definition on AWS or the one created with the resource stored in state. Default is `false`. Useful in the event the task definition is modified outside of this resource.\n" - }, - "volumes": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionVolume:TaskDefinitionVolume" - }, - "description": "Configuration block for volumes that containers in your task may use. Detailed below.\n", - "willReplaceOnChanges": true - } - }, - "isComponent": true - }, - "awsx:ecs:FargateService": { - "description": "Create an ECS Service resource for Fargate with the given unique name, arguments, and options.\nCreates Task definition if `taskDefinitionArgs` is specified.", - "properties": { - "service": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecs%2fservice:Service", - "description": "Underlying ECS Service resource" - }, - "taskDefinition": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecs%2FtaskDefinition:TaskDefinition", - "description": "Underlying Fargate component resource if created from args" - } - }, - "required": [ - "service" - ], - "inputProperties": { - "alarms": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceAlarms:ServiceAlarms", - "description": "Information about the CloudWatch alarms. See below.\n" - }, - "assignPublicIp": { - "type": "boolean", - "description": "Assign a public IP address to the ENI (Fargate launch type only). Valid values are `true` or `false`. Default `false`." - }, - "availabilityZoneRebalancing": { - "type": "string", - "description": "ECS automatically redistributes tasks within a service across Availability Zones (AZs) to mitigate the risk of impaired application availability due to underlying infrastructure failures and task lifecycle activities. The valid values are `ENABLED` and `DISABLED`. Defaults to `DISABLED`.\n" - }, - "cluster": { - "type": "string", - "description": "ARN of an ECS cluster.\n", - "willReplaceOnChanges": true - }, - "continueBeforeSteadyState": { - "type": "boolean", - "description": "If `true`, this provider will not wait for the service to reach a steady state (like [`aws ecs wait services-stable`](https://docs.aws.amazon.com/cli/latest/reference/ecs/wait/services-stable.html)) before continuing. Default `false`." - }, - "deploymentCircuitBreaker": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceDeploymentCircuitBreaker:ServiceDeploymentCircuitBreaker", - "description": "Configuration block for deployment circuit breaker. See below.\n" - }, - "deploymentController": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceDeploymentController:ServiceDeploymentController", - "description": "Configuration block for deployment controller configuration. See below.\n" - }, - "deploymentMaximumPercent": { - "type": "integer", - "description": "Upper limit (as a percentage of the service's desiredCount) of the number of running tasks that can be running in a service during a deployment. Not valid when using the `DAEMON` scheduling strategy.\n" - }, - "deploymentMinimumHealthyPercent": { - "type": "integer", - "description": "Lower limit (as a percentage of the service's desiredCount) of the number of running tasks that must remain running and healthy in a service during a deployment.\n" - }, - "desiredCount": { - "type": "integer", - "description": "Number of instances of the task definition to place and keep running. Defaults to 1. Do not specify if using the `DAEMON` scheduling strategy.\n" - }, - "enableEcsManagedTags": { - "type": "boolean", - "description": "Whether to enable Amazon ECS managed tags for the tasks within the service.\n" - }, - "enableExecuteCommand": { - "type": "boolean", - "description": "Whether to enable Amazon ECS Exec for the tasks within the service.\n" - }, - "forceDelete": { - "type": "boolean", - "description": "Enable to delete a service even if it wasn't scaled down to zero tasks. It's only necessary to use this if the service uses the `REPLICA` scheduling strategy.\n" - }, - "forceNewDeployment": { - "type": "boolean", - "description": "Enable to force a new task deployment of the service. This can be used to update tasks to use a newer Docker image with same image/tag combination (e.g., `myimage:latest`), roll Fargate tasks onto a newer platform version, or immediately deploy `ordered_placement_strategy` and `placement_constraints` updates.\nWhen using the forceNewDeployment property you also need to configure the triggers property.\n" - }, - "healthCheckGracePeriodSeconds": { - "type": "integer", - "description": "Seconds to ignore failing load balancer health checks on newly instantiated tasks to prevent premature shutdown, up to 2147483647. Only valid for services configured to use load balancers.\n" - }, - "iamRole": { - "type": "string", - "description": "ARN of the IAM role that allows Amazon ECS to make calls to your load balancer on your behalf. This parameter is required if you are using a load balancer with your service, but only if your task definition does not use the `awsvpc` network mode. If using `awsvpc` network mode, do not specify this role. If your account has already created the Amazon ECS service-linked role, that role is used by default for your service unless you specify a role here.\n", - "willReplaceOnChanges": true - }, - "loadBalancers": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceLoadBalancer:ServiceLoadBalancer" - }, - "description": "Configuration block for load balancers. See below.\n" - }, - "name": { - "type": "string", - "description": "Name of the service (up to 255 letters, numbers, hyphens, and underscores)\n\nThe following arguments are optional:\n", - "willReplaceOnChanges": true - }, - "networkConfiguration": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceNetworkConfiguration:ServiceNetworkConfiguration", - "description": "Network configuration for the service. This parameter is required for task definitions that use the `awsvpc` network mode to receive their own Elastic Network Interface, and it is not supported for other network modes. See below.\n" - }, - "placementConstraints": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServicePlacementConstraint:ServicePlacementConstraint" - }, - "description": "Rules that are taken into consideration during task placement. Updates to this configuration will take effect next task deployment unless `force_new_deployment` is enabled. Maximum number of `placement_constraints` is `10`. See below.\n" - }, - "platformVersion": { - "type": "string", - "description": "Platform version on which to run your service. Only applicable for `launch_type` set to `FARGATE`. Defaults to `LATEST`. More information about Fargate platform versions can be found in the [AWS ECS User Guide](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html).\n" - }, - "propagateTags": { - "type": "string", - "description": "Whether to propagate the tags from the task definition or the service to the tasks. The valid values are `SERVICE` and `TASK_DEFINITION`.\n" - }, - "schedulingStrategy": { - "type": "string", - "description": "Scheduling strategy to use for the service. The valid values are `REPLICA` and `DAEMON`. Defaults to `REPLICA`. Note that [*Tasks using the Fargate launch type or the `CODE_DEPLOY` or `EXTERNAL` deployment controller types don't support the `DAEMON` scheduling strategy*](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html).\n", - "willReplaceOnChanges": true - }, - "serviceConnectConfiguration": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceServiceConnectConfiguration:ServiceServiceConnectConfiguration", - "description": "ECS Service Connect configuration for this service to discover and connect to services, and be discovered by, and connected from, other services within a namespace. See below.\n" - }, - "serviceRegistries": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceServiceRegistries:ServiceServiceRegistries", - "description": "Service discovery registries for the service. The maximum number of `service_registries` blocks is `1`. See below.\n" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Key-value map of resource tags. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - }, - "taskDefinition": { - "type": "string", - "description": "Family and revision (`family:revision`) or full ARN of the task definition that you want to run in your service. Either [taskDefinition] or [taskDefinitionArgs] must be provided." - }, - "taskDefinitionArgs": { - "$ref": "#/types/awsx:ecs:FargateServiceTaskDefinition", - "plain": true, - "description": "The args of task definition that you want to run in your service. Either [taskDefinition] or [taskDefinitionArgs] must be provided." - }, - "triggers": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Map of arbitrary keys and values that, when changed, will trigger an in-place update (redeployment). Useful with `\"plantimestamp()\"`. When using the triggers property you also need to set the forceNewDeployment property to True.\n" - }, - "volumeConfiguration": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceVolumeConfiguration:ServiceVolumeConfiguration", - "description": "Configuration for a volume specified in the task definition as a volume that is configured at launch time. Currently, the only supported volume type is an Amazon EBS volume. See below.\n" - }, - "vpcLatticeConfigurations": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceVpcLatticeConfiguration:ServiceVpcLatticeConfiguration" - }, - "description": "The VPC Lattice configuration for your service that allows Lattice to connect, secure, and monitor your service across multiple accounts and VPCs. See below.\n" - } - }, - "isComponent": true - }, - "awsx:ecs:FargateTaskDefinition": { - "description": "Create a TaskDefinition resource with the given unique name, arguments, and options.\nCreates required log-group and task \u0026 execution roles.\nPresents required Service load balancers if target group included in port mappings.", - "properties": { - "executionRole": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:iam%2Frole:Role", - "description": "Auto-created IAM task execution role that the Amazon ECS container agent and the Docker daemon can assume." - }, - "loadBalancers": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs%2FServiceLoadBalancer:ServiceLoadBalancer" - }, - "description": "Computed load balancers from target groups specified of container port mappings." - }, - "logGroup": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:cloudwatch%2FlogGroup:LogGroup", - "description": "Auto-created Log Group resource for use by containers." - }, - "taskDefinition": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecs%2FtaskDefinition:TaskDefinition", - "description": "Underlying ECS Task Definition resource" - }, - "taskRole": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:iam%2Frole:Role", - "description": "Auto-created IAM role that allows your Amazon ECS container task to make calls to other AWS services." - } - }, - "required": [ - "taskDefinition", - "loadBalancers" - ], - "inputProperties": { - "container": { - "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", - "plain": true, - "description": "Single container to make a TaskDefinition from. Useful for simple cases where there aren't\nmultiple containers, especially when creating a TaskDefinition to call [run] on.\n\nEither [container] or [containers] must be provided." - }, - "containers": { - "type": "object", - "additionalProperties": { - "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", - "plain": true - }, - "plain": true, - "description": "All the containers to make a TaskDefinition from. Useful when creating a Service that will\ncontain many containers within.\n\nEither [container] or [containers] must be provided." - }, - "cpu": { - "type": "string", - "description": "The number of cpu units used by the task. If not provided, a default will be computed based on the cumulative needs specified by [containerDefinitions]" - }, - "ephemeralStorage": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionEphemeralStorage:TaskDefinitionEphemeralStorage", - "description": "The amount of ephemeral storage to allocate for the task. This parameter is used to expand the total amount of ephemeral storage available, beyond the default amount, for tasks hosted on AWS Fargate. See Ephemeral Storage.\n", - "willReplaceOnChanges": true - }, - "executionRole": { - "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", - "plain": true, - "description": "The execution role that the Amazon ECS container agent and the Docker daemon can assume.\nWill be created automatically if not defined." - }, - "family": { - "type": "string", - "description": "An optional unique name for your task definition. If not specified, then a default will be created." - }, - "inferenceAccelerators": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionInferenceAccelerator:TaskDefinitionInferenceAccelerator" - }, - "description": "Configuration block(s) with Inference Accelerators settings. Detailed below.\n", - "willReplaceOnChanges": true - }, - "ipcMode": { - "type": "string", - "description": "IPC resource namespace to be used for the containers in the task The valid values are `host`, `task`, and `none`.\n", - "willReplaceOnChanges": true - }, - "logGroup": { - "$ref": "#/types/awsx:awsx:DefaultLogGroup", - "plain": true, - "description": "A set of volume blocks that containers in your task may use." - }, - "memory": { - "type": "string", - "description": "The amount (in MiB) of memory used by the task. If not provided, a default will be computed\nbased on the cumulative needs specified by [containerDefinitions]" - }, - "pidMode": { - "type": "string", - "description": "Process namespace to use for the containers in the task. The valid values are `host` and `task`.\n", - "willReplaceOnChanges": true - }, - "placementConstraints": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionPlacementConstraint:TaskDefinitionPlacementConstraint" - }, - "description": "Configuration block for rules that are taken into consideration during task placement. Maximum number of `placement_constraints` is `10`. Detailed below.\n", - "willReplaceOnChanges": true - }, - "proxyConfiguration": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionProxyConfiguration:TaskDefinitionProxyConfiguration", - "description": "Configuration block for the App Mesh proxy. Detailed below.\n", - "willReplaceOnChanges": true - }, - "runtimePlatform": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionRuntimePlatform:TaskDefinitionRuntimePlatform", - "description": "Configuration block for runtime_platform that containers in your task may use.\n", - "willReplaceOnChanges": true - }, - "skipDestroy": { - "type": "boolean", - "description": "Whether to retain the old revision when the resource is destroyed or replacement is necessary. Default is `false`.\n" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Key-value map of resource tags. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - }, - "taskRole": { - "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", - "plain": true, - "description": "IAM role that allows your Amazon ECS container task to make calls to other AWS services.\nWill be created automatically if not defined." - }, - "trackLatest": { - "type": "boolean", - "description": "Whether should track latest `ACTIVE` task definition on AWS or the one created with the resource stored in state. Default is `false`. Useful in the event the task definition is modified outside of this resource.\n" - }, - "volumes": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionVolume:TaskDefinitionVolume" - }, - "description": "Configuration block for volumes that containers in your task may use. Detailed below.\n", - "willReplaceOnChanges": true - } - }, - "isComponent": true - }, - "awsx:lb:ApplicationLoadBalancer": { - "description": "Provides an Application Load Balancer resource with listeners, default target group and default security group.", - "properties": { - "defaultSecurityGroup": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2fsecurityGroup:SecurityGroup", - "description": "Default security group, if auto-created" - }, - "defaultTargetGroup": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2ftargetGroup:TargetGroup", - "description": "Default target group, if auto-created" - }, - "listeners": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2flistener:Listener" - }, - "description": "Listeners created as part of this load balancer" - }, - "loadBalancer": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2floadBalancer:LoadBalancer", - "description": "Underlying Load Balancer resource" - }, - "vpcId": { - "type": "string", - "description": "Id of the VPC in which this load balancer is operating" - } - }, - "type": "object", - "required": [ - "loadBalancer", - "defaultTargetGroup" - ], - "inputProperties": { - "accessLogs": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/LoadBalancerAccessLogs:LoadBalancerAccessLogs", - "description": "Access Logs block. See below.\n" - }, - "clientKeepAlive": { - "type": "integer", - "description": "Client keep alive value in seconds. The valid range is 60-604800 seconds. The default is 3600 seconds.\n" - }, - "connectionLogs": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/LoadBalancerConnectionLogs:LoadBalancerConnectionLogs", - "description": "Connection Logs block. See below. Only valid for Load Balancers of type `application`.\n" - }, - "customerOwnedIpv4Pool": { - "type": "string", - "description": "ID of the customer owned ipv4 pool to use for this load balancer.\n", - "willReplaceOnChanges": true - }, - "defaultSecurityGroup": { - "$ref": "#/types/awsx:awsx:DefaultSecurityGroup", - "plain": true, - "description": "Options for creating a default security group if [securityGroups] not specified." - }, - "defaultTargetGroup": { - "$ref": "#/types/awsx:lb:TargetGroup", - "plain": true, - "description": "Options creating a default target group." - }, - "defaultTargetGroupPort": { - "type": "integer", - "description": "Port to use to connect with the target. Valid values are ports 1-65535. Defaults to 80.\n" - }, - "desyncMitigationMode": { - "type": "string", - "description": "How the load balancer handles requests that might pose a security risk to an application due to HTTP desync. Valid values are `monitor`, `defensive` (default), `strictest`.\n" - }, - "dnsRecordClientRoutingPolicy": { - "type": "string", - "description": "How traffic is distributed among the load balancer Availability Zones. Possible values are `any_availability_zone` (default), `availability_zone_affinity`, or `partial_availability_zone_affinity`. See [Availability Zone DNS affinity](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/network-load-balancers.html#zonal-dns-affinity) for additional details. Only valid for `network` type load balancers.\n" - }, - "dropInvalidHeaderFields": { - "type": "boolean", - "description": "Whether HTTP headers with header fields that are not valid are removed by the load balancer (true) or routed to targets (false). The default is false. Elastic Load Balancing requires that message header names contain only alphanumeric characters and hyphens. Only valid for Load Balancers of type `application`.\n" - }, - "enableDeletionProtection": { - "type": "boolean", - "description": "If true, deletion of the load balancer will be disabled via the AWS API. This will prevent this provider from deleting the load balancer. Defaults to `false`.\n" - }, - "enableHttp2": { - "type": "boolean", - "description": "Whether HTTP/2 is enabled in `application` load balancers. Defaults to `true`.\n" - }, - "enableTlsVersionAndCipherSuiteHeaders": { - "type": "boolean", - "description": "Whether the two headers (`x-amzn-tls-version` and `x-amzn-tls-cipher-suite`), which contain information about the negotiated TLS version and cipher suite, are added to the client request before sending it to the target. Only valid for Load Balancers of type `application`. Defaults to `false`\n" - }, - "enableWafFailOpen": { - "type": "boolean", - "description": "Whether to allow a WAF-enabled load balancer to route requests to targets if it is unable to forward the request to AWS WAF. Defaults to `false`.\n" - }, - "enableXffClientPort": { - "type": "boolean", - "description": "Whether the X-Forwarded-For header should preserve the source port that the client used to connect to the load balancer in `application` load balancers. Defaults to `false`.\n" - }, - "enableZonalShift": { - "type": "boolean", - "description": "Whether zonal shift is enabled. Defaults to `false`.\n" - }, - "enforceSecurityGroupInboundRulesOnPrivateLinkTraffic": { - "type": "string", - "description": "Whether inbound security group rules are enforced for traffic originating from a PrivateLink. Only valid for Load Balancers of type `network`. The possible values are `on` and `off`.\n" - }, - "idleTimeout": { - "type": "integer", - "description": "Time in seconds that the connection is allowed to be idle. Only valid for Load Balancers of type `application`. Default: 60.\n" - }, - "internal": { - "type": "boolean", - "description": "If true, the LB will be internal. Defaults to `false`.\n", - "willReplaceOnChanges": true - }, - "ipAddressType": { - "type": "string", - "description": "Type of IP addresses used by the subnets for your load balancer. The possible values depend upon the load balancer type: `ipv4` (all load balancer types), `dualstack` (all load balancer types), and `dualstack-without-public-ipv4` (type `application` only).\n" - }, - "listener": { - "$ref": "#/types/awsx:lb:Listener", - "plain": true, - "description": "A listener to create. Only one of [listener] and [listeners] can be specified." - }, - "listeners": { - "type": "array", - "items": { - "$ref": "#/types/awsx:lb:Listener", - "plain": true - }, - "plain": true, - "description": "List of listeners to create. Only one of [listener] and [listeners] can be specified." - }, - "name": { - "type": "string", - "description": "Name of the LB. This name must be unique within your AWS account, can have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and must not begin or end with a hyphen. If not specified, this provider will autogenerate a name beginning with `tf-lb`.\n", - "willReplaceOnChanges": true - }, - "namePrefix": { - "type": "string", - "description": "Creates a unique name beginning with the specified prefix. Conflicts with `name`.\n", - "willReplaceOnChanges": true - }, - "preserveHostHeader": { - "type": "boolean", - "description": "Whether the Application Load Balancer should preserve the Host header in the HTTP request and send it to the target without any change. Defaults to `false`.\n" - }, - "securityGroups": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of security group IDs to assign to the LB. Only valid for Load Balancers of type `application` or `network`. For load balancers of type `network` security groups cannot be added if none are currently present, and cannot all be removed once added. If either of these conditions are met, this will force a recreation of the resource.\n" - }, - "subnetIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of subnet IDs to attach to the LB. For Load Balancers of type `network` subnets can only be added (see [Availability Zones](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/network-load-balancers.html#availability-zones)), deleting a subnet for load balancers of type `network` will force a recreation of the resource.\n" - }, - "subnetMappings": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/LoadBalancerSubnetMapping:LoadBalancerSubnetMapping" - }, - "description": "Subnet mapping block. See below. For Load Balancers of type `network` subnet mappings can only be added.\n" - }, - "subnets": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2fsubnet:Subnet" - }, - "description": "A list of subnets to attach to the LB. Only one of [subnets], [subnetIds] or [subnetMappings] can be specified" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Map of tags to assign to the resource. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - }, - "xffHeaderProcessingMode": { - "type": "string", - "description": "Determines how the load balancer modifies the `X-Forwarded-For` header in the HTTP request before sending the request to the target. The possible values are `append`, `preserve`, and `remove`. Only valid for Load Balancers of type `application`. The default is `append`.\n" - } - }, - "isComponent": true - }, - "awsx:lb:NetworkLoadBalancer": { - "description": "Provides a Network Load Balancer resource with listeners and default target group.", - "properties": { - "defaultTargetGroup": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2ftargetGroup:TargetGroup", - "description": "Default target group, if auto-created" - }, - "listeners": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2flistener:Listener" - }, - "description": "Listeners created as part of this load balancer" - }, - "loadBalancer": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2floadBalancer:LoadBalancer", - "description": "Underlying Load Balancer resource" - }, - "vpcId": { - "type": "string", - "description": "Id of the VPC in which this load balancer is operating" - } - }, - "type": "object", - "required": [ - "loadBalancer", - "defaultTargetGroup" - ], - "inputProperties": { - "accessLogs": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/LoadBalancerAccessLogs:LoadBalancerAccessLogs", - "description": "Access Logs block. See below.\n" - }, - "clientKeepAlive": { - "type": "integer", - "description": "Client keep alive value in seconds. The valid range is 60-604800 seconds. The default is 3600 seconds.\n" - }, - "connectionLogs": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/LoadBalancerConnectionLogs:LoadBalancerConnectionLogs", - "description": "Connection Logs block. See below. Only valid for Load Balancers of type `application`.\n" - }, - "customerOwnedIpv4Pool": { - "type": "string", - "description": "ID of the customer owned ipv4 pool to use for this load balancer.\n", - "willReplaceOnChanges": true - }, - "defaultTargetGroup": { - "$ref": "#/types/awsx:lb:TargetGroup", - "plain": true, - "description": "Options creating a default target group." - }, - "defaultTargetGroupPort": { - "type": "integer", - "description": "Port to use to connect with the target. Valid values are ports 1-65535. Defaults to 80.\n" - }, - "desyncMitigationMode": { - "type": "string", - "description": "How the load balancer handles requests that might pose a security risk to an application due to HTTP desync. Valid values are `monitor`, `defensive` (default), `strictest`.\n" - }, - "dnsRecordClientRoutingPolicy": { - "type": "string", - "description": "How traffic is distributed among the load balancer Availability Zones. Possible values are `any_availability_zone` (default), `availability_zone_affinity`, or `partial_availability_zone_affinity`. See [Availability Zone DNS affinity](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/network-load-balancers.html#zonal-dns-affinity) for additional details. Only valid for `network` type load balancers.\n" - }, - "dropInvalidHeaderFields": { - "type": "boolean", - "description": "Whether HTTP headers with header fields that are not valid are removed by the load balancer (true) or routed to targets (false). The default is false. Elastic Load Balancing requires that message header names contain only alphanumeric characters and hyphens. Only valid for Load Balancers of type `application`.\n" - }, - "enableCrossZoneLoadBalancing": { - "type": "boolean", - "description": "If true, cross-zone load balancing of the load balancer will be enabled. For `network` and `gateway` type load balancers, this feature is disabled by default (`false`). For `application` load balancer this feature is always enabled (`true`) and cannot be disabled. Defaults to `false`.\n" - }, - "enableDeletionProtection": { - "type": "boolean", - "description": "If true, deletion of the load balancer will be disabled via the AWS API. This will prevent this provider from deleting the load balancer. Defaults to `false`.\n" - }, - "enableTlsVersionAndCipherSuiteHeaders": { - "type": "boolean", - "description": "Whether the two headers (`x-amzn-tls-version` and `x-amzn-tls-cipher-suite`), which contain information about the negotiated TLS version and cipher suite, are added to the client request before sending it to the target. Only valid for Load Balancers of type `application`. Defaults to `false`\n" - }, - "enableWafFailOpen": { - "type": "boolean", - "description": "Whether to allow a WAF-enabled load balancer to route requests to targets if it is unable to forward the request to AWS WAF. Defaults to `false`.\n" - }, - "enableXffClientPort": { - "type": "boolean", - "description": "Whether the X-Forwarded-For header should preserve the source port that the client used to connect to the load balancer in `application` load balancers. Defaults to `false`.\n" - }, - "enableZonalShift": { - "type": "boolean", - "description": "Whether zonal shift is enabled. Defaults to `false`.\n" - }, - "enforceSecurityGroupInboundRulesOnPrivateLinkTraffic": { - "type": "string", - "description": "Whether inbound security group rules are enforced for traffic originating from a PrivateLink. Only valid for Load Balancers of type `network`. The possible values are `on` and `off`.\n" - }, - "idleTimeout": { - "type": "integer", - "description": "Time in seconds that the connection is allowed to be idle. Only valid for Load Balancers of type `application`. Default: 60.\n" - }, - "internal": { - "type": "boolean", - "description": "If true, the LB will be internal. Defaults to `false`.\n", - "willReplaceOnChanges": true - }, - "ipAddressType": { - "type": "string", - "description": "Type of IP addresses used by the subnets for your load balancer. The possible values depend upon the load balancer type: `ipv4` (all load balancer types), `dualstack` (all load balancer types), and `dualstack-without-public-ipv4` (type `application` only).\n" - }, - "listener": { - "$ref": "#/types/awsx:lb:Listener", - "plain": true, - "description": "A listener to create. Only one of [listener] and [listeners] can be specified." - }, - "listeners": { - "type": "array", - "items": { - "$ref": "#/types/awsx:lb:Listener", - "plain": true - }, - "plain": true, - "description": "List of listeners to create. Only one of [listener] and [listeners] can be specified." - }, - "name": { - "type": "string", - "description": "Name of the LB. This name must be unique within your AWS account, can have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and must not begin or end with a hyphen. If not specified, this provider will autogenerate a name beginning with `tf-lb`.\n", - "willReplaceOnChanges": true - }, - "namePrefix": { - "type": "string", - "description": "Creates a unique name beginning with the specified prefix. Conflicts with `name`.\n", - "willReplaceOnChanges": true - }, - "preserveHostHeader": { - "type": "boolean", - "description": "Whether the Application Load Balancer should preserve the Host header in the HTTP request and send it to the target without any change. Defaults to `false`.\n" - }, - "securityGroups": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of security group IDs to assign to the LB. Only valid for Load Balancers of type `application` or `network`. For load balancers of type `network` security groups cannot be added if none are currently present, and cannot all be removed once added. If either of these conditions are met, this will force a recreation of the resource.\n" - }, - "subnetIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of subnet IDs to attach to the LB. For Load Balancers of type `network` subnets can only be added (see [Availability Zones](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/network-load-balancers.html#availability-zones)), deleting a subnet for load balancers of type `network` will force a recreation of the resource.\n" - }, - "subnetMappings": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/LoadBalancerSubnetMapping:LoadBalancerSubnetMapping" - }, - "description": "Subnet mapping block. See below. For Load Balancers of type `network` subnet mappings can only be added.\n" - }, - "subnets": { - "type": "array", - "items": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2fsubnet:Subnet" - }, - "description": "A list of subnets to attach to the LB. Only one of [subnets], [subnetIds] or [subnetMappings] can be specified" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Map of tags to assign to the resource. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" - }, - "xffHeaderProcessingMode": { - "type": "string", - "description": "Determines how the load balancer modifies the `X-Forwarded-For` header in the HTTP request before sending the request to the target. The possible values are `append`, `preserve`, and `remove`. Only valid for Load Balancers of type `application`. The default is `append`.\n" - } - }, - "isComponent": true - }, - "awsx:lb:TargetGroupAttachment": { - "description": "Attach an EC2 instance or Lambda to a Load Balancer. This will create required permissions if attaching to a Lambda Function.", - "properties": { - "lambdaPermission": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lambda%2fpermission:Permission", - "description": "Auto-created Lambda permission, if targeting a Lambda function" - }, - "targetGroupAttachment": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2ftargetGroupAttachment:TargetGroupAttachment", - "description": "Underlying Target Group Attachment resource", - "language": { - "csharp": { - "name": "Attachment" - } - } - } - }, - "type": "object", - "required": [ - "targetGroupAttachment" - ], - "inputProperties": { - "instance": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2finstance:Instance", - "description": "EC2 Instance to attach to the Target Group. Exactly 1 of [instance], [instanceId], [lambda] or [lambdaArn] must be provided." - }, - "instanceId": { - "type": "string", - "description": "ID of an EC2 Instance to attach to the Target Group. Exactly 1 of [instance], [instanceId], [lambda] or [lambdaArn] must be provided." - }, - "lambda": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lambda%2ffunction:Function", - "description": "Lambda Function to attach to the Target Group. Exactly 1 of [instance], [instanceId], [lambda] or [lambdaArn] must be provided.", - "language": { - "python": { - "name": "function" - } - } - }, - "lambdaArn": { - "type": "string", - "description": "ARN of a Lambda Function to attach to the Target Group. Exactly 1 of [instance], [instanceId], [lambda] or [lambdaArn] must be provided." - }, - "targetGroup": { - "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2ftargetGroup:TargetGroup", - "description": "Target Group to attach to. Exactly one of [targetGroup] or [targetGroupArn] must be specified." - }, - "targetGroupArn": { - "type": "string", - "description": "ARN of the Target Group to attach to. Exactly one of [targetGroup] or [targetGroupArn] must be specified." - } - }, - "isComponent": true - } - }, - "functions": { - "awsx:ec2:getDefaultVpc": { - "deprecationMessage": "Waiting for https://github.com/pulumi/pulumi/issues/7583. Use the DefaultVpc resource until resolved.", - "description": "[NOT YET IMPLEMENTED] Get the Default VPC for a region.", - "inputs": { - "description": "Arguments for getting the default VPC" - }, - "outputs": { - "description": "Outputs from the default VPC configuration", - "properties": { - "privateSubnetIds": { - "type": "array", - "items": { - "type": "string" - } - }, - "publicSubnetIds": { - "type": "array", - "items": { - "type": "string" - } - }, - "vpcId": { - "type": "string", - "description": "The VPC ID for the default VPC" - } - }, - "required": [ - "vpcId", - "publicSubnetIds", - "privateSubnetIds" - ] - } - } - } -} \ No newline at end of file From 26ab61aa75f1fb85c89653d9fee3271f0c54701a Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 10:33:41 -0500 Subject: [PATCH 06/25] Plumb Version in Go --- provider/pkg/version/version.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 provider/pkg/version/version.go diff --git a/provider/pkg/version/version.go b/provider/pkg/version/version.go new file mode 100644 index 000000000..9523bcd41 --- /dev/null +++ b/provider/pkg/version/version.go @@ -0,0 +1,18 @@ +// Copyright 2016-2024, Pulumi Corporation. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package version + +// Version is initialized by the Go linker to contain the semver of this build. +var Version string From 4ced5daf26e28f5adbcb50ed36b5db9d644dbf9c Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 10:34:49 -0500 Subject: [PATCH 07/25] Pin pulumi-java-gen version --- .pulumi-java-gen.version | 1 + 1 file changed, 1 insertion(+) create mode 100644 .pulumi-java-gen.version diff --git a/.pulumi-java-gen.version b/.pulumi-java-gen.version new file mode 100644 index 000000000..c81aa44af --- /dev/null +++ b/.pulumi-java-gen.version @@ -0,0 +1 @@ +0.9.7 From 55b5a4a94d6f85cd6d1136f74d61f5c3e8282e25 Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 10:35:13 -0500 Subject: [PATCH 08/25] Configure .ci-mgmt.yaml --- .ci-mgmt.yaml | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 .ci-mgmt.yaml diff --git a/.ci-mgmt.yaml b/.ci-mgmt.yaml new file mode 100644 index 000000000..da81f0a44 --- /dev/null +++ b/.ci-mgmt.yaml @@ -0,0 +1,91 @@ +provider: awsx +aws: true +major-version: 2 +template: generic +shards: 10 + +# This is defined in .mk/build.mk instead of using the default Go builder. +customBuildProviderCmd: true + +env: + ALT_AWS_ACCESS_KEY_ID: ${{ secrets.ALT_AWS_ACCESS_KEY_ID }} + ALT_AWS_SECRET_ACCESS_KEY: ${{ secrets.ALT_AWS_SECRET_ACCESS_KEY }} + AWS_REGION: us-west-2 + GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} + GOLANGCI_LINT_VERSION: v1.61.0 + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + PROVIDER: eks + PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + PULUMI_API: https://api.pulumi-staging.io + PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} + SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} + SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} + PULUMI_ENABLE_RESOURCE_REFERENCES: 1 + PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget + +# lint: false +# parallel: 1 +# timeout: 150 +# generate-nightly-test-workflow: true +# providerVersion: github.com/hashicorp/terraform-provider-aws/version.ProviderVersion +# toolVersions: +# dotnet: "6.0.x" +# go: "1.23.x" +# java: "11" +# gradle: "7.6" +# nodejs: "20.x" +# pulumi: "dev" +# python: "3.11.8" +# env: +# PULUMI_MISSING_DOCS_ERROR: true +# AWS_REGION: "us-west-2" +# OIDC_ROLE_ARN: ${{ secrets.OIDC_ROLE_ARN }} +# makeTemplate: bridged +# checkoutSubmodules: true +# freeDiskSpaceBeforeBuild: true +# freeDiskSpaceBeforeSdkBuild: true +# freeDiskSpaceBeforeTest: true +# # TODO: remove XrunUpstreamTools flag after work to add docs replacement strategies to resources.go is completed +# # Tracked in in https://github.com/pulumi/pulumi-aws/issues/2757 +# XrunUpstreamTools: true +# plugins: +# - name: archive +# version: "0.0.1" +# - name: tls +# version: "4.10.0" +# - name: github +# version: "4.10.0" +# - name: kubernetes +# version: "4.11.0" +# - name: "null" +# version: "0.0.3" +# - name: "local" +# version: "0.1.0" +# - name: random +# version: "4.8.2" +# - name: github +# version: "5.14.0" +# - name: std +# version: "1.6.2" +# - name: terraform +# version: "1.0.17" +# kind: converter +# # Use `pulumi convert` for translating examples from TF to Pulumi. +# pulumiConvert: 1 +# goBuildParallelism: 2 +# actions: +# preTest: +# - name: Configure AWS Credentials +# uses: aws-actions/configure-aws-credentials@v4 +# with: +# aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} +# aws-region: ${{ env.AWS_REGION }} +# aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} +# role-duration-seconds: 7200 +# role-session-name: aws@githubActions +# role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} From 27293085e91742b4bca58d9bddd86759d2201592 Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 10:36:00 -0500 Subject: [PATCH 09/25] temp: script syncing ci-mgmt --- scripts/ci-mgmt.sh | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100755 scripts/ci-mgmt.sh diff --git a/scripts/ci-mgmt.sh b/scripts/ci-mgmt.sh new file mode 100755 index 000000000..6cd2d4c5f --- /dev/null +++ b/scripts/ci-mgmt.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +set -euo pipefail + +REF=$(cd ~/code/ci-mgmt && git rev-parse HEAD) +go run github.com/pulumi/ci-mgmt/provider-ci@${REF} generate --skip-migrations From 4d302c48026deab28e9a54013939728b649e4c13 Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 10:36:49 -0500 Subject: [PATCH 10/25] Update provider/go.mod naming convention --- provider/go.mod | 89 ++++----- provider/go.sum | 471 ++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 442 insertions(+), 118 deletions(-) diff --git a/provider/go.mod b/provider/go.mod index ba14d81f1..6a873bd8d 100644 --- a/provider/go.mod +++ b/provider/go.mod @@ -1,22 +1,26 @@ -module github.com/pulumi/pulumi-awsx/provider +module github.com/pulumi/pulumi-awsx/provider/v2 -go 1.21.0 +go 1.23 + +toolchain go1.23.3 require ( - github.com/pulumi/providertest v0.0.12 + github.com/pkg/errors v0.9.1 + github.com/pulumi/providertest v0.1.4 + github.com/pulumi/pulumi/pkg/v3 v3.144.1 + github.com/pulumi/pulumi/sdk/v3 v3.144.1 + github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.9.0 ) require ( - cloud.google.com/go v0.112.2 // indirect - cloud.google.com/go/auth v0.2.0 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.0 // indirect + cloud.google.com/go v0.112.1 // indirect cloud.google.com/go/compute/metadata v0.5.0 // indirect - cloud.google.com/go/iam v1.1.7 // indirect - cloud.google.com/go/kms v1.15.8 // indirect + cloud.google.com/go/iam v1.1.6 // indirect + cloud.google.com/go/kms v1.15.7 // indirect cloud.google.com/go/logging v1.9.0 // indirect - cloud.google.com/go/longrunning v0.5.6 // indirect - cloud.google.com/go/storage v1.40.0 // indirect + cloud.google.com/go/longrunning v0.5.5 // indirect + cloud.google.com/go/storage v1.39.1 // indirect dario.cat/mergo v1.0.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect @@ -29,9 +33,10 @@ require ( github.com/ProtonMail/go-crypto v1.0.0 // indirect github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect github.com/agext/levenshtein v1.2.3 // indirect + github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/atotto/clipboard v0.1.4 // indirect - github.com/aws/aws-sdk-go v1.51.23 // indirect + github.com/aws/aws-sdk-go v1.50.36 // indirect github.com/aws/aws-sdk-go-v2 v1.26.1 // indirect github.com/aws/aws-sdk-go-v2/config v1.27.11 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.11 // indirect @@ -41,7 +46,7 @@ require ( github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 // indirect - github.com/aws/aws-sdk-go-v2/service/kms v1.31.0 // indirect + github.com/aws/aws-sdk-go-v2/service/kms v1.30.1 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 // indirect @@ -49,16 +54,16 @@ require ( github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/blang/semver v3.5.1+incompatible // indirect github.com/cenkalti/backoff/v3 v3.2.2 // indirect - github.com/charmbracelet/bubbles v0.18.0 // indirect + github.com/charmbracelet/bubbles v0.16.1 // indirect github.com/charmbracelet/bubbletea v0.25.0 // indirect - github.com/charmbracelet/lipgloss v0.10.0 // indirect + github.com/charmbracelet/lipgloss v0.7.1 // indirect github.com/cheggaaa/pb v1.0.29 // indirect github.com/cloudflare/circl v1.3.7 // indirect - github.com/containerd/console v1.0.4 // indirect + github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/deckarep/golang-set/v2 v2.6.0 // indirect - github.com/djherbis/times v1.6.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/deckarep/golang-set/v2 v2.5.0 // indirect + github.com/djherbis/times v1.5.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect @@ -69,8 +74,7 @@ require ( github.com/go-jose/go-jose/v3 v3.0.3 // indirect github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-test/deep v1.1.0 // indirect - github.com/gofrs/uuid v4.4.0+incompatible // indirect + github.com/gofrs/uuid v4.2.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang/glog v1.2.2 // indirect @@ -81,8 +85,8 @@ require ( github.com/google/uuid v1.6.0 // indirect github.com/google/wire v0.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.3 // indirect - github.com/gorilla/mux v1.8.1 // indirect + github.com/googleapis/gax-go/v2 v2.12.2 // indirect + github.com/gorilla/mux v1.8.0 // indirect github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -92,9 +96,10 @@ require ( github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8 // indirect github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect github.com/hashicorp/go-sockaddr v1.0.6 // indirect - github.com/hashicorp/hcl v1.0.1-vault-5 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/hcl/v2 v2.22.0 // indirect - github.com/hashicorp/vault/api v1.12.2 // indirect + github.com/hashicorp/vault/api v1.12.0 // indirect + github.com/iancoleman/strcase v0.2.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect @@ -125,39 +130,37 @@ require ( github.com/pgavlin/goldmark v1.1.33-0.20200616210433-b5eb04559386 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/pkg/term v1.1.0 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 // indirect github.com/pulumi/esc v0.10.0 // indirect - github.com/pulumi/pulumi/pkg/v3 v3.144.1 // indirect - github.com/pulumi/pulumi/sdk/v3 v3.144.1 // indirect - github.com/rivo/uniseg v0.4.7 // indirect + github.com/pulumi/inflector v0.1.1 // indirect + github.com/rivo/uniseg v0.4.4 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 // indirect - github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect - github.com/segmentio/asm v1.2.0 // indirect - github.com/segmentio/encoding v0.4.0 // indirect + github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 // indirect + github.com/segmentio/asm v1.1.3 // indirect + github.com/segmentio/encoding v0.3.5 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/skeema/knownhosts v1.2.2 // indirect - github.com/spf13/cobra v1.8.0 // indirect + github.com/spf13/afero v1.9.5 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/texttheater/golang-levenshtein v1.0.1 // indirect github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect - github.com/zclconf/go-cty v1.14.4 // indirect + github.com/zclconf/go-cty v1.13.2 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.50.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 // indirect - go.opentelemetry.io/otel v1.25.0 // indirect - go.opentelemetry.io/otel/metric v1.25.0 // indirect - go.opentelemetry.io/otel/trace v1.25.0 // indirect - go.uber.org/atomic v1.11.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.uber.org/atomic v1.9.0 // indirect gocloud.dev v0.37.0 // indirect gocloud.dev/secrets/hashivault v0.37.0 // indirect golang.org/x/crypto v0.31.0 // indirect @@ -172,8 +175,8 @@ require ( golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.22.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/api v0.174.0 // indirect - google.golang.org/genproto v0.0.0-20240415180920-8c6c420018be // indirect + google.golang.org/api v0.169.0 // indirect + google.golang.org/genproto v0.0.0-20240311173647-c811ad7063a7 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect google.golang.org/grpc v1.67.1 // indirect diff --git a/provider/go.sum b/provider/go.sum index f3395f628..cde95692c 100644 --- a/provider/go.sum +++ b/provider/go.sum @@ -1,24 +1,57 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.112.2 h1:ZaGT6LiG7dBzi6zNOvVZwacaXlmf3lRqnC4DQzqyRQw= -cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms= -cloud.google.com/go/auth v0.2.0 h1:y6oTcpMSbOcXbwYgUUrvI+mrQ2xbrcdpPgtVbCGTLTk= -cloud.google.com/go/auth v0.2.0/go.mod h1:+yb+oy3/P0geX6DLKlqiGHARGR6EX2GRtYCzWOCQSbU= -cloud.google.com/go/auth/oauth2adapt v0.2.0 h1:FR8zevgQwu+8CqiOT5r6xCmJa3pJC/wdXEEPF1OkNhA= -cloud.google.com/go/auth/oauth2adapt v0.2.0/go.mod h1:AfqujpDAlTfLfeCIl/HJZZlIxD8+nJoZ5e0x1IxGq5k= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= +cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= -cloud.google.com/go/iam v1.1.7 h1:z4VHOhwKLF/+UYXAJDFwGtNF0b6gjsW1Pk9Ml0U/IoM= -cloud.google.com/go/iam v1.1.7/go.mod h1:J4PMPg8TtyurAUvSmPj8FF3EDgY1SPRZxcUGrn7WXGA= -cloud.google.com/go/kms v1.15.8 h1:szIeDCowID8th2i8XE4uRev5PMxQFqW+JjwYxL9h6xs= -cloud.google.com/go/kms v1.15.8/go.mod h1:WoUHcDjD9pluCg7pNds131awnH429QGvRM3N/4MyoVs= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= +cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= +cloud.google.com/go/kms v1.15.7 h1:7caV9K3yIxvlQPAcaFffhlT7d1qpxjB1wHBtjWa13SM= +cloud.google.com/go/kms v1.15.7/go.mod h1:ub54lbsa6tDkUwnu4W7Yt1aAIFLnspgh0kPGToDukeI= cloud.google.com/go/logging v1.9.0 h1:iEIOXFO9EmSiTjDmfpbRjOxECO7R8C7b8IXUGOj7xZw= cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= -cloud.google.com/go/longrunning v0.5.6 h1:xAe8+0YaWoCKr9t1+aWe+OeQgN/iJK1fEgZSXmjuEaE= -cloud.google.com/go/longrunning v0.5.6/go.mod h1:vUaDrWYOMKRuhiv6JBnn49YxCPz2Ayn9GqyjaBT8/mA= -cloud.google.com/go/storage v1.40.0 h1:VEpDQV5CJxFmJ6ueWNsKxcr1QAYOXEgxDa+sBbJahPw= -cloud.google.com/go/storage v1.40.0/go.mod h1:Rrj7/hKlG87BLqDJYtwR0fbPld8uJPbQ2ucUMY7Ir0g= +cloud.google.com/go/longrunning v0.5.5 h1:GOE6pZFdSrTb4KAiKnXsJBtlE6mEyaW44oKyMILWnOg= +cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.39.1 h1:MvraqHKhogCOTXTlct/9C3K3+Uy2jBmFYb3/Sp6dVtY= +cloud.google.com/go/storage v1.39.1/go.mod h1:xK6xZmxZmo+fyP7+DEF6FhNc24/JAe95OLyOHCXFH1o= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= @@ -34,6 +67,7 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= @@ -47,14 +81,16 @@ github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7l github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= +github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= -github.com/aws/aws-sdk-go v1.51.23 h1:/3TEdsEE/aHmdKGw2NrOp7Sdea76zfffGkTTSXTsDxY= -github.com/aws/aws-sdk-go v1.51.23/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.50.36 h1:PjWXHwZPuTLMR1NIb8nEjLucZBMzmf84TLoLbD8BZqk= +github.com/aws/aws-sdk-go v1.50.36/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= @@ -85,8 +121,8 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 h1:ogRAwT1/g github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7/go.mod h1:YCsIZhXfRPLFFCl5xxY+1T9RKzOKjCut+28JSX2DnAk= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 h1:f9RyWNtS8oH7cZlbn+/JNPpjUk5+5fLd5lM9M0i49Ys= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5/go.mod h1:h5CoMZV2VF297/VLhRhO1WF+XYWOzXo+4HsObA4HjBQ= -github.com/aws/aws-sdk-go-v2/service/kms v1.31.0 h1:yl7wcqbisxPzknJVfWTLnK83McUvXba+pz2+tPbIUmQ= -github.com/aws/aws-sdk-go-v2/service/kms v1.31.0/go.mod h1:2snWQJQUKsbN66vAawJuOGX7dr37pfOq9hb0tZDGIqQ= +github.com/aws/aws-sdk-go-v2/service/kms v1.30.1 h1:SBn4I0fJXF9FYOVRSVMWuhvEKoAHDikjGpS3wlmw5DE= +github.com/aws/aws-sdk-go-v2/service/kms v1.30.1/go.mod h1:2snWQJQUKsbN66vAawJuOGX7dr37pfOq9hb0tZDGIqQ= github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 h1:6cnno47Me9bRykw9AEv9zkXE+5or7jz8TsskTTccbgc= github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1/go.mod h1:qmdkIIAC+GCLASF7R2whgNrJADz0QZPX+Seiw/i4S3o= github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 h1:vN8hEbpRnL7+Hopy9dzmRle1xmDc7o8tmY0klsr175w= @@ -105,32 +141,36 @@ github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7N github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M= github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= -github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= +github.com/charmbracelet/bubbles v0.16.1 h1:6uzpAAaT9ZqKssntbvZMlksWHruQLNxg49H5WdeuYSY= +github.com/charmbracelet/bubbles v0.16.1/go.mod h1:2QCp9LFlEsBQMvIYERr7Ww2H2bA7xen1idUDIzm/+Xc= github.com/charmbracelet/bubbletea v0.25.0 h1:bAfwk7jRz7FKFl9RzlIULPkStffg5k6pNt5dywy4TcM= github.com/charmbracelet/bubbletea v0.25.0/go.mod h1:EN3QDR1T5ZdWmdfDzYcqOCAps45+QIJbLOBxmVNWNNg= -github.com/charmbracelet/lipgloss v0.10.0 h1:KWeXFSexGcfahHX+54URiZGkBFazf70JNMtwg/AFW3s= -github.com/charmbracelet/lipgloss v0.10.0/go.mod h1:Wig9DSfvANsxqkRsqj6x87irdy123SR4dOXlKa91ciE= +github.com/charmbracelet/lipgloss v0.7.1 h1:17WMwi7N1b1rVWOjMT+rCh7sQkvDU75B2hbZpc5Kc1E= +github.com/charmbracelet/lipgloss v0.7.1/go.mod h1:yG0k3giv8Qj8edTCbbg6AlQ5e8KNWpFujkNawKNhE2c= github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= -github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= +github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= -github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/djherbis/times v1.6.0 h1:w2ctJ92J8fBvWPxugmXIv7Nz7Q3iDMKNx9v5ocVH20c= -github.com/djherbis/times v1.6.0/go.mod h1:gOHeRAz2h+VJNZ5Gmc/o7iD9k4wW7NMVqieYCY99oc0= +github.com/deckarep/golang-set/v2 v2.5.0 h1:hn6cEZtQ0h3J8kFrHR/NrzyOoTnjgW1+FmNJzQ7y/sA= +github.com/deckarep/golang-set/v2 v2.5.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/djherbis/times v1.5.0 h1:79myA211VwPhFTqUk8xehWrsEO+zcIZj0zT8mXPVARU= +github.com/djherbis/times v1.5.0/go.mod h1:5q7FDLvbNg1L/KaBmPcWlVR9NmoKo3+ucqUA3ijQhA0= github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= @@ -140,6 +180,8 @@ github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FM github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= @@ -165,6 +207,9 @@ github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMj github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -172,10 +217,10 @@ github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= -github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= -github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= +github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= +github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -184,28 +229,46 @@ github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVI github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -216,8 +279,23 @@ github.com/google/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6A github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk= github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= @@ -228,10 +306,13 @@ github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI= github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= -github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= +github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -253,12 +334,18 @@ github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9 github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= github.com/hashicorp/go-sockaddr v1.0.6 h1:RSG8rKU28VTUTvEKghe5gIhIQpv8evvNpnDEyqO4u9I= github.com/hashicorp/go-sockaddr v1.0.6/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= -github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= -github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl/v2 v2.22.0 h1:hkZ3nCtqeJsDhPRFz5EA9iwcG1hNWGePOTw6oyul12M= github.com/hashicorp/hcl/v2 v2.22.0/go.mod h1:62ZYHrXgPoX8xBnzl8QzbWq4dyDsDtfCRgIq1rbJEvA= -github.com/hashicorp/vault/api v1.12.2 h1:7YkCTE5Ni90TcmYHDBExdt4WGJxhpzaHqR6uGbQb/rE= -github.com/hashicorp/vault/api v1.12.2/go.mod h1:LSGf1NGT1BnvFFnKVtnvcaLBM2Lz+gJdpL6HUYed8KE= +github.com/hashicorp/vault/api v1.12.0 h1:meCpJSesvzQyao8FCOgk2fGdoADAnbDu2WPJN1lDLJ4= +github.com/hashicorp/vault/api v1.12.0/go.mod h1:si+lJCYO7oGkIoNPAN8j3azBLTn9SjMGS+jFaHd1Cck= +github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= @@ -269,11 +356,14 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -344,26 +434,29 @@ github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmd github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 h1:vkHw5I/plNdTr435cARxCW6q9gc0S/Yxz7Mkd38pOb0= github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231/go.mod h1:murToZ2N9hNJzewjHBgfFdXhZKjY3z5cYC1VXk+lbFE= github.com/pulumi/esc v0.10.0 h1:jzBKzkLVW0mePeanDRfqSQoCJ5yrkux0jIwAkUxpRKE= github.com/pulumi/esc v0.10.0/go.mod h1:2Bfa+FWj/xl8CKqRTWbWgDX0SOD4opdQgvYSURTGK2c= -github.com/pulumi/providertest v0.0.12 h1:UjcFQHHs4AGJyJqxhvC2q8yVQ7Li+UyCyP95HZcK03U= -github.com/pulumi/providertest v0.0.12/go.mod h1:REAoaN+hGOtdWJGirfWYqcSjCejlbGfzyVTUuemJTuE= +github.com/pulumi/inflector v0.1.1 h1:dvlxlWtXwOJTUUtcYDvwnl6Mpg33prhK+7mzeF+SobA= +github.com/pulumi/inflector v0.1.1/go.mod h1:HUFCjcPTz96YtTuUlwG3i3EZG4WlniBvR9bd+iJxCUY= +github.com/pulumi/providertest v0.1.4 h1:25AeDXEcQLtRxJgcDG5TISYpOMoVoQHhv69vzfJtHws= +github.com/pulumi/providertest v0.1.4/go.mod h1:bU07oPwpgNjGuuIT6CPnI/eLXaGHqhypFrxX5ZsABo4= github.com/pulumi/pulumi/pkg/v3 v3.144.1 h1:64mVLQDEZa2GN52rTKSyXlA3r+APoqDXrNdkzlASyvs= github.com/pulumi/pulumi/pkg/v3 v3.144.1/go.mod h1:q2wZOcwXVI/+OBtEXD6mLS7shhRMgsIGTo/uWfo0q04= github.com/pulumi/pulumi/sdk/v3 v3.144.1 h1:QQtCDERihhlfvcmRzqHeBmOER1Fg1VkFj9933Lxqv00= github.com/pulumi/pulumi/sdk/v3 v3.144.1/go.mod h1:/6gxU2XirnLlImBy5OoqV6I4HcjOf+IznNIZNZExZzo= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= -github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -371,17 +464,19 @@ github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkB github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs= -github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= -github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= -github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= -github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= -github.com/segmentio/encoding v0.4.0 h1:MEBYvRqiUB2nfR2criEXWqwdY6HJOUrCn5hboVOVmy8= -github.com/segmentio/encoding v0.4.0/go.mod h1:/d03Cd8PoaDeceuhUUUQWjU0KhWjrmYrWPgtJHYZSnI= +github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 h1:TToq11gyfNlrMFZiYujSekIsPd9AmsA2Bj/iv+s4JHE= +github.com/santhosh-tekuri/jsonschema/v5 v5.0.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= +github.com/segmentio/asm v1.1.3 h1:WM03sfUOENvvKexOLp+pCqgb/WDjsi7EK8gIsICtzhc= +github.com/segmentio/asm v1.1.3/go.mod h1:Ld3L4ZXGNcSLRg4JBsZ3//1+f/TjYl0Mzen/DQy1EJg= +github.com/segmentio/encoding v0.3.5 h1:UZEiaZ55nlXGDL92scoVuw00RmiRCazIEmvPSbSvt8Y= +github.com/segmentio/encoding v0.3.5/go.mod h1:n0JeuIqEQrQoPDGsjo8UNd1iA0U8d8+oHAA4E3G3OxM= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= @@ -420,43 +515,56 @@ github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVK github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zclconf/go-cty v1.14.4 h1:uXXczd9QDGsgu0i/QFR/hzI5NYCHLf6NQw/atrbnhq8= -github.com/zclconf/go-cty v1.14.4/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty v1.13.2 h1:4GvrUxe/QUDYuJKAav4EYqdM47/kZa672LwmXFmEKT0= +github.com/zclconf/go-cty v1.13.2/go.mod h1:YKQzy/7pZ7iq2jNFzy5go57xdxdWoLLpaEp4u238AE0= +github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= +github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.50.0 h1:zvpPXY7RfYAGSdYQLjp6zxdJNSYD/+FFoCTQN9IPxBs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.50.0/go.mod h1:BMn8NB1vsxTljvuorms2hyOs8IBuuBEq0pl7ltOfy30= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 h1:cEPbyTSEHlQR89XVlyo78gqluF8Y3oMeBkXGWzQsfXY= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0/go.mod h1:DKdbWcT4GH1D0Y3Sqt/PFXt2naRKDWtU+eE6oLdFNA8= -go.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k= -go.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg= -go.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA= -go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= -go.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM= -go.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I= -go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= -go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= gocloud.dev v0.37.0 h1:XF1rN6R0qZI/9DYjN16Uy0durAmSlf58DHOcb28GPro= gocloud.dev v0.37.0/go.mod h1:7/O4kqdInCNsc6LqgmuFnS0GRew4XNNYWpA44yQnwco= gocloud.dev/secrets/hashivault v0.37.0 h1:5ehGtUBP29DFAgAs6bPw7fVSgqQ3TxaoK2xVcLp1x+c= gocloud.dev/secrets/hashivault v0.37.0/go.mod h1:4ClUWjBfP8wLdGts56acjHz3mWLuATMoH9vi74FjIv8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= @@ -465,15 +573,40 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuhGX/+R1ZpfJ4/ia80JM= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= @@ -482,14 +615,36 @@ golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= @@ -502,13 +657,26 @@ golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= @@ -518,18 +686,45 @@ golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -555,8 +750,12 @@ golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= @@ -567,6 +766,9 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -574,11 +776,51 @@ golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= @@ -591,24 +833,92 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.174.0 h1:zB1BWl7ocxfTea2aQ9mgdzXjnfPySllpPOskdnO+q34= -google.golang.org/api v0.174.0/go.mod h1:aC7tB6j0HR1Nl0ni5ghpx6iLasmAX78Zkh/wgxAAjLg= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= +google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20240415180920-8c6c420018be h1:g4aX8SUFA8V5F4LrSY5EclyGYw1OZN4HS1jTyjB9ZDc= -google.golang.org/genproto v0.0.0-20240415180920-8c6c420018be/go.mod h1:FeSdT5fk+lkxatqJP38MsUicGqHax5cLtmy/6TAuxO4= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20240311173647-c811ad7063a7 h1:ImUcDPHjTrAqNhlOkSocDLfG9rrNHH7w7uoKWPaWZ8s= +google.golang.org/genproto v0.0.0-20240311173647-c811ad7063a7/go.mod h1:/3XmxOjePkvmKrHuBy4zNFw7IzxJXtAgdpXi8Ll990U= google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8= google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -619,13 +929,16 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= @@ -638,8 +951,16 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= lukechampine.com/frand v1.4.2 h1:RzFIpOvkMXuPMBb9maa4ND4wjBn71E1Jpf8BzJHMaVw= lukechampine.com/frand v1.4.2/go.mod h1:4S/TM2ZgrKejMcKMbeLjISpJMO+/eZ1zu3vYX9dtj3s= pgregory.net/rapid v0.6.1 h1:4eyrDxyht86tT4Ztm+kvlyNBLIk071gR+ZQdhphc9dQ= pgregory.net/rapid v0.6.1/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= From aa58e62258d7360f822db14eb2b7bd4919e95f28 Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 10:44:40 -0500 Subject: [PATCH 11/25] temp: mv Makefile Makefile.old --- Makefile => Makefile.old | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Makefile => Makefile.old (100%) diff --git a/Makefile b/Makefile.old similarity index 100% rename from Makefile rename to Makefile.old From 754a69885030713f744cd67c1ebb04a87fe787bc Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 10:45:22 -0500 Subject: [PATCH 12/25] generate: ./scripts/ci-mgmt.sh --- .gitattributes | 1 + .github/ISSUE_TEMPLATE/bug.yaml | 69 +++ .github/ISSUE_TEMPLATE/epic.md | 35 ++ .github/actions/download-bin/action.yml | 23 + .github/actions/download-codegen/action.yml | 17 + .github/actions/download-sdk/action.yml | 19 + .github/actions/setup-tools/action.yml | 91 ++++ .github/actions/upload-sdk/action.yml | 20 + .github/workflows/artifact-cleanup.yml | 13 - .github/workflows/build_provider.yml | 73 ++++ .github/workflows/build_sdk.yml | 132 ++++++ .github/workflows/command-dispatch.yml | 62 ++- .github/workflows/community-moderation.yml | 45 ++ .github/workflows/cron.yml | 216 ---------- .github/workflows/license.yml | 70 ++++ .github/workflows/lint.yml | 61 +++ .github/workflows/master.yml | 435 ++++++------------- .github/workflows/pre-release.yml | 376 ----------------- .github/workflows/prerelease.yml | 93 ++++ .github/workflows/prerequisites.yml | 117 ++++++ .github/workflows/publish.yml | 222 ++++++++++ .github/workflows/pull-request.yml | 54 ++- .github/workflows/release.yml | 442 ++++---------------- .github/workflows/release_command.yml | 45 ++ .github/workflows/run-acceptance-tests.yml | 340 ++++++--------- .github/workflows/test.yml | 146 +++++++ .github/workflows/verify-release.yml | 93 ++++ .github/workflows/version.yml | 22 - .github/workflows/weekly-pulumi-update.yml | 103 ----- .golangci.yml | 35 ++ .upgrade-config.yml | 6 + CODE-OF-CONDUCT.md | 27 +- Makefile | 382 +++++++++++++++++ 33 files changed, 2216 insertions(+), 1669 deletions(-) create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug.yaml create mode 100644 .github/ISSUE_TEMPLATE/epic.md create mode 100644 .github/actions/download-bin/action.yml create mode 100644 .github/actions/download-codegen/action.yml create mode 100644 .github/actions/download-sdk/action.yml create mode 100644 .github/actions/setup-tools/action.yml create mode 100644 .github/actions/upload-sdk/action.yml delete mode 100644 .github/workflows/artifact-cleanup.yml create mode 100644 .github/workflows/build_provider.yml create mode 100644 .github/workflows/build_sdk.yml create mode 100644 .github/workflows/community-moderation.yml delete mode 100644 .github/workflows/cron.yml create mode 100644 .github/workflows/license.yml create mode 100644 .github/workflows/lint.yml delete mode 100644 .github/workflows/pre-release.yml create mode 100644 .github/workflows/prerelease.yml create mode 100644 .github/workflows/prerequisites.yml create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/release_command.yml create mode 100644 .github/workflows/test.yml create mode 100644 .github/workflows/verify-release.yml delete mode 100644 .github/workflows/version.yml delete mode 100644 .github/workflows/weekly-pulumi-update.yml create mode 100644 .golangci.yml create mode 100644 .upgrade-config.yml create mode 100644 Makefile diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..ff9aa4f9d --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +sdk/**/* linguist-generated=true diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml new file mode 100644 index 000000000..63d707268 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -0,0 +1,69 @@ +name: Bug Report +description: Report something that's not working correctly +labels: ["kind/bug", "needs-triage"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + You can also ask questions on our [Community Slack](https://slack.pulumi.com/). + - type: textarea + id: what-happened + attributes: + label: Describe what happened + description: Please summarize what happened, including what Pulumi commands you ran, as well as + an inline snippet of any relevant error or console output. + validations: + required: true + - type: textarea + id: sample-program + attributes: + label: Sample program + description: | +
Provide a reproducible sample program + If this is a bug you encountered while running a Pulumi command, please provide us with a minimal, + self-contained Pulumi program that reproduces this behavior so that we can investigate on our end. + Without a functional reproduction, we will not be able to prioritize this bug. + **Note:** If the program output is more than a few lines, please send us a Gist or a link to a file. +
+ validations: + required: true + - type: textarea + id: log-output + attributes: + label: Log output + description: | +
How to Submit Logs + If this is something that is dependent on your environment, please also provide us with the output of + `pulumi up --logtostderr --logflow -v=10` from the root of your project. + We may also ask you to supply us with debug output following [these steps](https://www.pulumi.com/docs/using-pulumi/pulumi-packages/debugging-provider-packages/). + **Note:** If the log output is more than a few lines, please send us a Gist or a link to a file. +
+ - type: textarea + id: resources + attributes: + label: Affected Resource(s) + description: Please list the affected Pulumi Resource(s) or Function(s). + validations: + required: false + - type: textarea + id: versions + attributes: + label: Output of `pulumi about` + description: Provide the output of `pulumi about` from the root of your project. + validations: + required: true + - type: textarea + id: ctx + attributes: + label: Additional context + description: Anything else you would like to add? + validations: + required: false + - type: textarea + id: voting + attributes: + label: Contributing + value: | + Vote on this issue by adding a 👍 reaction. + To contribute a fix for this issue, leave a comment (and link to your pull request, if you've opened one already). \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/epic.md b/.github/ISSUE_TEMPLATE/epic.md new file mode 100644 index 000000000..27d4e3a44 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/epic.md @@ -0,0 +1,35 @@ +--- +name: Epic +about: Tracks a shippable unit of work +title: '[Epic] {your-title-here}' +labels: kind/epic +projects: ['pulumi/32'] +assignees: '' +type: Epic +--- + +## Overview + + +## Key KPIs + + +## Key Stakeholders +- Product and Engineering: +- Documentation: +- Marketing/Partnerships: +- Customers: + +## Key Deliverables + + +### References 📔 + + +- [ ] Project View +- [ ] PR/FAQ +- [ ] Design Doc +- [ ] UX Designs +- [ ] Decision Log + + diff --git a/.github/actions/download-bin/action.yml b/.github/actions/download-bin/action.yml new file mode 100644 index 000000000..2767c8ad0 --- /dev/null +++ b/.github/actions/download-bin/action.yml @@ -0,0 +1,23 @@ +name: Download the provider binary +description: Downloads the provider binary to `bin/`. + +runs: + using: "composite" + steps: + + - name: Download pulumi-resource-awsx + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + pattern: pulumi-resource-awsx-*-linux-amd64.tar.gz + path: ${{ github.workspace }}/bin + merge-multiple: true + + - name: Untar pulumi-resource-awsx + shell: bash + run: | + tar -zxf ${{ github.workspace }}/bin/*amd64.tar.gz -C ${{ github.workspace}}/bin + + - name: Mark pulumi-resource-awsx as executable + shell: bash + run: | + find ${{ github.workspace }} -name "pulumi-*-awsx" -print -exec chmod +x {} \; diff --git a/.github/actions/download-codegen/action.yml b/.github/actions/download-codegen/action.yml new file mode 100644 index 000000000..5bc557ea6 --- /dev/null +++ b/.github/actions/download-codegen/action.yml @@ -0,0 +1,17 @@ +name: Download the code generator binary +description: Downloads the code generator binary to `bin/`. + +runs: + using: "composite" + steps: + + - name: Download the code generator binary for awsx + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: pulumi-gen-awsx + path: ${{ github.workspace }}/bin + + - name: Ensure the code generator binary for awsx is executable + shell: bash + run: | + find ${{ github.workspace }} -name "pulumi-*-awsx" -print -exec chmod +x {} \; diff --git a/.github/actions/download-sdk/action.yml b/.github/actions/download-sdk/action.yml new file mode 100644 index 000000000..ec5a2f308 --- /dev/null +++ b/.github/actions/download-sdk/action.yml @@ -0,0 +1,19 @@ +name: Download SDK asset +description: Restores the SDK asset for a language. + +inputs: + language: + required: true + description: One of nodejs, python, dotnet, go, java + +runs: + using: "composite" + steps: + - name: Download ${{ inputs.language }} SDK + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: ${{ inputs.language }}-sdk.tar.gz + path: ${{ github.workspace}}/sdk/ + - name: Uncompress SDK folder + shell: bash + run: tar -zxf ${{ github.workspace }}/sdk/${{ inputs.language }}.tar.gz -C ${{ github.workspace }}/sdk/${{ inputs.language }} diff --git a/.github/actions/setup-tools/action.yml b/.github/actions/setup-tools/action.yml new file mode 100644 index 000000000..14cd282f7 --- /dev/null +++ b/.github/actions/setup-tools/action.yml @@ -0,0 +1,91 @@ +name: Setup tools +description: Installs Go, Pulumi, pulumictl, schema-tools, Node.JS, Python, dotnet and Java. + +inputs: + tools: + description: | + Comma separated list of tools to install. The default of "all" installs all tools. Available tools are: + go + pulumicli + pulumictl + schema-tools + nodejs + python + dotnet + java + default: all + cache-go: + description: | + Whether to enable the GitHub cache for Go. Appropriate for disabling in + smaller jobs that typically completely before the "real" job has an + opportunity to populate the cache. + default: "true" + +runs: + using: "composite" + steps: + - name: Install Go + if: inputs.tools == 'all' || contains(inputs.tools, 'go') + uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5 + with: + go-version: "1.21.x" + cache-dependency-path: | + provider/*.sum + upstream/*.sum + sdk/go/*.sum + sdk/*.sum + *.sum + # TODO(https://github.com/actions/setup-go/issues/316): Restore but don't save the cache. + cache: ${{ inputs.cache-go }} + + - name: Install pulumictl + if: inputs.tools == 'all' || contains(inputs.tools, 'pulumictl') + uses: jaxxstorm/action-install-gh-release@cd6b2b78ad38bdd294341cda064ec0692b06215b # v1.14.0 + with: + tag: v0.0.46 + repo: pulumi/pulumictl + + - name: Install Pulumi CLI + if: inputs.tools == 'all' || contains(inputs.tools, 'pulumicli') + uses: pulumi/actions@c7fad9e2f0b79653172b36538b8b34b3c0291952 # v6 + with: + pulumi-version: "dev" + + - name: Install Schema Tools + if: inputs.tools == 'all' || contains(inputs.tools, 'schema-tools') + uses: jaxxstorm/action-install-gh-release@cd6b2b78ad38bdd294341cda064ec0692b06215b # v1.14.0 + with: + repo: pulumi/schema-tools + + - name: Setup Node + if: inputs.tools == 'all' || contains(inputs.tools, 'nodejs') + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4 + with: + node-version: 20.x + registry-url: https://registry.npmjs.org + + - name: Setup DotNet + if: inputs.tools == 'all' || contains(inputs.tools, 'dotnet') + uses: actions/setup-dotnet@87b7050bc53ea08284295505d98d2aa94301e852 # v4.2.0 + with: + dotnet-version: 6.0.x + + - name: Setup Python + if: inputs.tools == 'all' || contains(inputs.tools, 'python') + uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + with: + python-version: 3.11.8 + + - name: Setup Java + if: inputs.tools == 'all' || contains(inputs.tools, 'java') + uses: actions/setup-java@7a6d8a8234af8eb26422e24e3006232cccaa061b # v4.6.0 + with: + cache: gradle + distribution: temurin + java-version: 11 + + - name: Setup Gradle + if: inputs.tools == 'all' || contains(inputs.tools, 'java') + uses: gradle/gradle-build-action@ac2d340dc04d9e1113182899e983b5400c17cda1 # v3 + with: + gradle-version: 7.6 diff --git a/.github/actions/upload-sdk/action.yml b/.github/actions/upload-sdk/action.yml new file mode 100644 index 000000000..bea11eed8 --- /dev/null +++ b/.github/actions/upload-sdk/action.yml @@ -0,0 +1,20 @@ +name: Upload SDK asset +description: Upload the SDK for a specific language as an asset for the workflow. + +inputs: + language: + required: true + description: One of nodejs, python, dotnet, go, java + +runs: + using: "composite" + steps: + - name: Compress SDK folder + shell: bash + run: tar -zcf sdk/${{ inputs.language }}.tar.gz -C sdk/${{ inputs.language }} . + - name: Upload artifacts + uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + with: + name: ${{ inputs.language }}-sdk.tar.gz + path: ${{ github.workspace}}/sdk/${{ inputs.language }}.tar.gz + retention-days: 30 diff --git a/.github/workflows/artifact-cleanup.yml b/.github/workflows/artifact-cleanup.yml deleted file mode 100644 index d99e87080..000000000 --- a/.github/workflows/artifact-cleanup.yml +++ /dev/null @@ -1,13 +0,0 @@ -jobs: - remove-old-artifacts: - runs-on: ubuntu-latest - steps: - - name: Remove old artifacts - uses: c-hive/gha-remove-artifacts@v1 - with: - age: 1 month - skip-tags: true -name: cleanup -"on": - schedule: - - cron: 0 1 * * * diff --git a/.github/workflows/build_provider.yml b/.github/workflows/build_provider.yml new file mode 100644 index 000000000..17f48d363 --- /dev/null +++ b/.github/workflows/build_provider.yml @@ -0,0 +1,73 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt + +name: "Build Provider" + +on: + workflow_call: + inputs: + version: + required: true + type: string + description: Version of the provider to build + +jobs: + build_provider: + name: Build ${{ matrix.platform.os }}-${{ matrix.platform.arch }} + runs-on: ubuntu-latest + env: + PROVIDER_VERSION: ${{ inputs.version }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + strategy: + fail-fast: true + matrix: + platform: + - os: linux + arch: amd64 + - os: linux + arch: arm64 + - os: darwin + arch: amd64 + - os: darwin + arch: arm64 + - os: windows + arch: amd64 + steps: + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + - name: Setup tools + uses: ./.github/actions/setup-tools + with: + tools: pulumictl, go + - name: Prepare local workspace before restoring previously built + run: make prepare_local_workspace + - name: Download schema-embed.json + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + # Use a pattern to avoid failing if the artifact doesn't exist + pattern: schema-embed.* + # Avoid creating directories for each artifact + merge-multiple: true + path: provider/cmd/pulumi-resource-awsx + - name: Restore makefile progress + run: make --touch provider schema + + - name: Build provider + run: make "provider-${{ matrix.platform.os }}-${{ matrix.platform.arch }}" + env: + AZURE_SIGNING_CLIENT_ID: ${{ secrets.AZURE_SIGNING_CLIENT_ID }} + AZURE_SIGNING_CLIENT_SECRET: ${{ secrets.AZURE_SIGNING_CLIENT_SECRET }} + AZURE_SIGNING_TENANT_ID: ${{ secrets.AZURE_SIGNING_TENANT_ID }} + AZURE_SIGNING_KEY_VAULT_URI: ${{ secrets.AZURE_SIGNING_KEY_VAULT_URI }} + SKIP_SIGNING: ${{ secrets.AZURE_SIGNING_CLIENT_ID == '' && secrets.AZURE_SIGNING_CLIENT_SECRET == '' && secrets.AZURE_SIGNING_TENANT_ID == '' && secrets.AZURE_SIGNING_KEY_VAULT_URI == '' }} + + - name: Package provider + run: make provider_dist-${{ matrix.platform.os }}-${{ matrix.platform.arch }} + + - name: Upload artifacts + uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + with: + name: pulumi-resource-awsx-v${{ inputs.version }}-${{ matrix.platform.os }}-${{ matrix.platform.arch }}.tar.gz + path: bin/pulumi-resource-awsx-v${{ inputs.version }}-${{ matrix.platform.os }}-${{ matrix.platform.arch }}.tar.gz + retention-days: 30 diff --git a/.github/workflows/build_sdk.yml b/.github/workflows/build_sdk.yml new file mode 100644 index 000000000..e8d826747 --- /dev/null +++ b/.github/workflows/build_sdk.yml @@ -0,0 +1,132 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt + +name: "Build SDK" + +on: + workflow_call: + inputs: + version: + required: true + type: string + +env: + ALT_AWS_ACCESS_KEY_ID: ${{ secrets.ALT_AWS_ACCESS_KEY_ID }} + ALT_AWS_SECRET_ACCESS_KEY: ${{ secrets.ALT_AWS_SECRET_ACCESS_KEY }} + AWS_REGION: us-west-2 + GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} + GOLANGCI_LINT_VERSION: v1.61.0 + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NUGET_PUBLISH_KEY: ${{ secrets.NUGET_PUBLISH_KEY }} + PROVIDER: eks + PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + PULUMI_API: https://api.pulumi-staging.io + PULUMI_ENABLE_RESOURCE_REFERENCES: "1" + PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. + PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget + PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + PYPI_USERNAME: __token__ + SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} + SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} + SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + TF_APPEND_USER_AGENT: pulumi + PROVIDER_VERSION: ${{ inputs.version }} + +jobs: + build_sdk: + name: build_sdk + runs-on: ubuntu-latest + strategy: + # We normally fail fast unless this is a PR from Renovate in which case + # we'll always build all SDKs in case there are any changes to commit. + fail-fast: ${{ ! contains(github.actor, 'renovate') }} + matrix: + language: + - nodejs + - python + - dotnet + - go + - java + steps: + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + - name: Cache examples generation + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4 + with: + path: | + .pulumi/examples-cache + key: ${{ runner.os }}-${{ hashFiles('provider/go.sum') }} + - name: Setup tools + uses: ./.github/actions/setup-tools + with: + tools: pulumictl, pulumicli, ${{ matrix.language }} + - name: Prepare local workspace + run: make prepare_local_workspace + - name: Download gen + uses: ./.github/actions/download-codegen + - name: Update path + run: echo "${{ github.workspace }}/bin" >> "$GITHUB_PATH" + - name: Restore makefile progress + run: make --touch provider schema + - name: Build SDK + run: make build_${{ matrix.language }} + - name: Check worktree clean + id: worktreeClean + uses: pulumi/git-status-check-action@v1 + with: + # Keep these in sync with the Renovate step below to avoid them getting checked in. + allowed-changes: | + sdk/**/pulumi-plugin.json + sdk/dotnet/*.csproj + sdk/go/**/pulumiUtilities.go + sdk/nodejs/package.json + sdk/python/pyproject.toml + - name: Commit ${{ matrix.language }} SDK changes for Renovate + # If the worktree is dirty and this is a Renovate PR to bump + # dependencies, commit the updated SDK and push it back to the PR. The + # job will still be marked as a failure. + if: failure() && steps.worktreeClean.outcome == 'failure' && contains(github.actor, 'renovate') && github.event_name == 'pull_request' + shell: bash + run: | + git diff --quiet -- sdk && echo "no changes to sdk" && exit + + git config --global user.email "bot@pulumi.com" + git config --global user.name "pulumi-bot" + + # Stash local changes and check out the PR's branch directly. + git stash + git fetch + git checkout "origin/$HEAD_REF" + + # Apply and add our changes, but don't commit any files we expect to + # always change due to versioning. + git stash pop + git add sdk + git reset \ + sdk/python/*/pulumi-plugin.json \ + sdk/python/pyproject.toml \ + sdk/dotnet/pulumi-plugin.json \ + sdk/dotnet/Pulumi.*.csproj \ + sdk/go/*/pulumi-plugin.json \ + sdk/go/*/internal/pulumiUtilities.go \ + sdk/nodejs/package.json + git commit -m 'Commit ${{ matrix.language }} SDK for Renovate' + + # Push with pulumi-bot credentials to trigger a re-run of the + # workflow. https://github.com/orgs/community/discussions/25702 + git push https://pulumi-bot:${{ secrets.PULUMI_BOT_TOKEN }}@github.com/${{ github.repository }} \ + "HEAD:$HEAD_REF" + env: + # head_ref is untrusted so it's recommended to pass via env var to + # avoid injections. + HEAD_REF: ${{ github.head_ref }} + + - name: Upload SDK + uses: ./.github/actions/upload-sdk + with: + language: ${{ matrix.language }} diff --git a/.github/workflows/command-dispatch.yml b/.github/workflows/command-dispatch.yml index ad4106d31..7577b0108 100644 --- a/.github/workflows/command-dispatch.yml +++ b/.github/workflows/command-dispatch.yml @@ -1,21 +1,51 @@ -name: Command Dispatch for testing -on: - issue_comment: - types: [created, edited] +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt +env: + ALT_AWS_ACCESS_KEY_ID: ${{ secrets.ALT_AWS_ACCESS_KEY_ID }} + ALT_AWS_SECRET_ACCESS_KEY: ${{ secrets.ALT_AWS_SECRET_ACCESS_KEY }} + AWS_REGION: us-west-2 + GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} + GOLANGCI_LINT_VERSION: v1.61.0 + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NUGET_PUBLISH_KEY: ${{ secrets.NUGET_PUBLISH_KEY }} + PROVIDER: eks + PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + PULUMI_API: https://api.pulumi-staging.io + PULUMI_ENABLE_RESOURCE_REFERENCES: "1" + PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. + PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget + PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + PYPI_USERNAME: __token__ + SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} + SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} + SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + TF_APPEND_USER_AGENT: pulumi jobs: command-dispatch-for-testing: + name: command-dispatch-for-testing runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Run Build - uses: peter-evans/slash-command-dispatch@v3 - with: - token: ${{ secrets.PULUMI_BOT_TOKEN }} - reaction-token: ${{ secrets.GITHUB_TOKEN }} - commands: | - run-acceptance-tests - run-pulumi-update - permission: write - issue-type: pull-request - repository: pulumi/pulumi-awsx + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + - uses: peter-evans/slash-command-dispatch@13bc09769d122a64f75aa5037256f6f2d78be8c4 # v4 + with: + commands: | + run-acceptance-tests + release + issue-type: pull-request + permission: write + reaction-token: ${{ secrets.GITHUB_TOKEN }} + repository: pulumi/pulumi-awsx + token: ${{ secrets.PULUMI_BOT_TOKEN }} +name: command-dispatch +on: + issue_comment: + types: + - created + - edited diff --git a/.github/workflows/community-moderation.yml b/.github/workflows/community-moderation.yml new file mode 100644 index 000000000..8eefeb73e --- /dev/null +++ b/.github/workflows/community-moderation.yml @@ -0,0 +1,45 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +jobs: + warn_codegen: + name: warn_codegen + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + - id: schema_changed + name: Check for diff in schema + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + with: + filters: "changed: 'provider/cmd/**/schema.json'" + - id: sdk_changed + if: steps.schema_changed.outputs.changed == 'false' + name: Check for diff in sdk/** + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + with: + filters: "changed: 'sdk/**'" + - if: steps.sdk_changed.outputs.changed == 'true' && + github.event.pull_request.head.repo.full_name != github.repository + name: Send codegen warning as comment on PR + uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3.0.1 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + message: > + Hello and thank you for your pull request! :heart: :sparkles: + + It looks like you're directly modifying files in the language SDKs, many of which are autogenerated. + + Be sure any files you're editing do not begin with a code generation warning. + + For generated files, you will need to make changes in `resources.go` instead, and [generate the code](https://github.com/pulumi/${{ github.event.repository.name }}/blob/master/CONTRIBUTING.md#committing-generated-code). +name: warn-codegen +on: + pull_request_target: + branches: + - master + types: + - opened diff --git a/.github/workflows/cron.yml b/.github/workflows/cron.yml deleted file mode 100644 index facb9372b..000000000 --- a/.github/workflows/cron.yml +++ /dev/null @@ -1,216 +0,0 @@ -env: - AWS_REGION: us-west-2 - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - LOCAL_PLAT: linux-amd64 - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - NUGET_PUBLISH_KEY: ${{ secrets.NUGET_PUBLISH_KEY }} - PROVIDER: awsx - PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} - PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} - PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} - PULUMI_API: https://api.pulumi-staging.io - PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - PYPI_USERNAME: __token__ - PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} - PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget - SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} - SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} - SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} - VERSION_PREFIX: 1.0.0 - GOVERSION: "1.21.x" - DOTNETVERSION: "6.x" - PYTHONVERSION: "3.8" - NODEVERSION: "18.x" - JAVAVERSION: "11" -jobs: - version: - uses: ./.github/workflows/version.yml - secrets: inherit - lint: - name: lint - runs-on: ubuntu-latest - continue-on-error: true - needs: version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: 18.x - registry-url: https://registry.npmjs.org - - name: Install Yarn - run: curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0 - - name: Update PATH for Yarn - run: | - echo "$HOME/.yarn/bin" >> $GITHUB_PATH - echo "$HOME/.config/yarn/global/node_modules/.bin" >> $GITHUB_PATH - - name: Lint AWSX Code - run: make lint - - name: Lint classic AWSX Code - run: make lint_classic - - name: Check worktree clean - uses: pulumi/git-status-check-action@v1 - with: - allowed-changes: | - sdk/**/pulumi-plugin.json - sdk/dotnet/Pulumi.*.csproj - sdk/go/**/pulumiUtilities.go - sdk/nodejs/package.json - sdk/python/pyproject.toml - build-provider: - runs-on: ubuntu-latest - needs: version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v3 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-region: ${{ env.AWS_REGION }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - role-duration-seconds: 7200 - role-session-name: ${{ env.PROVIDER }}@githubActions - role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} - - name: Install Go - uses: actions/setup-go@v4 - with: - go-version: ${{ env.GOVERSION }} - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: ${{env.NODEVERSION}} - registry-url: https://registry.npmjs.org - - name: Install Yarn - run: curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0 - - name: Update PATH for Yarn - run: | - echo "$HOME/.yarn/bin" >> $GITHUB_PATH - echo "$HOME/.config/yarn/global/node_modules/.bin" >> $GITHUB_PATH - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Pulumi CLI - uses: pulumi/action-install-pulumi-cli@v2 - - name: Build provider - run: make provider - - name: Test provider - run: make test_provider - - name: Check worktree clean - uses: pulumi/git-status-check-action@v1 - with: - allowed-changes: | - sdk/**/pulumi-plugin.json - sdk/dotnet/Pulumi.*.csproj - sdk/go/**/pulumiUtilities.go - sdk/nodejs/package.json - sdk/python/pyproject.toml - - name: Upload bin - uses: actions/upload-artifact@v4 - with: - name: bin - path: bin - - name: Tar provider bin - run: tar -zcf ${{ github.workspace }}/provider.tar.gz -C ${{ github.workspace }}/${{ env.PROVIDER }}/bin/ . - - name: Upload provider bin - uses: actions/upload-artifact@v4 - with: - name: ${{ env.PROVIDER }}-provider.tar.gz - path: ${{ github.workspace }}/provider.tar.gz - - if: failure() && github.event_name == 'push' - name: Notify Slack - uses: 8398a7/action-slack@v3 - with: - author_name: Failure in building provider - fields: repo,commit,author,action - status: ${{ job.status }} - acceptance-test: - runs-on: ubuntu-latest - needs: - - build-provider - - version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@v1.3.1 - with: - tool-cache: false - swap-storage: false - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Languages & Frameworks - uses: ./.github/actions/install - - name: Install Python deps - run: |- - pip3 install virtualenv==20.0.23 - pip3 install pipenv - - name: Download bin - uses: actions/download-artifact@v4 - with: - name: bin - path: bin - - name: Restore bin and avoid rebuilding - run: | - chmod +x bin/* - make provider --touch - - name: Build SDK - run: make build_${{ matrix.language }} - - name: Check worktree clean - uses: pulumi/git-status-check-action@v1 - with: - allowed-changes: | - sdk/**/pulumi-plugin.json - sdk/dotnet/Pulumi.*.csproj - sdk/go/**/pulumiUtilities.go - sdk/nodejs/package.json - sdk/python/pyproject.toml - - name: Compress SDK folder - run: tar -zcf sdk/${{ matrix.language }}.tar.gz -C sdk/${{ matrix.language }} - . - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: ${{ matrix.language }}-sdk.tar.gz - path: ${{ github.workspace}}/sdk/${{ matrix.language }}.tar.gz - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v3 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-region: ${{ env.AWS_REGION }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - role-duration-seconds: 7200 - role-session-name: ${{ env.PROVIDER }}@githubActions - role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} - - name: Run tests - # Tell make to not rebuild the provider bin - run: make test_${{ matrix.language }} - strategy: - fail-fast: false - matrix: - language: - - nodejs - - python - - dotnet - - go - - java -name: cron -"on": - schedule: - - cron: "0 7 * * *" diff --git a/.github/workflows/license.yml b/.github/workflows/license.yml new file mode 100644 index 000000000..4857589c5 --- /dev/null +++ b/.github/workflows/license.yml @@ -0,0 +1,70 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt + +name: license_check + +on: + workflow_call: + inputs: {} + +env: + ALT_AWS_ACCESS_KEY_ID: ${{ secrets.ALT_AWS_ACCESS_KEY_ID }} + ALT_AWS_SECRET_ACCESS_KEY: ${{ secrets.ALT_AWS_SECRET_ACCESS_KEY }} + AWS_REGION: us-west-2 + GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} + GOLANGCI_LINT_VERSION: v1.61.0 + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NUGET_PUBLISH_KEY: ${{ secrets.NUGET_PUBLISH_KEY }} + PROVIDER: eks + PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + PULUMI_API: https://api.pulumi-staging.io + PULUMI_ENABLE_RESOURCE_REFERENCES: "1" + PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. + PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget + PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + PYPI_USERNAME: __token__ + SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} + SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} + SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + TF_APPEND_USER_AGENT: pulumi + +jobs: + license_check: + name: License Check + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + - name: Setup tools + uses: ./.github/actions/setup-tools + with: + tools: go + cache-go: false + - run: make prepare_local_workspace + continue-on-error: true + - uses: pulumi/license-check-action@main + with: + module-path: provider + ignore-modules: >- + github.com/aead/chacha20, + github.com/apache/arrow/go/v12, + github.com/apache/thrift/lib/go/thrift, + github.com/cloudflare/circl, + github.com/golang, + github.com/gorhill/cronexpr, + github.com/in-toto/in-toto-golang, + github.com/jmespath/go-jmespath, + github.com/keybase/go-crypto, + github.com/klauspost/compress, + github.com/mattn/go-localereader, + github.com/modern-go/reflect2, + github.com/pierrec/lz4, + github.com/pjbgf/sha1cd, + github.com/pulumi, + github.com/segmentio/asm, + golang.org diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 000000000..2cdb5e428 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,61 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt + +name: lint + +on: + workflow_call: + inputs: {} + +env: + ALT_AWS_ACCESS_KEY_ID: ${{ secrets.ALT_AWS_ACCESS_KEY_ID }} + ALT_AWS_SECRET_ACCESS_KEY: ${{ secrets.ALT_AWS_SECRET_ACCESS_KEY }} + AWS_REGION: us-west-2 + GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} + GOLANGCI_LINT_VERSION: v1.61.0 + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NUGET_PUBLISH_KEY: ${{ secrets.NUGET_PUBLISH_KEY }} + PROVIDER: eks + PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + PULUMI_API: https://api.pulumi-staging.io + PULUMI_ENABLE_RESOURCE_REFERENCES: "1" + PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. + PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget + PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + PYPI_USERNAME: __token__ + SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} + SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} + SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + TF_APPEND_USER_AGENT: pulumi + +jobs: + lint: + name: lint + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + - name: Install go + uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5 + with: + # The versions of golangci-lint and setup-go here cross-depend and need to update together. + go-version: 1.23 + # Either this action or golangci-lint needs to disable the cache + cache: false + - name: disarm go:embed directives to enable lint + continue-on-error: true # this fails if there are no go:embed directives + run: | + git grep -l 'go:embed' -- provider | xargs sed -i 's/go:embed/ goembed/g' + - name: prepare workspace + continue-on-error: true + run: make prepare_local_workspace + - name: golangci-lint + uses: golangci/golangci-lint-action@971e284b6050e8a5849b72094c50ab08da042db8 # v6 + with: + version: v1.60 + working-directory: provider diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index 9ed5e807a..03d64b13a 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -1,336 +1,159 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt + env: + ALT_AWS_ACCESS_KEY_ID: ${{ secrets.ALT_AWS_ACCESS_KEY_ID }} + ALT_AWS_SECRET_ACCESS_KEY: ${{ secrets.ALT_AWS_SECRET_ACCESS_KEY }} AWS_REGION: us-west-2 - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - LOCAL_PLAT: linux-amd64 + GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} + GOLANGCI_LINT_VERSION: v1.61.0 NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} NUGET_PUBLISH_KEY: ${{ secrets.NUGET_PUBLISH_KEY }} - PROVIDER: awsx + PROVIDER: eks PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} PULUMI_API: https://api.pulumi-staging.io + PULUMI_ENABLE_RESOURCE_REFERENCES: "1" PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - PYPI_USERNAME: __token__ - PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget + PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + PYPI_USERNAME: __token__ SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} - VERSION_PREFIX: 1.0.0 - GOVERSION: "1.21.x" - DOTNETVERSION: "6.x" - PYTHONVERSION: "3.8" - NODEVERSION: "18.x" - JAVAVERSION: "11" + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + TF_APPEND_USER_AGENT: pulumi jobs: - version: - uses: ./.github/workflows/version.yml + prerequisites: + uses: ./.github/workflows/prerequisites.yml secrets: inherit - lint: - name: lint - runs-on: ubuntu-latest + with: + default_branch: ${{ github.event.repository.default_branch }} + is_pr: ${{ github.event_name == 'pull_request' }} + is_automated: ${{ github.actor == 'dependabot[bot]' }} + + build_provider: + uses: ./.github/workflows/build_provider.yml + needs: prerequisites + secrets: inherit + with: + version: ${{ needs.prerequisites.outputs.version }} + + build_sdk: + name: build_sdk + needs: prerequisites + uses: ./.github/workflows/build_sdk.yml + secrets: inherit + with: + version: ${{ needs.prerequisites.outputs.version }} + + generate_coverage_data: continue-on-error: true - needs: version env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: 18.x - registry-url: https://registry.npmjs.org - - name: Install Yarn - run: curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0 - - name: Update PATH for Yarn - run: | - echo "$HOME/.yarn/bin" >> $GITHUB_PATH - echo "$HOME/.config/yarn/global/node_modules/.bin" >> $GITHUB_PATH - - name: Lint AWSX Code - run: make lint - - name: Lint classic AWSX Code - run: make lint_classic - - name: Check worktree clean - uses: pulumi/git-status-check-action@v1 - with: - allowed-changes: | - sdk/**/pulumi-plugin.json - sdk/dotnet/Pulumi.*.csproj - sdk/go/**/pulumiUtilities.go - sdk/nodejs/package.json - sdk/python/pyproject.toml - build-provider: + COVERAGE_OUTPUT_DIR: ${{ secrets.COVERAGE_OUTPUT_DIR }} + name: generate_coverage_data + needs: prerequisites runs-on: ubuntu-latest - needs: version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v3 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-region: ${{ env.AWS_REGION }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - role-duration-seconds: 7200 - role-session-name: ${{ env.PROVIDER }}@githubActions - role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} - - name: Install Go - uses: actions/setup-go@v4 - with: - go-version: ${{ env.GOVERSION }} - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: ${{env.NODEVERSION}} - registry-url: https://registry.npmjs.org - - name: Install Yarn - run: curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0 - - name: Update PATH for Yarn - run: | - echo "$HOME/.yarn/bin" >> $GITHUB_PATH - echo "$HOME/.config/yarn/global/node_modules/.bin" >> $GITHUB_PATH - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Pulumi CLI - uses: pulumi/action-install-pulumi-cli@v2 - - name: Build provider - run: make provider - - name: Test provider - run: make test_provider - - name: Check worktree clean - uses: pulumi/git-status-check-action@v1 - with: - allowed-changes: | - sdk/**/pulumi-plugin.json - sdk/dotnet/Pulumi.*.csproj - sdk/go/**/pulumiUtilities.go - sdk/nodejs/package.json - sdk/python/pyproject.toml - - name: Upload bin - uses: actions/upload-artifact@v4 - with: - name: bin - path: bin - - name: Tar provider bin - run: tar -zcf ${{ github.workspace }}/provider.tar.gz -C ${{ github.workspace }}/${{ env.PROVIDER }}/bin/ . - - name: Upload provider bin - uses: actions/upload-artifact@v4 - with: - name: ${{ env.PROVIDER }}-provider.tar.gz - path: ${{ github.workspace }}/provider.tar.gz - - if: failure() && github.event_name == 'push' - name: Notify Slack - uses: 8398a7/action-slack@v3 - with: - author_name: Failure in building provider - fields: repo,commit,author,action - status: ${{ job.status }} - acceptance-test: - runs-on: ubuntu-latest - needs: - - build-provider - - version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@v1.3.1 - with: - tool-cache: false - swap-storage: false - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Languages & Frameworks - uses: ./.github/actions/install - - name: Setup Gradle - uses: gradle/gradle-build-action@v3 - with: - gradle-version: "8.4" - - name: Install Python deps - run: |- - pip3 install virtualenv==20.0.23 - pip3 install pipenv - - name: Download bin - uses: actions/download-artifact@v4 - with: - name: bin - path: bin - - name: Restore bin and avoid rebuilding - run: | - chmod +x bin/* - make provider --touch - - name: Build SDK - run: make build_${{ matrix.language }} - - name: Check worktree clean - uses: pulumi/git-status-check-action@v1 - with: - allowed-changes: | - sdk/**/pulumi-plugin.json - sdk/dotnet/Pulumi.*.csproj - sdk/go/**/pulumiUtilities.go - sdk/nodejs/package.json - sdk/python/pyproject.toml - - name: Compress SDK folder - run: tar -zcf sdk/${{ matrix.language }}.tar.gz -C sdk/${{ matrix.language }} - . - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: ${{ matrix.language }}-sdk.tar.gz - path: ${{ github.workspace}}/sdk/${{ matrix.language }}.tar.gz - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v3 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-region: ${{ env.AWS_REGION }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - role-duration-seconds: 7200 - role-session-name: ${{ env.PROVIDER }}@githubActions - role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} - - name: Run tests - # Tell make to not rebuild the provider bin - run: make test_${{ matrix.language }} - strategy: - fail-fast: false - matrix: - language: - - nodejs - - python - - dotnet - - go - - java + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 + with: + tool-cache: false + swap-storage: false + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + with: + aws-access-key-id: ${{ secrets.AWS_CORP_S3_UPLOAD_ACCESS_KEY_ID }} + aws-region: us-west-2 + aws-secret-access-key: ${{ secrets.AWS_CORP_S3_UPLOAD_SECRET_ACCESS_KEY }} + - name: Setup tools + uses: ./.github/actions/setup-tools + with: + tools: pulumictl, pulumicli, go, schema-tools + - name: Echo Coverage Output Dir + run: 'echo "Coverage output directory: ${{ env.COVERAGE_OUTPUT_DIR }}"' + - name: Generate Coverage Data + run: PULUMI_MISSING_DOCS_ERROR=true make tfgen + - name: Summarize Provider Coverage Results + run: cat ${{ env.COVERAGE_OUTPUT_DIR }}/shortSummary.txt + - name: Upload coverage data to S3 + run: >- + summaryName="${PROVIDER}_summary_$(date +"%Y-%m-%d_%H-%M-%S").json" + + s3FullURI="s3://${{ secrets.S3_COVERAGE_BUCKET_NAME }}/summaries/${summaryName}" + + aws s3 cp "${{ env.COVERAGE_OUTPUT_DIR }}/summary.json" "${s3FullURI}" --acl bucket-owner-full-control + lint: + name: lint + uses: ./.github/workflows/lint.yml + secrets: inherit + license_check: + name: License Check + uses: ./.github/workflows/license.yml + secrets: inherit + publish: name: publish - runs-on: ubuntu-latest + permissions: + contents: write needs: - - acceptance-test - - version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v3 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-region: us-east-2 - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - role-duration-seconds: 7200 - role-external-id: upload-pulumi-release - role-session-name: ${{ env.PROVIDER}}@githubActions - role-to-assume: ${{ secrets.AWS_UPLOAD_ROLE_ARN }} - - uses: MOZGIII/install-ldid-action@v1 - with: - tag: v2.1.5-procursus2 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Pulumi CLI - uses: pulumi/action-install-pulumi-cli@v2 - - name: Download provider binary - uses: actions/download-artifact@v4 - with: - name: ${{ env.PROVIDER }}-provider.tar.gz - path: ${{ github.workspace }}/bin - - name: Untar provider binaries - run: tar -zxf ${{ github.workspace }}/bin/provider.tar.gz -C ${{ github.workspace - }}/bin - - name: Restore binary perms - run: find ${{ github.workspace }}/bin -name "pulumi-*-${{ env.PROVIDER }}" -print - -exec chmod +x {} \; - - name: Test provider - run: make test_provider - - name: Create Provider Binaries - run: make dist - - name: Upload Provider Binaries - run: aws s3 cp dist s3://get.pulumi.com/releases/plugins/ --recursive - publish_sdk: - name: publish_sdk + - prerequisites + - build_provider + - test + - license_check + uses: ./.github/workflows/publish.yml + secrets: inherit + with: + version: ${{ needs.prerequisites.outputs.version }} + isPrerelease: true + skipGoSdk: true + skipJavaSdk: true + + tag_release_if_labeled_needs_release: + name: Tag release if labeled as needs-release + needs: publish runs-on: ubuntu-latest - needs: - - publish - - version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Languages & Frameworks - uses: ./.github/actions/install - - name: Setup Gradle - uses: gradle/gradle-build-action@v3 - with: - gradle-version: "8.4" - - name: Download python SDK - uses: actions/download-artifact@v4 - with: - name: python-sdk.tar.gz - path: ${{ github.workspace}}/sdk/ - - name: Uncompress python SDK - run: tar -zxf ${{github.workspace}}/sdk/python.tar.gz -C ${{github.workspace}}/sdk/python - - name: Download dotnet SDK - uses: actions/download-artifact@v4 - with: - name: dotnet-sdk.tar.gz - path: ${{ github.workspace}}/sdk/ - - name: Uncompress dotnet SDK - run: tar -zxf ${{github.workspace}}/sdk/dotnet.tar.gz -C ${{github.workspace}}/sdk/dotnet - - name: Download nodejs SDK - uses: actions/download-artifact@v4 - with: - name: nodejs-sdk.tar.gz - path: ${{ github.workspace}}/sdk/ - - name: Uncompress nodejs SDK - run: tar -zxf ${{github.workspace}}/sdk/nodejs.tar.gz -C ${{github.workspace}}/sdk/nodejs - - run: python -m pip install pip twine - - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Publish SDK - run: ./scripts/publish_packages.sh - - name: Download java SDK - uses: actions/download-artifact@v4 - with: - name: java-sdk.tar.gz - path: ${{ github.workspace}}/sdk/ - - name: Uncompress java SDK - run: tar -zxf ${{github.workspace}}/sdk/java.tar.gz -C ${{github.workspace}}/sdk/java - - name: Publish Java SDK - uses: gradle/gradle-build-action@a8f75513eafdebd8141bd1cd4e30fcd194af8dfa - env: - PACKAGE_VERSION: ${{ env.PROVIDER_VERSION }} - with: - arguments: publishToSonatype closeAndReleaseSonatypeStagingRepository - build-root-directory: ./sdk/java - gradle-version: 7.4.1 + - name: check if this commit needs release + if: ${{ env.RELEASE_BOT_ENDPOINT != '' }} + uses: pulumi/action-release-by-pr-label@main + with: + command: "release-if-needed" + repo: ${{ github.repository }} + commit: ${{ github.sha }} + slack_channel: ${{ secrets.RELEASE_OPS_SLACK_CHANNEL }} + env: + RELEASE_BOT_ENDPOINT: ${{ secrets.RELEASE_BOT_ENDPOINT }} + RELEASE_BOT_KEY: ${{ secrets.RELEASE_BOT_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + test: + uses: ./.github/workflows/test.yml + needs: + - prerequisites + - build_provider + - build_sdk + permissions: + contents: read + id-token: write + secrets: inherit + with: + version: ${{ needs.prerequisites.outputs.version }} + name: master -"on": +on: + workflow_dispatch: {} push: branches: - - master + - master paths-ignore: - - CHANGELOG.md + - "**.md" tags-ignore: - - v* - - sdk/* - - "**" + - v* + - sdk/* + - "**" diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml deleted file mode 100644 index 4ed5eb6d3..000000000 --- a/.github/workflows/pre-release.yml +++ /dev/null @@ -1,376 +0,0 @@ -env: - AWS_REGION: us-west-2 - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - LOCAL_PLAT: linux-amd64 - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - NUGET_PUBLISH_KEY: ${{ secrets.NUGET_PUBLISH_KEY }} - PROVIDER: awsx - PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} - PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} - PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} - PULUMI_API: https://api.pulumi-staging.io - PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - PYPI_USERNAME: __token__ - PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} - PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget - SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} - SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} - SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} - IS_PRERELEASE: true - GOVERSION: "1.21.x" - DOTNETVERSION: "6.x" - PYTHONVERSION: "3.8" - NODEVERSION: "18.x" - JAVAVERSION: "11" -jobs: - version: - uses: ./.github/workflows/version.yml - secrets: inherit - lint: - name: lint - runs-on: ubuntu-latest - continue-on-error: true - needs: version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: 18.x - registry-url: https://registry.npmjs.org - - name: Install Yarn - run: curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0 - - name: Update PATH for Yarn - run: | - echo "$HOME/.yarn/bin" >> $GITHUB_PATH - echo "$HOME/.config/yarn/global/node_modules/.bin" >> $GITHUB_PATH - - name: Lint AWSX Code - run: make lint - - name: Lint classic AWSX Code - run: make lint_classic - - name: Check worktree clean - uses: pulumi/git-status-check-action@v1 - with: - allowed-changes: | - sdk/**/pulumi-plugin.json - sdk/dotnet/Pulumi.*.csproj - sdk/go/**/pulumiUtilities.go - sdk/nodejs/package.json - sdk/python/pyproject.toml - build-provider: - runs-on: ubuntu-latest - needs: version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v3 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-region: ${{ env.AWS_REGION }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - role-duration-seconds: 7200 - role-session-name: ${{ env.PROVIDER }}@githubActions - role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} - - name: Install Go - uses: actions/setup-go@v4 - with: - go-version: ${{ env.GOVERSION }} - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: ${{env.NODEVERSION}} - registry-url: https://registry.npmjs.org - - name: Install Yarn - run: curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0 - - name: Update PATH for Yarn - run: | - echo "$HOME/.yarn/bin" >> $GITHUB_PATH - echo "$HOME/.config/yarn/global/node_modules/.bin" >> $GITHUB_PATH - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Pulumi CLI - uses: pulumi/action-install-pulumi-cli@v2 - - name: Build provider - run: make provider - - name: Test provider - run: make test_provider - - name: Check worktree clean - uses: pulumi/git-status-check-action@v1 - with: - allowed-changes: | - sdk/**/pulumi-plugin.json - sdk/dotnet/Pulumi.*.csproj - sdk/go/**/pulumiUtilities.go - sdk/nodejs/package.json - sdk/python/pyproject.toml - - name: Upload bin - uses: actions/upload-artifact@v4 - with: - name: bin - path: bin - - name: Tar provider bin - run: tar -zcf ${{ github.workspace }}/provider.tar.gz -C ${{ github.workspace }}/${{ env.PROVIDER }}/bin/ . - - name: Upload provider bin - uses: actions/upload-artifact@v4 - with: - name: ${{ env.PROVIDER }}-provider.tar.gz - path: ${{ github.workspace }}/provider.tar.gz - - if: failure() && github.event_name == 'push' - name: Notify Slack - uses: 8398a7/action-slack@v3 - with: - author_name: Failure in building provider - fields: repo,commit,author,action - status: ${{ job.status }} - acceptance-test: - runs-on: ubuntu-latest - needs: - - build-provider - - version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@v1.3.1 - with: - tool-cache: false - swap-storage: false - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Languages & Frameworks - uses: ./.github/actions/install - - name: Setup Gradle - uses: gradle/gradle-build-action@v3 - with: - gradle-version: "8.4" - - name: Install Python deps - run: |- - pip3 install virtualenv==20.0.23 - pip3 install pipenv - - name: Download bin - uses: actions/download-artifact@v4 - with: - name: bin - path: bin - - name: Restore bin and avoid rebuilding - run: | - chmod +x bin/* - make provider --touch - - name: Build SDK - run: make build_${{ matrix.language }} - - name: Check worktree clean - uses: pulumi/git-status-check-action@v1 - with: - allowed-changes: | - sdk/**/pulumi-plugin.json - sdk/dotnet/Pulumi.*.csproj - sdk/go/**/pulumiUtilities.go - sdk/nodejs/package.json - sdk/python/pyproject.toml - - name: Compress SDK folder - run: tar -zcf sdk/${{ matrix.language }}.tar.gz -C sdk/${{ matrix.language }} - . - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: ${{ matrix.language }}-sdk.tar.gz - path: ${{ github.workspace}}/sdk/${{ matrix.language }}.tar.gz - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v3 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-region: ${{ env.AWS_REGION }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - role-duration-seconds: 7200 - role-session-name: ${{ env.PROVIDER }}@githubActions - role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} - - name: Run tests - # Tell make to not rebuild the provider bin - run: make test_${{ matrix.language }} - strategy: - fail-fast: false - matrix: - language: - - nodejs - - python - - dotnet - - go - - java - publish: - name: publish - runs-on: ubuntu-latest - needs: - - acceptance-test - - version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v3 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-region: us-east-2 - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - role-duration-seconds: 7200 - role-external-id: upload-pulumi-release - role-session-name: ${{ env.PROVIDER}}@githubActions - role-to-assume: ${{ secrets.AWS_UPLOAD_ROLE_ARN }} - - uses: MOZGIII/install-ldid-action@v1 - with: - tag: v2.1.5-procursus2 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Pulumi CLI - uses: pulumi/action-install-pulumi-cli@v2 - - name: Download provider binary - uses: actions/download-artifact@v4 - with: - name: ${{ env.PROVIDER }}-provider.tar.gz - path: ${{ github.workspace }}/bin - - name: Untar provider binaries - run: tar -zxf ${{ github.workspace }}/bin/provider.tar.gz -C ${{ github.workspace - }}/bin - - name: Restore binary perms - run: find ${{ github.workspace }}/bin -name "pulumi-*-${{ env.PROVIDER }}" -print - -exec chmod +x {} \; - - name: Test provider - run: make test_provider - - name: Create Provider Binaries - run: make dist - - name: Upload Provider Binaries - run: aws s3 cp dist s3://get.pulumi.com/releases/plugins/ --recursive - - name: Create GH Release - uses: softprops/action-gh-release@v2 - with: - generate_release_notes: true - prerelease: true - files: | - dist/*.tar.gz - env: - GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} - publish_sdk: - name: publish_sdk - runs-on: ubuntu-latest - needs: - - publish - - version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Languages & Frameworks - uses: ./.github/actions/install - - name: Setup Gradle - uses: gradle/gradle-build-action@v3 - with: - gradle-version: "8.4" - - name: Download python SDK - uses: actions/download-artifact@v4 - with: - name: python-sdk.tar.gz - path: ${{ github.workspace}}/sdk/ - - name: Uncompress python SDK - run: tar -zxf ${{github.workspace}}/sdk/python.tar.gz -C ${{github.workspace}}/sdk/python - - name: Download dotnet SDK - uses: actions/download-artifact@v4 - with: - name: dotnet-sdk.tar.gz - path: ${{ github.workspace}}/sdk/ - - name: Uncompress dotnet SDK - run: tar -zxf ${{github.workspace}}/sdk/dotnet.tar.gz -C ${{github.workspace}}/sdk/dotnet - - name: Download nodejs SDK - uses: actions/download-artifact@v4 - with: - name: nodejs-sdk.tar.gz - path: ${{ github.workspace}}/sdk/ - - name: Uncompress nodejs SDK - run: tar -zxf ${{github.workspace}}/sdk/nodejs.tar.gz -C ${{github.workspace}}/sdk/nodejs - - run: python -m pip install pip twine - - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Publish SDK - run: ./scripts/publish_packages.sh - - name: Download java SDK - uses: actions/download-artifact@v4 - with: - name: java-sdk.tar.gz - path: ${{ github.workspace}}/sdk/ - - name: Uncompress java SDK - run: tar -zxf ${{github.workspace}}/sdk/java.tar.gz -C ${{github.workspace}}/sdk/java - - name: Publish Java SDK - uses: gradle/gradle-build-action@a8f75513eafdebd8141bd1cd4e30fcd194af8dfa - env: - PACKAGE_VERSION: ${{ env.PROVIDER_VERSION }} - with: - arguments: publishToSonatype closeAndReleaseSonatypeStagingRepository - build-root-directory: ./sdk/java - gradle-version: 7.4.1 - tag_sdk: - name: tag_sdk - runs-on: ubuntu-latest - needs: - - publish_sdk - - version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Download Go SDK - uses: actions/download-artifact@v4 - with: - name: go-sdk.tar.gz - path: ${{ github.workspace }}/sdk/ - - name: Uncompress Go SDK - run: tar -zxf ${{ github.workspace }}/sdk/go.tar.gz -C - ${{ github.workspace }}/sdk/go - shell: bash - - uses: pulumi/publish-go-sdk-action@v1 - with: - repository: ${{ github.repository }} - base-ref: ${{ github.sha }} - source: sdk - path: sdk - version: ${{ needs.version.outputs.version }} - additive: false - # Avoid including other language SDKs & artifacts in the commit - files: | - go.* - go/** - !*.tar.gz -name: prerelease -on: - push: - tags: - - v*.*.*-** diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml new file mode 100644 index 000000000..8c10c40bf --- /dev/null +++ b/.github/workflows/prerelease.yml @@ -0,0 +1,93 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt + +env: + IS_PRERELEASE: true + ALT_AWS_ACCESS_KEY_ID: ${{ secrets.ALT_AWS_ACCESS_KEY_ID }} + ALT_AWS_SECRET_ACCESS_KEY: ${{ secrets.ALT_AWS_SECRET_ACCESS_KEY }} + AWS_REGION: us-west-2 + GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} + GOLANGCI_LINT_VERSION: v1.61.0 + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NUGET_PUBLISH_KEY: ${{ secrets.NUGET_PUBLISH_KEY }} + PROVIDER: eks + PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + PULUMI_API: https://api.pulumi-staging.io + PULUMI_ENABLE_RESOURCE_REFERENCES: "1" + PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. + PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget + PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + PYPI_USERNAME: __token__ + SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} + SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} + SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + TF_APPEND_USER_AGENT: pulumi +jobs: + prerequisites: + uses: ./.github/workflows/prerequisites.yml + secrets: inherit + with: + default_branch: ${{ github.event.repository.default_branch }} + is_pr: ${{ github.event_name == 'pull_request' }} + is_automated: ${{ github.actor == 'dependabot[bot]' }} + + build_provider: + uses: ./.github/workflows/build_provider.yml + needs: prerequisites + secrets: inherit + with: + version: ${{ needs.prerequisites.outputs.version }} + + build_sdk: + name: build_sdk + needs: prerequisites + uses: ./.github/workflows/build_sdk.yml + secrets: inherit + with: + version: ${{ needs.prerequisites.outputs.version }} + + lint: + name: lint + uses: ./.github/workflows/lint.yml + secrets: inherit + license_check: + name: License Check + uses: ./.github/workflows/license.yml + secrets: inherit + + publish: + name: publish + permissions: + contents: write + needs: + - prerequisites + - build_provider + - test + - license_check + uses: ./.github/workflows/publish.yml + secrets: inherit + with: + version: ${{ needs.prerequisites.outputs.version }} + isPrerelease: true + + test: + uses: ./.github/workflows/test.yml + needs: + - prerequisites + - build_provider + - build_sdk + permissions: + contents: read + id-token: write + secrets: inherit + with: + version: ${{ needs.prerequisites.outputs.version }} + +name: prerelease +on: + push: + tags: + - v*.*.*-** diff --git a/.github/workflows/prerequisites.yml b/.github/workflows/prerequisites.yml new file mode 100644 index 000000000..77660eaf0 --- /dev/null +++ b/.github/workflows/prerequisites.yml @@ -0,0 +1,117 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt + +name: "Prerequisites" + +on: + workflow_call: + inputs: + is_pr: + type: boolean + required: true + is_automated: + type: boolean + required: true + default_branch: + type: string + required: true + outputs: + version: + description: "Provider version being built" + value: ${{ jobs.prerequisites.outputs.version }} + +env: + ALT_AWS_ACCESS_KEY_ID: ${{ secrets.ALT_AWS_ACCESS_KEY_ID }} + ALT_AWS_SECRET_ACCESS_KEY: ${{ secrets.ALT_AWS_SECRET_ACCESS_KEY }} + AWS_REGION: us-west-2 + GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} + GOLANGCI_LINT_VERSION: v1.61.0 + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NUGET_PUBLISH_KEY: ${{ secrets.NUGET_PUBLISH_KEY }} + PROVIDER: eks + PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + PULUMI_API: https://api.pulumi-staging.io + PULUMI_ENABLE_RESOURCE_REFERENCES: "1" + PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. + PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget + PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + PYPI_USERNAME: __token__ + SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} + SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} + SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + TF_APPEND_USER_AGENT: pulumi + +jobs: + prerequisites: + name: prerequisites + runs-on: ubuntu-latest + outputs: + version: ${{ steps.provider-version.outputs.version }} + steps: + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + - uses: pulumi/provider-version-action@0391d47b9b0d865d33dd0a295b1fcf9f7021dd4c # v1.5.3 + id: provider-version + with: + set-env: 'PROVIDER_VERSION' + - name: Cache examples generation + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4 + with: + path: | + .pulumi/examples-cache + key: ${{ runner.os }}-${{ hashFiles('provider/go.sum') }} + - name: Setup tools + uses: ./.github/actions/setup-tools + with: + tools: go, pulumictl, pulumicli, schema-tools + - name: Prepare local workspace before restoring previously built files + run: make prepare_local_workspace + - name: Generate schema + run: make schema + - name: Build provider binary + run: make provider + - name: Unit-test provider code + run: make test_provider + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@1e68e06f1dbfde0e4cefc87efeba9e4643565303 # v5.1.2 + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + - if: inputs.is_pr + name: Check Schema is Valid + run: | + EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) + { + echo "SCHEMA_CHANGES<<$EOF"; + schema-tools compare -r github://api.github.com/pulumi -p awsx -o "${{ inputs.default_branch }}" -n --local-path=provider/cmd/pulumi-resource-awsx/schema.json; + echo "$EOF"; + } >> "$GITHUB_ENV" + - if: inputs.is_pr && inputs.is_automated == false + name: Comment on PR with Details of Schema Check + uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3.0.1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + comment-tag: schemaCheck + message: >+ + ${{ env.SCHEMA_CHANGES }} + + + Maintainer note: consult the [runbook](https://github.com/pulumi/platform-providers-team/blob/main/playbooks/tf-provider-updating.md) for dealing with any breaking changes. + + - name: Upload pulumi-gen-awsx + uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + with: + name: pulumi-gen-awsx + path: ${{ github.workspace }}/bin/pulumi-gen-awsx + retention-days: 30 + + - name: Upload schema-embed.json + uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + with: + name: schema-embed.json + path: provider/cmd/pulumi-resource-awsx/schema-embed.json + retention-days: 30 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 000000000..7668b4b6b --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,222 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt +name: Publish + +on: + workflow_call: + inputs: + version: + required: true + type: string + isPrerelease: + required: true + type: boolean + skipGoSdk: + default: false + type: boolean + description: Skip publishing & verifying the Go SDK + skipJavaSdk: + default: false + type: boolean + description: Skip publishing the Java SDK + +env: + IS_PRERELEASE: ${{ inputs.isPrerelease }} + ALT_AWS_ACCESS_KEY_ID: ${{ secrets.ALT_AWS_ACCESS_KEY_ID }} + ALT_AWS_SECRET_ACCESS_KEY: ${{ secrets.ALT_AWS_SECRET_ACCESS_KEY }} + AWS_REGION: us-west-2 + GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} + GOLANGCI_LINT_VERSION: v1.61.0 + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NUGET_PUBLISH_KEY: ${{ secrets.NUGET_PUBLISH_KEY }} + PROVIDER: eks + PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + PULUMI_API: https://api.pulumi-staging.io + PULUMI_ENABLE_RESOURCE_REFERENCES: "1" + PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. + PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget + PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + PYPI_USERNAME: __token__ + SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} + SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} + SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + TF_APPEND_USER_AGENT: pulumi + +jobs: + publish: + name: publish + runs-on: ubuntu-latest + steps: + - name: Validate prerelease + if: inputs.isPrerelease == false && (contains(inputs.version, '-') || contains(inputs.version, '+')) + run: echo "Can't publish a prerelease version as a stable release. This is likely a bug in the calling workflow." && exit 1 + - name: Validate skipGoSdk + if: inputs.skipGoSdk && inputs.isPrerelease == false + run: echo "Can't skip Go SDK for stable releases. This is likely a bug in the calling workflow." && exit 1 + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + - name: Setup tools + uses: ./.github/actions/setup-tools + with: + tools: pulumictl, pulumicli, go, schema-tools + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-region: us-east-2 + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + role-duration-seconds: 7200 + role-external-id: upload-pulumi-release + role-session-name: awsx@githubActions + role-to-assume: ${{ secrets.AWS_UPLOAD_ROLE_ARN }} + - name: Create dist directory + run: mkdir -p dist + - name: Download provider assets + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + pattern: pulumi-resource-awsx-v${{ inputs.version }}-* + path: dist + # Don't create a directory for each artifact + merge-multiple: true + - name: Calculate checksums + working-directory: dist + run: shasum ./*.tar.gz > "pulumi-awsx_${{ inputs.version }}_checksums.txt" + - name: Get Schema Change Summary + id: schema-summary + shell: bash + run: | + # Get latest stable release. Return only first column from result (tag). + LAST_VERSION=$(gh release view --repo pulumi/pulumi-awsx --json tagName -q .tagName || echo "No stable release" ) + { + echo 'summary<> "$GITHUB_OUTPUT" + - name: Upload Provider Binaries + run: aws s3 cp dist s3://get.pulumi.com/releases/plugins/ --recursive + - name: Create GH Release + uses: softprops/action-gh-release@e7a8f85e1c67a31e6ed99a94b41bd0b71bbee6b8 # v2 + if: inputs.isPrerelease == false + with: + tag_name: v${{ inputs.version }} + prerelease: ${{ inputs.isPrerelease }} + # We keep pre-releases as drafts so they're not visible until we manually publish them. + draft: ${{ inputs.isPrerelease }} + body: ${{ steps.schema-summary.outputs.summary }} + generate_release_notes: true + files: dist/* + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + publish_sdk: + name: publish_sdk + needs: publish + runs-on: ubuntu-latest + outputs: + python_version: ${{ steps.python_version.outputs.version }} + steps: + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + # Persist credentials so we can push back to the repo + persist-credentials: true + - name: Setup tools + uses: ./.github/actions/setup-tools + with: + tools: pulumictl, pulumicli, nodejs, python, dotnet, go, java + - name: Publish SDKs + if: inputs.skipJavaSdk == false + uses: pulumi/pulumi-package-publisher@696a0fe98f86d86ada2a842d1859f3e8c40d6cd7 # v0.0.21 + with: + sdk: all + version: ${{ inputs.version }} + - name: Publish SDKs (except Java) + if: inputs.skipJavaSdk == true + uses: pulumi/pulumi-package-publisher@696a0fe98f86d86ada2a842d1859f3e8c40d6cd7 # v0.0.21 + with: + sdk: all,!java + version: ${{ inputs.version }} + - name: Download Go SDK + uses: ./.github/actions/download-sdk + with: + language: go + - uses: pulumi/publish-go-sdk-action@v1 + if: inputs.skipGoSdk == false + with: + repository: ${{ github.repository }} + base-ref: ${{ github.sha }} + source: sdk + path: sdk + version: ${{ inputs.version }} + additive: false + # Avoid including other language SDKs & artifacts in the commit + files: | + go.* + go/** + !*.tar.gz + - name: Extract python version + id: python_version + working-directory: sdk/python + run: | + pip install toml-cli==0.7.0 + version=$(toml get --toml-path pyproject.toml project.version) + echo "version=${version}" >> "$GITHUB_OUTPUT" + create_docs_build: + name: create_docs_build + needs: publish_sdk + # Only run for non-prerelease, if the publish_go_sdk job was successful or skipped + if: inputs.isPrerelease == false + runs-on: ubuntu-latest + steps: + - name: Dispatch Metadata build + uses: peter-evans/repository-dispatch@ff45666b9427631e3450c54a1bcbee4d9ff4d7c0 # v3 + with: + token: ${{ secrets.PULUMI_BOT_TOKEN }} + repository: pulumi/registry + event-type: resource-provider + client-payload: |- + { + "project": "${{ github.repository }}", + "project-shortname": "awsx", + "ref": "${{ github.ref_name }}" + } + + clean_up_release_labels: + name: Clean up release labels + # Only run for non-prerelease, if the publish_go_sdk job was successful or skipped + if: inputs.isPrerelease == false + needs: create_docs_build + + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + - name: Clean up release labels + uses: pulumi/action-release-by-pr-label@main + with: + command: "clean-up-release-labels" + repo: ${{ github.repository }} + commit: ${{ github.sha }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + verify_release: + name: verify_release + needs: publish_sdk + uses: ./.github/workflows/verify-release.yml + secrets: inherit + with: + providerVersion: ${{ inputs.version }} + # Prelease is run often but we only have 5 concurrent macos runners, so we only test after the stable release. + enableMacosRunner: ${{ inputs.isPrerelease == false }} + skipGoSdk: ${{ inputs.skipGoSdk }} + pythonVersion: ${{ needs.publish_sdk.outputs.python_version }} diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 8a1c03d6e..54bee5cac 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -1,21 +1,47 @@ -name: pull-request -"on": - pull_request_target: +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - + ALT_AWS_ACCESS_KEY_ID: ${{ secrets.ALT_AWS_ACCESS_KEY_ID }} + ALT_AWS_SECRET_ACCESS_KEY: ${{ secrets.ALT_AWS_SECRET_ACCESS_KEY }} + AWS_REGION: us-west-2 + GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} + GOLANGCI_LINT_VERSION: v1.61.0 + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NUGET_PUBLISH_KEY: ${{ secrets.NUGET_PUBLISH_KEY }} + PROVIDER: eks + PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + PULUMI_API: https://api.pulumi-staging.io + PULUMI_ENABLE_RESOURCE_REFERENCES: "1" + PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. + PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget + PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + PYPI_USERNAME: __token__ + SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} + SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} + SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + TF_APPEND_USER_AGENT: pulumi jobs: comment-on-pr: - # We only care about commenting on a PR if the PR is from a fork if: github.event.pull_request.head.repo.full_name != github.repository + name: comment-on-pr runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Comment PR - uses: thollander/actions-comment-pull-request@main - with: - message: | - PR is now waiting for a maintainer to run the acceptance tests. This PR will only perform build and linting. - **Note for the maintainer:** To run the acceptance tests, please comment */run-acceptance-tests* on the PR - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + - name: Comment PR + uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3.0.1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + message: > + PR is now waiting for a maintainer to run the acceptance tests. + + **Note for the maintainer:** To run the acceptance tests, please comment */run-acceptance-tests* on the PR +name: pull-request +on: + pull_request_target: {} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index eb76ee58c..e4f7523df 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,393 +1,93 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt +name: release +on: + push: + tags: + - v*.*.* + - "!v*.*.*-**" + env: + ALT_AWS_ACCESS_KEY_ID: ${{ secrets.ALT_AWS_ACCESS_KEY_ID }} + ALT_AWS_SECRET_ACCESS_KEY: ${{ secrets.ALT_AWS_SECRET_ACCESS_KEY }} AWS_REGION: us-west-2 - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - LOCAL_PLAT: linux-amd64 + GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} + GOLANGCI_LINT_VERSION: v1.61.0 NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} NUGET_PUBLISH_KEY: ${{ secrets.NUGET_PUBLISH_KEY }} - PROVIDER: awsx + PROVIDER: eks PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} PULUMI_API: https://api.pulumi-staging.io + PULUMI_ENABLE_RESOURCE_REFERENCES: "1" PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - PYPI_USERNAME: __token__ - PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget + PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + PYPI_USERNAME: __token__ SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} - GOVERSION: "1.21.x" - DOTNETVERSION: "6.x" - PYTHONVERSION: "3.8" - NODEVERSION: "18.x" - JAVAVERSION: "11" + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + TF_APPEND_USER_AGENT: pulumi jobs: - version: - uses: ./.github/workflows/version.yml + prerequisites: + uses: ./.github/workflows/prerequisites.yml + secrets: inherit + with: + default_branch: ${{ github.event.repository.default_branch }} + is_pr: ${{ github.event_name == 'pull_request' }} + is_automated: ${{ github.actor == 'dependabot[bot]' }} + + build_provider: + uses: ./.github/workflows/build_provider.yml + needs: prerequisites + secrets: inherit + with: + version: ${{ needs.prerequisites.outputs.version }} + + build_sdk: + name: build_sdk + needs: prerequisites + uses: ./.github/workflows/build_sdk.yml secrets: inherit + with: + version: ${{ needs.prerequisites.outputs.version }} + lint: name: lint - runs-on: ubuntu-latest - continue-on-error: true - needs: version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: 18.x - registry-url: https://registry.npmjs.org - - name: Install Yarn - run: curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0 - - name: Update PATH for Yarn - run: | - echo "$HOME/.yarn/bin" >> $GITHUB_PATH - echo "$HOME/.config/yarn/global/node_modules/.bin" >> $GITHUB_PATH - - name: Lint AWSX Code - run: make lint - - name: Lint classic AWSX Code - run: make lint_classic - - name: Check worktree clean - uses: pulumi/git-status-check-action@v1 - with: - allowed-changes: | - sdk/**/pulumi-plugin.json - sdk/dotnet/Pulumi.*.csproj - sdk/go/**/pulumiUtilities.go - sdk/nodejs/package.json - sdk/python/pyproject.toml - build-provider: - runs-on: ubuntu-latest - needs: version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v3 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-region: ${{ env.AWS_REGION }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - role-duration-seconds: 7200 - role-session-name: ${{ env.PROVIDER }}@githubActions - role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} - - name: Install Go - uses: actions/setup-go@v4 - with: - go-version: ${{ env.GOVERSION }} - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: ${{env.NODEVERSION}} - registry-url: https://registry.npmjs.org - - name: Install Yarn - run: curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0 - - name: Update PATH for Yarn - run: | - echo "$HOME/.yarn/bin" >> $GITHUB_PATH - echo "$HOME/.config/yarn/global/node_modules/.bin" >> $GITHUB_PATH - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Pulumi CLI - uses: pulumi/action-install-pulumi-cli@v2 - - name: Build provider - run: make provider - - name: Test provider - run: make test_provider - - name: Check worktree clean - uses: pulumi/git-status-check-action@v1 - with: - allowed-changes: | - sdk/**/pulumi-plugin.json - sdk/dotnet/Pulumi.*.csproj - sdk/go/**/pulumiUtilities.go - sdk/nodejs/package.json - sdk/python/pyproject.toml - - name: Upload bin - uses: actions/upload-artifact@v4 - with: - name: bin - path: bin - - name: Tar provider bin - run: tar -zcf ${{ github.workspace }}/provider.tar.gz -C ${{ github.workspace }}/${{ env.PROVIDER }}/bin/ . - - name: Upload provider bin - uses: actions/upload-artifact@v4 - with: - name: ${{ env.PROVIDER }}-provider.tar.gz - path: ${{ github.workspace }}/provider.tar.gz - - if: failure() && github.event_name == 'push' - name: Notify Slack - uses: 8398a7/action-slack@v3 - with: - author_name: Failure in building provider - fields: repo,commit,author,action - status: ${{ job.status }} - acceptance-test: - runs-on: ubuntu-latest - needs: - - build-provider - - version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@v1.3.1 - with: - tool-cache: false - swap-storage: false - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Languages & Frameworks - uses: ./.github/actions/install - - name: Setup Gradle - uses: gradle/gradle-build-action@v3 - with: - gradle-version: "8.4" - - name: Install Python deps - run: |- - pip3 install virtualenv==20.0.23 - pip3 install pipenv - - name: Download bin - uses: actions/download-artifact@v4 - with: - name: bin - path: bin - - name: Restore bin and avoid rebuilding - run: | - chmod +x bin/* - make provider --touch - - name: Build SDK - run: make build_${{ matrix.language }} - - name: Check worktree clean - uses: pulumi/git-status-check-action@v1 - with: - allowed-changes: | - sdk/**/pulumi-plugin.json - sdk/dotnet/Pulumi.*.csproj - sdk/go/**/pulumiUtilities.go - sdk/nodejs/package.json - sdk/python/pyproject.toml - - name: Compress SDK folder - run: tar -zcf sdk/${{ matrix.language }}.tar.gz -C sdk/${{ matrix.language }} - . - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: ${{ matrix.language }}-sdk.tar.gz - path: ${{ github.workspace}}/sdk/${{ matrix.language }}.tar.gz - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v3 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-region: ${{ env.AWS_REGION }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - role-duration-seconds: 7200 - role-session-name: ${{ env.PROVIDER }}@githubActions - role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} - - name: Run tests - # Tell make to not rebuild the provider bin - run: make test_${{ matrix.language }} - strategy: - fail-fast: false - matrix: - language: - - nodejs - - python - - dotnet - - go - - java + uses: ./.github/workflows/lint.yml + secrets: inherit + license_check: + name: License Check + uses: ./.github/workflows/license.yml + secrets: inherit + publish: name: publish - runs-on: ubuntu-latest - needs: - - acceptance-test - - version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v3 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-region: us-east-2 - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - role-duration-seconds: 7200 - role-external-id: upload-pulumi-release - role-session-name: ${{ env.PROVIDER}}@githubActions - role-to-assume: ${{ secrets.AWS_UPLOAD_ROLE_ARN }} - - uses: MOZGIII/install-ldid-action@v1 - with: - tag: v2.1.5-procursus2 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Pulumi CLI - uses: pulumi/action-install-pulumi-cli@v2 - - name: Download provider binary - uses: actions/download-artifact@v4 - with: - name: ${{ env.PROVIDER }}-provider.tar.gz - path: ${{ github.workspace }}/bin - - name: Untar provider binaries - run: tar -zxf ${{ github.workspace }}/bin/provider.tar.gz -C ${{ github.workspace - }}/bin - - name: Restore binary perms - run: find ${{ github.workspace }}/bin -name "pulumi-*-${{ env.PROVIDER }}" -print - -exec chmod +x {} \; - - name: Test provider - run: make test_provider - - name: Create Provider Binaries - run: make dist - - name: Upload Provider Binaries - run: aws s3 cp dist s3://get.pulumi.com/releases/plugins/ --recursive - - name: Create GH Release - uses: softprops/action-gh-release@v2 - with: - generate_release_notes: true - files: | - dist/*.tar.gz - env: - GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} - publish_sdk: - name: publish_sdk - runs-on: ubuntu-latest - needs: - - publish - - version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Languages & Frameworks - uses: ./.github/actions/install - - name: Setup Gradle - uses: gradle/gradle-build-action@v3 - with: - gradle-version: "8.4" - - name: Download python SDK - uses: actions/download-artifact@v4 - with: - name: python-sdk.tar.gz - path: ${{ github.workspace}}/sdk/ - - name: Uncompress python SDK - run: tar -zxf ${{github.workspace}}/sdk/python.tar.gz -C ${{github.workspace}}/sdk/python - - name: Download dotnet SDK - uses: actions/download-artifact@v4 - with: - name: dotnet-sdk.tar.gz - path: ${{ github.workspace}}/sdk/ - - name: Uncompress dotnet SDK - run: tar -zxf ${{github.workspace}}/sdk/dotnet.tar.gz -C ${{github.workspace}}/sdk/dotnet - - name: Download nodejs SDK - uses: actions/download-artifact@v4 - with: - name: nodejs-sdk.tar.gz - path: ${{ github.workspace}}/sdk/ - - name: Uncompress nodejs SDK - run: tar -zxf ${{github.workspace}}/sdk/nodejs.tar.gz -C ${{github.workspace}}/sdk/nodejs - - run: python -m pip install pip twine - - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Publish SDK - run: ./scripts/publish_packages.sh - - name: Download java SDK - uses: actions/download-artifact@v4 - with: - name: java-sdk.tar.gz - path: ${{ github.workspace}}/sdk/ - - name: Uncompress java SDK - run: tar -zxf ${{github.workspace}}/sdk/java.tar.gz -C ${{github.workspace}}/sdk/java - - name: Publish Java SDK - uses: gradle/gradle-build-action@a8f75513eafdebd8141bd1cd4e30fcd194af8dfa - env: - PACKAGE_VERSION: ${{ env.PROVIDER_VERSION }} - with: - arguments: publishToSonatype closeAndReleaseSonatypeStagingRepository - build-root-directory: ./sdk/java - gradle-version: 7.4.1 - tag_sdk: - name: tag_sdk - runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write needs: - - publish_sdk - - version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Download Go SDK - uses: actions/download-artifact@v4 - with: - name: go-sdk.tar.gz - path: ${{ github.workspace }}/sdk/ - - name: Uncompress Go SDK - run: tar -zxf ${{ github.workspace }}/sdk/go.tar.gz -C - ${{ github.workspace }}/sdk/go - shell: bash - - uses: pulumi/publish-go-sdk-action@v1 - with: - repository: ${{ github.repository }} - base-ref: ${{ github.sha }} - source: sdk - path: sdk - version: ${{ needs.version.outputs.version }} - additive: false - # Avoid including other language SDKs & artifacts in the commit - files: | - go.* - go/** - !*.tar.gz - create_docs_build: - name: Create docs build - runs-on: ubuntu-latest + - prerequisites + - build_provider + - test + - license_check + uses: ./.github/workflows/publish.yml + secrets: inherit + with: + version: ${{ needs.prerequisites.outputs.version }} + isPrerelease: false + + test: + uses: ./.github/workflows/test.yml needs: - - tag_sdk - - version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - env: - GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} - name: Dispatch event - run: pulumictl create docs-build pulumi-${{ env.PROVIDER }} ${GITHUB_REF#refs/tags/} --schema-path schema.json -name: release -"on": - push: - tags: - - v*.*.* - - "!v*.*.*-**" - - "!v0.x.x" + - prerequisites + - build_provider + - build_sdk + permissions: + contents: read + id-token: write + secrets: inherit + with: + version: ${{ needs.prerequisites.outputs.version }} diff --git a/.github/workflows/release_command.yml b/.github/workflows/release_command.yml new file mode 100644 index 000000000..5712f40e5 --- /dev/null +++ b/.github/workflows/release_command.yml @@ -0,0 +1,45 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt + +name: release-command +on: + repository_dispatch: + types: + - release-command +jobs: + should_release: + name: Should release PR + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + - name: Should release PR + uses: pulumi/action-release-by-pr-label@main + with: + command: "should-release" + repo: ${{ github.repository }} + pr: ${{ github.event.client_payload.pull_request.number }} + version: ${{ github.event.client_payload.slash_command.args.all }} + slack_channel: ${{ secrets.RELEASE_OPS_STAGING_SLACK_CHANNEL }} + env: + RELEASE_BOT_ENDPOINT: ${{ secrets.RELEASE_BOT_ENDPOINT }} + RELEASE_BOT_KEY: ${{ secrets.RELEASE_BOT_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - if: failure() + name: Notify failure + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0 + with: + token: ${{ secrets.GITHUB_TOKEN }} + repository: ${{ github.event.client_payload.github.payload.repository.full_name }} + issue-number: ${{ github.event.client_payload.github.payload.issue.number }} + body: | + "release command failed: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" + - if: success() + name: Notify success + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0 + with: + token: ${{ secrets.GITHUB_TOKEN }} + repository: ${{ github.event.client_payload.github.payload.repository.full_name }} + comment-id: ${{ github.event.client_payload.github.payload.comment.id }} + reaction-type: hooray diff --git a/.github/workflows/run-acceptance-tests.yml b/.github/workflows/run-acceptance-tests.yml index 33a54decf..f43e2cd79 100644 --- a/.github/workflows/run-acceptance-tests.yml +++ b/.github/workflows/run-acceptance-tests.yml @@ -1,245 +1,141 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt + +name: run-acceptance-tests + +on: + pull_request: + paths-ignore: + - CHANGELOG.md + repository_dispatch: + types: + - run-acceptance-tests-command + env: + PR_COMMIT_SHA: ${{ github.event.client_payload.pull_request.head.sha }} + ALT_AWS_ACCESS_KEY_ID: ${{ secrets.ALT_AWS_ACCESS_KEY_ID }} + ALT_AWS_SECRET_ACCESS_KEY: ${{ secrets.ALT_AWS_SECRET_ACCESS_KEY }} AWS_REGION: us-west-2 - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - LOCAL_PLAT: linux-amd64 + GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} + GOLANGCI_LINT_VERSION: v1.61.0 NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - PROVIDER: awsx + NUGET_PUBLISH_KEY: ${{ secrets.NUGET_PUBLISH_KEY }} + PROVIDER: eks PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} PULUMI_API: https://api.pulumi-staging.io + PULUMI_ENABLE_RESOURCE_REFERENCES: "1" PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - PR_COMMIT_SHA: ${{ github.event.client_payload.pull_request.head.sha }} PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget + PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + PYPI_USERNAME: __token__ SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} - VERSION_PREFIX: 1.0.0 - GOVERSION: "1.21.x" - DOTNETVERSION: "6.x" - PYTHONVERSION: "3.8" - NODEVERSION: "18.x" - JAVAVERSION: "11" + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + TF_APPEND_USER_AGENT: pulumi + +# This should cancel any previous runs of the same workflow on the same branch which are still running. +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: + prerequisites: + if: github.event_name == 'repository_dispatch' || + github.event.pull_request.head.repo.full_name == github.repository + permissions: + pull-requests: write + uses: ./.github/workflows/prerequisites.yml + secrets: inherit + with: + default_branch: ${{ github.event.repository.default_branch }} + is_pr: ${{ github.event_name == 'pull_request' }} + is_automated: ${{ github.actor == 'dependabot[bot]' }} + + build_provider: + uses: ./.github/workflows/build_provider.yml + needs: prerequisites + secrets: inherit + with: + version: ${{ needs.prerequisites.outputs.version }} + + build_sdk: + if: github.event_name == 'repository_dispatch' || + github.event.pull_request.head.repo.full_name == github.repository + name: build_sdk + needs: prerequisites + uses: ./.github/workflows/build_sdk.yml + secrets: inherit + with: + version: ${{ needs.prerequisites.outputs.version }} + comment-notification: - # We only care about adding the result to the PR if it's a repository_dispatch event if: github.event_name == 'repository_dispatch' + name: comment-notification + permissions: + pull-requests: write runs-on: ubuntu-latest steps: - - name: Create URL to the run output - id: vars - run: echo run-url=https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID >> "$GITHUB_OUTPUT" - - name: Update with Result - uses: peter-evans/create-or-update-comment@v3 - with: - token: ${{ secrets.GITHUB_TOKEN }} - repository: ${{ github.event.client_payload.github.payload.repository.full_name }} - issue-number: ${{ github.event.client_payload.github.payload.issue.number }} - body: | - Please view the PR build - ${{ steps.vars.outputs.run-url }} - version: - uses: ./.github/workflows/version.yml - secrets: inherit + - id: run-url + name: Create URL to the run output + run: echo "run-url=https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID" >> "$GITHUB_OUTPUT" + - name: Update with Result + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0 + with: + body: "Please view the PR build: ${{ steps.run-url.outputs.run-url }}" + issue-number: ${{ github.event.client_payload.github.payload.issue.number }} + repository: ${{ github.event.client_payload.github.payload.repository.full_name }} + token: ${{ secrets.GITHUB_TOKEN }} lint: + if: github.event_name == 'repository_dispatch' || + github.event.pull_request.head.repo.full_name == github.repository name: lint + uses: ./.github/workflows/lint.yml + secrets: inherit + sentinel: + name: sentinel + if: github.event_name == 'repository_dispatch' || + github.event.pull_request.head.repo.full_name == github.repository + permissions: + statuses: write + needs: + - test + - build_provider + - license_check + - lint runs-on: ubuntu-latest - continue-on-error: true - needs: version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: 18.x - registry-url: https://registry.npmjs.org - - name: Install Yarn - run: curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0 - - name: Update PATH for Yarn - run: | - echo "$HOME/.yarn/bin" >> $GITHUB_PATH - echo "$HOME/.config/yarn/global/node_modules/.bin" >> $GITHUB_PATH - - uses: MOZGIII/install-ldid-action@v1 - with: - tag: v2.1.5-procursus2 - - name: Lint AWSX Code - run: make lint - - name: Lint classic AWSX Code - run: make lint_classic - - name: Build dist packages - run: make dist - - name: Upload dist - uses: actions/upload-artifact@v4 - with: - name: dist - path: dist - - name: Check worktree clean - uses: pulumi/git-status-check-action@v1 - with: - allowed-changes: | - sdk/**/pulumi-plugin.json - sdk/dotnet/Pulumi.*.csproj - sdk/go/**/pulumiUtilities.go - sdk/nodejs/package.json - sdk/python/pyproject.toml - build-provider: - runs-on: ubuntu-latest - needs: version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v3 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-region: ${{ env.AWS_REGION }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - role-duration-seconds: 7200 - role-session-name: ${{ env.PROVIDER }}@githubActions - role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} - - name: Install Go - uses: actions/setup-go@v4 - with: - go-version: ${{ env.GOVERSION }} - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: ${{env.NODEVERSION}} - registry-url: https://registry.npmjs.org - - name: Install Yarn - run: curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0 - - name: Update PATH for Yarn - run: | - echo "$HOME/.yarn/bin" >> $GITHUB_PATH - echo "$HOME/.config/yarn/global/node_modules/.bin" >> $GITHUB_PATH - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Pulumi CLI - uses: pulumi/action-install-pulumi-cli@v2 - - name: Build provider - run: make provider - - name: Test provider - run: make test_provider - - name: Check worktree clean - uses: pulumi/git-status-check-action@v1 - with: - allowed-changes: | - sdk/**/pulumi-plugin.json - sdk/dotnet/Pulumi.*.csproj - sdk/go/**/pulumiUtilities.go - sdk/nodejs/package.json - sdk/python/pyproject.toml - - name: Upload bin - uses: actions/upload-artifact@v4 - with: - name: bin - path: bin - - name: Tar provider bin - run: tar -zcf ${{ github.workspace }}/provider.tar.gz -C ${{ github.workspace }}/${{ env.PROVIDER }}/bin/ . - - name: Upload provider bin - uses: actions/upload-artifact@v4 - with: - name: ${{ env.PROVIDER }}-provider.tar.gz - path: ${{ github.workspace }}/provider.tar.gz - - if: failure() && github.event_name == 'push' - name: Notify Slack - uses: 8398a7/action-slack@v3 - with: - author_name: Failure in building provider - fields: repo,commit,author,action - status: ${{ job.status }} - acceptance-test: - runs-on: ubuntu-latest - if: github.event_name == 'repository_dispatch' || github.event.pull_request.head.repo.full_name == github.repository + - uses: guibranco/github-status-action-v2@0849440ec82c5fa69b2377725b9b7852a3977e76 # v1.1.13 + with: + authToken: ${{secrets.GITHUB_TOKEN}} + # Write an explicit status check called "Sentinel" which will only pass if this code really runs. + # This should always be a required check for PRs. + context: 'Sentinel' + description: 'All required checks passed' + state: 'success' + # Write to the PR commit SHA if it's available as we don't want the merge commit sha, + # otherwise use the current SHA for any other type of build. + sha: ${{ github.event.pull_request.head.sha || github.sha }} + + test: + # Don't run tests on PRs from forks. + if: github.event_name == 'repository_dispatch' || + github.event.pull_request.head.repo.full_name == github.repository + uses: ./.github/workflows/test.yml needs: - - build-provider - - version - env: - PROVIDER_VERSION: ${{ needs.version.outputs.version }} - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@v1.3.1 - with: - tool-cache: false - swap-storage: false - - name: Checkout Repo - uses: actions/checkout@v4 - - name: Install pulumictl - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Languages & Frameworks - uses: ./.github/actions/install - - name: Install Python deps - run: |- - pip3 install virtualenv==20.0.23 - pip3 install pipenv - - name: Download bin - uses: actions/download-artifact@v4 - with: - name: bin - path: bin - - name: Restore bin and avoid rebuilding - run: | - chmod +x bin/* - make provider --touch - - name: Build SDK - run: make build_${{ matrix.language }} - - name: Check worktree clean - uses: pulumi/git-status-check-action@v1 - with: - allowed-changes: | - sdk/**/pulumi-plugin.json - sdk/dotnet/Pulumi.*.csproj - sdk/go/**/pulumiUtilities.go - sdk/nodejs/package.json - sdk/python/pyproject.toml - - name: Compress SDK folder - run: tar -zcf sdk/${{ matrix.language }}.tar.gz -C sdk/${{ matrix.language }} - . - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: ${{ matrix.language }}-sdk.tar.gz - path: ${{ github.workspace}}/sdk/${{ matrix.language }}.tar.gz - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v3 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-region: ${{ env.AWS_REGION }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - role-duration-seconds: 7200 - role-session-name: ${{ env.PROVIDER }}@githubActions - role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} - - name: Run tests - # Tell make to not rebuild the provider bin - run: make test_${{ matrix.language }} - strategy: - fail-fast: false - matrix: - language: - - nodejs - - python - - dotnet - - go - - java -name: Run Acceptance Tests from PR -on: - repository_dispatch: - types: [run-acceptance-tests-command] - pull_request: - branches: - - master - - test-ci-changes + - prerequisites + - build_provider + - build_sdk + permissions: + contents: read + id-token: write + secrets: inherit + with: + version: ${{ needs.prerequisites.outputs.version }} + + license_check: + name: License Check + uses: ./.github/workflows/license.yml + secrets: inherit diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..52ad9ef4e --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,146 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt + +name: "Test Provider" + +on: + workflow_call: + inputs: + version: + required: true + type: string + description: Version of the provider to test + +env: + PR_COMMIT_SHA: ${{ github.event.client_payload.pull_request.head.sha }} + ALT_AWS_ACCESS_KEY_ID: ${{ secrets.ALT_AWS_ACCESS_KEY_ID }} + ALT_AWS_SECRET_ACCESS_KEY: ${{ secrets.ALT_AWS_SECRET_ACCESS_KEY }} + AWS_REGION: us-west-2 + GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} + GOLANGCI_LINT_VERSION: v1.61.0 + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NUGET_PUBLISH_KEY: ${{ secrets.NUGET_PUBLISH_KEY }} + PROVIDER: eks + PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + PULUMI_API: https://api.pulumi-staging.io + PULUMI_ENABLE_RESOURCE_REFERENCES: "1" + PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. + PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget + PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + PYPI_USERNAME: __token__ + SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} + SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} + SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + TF_APPEND_USER_AGENT: pulumi + +jobs: + test: + permissions: + contents: read + id-token: write + runs-on: ubuntu-latest + env: + PROVIDER_VERSION: ${{ inputs.version }} + steps: + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ env.PR_COMMIT_SHA }} + persist-credentials: false + - name: Checkout p/examples + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: pulumi/examples + path: p-examples + - name: Setup tools + uses: ./.github/actions/setup-tools + - name: Prepare local workspace + run: make prepare_local_workspace + - name: Download bin + uses: ./.github/actions/download-bin + - name: Download nodejs SDK + uses: ./.github/actions/download-sdk + with: + language: nodejs + - name: Restore makefile progress + run: make --touch provider schema build_nodejs + - name: Install dependencies + run: make install_nodejs_sdk + - name: Download python SDK + uses: ./.github/actions/download-sdk + with: + language: python + - name: Restore makefile progress + run: make --touch provider schema build_python + - name: Install dependencies + run: make install_python_sdk + - name: Download dotnet SDK + uses: ./.github/actions/download-sdk + with: + language: dotnet + - name: Restore makefile progress + run: make --touch provider schema build_dotnet + - name: Install dependencies + run: make install_dotnet_sdk + - name: Download go SDK + uses: ./.github/actions/download-sdk + with: + language: go + - name: Restore makefile progress + run: make --touch provider schema build_go + - name: Install dependencies + run: make install_go_sdk + - name: Download java SDK + uses: ./.github/actions/download-sdk + with: + language: java + - name: Restore makefile progress + run: make --touch provider schema build_java + - name: Install dependencies + run: make install_java_sdk + - name: Update path + run: echo "${{ github.workspace }}/bin" >> "$GITHUB_PATH" + - name: Install Python deps + run: |- + pip3 install virtualenv==20.0.23 + pip3 install pipenv + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-region: ${{ env.AWS_REGION }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + role-duration-seconds: 7200 + role-session-name: awsx@githubActions + role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} + - name: Install gotestfmt + uses: GoTestTools/gotestfmt-action@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} + version: v2.5.0 + - name: Generate shard + run: make shard + env: + SHARD_TOTAL: ${{ matrix.total }} + SHARD_INDEX: ${{ matrix.index }} + - name: Run integration tests + run: make test_shard + strategy: + fail-fast: false + matrix: + total: + - 10 + index: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 diff --git a/.github/workflows/verify-release.yml b/.github/workflows/verify-release.yml new file mode 100644 index 000000000..89552c998 --- /dev/null +++ b/.github/workflows/verify-release.yml @@ -0,0 +1,93 @@ +name: "Verify Release" + +on: + workflow_dispatch: + inputs: + providerVersion: + description: "The version of the provider to verify" + required: true + type: string + enableMacRunner: + description: "Enable the MacOS runner in addition to Linux and Windows. Defaults to 'false'." + required: false + type: boolean + skipGoSdk: + description: "Skip the Go SDK verification. Defaults to 'false'. Enable this when verifying a pre-release for which we don't publish the Go SDK (for PRs and the default branch)." + required: false + type: boolean + default: false + pythonVersion: + description: "Optional python SDK version to verify. Defaults to inputs.providerVersion." + type: string + required: false + workflow_call: + inputs: + providerVersion: + description: "The version of the provider to verify" + required: true + type: string + enableMacosRunner: + description: "Enable the macos-latest runner in addition to ubuntu-latest and windows-latest. Defaults to 'false'." + required: false + type: boolean + default: false + skipGoSdk: + description: "Skip the Go SDK verification. Defaults to 'false'. This is used when we're not publishing a Go SDK on the default branch build." + required: false + type: boolean + default: false + pythonVersion: + description: "Optional python SDK version to verify. Defaults to inputs.providerVersion." + type: string + required: false + +env: + ALT_AWS_ACCESS_KEY_ID: ${{ secrets.ALT_AWS_ACCESS_KEY_ID }} + ALT_AWS_SECRET_ACCESS_KEY: ${{ secrets.ALT_AWS_SECRET_ACCESS_KEY }} + AWS_REGION: us-west-2 + GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} + GOLANGCI_LINT_VERSION: v1.61.0 + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NUGET_PUBLISH_KEY: ${{ secrets.NUGET_PUBLISH_KEY }} + PROVIDER: eks + PUBLISH_REPO_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + PUBLISH_REPO_USERNAME: ${{ secrets.OSSRH_USERNAME }} + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + PULUMI_API: https://api.pulumi-staging.io + PULUMI_ENABLE_RESOURCE_REFERENCES: "1" + PULUMI_GO_DEP_ROOT: ${{ github.workspace }}/.. + PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget + PYPI_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + PYPI_USERNAME: __token__ + SIGNING_KEY: ${{ secrets.JAVA_SIGNING_KEY }} + SIGNING_KEY_ID: ${{ secrets.JAVA_SIGNING_KEY_ID }} + SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + TF_APPEND_USER_AGENT: pulumi + +jobs: + verify-release: + name: verify-release + # We don't have any release verification configurations, so we never run this workflow. + # Configure your .ci-mgmt.yaml files to include the release verification configurations e.g. + # releaseVerification: + # nodejs: path/to/nodejs/project + # python: path/to/python/project + # dotnet: path/to/dotnet/project + # go: path/to/go/project + if: false + strategy: + matrix: + # We don't have any release verification configurations, so we only run on Linux to print warnings to help users configure the release verification. + runner: ["ubuntu-latest"] + runs-on: ${{ matrix.runner }} + steps: + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + - name: Setup tools + uses: ./.github/actions/setup-tools + with: + tools: pulumicli, nodejs, python, dotnet, go, java diff --git a/.github/workflows/version.yml b/.github/workflows/version.yml deleted file mode 100644 index ccfa89024..000000000 --- a/.github/workflows/version.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: version - -on: - workflow_call: - outputs: - version: - description: Calculated version - value: ${{ jobs.version.outputs.version }} - -env: - GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} - -jobs: - version: - runs-on: ubuntu-latest - name: Calculate Dev Version - steps: - - id: version - name: Calculate build version - uses: pulumi/provider-version-action@v1 - outputs: - version: ${{ steps.version.outputs.VERSION }} diff --git a/.github/workflows/weekly-pulumi-update.yml b/.github/workflows/weekly-pulumi-update.yml deleted file mode 100644 index 919016c6f..000000000 --- a/.github/workflows/weekly-pulumi-update.yml +++ /dev/null @@ -1,103 +0,0 @@ -name: weekly-pulumi-update -on: - repository_dispatch: - types: [run-pulumi-update-command] - schedule: - # Every Monday at 11AM UTC - - cron: 0 11 * * 1 - workflow_dispatch: {} - -permissions: - pull-requests: write - contents: write -env: - GOVERSION: "1.21.x" -jobs: - weekly-pulumi-update: - runs-on: ubuntu-latest - strategy: - fail-fast: true - steps: - - name: Checkout Repo - uses: actions/checkout@v3 - - name: Install Go - uses: actions/setup-go@v4 - with: - go-version: ${{ env.GOVERSION }} - - name: Install Yarn - run: curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0 - - name: Update PATH for Yarn - run: | - echo "$HOME/.yarn/bin" >> $GITHUB_PATH - echo "$HOME/.config/yarn/global/node_modules/.bin" >> $GITHUB_PATH - - name: Update Pulumi/Pulumi - id: gomod - run: | - git config --local user.email 'bot@pulumi.com' - git config --local user.name 'pulumi-bot' - - PULUMI_VERSION=$(./scripts/get-latest-pulumi-version.sh) - echo "Latest Pulumi version is $PULUMI_VERSION" - echo "PULUMI_VERSION=$PULUMI_VERSION" >> "$GITHUB_ENV" - - git checkout -b update-pulumi/$PULUMI_VERSION-${{ github.run_id }}-${{ github.run_number }} - - echo "Updating Pulumi dependencies to $PULUMI_VERSION" - ./scripts/bump-pulumi-deps.sh --version "$PULUMI_VERSION" - - echo "Updating node @pulumi/pulumi to $PULUMI_VERSION" - pushd awsx - # Strips the v from the version to get the correct npm version - yarn upgrade @pulumi/pulumi@${PULUMI_VERSION#v} - yarn run dedupe-deps - - echo "Ensure that we don't have any duplicate dependencies" - yarn run check-duplicate-deps - popd - - - git update-index -q --refresh - - if ! git diff-files --quiet; then - echo changes=1 >> "$GITHUB_OUTPUT" - fi - - name: Setup Node - if: steps.gomod.outputs.changes != 0 - uses: actions/setup-node@v4 - with: - node-version: ${{env.NODEVERSION}} - registry-url: https://registry.npmjs.org - - name: Install pulumictl - if: steps.gomod.outputs.changes != 0 - uses: jaxxstorm/action-install-gh-release@v1.10.0 - with: - repo: pulumi/pulumictl - - name: Install Pulumi CLI - if: steps.gomod.outputs.changes != 0 - uses: pulumi/action-install-pulumi-cli@v2 - - name: Build Provider - if: steps.gomod.outputs.changes != 0 - run: | - make build - make lint - - name: Commit changes - if: steps.gomod.outputs.changes != 0 - run: | - git add . - - git commit -m "Update pulumi/pulumi version to $PULUMI_VERSION" - - git push origin update-pulumi/$PULUMI_VERSION-${{ github.run_id }}-${{ github.run_number }} - - name: pull-request - if: steps.gomod.outputs.changes != 0 - env: - GH_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} - run: | - gh pr create --title "Update pulumi/pulumi version to $PULUMI_VERSION" --body "Upgrading pulumi/pkg and pulumi/sdk to version $PULUMI_VERSION." - - name: Enable auto-merge - if: steps.gomod.outputs.changes != 0 && github.event_name == 'schedule' - env: - GH_TOKEN: ${{ github.token }} - run: | - gh pr merge --squash --auto "1" - name: weekly-pulumi-update diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 000000000..e76dace4f --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,35 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt + +linters: + enable: + - errcheck + - gci + - goconst + - gofmt + - gosec + - govet + - ineffassign + - lll + - gosimple + - staticcheck + - misspell + - nakedret + - revive + - unconvert + - unused + enable-all: false +issues: + exclude-files: + - schema.go + - pulumiManifest.go +run: + timeout: 20m +linters-settings: + gci: + sections: + - standard # Standard section: captures all standard library packages. + - blank # Blank section: contains all blank imports. + - default # Default section: contains all imports that could not be matched to another section type. + - prefix(github.com/pulumi/) # Custom section: groups all imports with the github.com/pulumi/ prefix. + - prefix(github.com/pulumi/pulumi-awsx) # Custom section: local imports + custom-order: true diff --git a/.upgrade-config.yml b/.upgrade-config.yml new file mode 100644 index 000000000..546d65828 --- /dev/null +++ b/.upgrade-config.yml @@ -0,0 +1,6 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt + +--- +upstream-provider-name: terraform-provider-awsx +pulumi-infer-version: true +remove-plugins: true diff --git a/CODE-OF-CONDUCT.md b/CODE-OF-CONDUCT.md index bfb1c215c..995e13c00 100644 --- a/CODE-OF-CONDUCT.md +++ b/CODE-OF-CONDUCT.md @@ -19,6 +19,7 @@ include: * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members +* Contribute in a positive and constructive way Examples of unacceptable behavior by participants include: @@ -30,6 +31,12 @@ Examples of unacceptable behavior by participants include: address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Community Guidelines +* Be clear and stay on topic. Communicating with strangers on the Internet can make it hard to convey or read tone, and sarcasm is frequently misunderstood. Try to use clear language, and think about how the other person will receive it. +* Don’t cross-post the same thing in multiple GitHub Discussion topics or multiple Slack channels. This can make it difficult for people answering your questions and creates "scrollback spam". +* Public discussion is preferred to private. Avoid using Slack DMs for questions, and instead share them in public Slack channels or GitHub Discussion threads. This allows a larger audience to both share their knowledge as well as learn from your question or issue. If you're having a problem, chances are someone else is having a similar problem. Learning in public is a community contribution. +* Minimize notifications to other community members. Avoid tagging other community members in Slack messages or Discussion threads, unless you are replying to something specific. Community members are here to help each other, but are not "on call" for support, and we expect everyone to try to minimize "notification fatigue". If your issue is time-sensitive or critical, use methods like support@pulumi.com instead. ## Our Responsibilities @@ -38,19 +45,19 @@ behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. +reject comments, commits, code, wiki edits, issues, GitHub Discussions posts, +and other contributions that are not aligned to this Code of Conduct, or to ban +temporarily or permanently any contributor for other behaviors that they deem +inappropriate, threatening, offensive, or harmful. ## Scope -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. +This Code of Conduct applies both within project spaces (including the Community Slack +and GitHub Discussions forums) and in public spaces when an individual is representing the +project or its community. Examples of representing a project or community include +using an official project e-mail address, posting via an official social media account, +or acting as an appointed representative at an online or offline event. Representation +of a project may be further defined and clarified by project maintainers. ## Enforcement diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..5fdb2bd21 --- /dev/null +++ b/Makefile @@ -0,0 +1,382 @@ +# WARNING: This file is autogenerated - changes will be overwritten when regenerated by https://github.com/pulumi/ci-mgmt + +PACK := awsx +ORG := pulumi +PROJECT := github.com/$(ORG)/pulumi-$(PACK) +PROVIDER_PATH := provider/v2 +VERSION_PATH := $(PROVIDER_PATH)/pkg/version.Version +TFGEN := pulumi-gen-$(PACK) +PROVIDER := pulumi-resource-$(PACK) +JAVA_GEN := pulumi-java-gen +TESTPARALLELISM := 10 +WORKING_DIR := $(shell pwd) +PULUMI_PROVIDER_BUILD_PARALLELISM ?= +PULUMI_CONVERT := 0 +PULUMI_MISSING_DOCS_ERROR := true + +# Override during CI using `make [TARGET] PROVIDER_VERSION=""` or by setting a PROVIDER_VERSION environment variable +# Local & branch builds will just used this fixed default version unless specified +PROVIDER_VERSION ?= 2.0.0-alpha.0+dev +# Use this normalised version everywhere rather than the raw input to ensure consistency. +VERSION_GENERIC = $(shell pulumictl convert-version --language generic --version "$(PROVIDER_VERSION)") + +# Strips debug information from the provider binary to reduce its size and speed up builds +LDFLAGS_STRIP_SYMBOLS=-s -w +LDFLAGS_PROJ_VERSION=-X $(PROJECT)/$(VERSION_PATH)=$(VERSION_GENERIC) +LDFLAGS_UPSTREAM_VERSION= +LDFLAGS_EXTRAS= +LDFLAGS=$(LDFLAGS_PROJ_VERSION) $(LDFLAGS_UPSTREAM_VERSION) $(LDFLAGS_EXTRAS) $(LDFLAGS_STRIP_SYMBOLS) + +# Create a `.make` directory for tracking targets which don't generate a single file output. This should be ignored by git. +# For targets which either don't generate a single file output, or the output file is committed, we use a "sentinel" +# file within `.make/` to track the staleness of the target and only rebuild when needed. +# For each phony target, we create an internal target with the same name, but prefixed with `.make/` where the work is performed. +# At the end of each internal target we run `@touch $@` to update the file which is the name of the target. + +# Ensure all directories exist before evaluating targets to avoid issues with `touch` creating directories. +_ := $(shell mkdir -p .make bin .pulumi/bin) + +# Build the provider and all SDKs and install ready for testing +build: install_plugins provider build_sdks install_sdks +# Keep aliases for old targets to ensure backwards compatibility +development: build +only_build: build +# Prepare the workspace for building the provider and SDKs +# Importantly this is run by CI ahead of restoring the bin directory and resuming SDK builds +prepare_local_workspace: install_plugins upstream +# Creates all generated files which need to be committed +generate: generate_sdks schema +generate_sdks: generate_nodejs generate_python generate_dotnet generate_go generate_java +build_sdks: build_nodejs build_python build_dotnet build_go build_java +install_sdks: install_nodejs_sdk install_python_sdk install_dotnet_sdk install_go_sdk install_java_sdk +.PHONY: development only_build build generate generate_sdks build_sdks install_sdks + +help: + @echo "Usage: make [target]" + @echo "" + @echo "Main Targets" + @echo " build (default) Build the provider and all SDKs and install for testing" + @echo " generate Generate all SDKs, documentation and schema" + @echo " provider Build the local provider binary" + @echo " lint_provider<.fix> Run the linter on the provider (& optionally fix)" + @echo " test_provider Run the provider tests" + @echo " test Run the example tests (must run 'build' first)" + @echo " clean Clean up generated files" + @echo "" + @echo "More Precise Targets" + @echo " schema Generate the schema" + @echo " generate_sdks Generate all SDKs" + @echo " build_sdks Build all SDKs" + @echo " install_sdks Install all SDKs" + @echo " provider_dist Build and package the provider for all platforms" + @echo "" + @echo "Tool Targets" + @echo " ci-mgmt Re-generate CI configuration from .ci-mgmt.yaml" + @echo " debug_tfgen Start a debug server for tfgen" + @echo "" + @echo "Internal Targets (automatically run as dependencies of other targets)" + @echo " prepare_local_workspace Prepare for building" + @echo " install_plugins Install plugin dependencies" + @echo " upstream Initialize the upstream submodule, if present" + @echo "" + @echo "Language-Specific Targets" + @echo " generate_[language] Generate the SDK files ready for committing" + @echo " build_[language] Build the SDK to check correctness" + @echo " install_[language]_sdk Install the SDK ready for testing" + @echo "" + @echo " [language] = nodejs python dotnet go java" + @echo "" +.PHONY: help + +GEN_PULUMI_HOME := $(WORKING_DIR)/.pulumi +GEN_PULUMI_CONVERT_EXAMPLES_CACHE_DIR := $(GEN_PULUMI_HOME)/examples-cache +GEN_ENVS := PULUMI_HOME=$(GEN_PULUMI_HOME) PULUMI_CONVERT_EXAMPLES_CACHE_DIR=$(GEN_PULUMI_CONVERT_EXAMPLES_CACHE_DIR) PULUMI_CONVERT=$(PULUMI_CONVERT) PULUMI_DISABLE_AUTOMATIC_PLUGIN_ACQUISITION=$(PULUMI_CONVERT) + +generate_dotnet: .make/generate_dotnet +build_dotnet: .make/build_dotnet +.make/generate_dotnet: export PATH := $(WORKING_DIR)/.pulumi/bin:$(PATH) +.make/generate_dotnet: .make/install_plugins bin/$(TFGEN) + $(GEN_ENVS) $(WORKING_DIR)/bin/$(TFGEN) dotnet --out sdk/dotnet/ + cd sdk/dotnet/ && \ + printf "module fake_dotnet_module // Exclude this directory from Go tools\n\ngo 1.17\n" > go.mod && \ + echo "$(VERSION_GENERIC)" >version.txt + @touch $@ +.make/build_dotnet: .make/generate_dotnet + cd sdk/dotnet/ && dotnet build + @touch $@ +.PHONY: generate_dotnet build_dotnet + +generate_go: .make/generate_go +build_go: .make/build_go +.make/generate_go: export PATH := $(WORKING_DIR)/.pulumi/bin:$(PATH) +.make/generate_go: .make/install_plugins bin/$(TFGEN) + $(GEN_ENVS) $(WORKING_DIR)/bin/$(TFGEN) go --out sdk/go/ + @touch $@ +.make/build_go: .make/generate_go + cd sdk && go list "$$(grep -e "^module" go.mod | cut -d ' ' -f 2)/go/..." | xargs -I {} bash -c 'go build {} && go clean -i {}' + @touch $@ +.PHONY: generate_go build_go + +generate_java: .make/generate_java +build_java: .make/build_java +.make/generate_java: export PATH := $(WORKING_DIR)/.pulumi/bin:$(PATH) +.make/generate_java: PACKAGE_VERSION := $(VERSION_GENERIC) +.make/generate_java: .make/install_plugins bin/pulumi-java-gen .make/schema + PULUMI_HOME=$(GEN_PULUMI_HOME) PULUMI_CONVERT_EXAMPLES_CACHE_DIR=$(GEN_PULUMI_CONVERT_EXAMPLES_CACHE_DIR) bin/$(JAVA_GEN) generate --schema provider/cmd/$(PROVIDER)/schema.json --out sdk/java --build gradle-nexus + printf "module fake_java_module // Exclude this directory from Go tools\n\ngo 1.17\n" > sdk/java/go.mod + @touch $@ +.make/build_java: PACKAGE_VERSION := $(VERSION_GENERIC) +.make/build_java: .make/generate_java + cd sdk/java/ && \ + gradle --console=plain build && \ + gradle --console=plain javadoc + @touch $@ +.PHONY: generate_java build_java + +generate_nodejs: .make/generate_nodejs +build_nodejs: .make/build_nodejs +.make/generate_nodejs: export PATH := $(WORKING_DIR)/.pulumi/bin:$(PATH) +.make/generate_nodejs: .make/install_plugins bin/$(TFGEN) + $(GEN_ENVS) $(WORKING_DIR)/bin/$(TFGEN) nodejs --out sdk/nodejs/ + printf "module fake_nodejs_module // Exclude this directory from Go tools\n\ngo 1.17\n" > sdk/nodejs/go.mod + @touch $@ +.make/build_nodejs: .make/generate_nodejs + cd sdk/nodejs/ && \ + yarn install && \ + yarn run tsc && \ + cp ../../README.md ../../LICENSE* package.json yarn.lock ./bin/ + @touch $@ +.PHONY: generate_nodejs build_nodejs + +generate_python: .make/generate_python +build_python: .make/build_python +.make/generate_python: export PATH := $(WORKING_DIR)/.pulumi/bin:$(PATH) +.make/generate_python: .make/install_plugins bin/$(TFGEN) + $(GEN_ENVS) $(WORKING_DIR)/bin/$(TFGEN) python --out sdk/python/ + printf "module fake_python_module // Exclude this directory from Go tools\n\ngo 1.17\n" > sdk/python/go.mod + cp README.md sdk/python/ + @touch $@ +.make/build_python: .make/generate_python + cd sdk/python/ && \ + rm -rf ./bin/ ../python.bin/ && cp -R . ../python.bin && mv ../python.bin ./bin && \ + rm ./bin/go.mod && \ + python3 -m venv venv && \ + ./venv/bin/python -m pip install build==1.2.1 && \ + cd ./bin && \ + ../venv/bin/python -m build . + @touch $@ +.PHONY: generate_python build_python + +clean: + rm -rf sdk/{dotnet,nodejs,go,python} + rm -rf bin/* + rm -rf .make/* + if dotnet nuget list source | grep "$(WORKING_DIR)/nuget"; then \ + dotnet nuget remove source "$(WORKING_DIR)/nuget" \ + ; fi +.PHONY: clean + +install_dotnet_sdk: .make/install_dotnet_sdk +.make/install_dotnet_sdk: .make/build_dotnet + mkdir -p nuget + find sdk/dotnet/bin -name '*.nupkg' -print -exec cp -p "{}" ${WORKING_DIR}/nuget \; + if ! dotnet nuget list source | grep "${WORKING_DIR}/nuget"; then \ + dotnet nuget add source "${WORKING_DIR}/nuget" --name "${WORKING_DIR}/nuget" \ + ; fi + @touch $@ +install_go_sdk: +install_java_sdk: +install_nodejs_sdk: .make/install_nodejs_sdk +.make/install_nodejs_sdk: .make/build_nodejs + yarn link --cwd $(WORKING_DIR)/sdk/nodejs/bin + @touch $@ +install_python_sdk: +.PHONY: install_dotnet_sdk install_go_sdk install_java_sdk install_nodejs_sdk install_python_sdk + +# Install Pulumi plugins required for TFGen to resolve references +install_plugins: .make/install_plugins +.make/install_plugins: export PULUMI_HOME := $(WORKING_DIR)/.pulumi +.make/install_plugins: export PATH := $(WORKING_DIR)/.pulumi/bin:$(PATH) +.make/install_plugins: .pulumi/bin/pulumi + @touch $@ +.PHONY: install_plugins + +lint_provider: provider + cd provider && golangci-lint run --path-prefix provider -c ../.golangci.yml +# `lint_provider.fix` is a utility target meant to be run manually +# that will run the linter and fix errors when possible. +lint_provider.fix: + cd provider && golangci-lint run --path-prefix provider -c ../.golangci.yml --fix +.PHONY: lint_provider lint_provider.fix + +# `make provider_no_deps` builds the provider binary directly, without ensuring that +# `cmd/pulumi-resource-awsx/schema.json` is valid and up to date. +# To create a release ready binary, you should use `make provider`. +provider: bin/$(PROVIDER) +provider_no_deps: + $(call build_provider_cmd,$(WORKING_DIR)/bin/$(PROVIDER)) +bin/$(PROVIDER): .make/schema + $(call build_provider_cmd,$(WORKING_DIR)/bin/$(PROVIDER)) +.PHONY: provider provider_no_deps + +test: export PATH := $(WORKING_DIR)/bin:$(PATH) +test: + cd examples && go test -v -tags=all -parallel $(TESTPARALLELISM) -timeout 2h +.PHONY: test + +test_provider: + cd provider && go test -v -short \ + -coverprofile="coverage.txt" \ + -coverpkg="./...,github.com/hashicorp/terraform-provider-..." \ + -parallel $(TESTPARALLELISM) \ + ./... +.PHONY: test_provider + +tfgen: schema +schema: .make/schema +# This does actually have dependencies, but we're keeping it around for backwards compatibility for now +tfgen_no_deps: .make/schema +.make/schema: export PULUMI_HOME := $(WORKING_DIR)/.pulumi +.make/schema: export PATH := $(WORKING_DIR)/.pulumi/bin:$(PATH) +.make/schema: export PULUMI_CONVERT := $(PULUMI_CONVERT) +.make/schema: export PULUMI_CONVERT_EXAMPLES_CACHE_DIR := $(WORKING_DIR)/.pulumi/examples-cache +.make/schema: export PULUMI_DISABLE_AUTOMATIC_PLUGIN_ACQUISITION := $(PULUMI_CONVERT) +.make/schema: export PULUMI_MISSING_DOCS_ERROR := $(PULUMI_MISSING_DOCS_ERROR) +.make/schema: bin/$(TFGEN) .make/install_plugins .make/upstream + $(WORKING_DIR)/bin/$(TFGEN) schema --out provider/cmd/$(PROVIDER) + (cd provider && VERSION=$(VERSION_GENERIC) go generate cmd/$(PROVIDER)/main.go) + @touch $@ +tfgen_build_only: bin/$(TFGEN) +bin/$(TFGEN): provider/*.go $(wildcard go.mod provider/go.mod) .make/upstream + (cd provider && go build $(PULUMI_PROVIDER_BUILD_PARALLELISM) -o $(WORKING_DIR)/bin/$(TFGEN) -ldflags "$(LDFLAGS_PROJ_VERSION) $(LDFLAGS_EXTRAS)" $(PROJECT)/$(PROVIDER_PATH)/cmd/$(TFGEN)) +.PHONY: tfgen schema tfgen_no_deps tfgen_build_only + +upstream: .make/upstream +.make/upstream: + @touch $@ + +bin/pulumi-java-gen: .pulumi-java-gen.version + pulumictl download-binary -n pulumi-language-java -v v$(shell cat .pulumi-java-gen.version) -r pulumi/pulumi-java + +# To make an immediately observable change to .ci-mgmt.yaml: +# +# - Edit .ci-mgmt.yaml +# - Run make ci-mgmt to apply the change locally. +# +ci-mgmt: .ci-mgmt.yaml + go run github.com/pulumi/ci-mgmt/provider-ci@master generate +.PHONY: ci-mgmt + +# Because some codegen depends on the version of the CLI used, we install a local CLI +# version pinned to the same version as `provider/go.mod`. +# +# This logic compares the version of .pulumi/bin/pulumi already installed. If it matches +# the desired version, we just print. Otherwise we (re)install pulumi at the desired +# version. +.pulumi/bin/pulumi: .pulumi/version + @if [ -x .pulumi/bin/pulumi ] && [ "v$$(cat .pulumi/version)" = "$$(.pulumi/bin/pulumi version)" ]; then \ + echo "pulumi/bin/pulumi version: v$$(cat .pulumi/version)"; \ + touch $@; \ + else \ + curl -fsSL https://get.pulumi.com | \ + HOME=$(WORKING_DIR) sh -s -- --version "$$(cat .pulumi/version)"; \ + fi + +# Compute the version of Pulumi to use by inspecting the Go dependencies of the provider. +.pulumi/version: $(wildcard go.mod provider/go.mod) + cd provider && go list -f "{{slice .Version 1}}" -m github.com/pulumi/pulumi/pkg/v3 | tee ../$@ + +# Start debug server for tfgen +debug_tfgen: + dlv --listen=:2345 --headless=true --api-version=2 exec $(WORKING_DIR)/bin/$(TFGEN) -- schema --out provider/cmd/$(PROVIDER) +.PHONY: debug_tfgen + +# Provider cross-platform build & packaging + +# Set these variables to enable signing of the windows binary +AZURE_SIGNING_CLIENT_ID ?= +AZURE_SIGNING_CLIENT_SECRET ?= +AZURE_SIGNING_TENANT_ID ?= +AZURE_SIGNING_KEY_VAULT_URI ?= +SKIP_SIGNING ?= + +# These targets assume that the schema-embed.json exists - it's generated by tfgen. +# We disable CGO to ensure that the binary is statically linked. +bin/linux-amd64/$(PROVIDER): export GOOS := linux +bin/linux-amd64/$(PROVIDER): export GOARCH := amd64 +bin/linux-arm64/$(PROVIDER): export GOOS := linux +bin/linux-arm64/$(PROVIDER): export GOARCH := arm64 +bin/darwin-amd64/$(PROVIDER): export GOOS := darwin +bin/darwin-amd64/$(PROVIDER): export GOARCH := amd64 +bin/darwin-arm64/$(PROVIDER): export GOOS := darwin +bin/darwin-arm64/$(PROVIDER): export GOARCH := arm64 +bin/windows-amd64/$(PROVIDER).exe: export GOOS := windows +bin/windows-amd64/$(PROVIDER).exe: export GOARCH := amd64 +bin/%/$(PROVIDER) bin/%/$(PROVIDER).exe: bin/jsign-6.0.jar + $(call build_provider_cmd,$(WORKING_DIR)/$@) + @# Only sign windows binary if fully configured. + @# Test variables set by joining with | between and looking for || showing at least one variable is empty. + @# Move the binary to a temporary location and sign it there to avoid the target being up-to-date if signing fails. + set -e; \ + if [[ "${GOOS}-${GOARCH}" = "windows-amd64" && ${SKIP_SIGNING} != "true" ]]; then \ + if [[ "|${AZURE_SIGNING_CLIENT_ID}|${AZURE_SIGNING_CLIENT_SECRET}|${AZURE_SIGNING_TENANT_ID}|${AZURE_SIGNING_KEY_VAULT_URI}|" == *"||"* ]]; then \ + echo "Can't sign windows binaries as required configuration not set: AZURE_SIGNING_CLIENT_ID, AZURE_SIGNING_CLIENT_SECRET, AZURE_SIGNING_TENANT_ID, AZURE_SIGNING_KEY_VAULT_URI"; \ + echo "To rebuild with signing delete the unsigned $@ and rebuild with the fixed configuration"; \ + if [[ ${CI} == "true" ]]; then exit 1; fi; \ + else \ + mv $@ $@.unsigned; \ + az login --service-principal \ + --username "${AZURE_SIGNING_CLIENT_ID}" \ + --password "${AZURE_SIGNING_CLIENT_SECRET}" \ + --tenant "${AZURE_SIGNING_TENANT_ID}" \ + --output none; \ + ACCESS_TOKEN=$$(az account get-access-token --resource "https://vault.azure.net" | jq -r .accessToken); \ + java -jar bin/jsign-6.0.jar \ + --storetype AZUREKEYVAULT \ + --keystore "PulumiCodeSigning" \ + --url "${AZURE_SIGNING_KEY_VAULT_URI}" \ + --storepass "$${ACCESS_TOKEN}" \ + $@.unsigned; \ + mv $@.unsigned $@; \ + az logout; \ + fi; \ + fi + +bin/jsign-6.0.jar: + wget https://github.com/ebourg/jsign/releases/download/6.0/jsign-6.0.jar --output-document=bin/jsign-6.0.jar + +provider-linux-amd64: bin/linux-amd64/$(PROVIDER) +provider-linux-arm64: bin/linux-arm64/$(PROVIDER) +provider-darwin-amd64: bin/darwin-amd64/$(PROVIDER) +provider-darwin-arm64: bin/darwin-arm64/$(PROVIDER) +provider-windows-amd64: bin/windows-amd64/$(PROVIDER).exe +.PHONY: provider-linux-amd64 provider-linux-arm64 provider-darwin-amd64 provider-darwin-arm64 provider-windows-amd64 + +bin/$(PROVIDER)-v$(VERSION_GENERIC)-linux-amd64.tar.gz: bin/linux-amd64/$(PROVIDER) +bin/$(PROVIDER)-v$(VERSION_GENERIC)-linux-arm64.tar.gz: bin/linux-arm64/$(PROVIDER) +bin/$(PROVIDER)-v$(VERSION_GENERIC)-darwin-amd64.tar.gz: bin/darwin-amd64/$(PROVIDER) +bin/$(PROVIDER)-v$(VERSION_GENERIC)-darwin-arm64.tar.gz: bin/darwin-arm64/$(PROVIDER) +bin/$(PROVIDER)-v$(VERSION_GENERIC)-windows-amd64.tar.gz: bin/windows-amd64/$(PROVIDER).exe +bin/$(PROVIDER)-v$(VERSION_GENERIC)-%.tar.gz: + @mkdir -p dist + @# $< is the last dependency (the binary path from above) e.g. bin/linux-amd64/pulumi-resource-xyz + @# $@ is the current target e.g. bin/pulumi-resource-xyz-v1.2.3-linux-amd64.tar.gz + tar --gzip -cf $@ README.md LICENSE -C $$(dirname $<) . + +provider_dist-linux-amd64: bin/$(PROVIDER)-v$(VERSION_GENERIC)-linux-amd64.tar.gz +provider_dist-linux-arm64: bin/$(PROVIDER)-v$(VERSION_GENERIC)-linux-arm64.tar.gz +provider_dist-darwin-amd64: bin/$(PROVIDER)-v$(VERSION_GENERIC)-darwin-amd64.tar.gz +provider_dist-darwin-arm64: bin/$(PROVIDER)-v$(VERSION_GENERIC)-darwin-arm64.tar.gz +provider_dist-windows-amd64: bin/$(PROVIDER)-v$(VERSION_GENERIC)-windows-amd64.tar.gz +provider_dist: provider_dist-linux-amd64 provider_dist-linux-arm64 provider_dist-darwin-amd64 provider_dist-darwin-arm64 provider_dist-windows-amd64 +.PHONY: provider_dist-linux-amd64 provider_dist-linux-arm64 provider_dist-darwin-amd64 provider_dist-darwin-arm64 provider_dist-windows-amd64 provider_dist +# shard computes tests to run and modifies the CI runner's environment. +shard: + @(cd examples && go run github.com/pulumi/shard@6dbd62a9c3c5ef92806a9a030b18fe073228ddd2 --total $(SHARD_TOTAL) --index $(SHARD_INDEX) --output env) >> "$(GITHUB_ENV)" + +# test_shard runs the tests specified by a regex contained in $SHARD_TESTS for paths $SHARD_PATHS. +test_shard: + cd examples && \ + go test -tags=all -v -count=1 -coverprofile="coverage.txt" -coverpkg=./... -timeout 3h -parallel ${TESTPARALLELISM} -run "$(SHARD_TESTS)" $(SHARD_PATHS) +# Permit providers to extend the Makefile with provider-specific Make includes. +include $(wildcard .mk/*.mk) From 94f22528c1f11363cd3e28d7b7d9ab435cf0e459 Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 10:47:09 -0500 Subject: [PATCH 13/25] Make customization: custom provider build and test --- .mk/build.mk | 37 +++++++++++++++++++++++++++++++++++++ .mk/test_provider.mk | 10 ++++++++++ 2 files changed, 47 insertions(+) create mode 100644 .mk/build.mk create mode 100644 .mk/test_provider.mk diff --git a/.mk/build.mk b/.mk/build.mk new file mode 100644 index 000000000..5c84d2f13 --- /dev/null +++ b/.mk/build.mk @@ -0,0 +1,37 @@ +build_provider_cmd = make PROVIDER_BIN=$(1) .make/provider + +PROVIDER_BIN := bin/${PROVIDER} +PROVIDER_OS := $(shell go env GOOS) +PROVIDER_ARCH := $(shell go env GOARCH) + +PKG_ARGS := --no-bytecode --public-packages "*" --public +AWSX_SRC := $(wildcard awsx/*.*) $(wildcard awsx/*/*.ts) + +.PHONY: .make/provider +.make/provider: .make/provider/${PROVIDER_OS}-${PROVIDER_ARCH} + +.make/provider/linux-amd64: TARGET := node16-linuxstatic-x64 +.make/provider/linux-arm64: TARGET := node16-linuxstatic-arm64 +.make/provider/darwin-amd64: TARGET := node16-macos-x64 +.make/provider/darwin-arm64: TARGET := node16-macos-arm64 +.make/provider/windows-amd64: TARGET := node16-win-x64 +.make/provider/%: .make/awsx_bin .make/gen_types + cd awsx && yarn run pkg . ${PKG_ARGS} --target "${TARGET}" --output "${PROVIDER_BIN}" + mkdir -p .make/provider + @touch $@ + +.make/gen_types: .make/awsx_node_modules .make/schema + cd awsx && yarn gen-types + @touch $@ + +.make/awsx_bin: .make/awsx_node_modules .make/gen_types ${AWSX_SRC} + @cd awsx && \ + yarn tsc && \ + cp package.json ./bin/ && \ + cp ../provider/cmd/pulumi-resource-awsx/schema-embed.json ./bin/schema.json && \ + sed -i.bak -e "s/\$${VERSION}/$(VERSION_GENERIC)/g" ./bin/package.json + @touch $@ + +.make/awsx_node_modules: awsx/package.json awsx/yarn.lock + yarn install --cwd awsx --no-progress + @touch $@ diff --git a/.mk/test_provider.mk b/.mk/test_provider.mk new file mode 100644 index 000000000..77afe1a28 --- /dev/null +++ b/.mk/test_provider.mk @@ -0,0 +1,10 @@ +test_provider: yarn_tests + +yarn_tests: + cd awsx && yarn test +.PHONY: yarn_tests + +# istanbul_tests: +# cd awsx-classic/tests && \ +# yarn && yarn run build && yarn run mocha $$(find bin -name '*.spec.js') +# .PHONY: istanbul_tests From 322e5890f93c1170c02458112eae0fbbaef57aca Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 10:50:17 -0500 Subject: [PATCH 14/25] make provider generate_sdks --- provider/cmd/pulumi-resource-awsx/schema.json | 3364 +++++++++++++++++ sdk/dotnet/go.mod | 3 + sdk/java/go.mod | 3 + sdk/nodejs/go.mod | 3 + sdk/python/go.mod | 3 + 5 files changed, 3376 insertions(+) create mode 100644 provider/cmd/pulumi-resource-awsx/schema.json create mode 100644 sdk/dotnet/go.mod create mode 100644 sdk/java/go.mod create mode 100644 sdk/nodejs/go.mod create mode 100644 sdk/python/go.mod diff --git a/provider/cmd/pulumi-resource-awsx/schema.json b/provider/cmd/pulumi-resource-awsx/schema.json new file mode 100644 index 000000000..621a34bcf --- /dev/null +++ b/provider/cmd/pulumi-resource-awsx/schema.json @@ -0,0 +1,3364 @@ +{ + "name": "awsx", + "displayName": "AWSx (Pulumi Crosswalk for AWS)", + "description": "Pulumi Amazon Web Services (AWS) AWSX Components.", + "keywords": [ + "pulumi", + "aws", + "awsx", + "kind/component", + "category/cloud" + ], + "homepage": "https://pulumi.com", + "license": "Apache-2.0", + "repository": "https://github.com/pulumi/pulumi-awsx", + "publisher": "Pulumi", + "language": { + "csharp": { + "liftSingleValueMethodReturns": true, + "packageReferences": { + "Pulumi": "3.*", + "Pulumi.Aws": "6.*", + "Pulumi.Docker": "4.*" + }, + "respectSchemaVersion": true + }, + "go": { + "generateResourceContainerTypes": true, + "importBasePath": "github.com/pulumi/pulumi-awsx/sdk/v2/go/awsx", + "internalDependencies": [ + "github.com/pulumi/pulumi-docker-build/sdk/go/dockerbuild" + ], + "liftSingleValueMethodReturns": true, + "respectSchemaVersion": true + }, + "java": { + "dependencies": { + "com.pulumi:aws": "6.66.2", + "com.pulumi:docker-build": "0.0.8" + } + }, + "nodejs": { + "dependencies": { + "@aws-sdk/client-ecs": "^3.405.0", + "@pulumi/aws": "^6.66.2", + "@pulumi/docker-build": "^0.0.8", + "@types/aws-lambda": "^8.10.23", + "docker-classic": "npm:@pulumi/docker@3.6.1", + "mime": "^2.0.0" + }, + "devDependencies": { + "@types/mime": "^2.0.0", + "@types/node": "^18", + "typescript": "^4.6.2" + }, + "respectSchemaVersion": true + }, + "python": { + "liftSingleValueMethodReturns": true, + "pyproject": { + "enabled": true + }, + "readme": "Pulumi Amazon Web Services (AWS) AWSX Components.", + "requires": { + "pulumi-aws": "\u003e=6.0.4,\u003c7.0.0", + "pulumi-docker-build": "\u003e=0.0.8,\u003c1.0.0" + }, + "respectSchemaVersion": true, + "usesIOClasses": true + } + }, + "config": {}, + "types": { + "awsx:awsx:Bucket": { + "description": "The set of arguments for constructing a Bucket resource.", + "properties": { + "accelerationStatus": { + "type": "string", + "description": "Sets the accelerate configuration of an existing bucket. Can be `Enabled` or `Suspended`.\n" + }, + "acl": { + "type": "string", + "description": "The [canned ACL](https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl) to apply. Valid values are `private`, `public-read`, `public-read-write`, `aws-exec-read`, `authenticated-read`, and `log-delivery-write`. Defaults to `private`. Conflicts with `grant`.\n" + }, + "arn": { + "type": "string", + "description": "The ARN of the bucket. Will be of format `arn:aws:s3:::bucketname`.\n" + }, + "bucket": { + "type": "string", + "description": "The name of the bucket. If omitted, this provider will assign a random, unique name. Must be lowercase and less than or equal to 63 characters in length. A full list of bucket naming rules [may be found here](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html).\n", + "language": { + "csharp": { + "name": "BucketName" + } + }, + "willReplaceOnChanges": true + }, + "bucketPrefix": { + "type": "string", + "description": "Creates a unique bucket name beginning with the specified prefix. Conflicts with `bucket`. Must be lowercase and less than or equal to 37 characters in length. A full list of bucket naming rules [may be found here](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html).\n", + "willReplaceOnChanges": true + }, + "corsRules": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketCorsRule:BucketCorsRule" + }, + "description": "A rule of [Cross-Origin Resource Sharing](https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html) (documented below).\n" + }, + "forceDestroy": { + "type": "boolean", + "description": "A boolean that indicates all objects (including any [locked objects](https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock-overview.html)) should be deleted from the bucket so that the bucket can be destroyed without error. These objects are *not* recoverable.\n" + }, + "grants": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketGrant:BucketGrant" + }, + "description": "An [ACL policy grant](https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#sample-acl) (documented below). Conflicts with `acl`.\n" + }, + "hostedZoneId": { + "type": "string", + "description": "The [Route 53 Hosted Zone ID](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_website_region_endpoints) for this bucket's region.\n" + }, + "lifecycleRules": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketLifecycleRule:BucketLifecycleRule" + }, + "description": "A configuration of [object lifecycle management](http://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html) (documented below).\n" + }, + "loggings": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketLogging:BucketLogging" + }, + "description": "A settings of [bucket logging](https://docs.aws.amazon.com/AmazonS3/latest/UG/ManagingBucketLogging.html) (documented below).\n" + }, + "objectLockConfiguration": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketObjectLockConfiguration:BucketObjectLockConfiguration", + "description": "A configuration of [S3 object locking](https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html) (documented below)\n\n\u003e **NOTE:** You cannot use `acceleration_status` in `cn-north-1` or `us-gov-west-1`\n" + }, + "policy": { + "type": "string", + "description": "A valid [bucket policy](https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html) JSON document. Note that if the policy document is not specific enough (but still valid), this provider may view the policy as constantly changing in a `pulumi preview`. In this case, please make sure you use the verbose/specific version of the policy.\n" + }, + "replicationConfiguration": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketReplicationConfiguration:BucketReplicationConfiguration", + "description": "A configuration of [replication configuration](http://docs.aws.amazon.com/AmazonS3/latest/dev/crr.html) (documented below).\n" + }, + "requestPayer": { + "type": "string", + "description": "Specifies who should bear the cost of Amazon S3 data transfer.\nCan be either `BucketOwner` or `Requester`. By default, the owner of the S3 bucket would incur\nthe costs of any data transfer. See [Requester Pays Buckets](http://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html)\ndeveloper guide for more information.\n" + }, + "serverSideEncryptionConfiguration": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketServerSideEncryptionConfiguration:BucketServerSideEncryptionConfiguration", + "description": "A configuration of [server-side encryption configuration](http://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html) (documented below)\n" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "A map of tags to assign to the bucket. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + }, + "versioning": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketVersioning:BucketVersioning", + "description": "A state of [versioning](https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html) (documented below)\n" + }, + "website": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:s3/BucketWebsite:BucketWebsite", + "description": "A website object (documented below).\n" + }, + "websiteDomain": { + "type": "string", + "description": "The domain of the website endpoint, if the bucket is configured with a website. If not, this will be an empty string. This is used to create Route 53 alias records.\n" + }, + "websiteEndpoint": { + "type": "string", + "description": "The website endpoint, if the bucket is configured with a website. If not, this will be an empty string.\n" + } + }, + "type": "object" + }, + "awsx:awsx:DefaultBucket": { + "description": "Bucket with default setup unless explicitly skipped.", + "properties": { + "args": { + "$ref": "#/types/awsx:awsx:Bucket", + "plain": true, + "description": "Arguments to use instead of the default values during creation." + }, + "existing": { + "$ref": "#/types/awsx:awsx:ExistingBucket", + "plain": true, + "description": "Identity of an existing bucket to use. Cannot be used in combination with `args`." + }, + "skip": { + "type": "boolean", + "plain": true, + "description": "Skip creation of the bucket." + } + }, + "type": "object" + }, + "awsx:awsx:DefaultLogGroup": { + "description": "Log group with default setup unless explicitly skipped.", + "properties": { + "args": { + "$ref": "#/types/awsx:awsx:LogGroup", + "plain": true, + "description": "Arguments to use instead of the default values during creation." + }, + "existing": { + "$ref": "#/types/awsx:awsx:ExistingLogGroup", + "plain": true, + "description": "Identity of an existing log group to use. Cannot be used in combination with `args` or `opts`." + }, + "skip": { + "type": "boolean", + "plain": true, + "description": "Skip creation of the log group." + } + }, + "type": "object" + }, + "awsx:awsx:DefaultRoleWithPolicy": { + "description": "Role and policy attachments with default setup unless explicitly skipped or an existing role ARN provided.", + "properties": { + "args": { + "$ref": "#/types/awsx:awsx:RoleWithPolicy", + "plain": true, + "description": "Args to use when creating the role and policies. Can't be specified if `roleArn` is used." + }, + "roleArn": { + "type": "string", + "description": "ARN of existing role to use instead of creating a new role. Cannot be used in combination with `args` or `opts`." + }, + "skip": { + "type": "boolean", + "plain": true, + "description": "Skips creation of the role if set to `true`." + } + }, + "type": "object" + }, + "awsx:awsx:DefaultSecurityGroup": { + "description": "Security Group with default setup unless explicitly skipped or an existing security group id provided.", + "properties": { + "args": { + "$ref": "#/types/awsx:awsx:SecurityGroup", + "plain": true, + "description": "Args to use when creating the security group. Can't be specified if `securityGroupId` is used." + }, + "securityGroupId": { + "type": "string", + "description": "Id of existing security group to use instead of creating a new security group. Cannot be used in combination with `args` or `opts`." + }, + "skip": { + "type": "boolean", + "plain": true, + "description": "Skips creation of the security group if set to `true`." + } + }, + "type": "object" + }, + "awsx:awsx:ExistingBucket": { + "description": "Reference to an existing bucket.", + "properties": { + "arn": { + "type": "string", + "description": "Arn of the bucket. Only one of [arn] or [name] can be specified." + }, + "name": { + "type": "string", + "description": "Name of the bucket. Only one of [arn] or [name] can be specified." + } + }, + "type": "object" + }, + "awsx:awsx:ExistingLogGroup": { + "description": "Reference to an existing log group.", + "properties": { + "arn": { + "type": "string", + "description": "Arn of the log group. Only one of [arn] or [name] can be specified." + }, + "name": { + "type": "string", + "description": "Name of the log group. Only one of [arn] or [name] can be specified." + }, + "region": { + "type": "string", + "description": "Region of the log group. If not specified, the provider region will be used." + } + }, + "type": "object" + }, + "awsx:awsx:LogGroup": { + "description": "The set of arguments for constructing a LogGroup resource.", + "properties": { + "kmsKeyId": { + "type": "string", + "description": "The ARN of the KMS Key to use when encrypting log data. Please note, after the AWS KMS CMK is disassociated from the log group,\nAWS CloudWatch Logs stops encrypting newly ingested data for the log group. All previously ingested data remains encrypted, and AWS CloudWatch Logs requires\npermissions for the CMK whenever the encrypted data is requested.\n" + }, + "logGroupClass": { + "type": "string", + "description": "Specified the log class of the log group. Possible values are: `STANDARD` or `INFREQUENT_ACCESS`.\n", + "willReplaceOnChanges": true + }, + "name": { + "type": "string", + "description": "The name of the log group. If omitted, this provider will assign a random, unique name.\n", + "willReplaceOnChanges": true + }, + "namePrefix": { + "type": "string", + "description": "Creates a unique name beginning with the specified prefix. Conflicts with `name`.\n", + "willReplaceOnChanges": true + }, + "retentionInDays": { + "type": "integer", + "description": "Specifies the number of days\nyou want to retain log events in the specified log group. Possible values are: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1096, 1827, 2192, 2557, 2922, 3288, 3653, and 0.\nIf you select 0, the events in the log group are always retained and never expire.\n" + }, + "skipDestroy": { + "type": "boolean", + "description": "Set to true if you do not wish the log group (and any logs it may contain) to be deleted at destroy time, and instead just remove the log group from the state.\n" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "A map of tags to assign to the resource. .If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + } + }, + "type": "object" + }, + "awsx:awsx:OptionalLogGroup": { + "description": "Log group which is only created if enabled.", + "properties": { + "args": { + "$ref": "#/types/awsx:awsx:LogGroup", + "plain": true, + "description": "Arguments to use instead of the default values during creation." + }, + "enable": { + "type": "boolean", + "plain": true, + "description": "Enable creation of the log group." + }, + "existing": { + "$ref": "#/types/awsx:awsx:ExistingLogGroup", + "plain": true, + "description": "Identity of an existing log group to use. Cannot be used in combination with `args` or `opts`." + } + }, + "type": "object" + }, + "awsx:awsx:RequiredBucket": { + "description": "Bucket with default setup.", + "properties": { + "args": { + "$ref": "#/types/awsx:awsx:Bucket", + "plain": true, + "description": "Arguments to use instead of the default values during creation." + }, + "existing": { + "$ref": "#/types/awsx:awsx:ExistingBucket", + "plain": true, + "description": "Identity of an existing bucket to use. Cannot be used in combination with `args`." + } + }, + "type": "object" + }, + "awsx:awsx:RequiredLogGroup": { + "description": "Log group with default setup.", + "properties": { + "args": { + "$ref": "#/types/awsx:awsx:LogGroup", + "plain": true, + "description": "Arguments to use instead of the default values during creation." + }, + "existing": { + "$ref": "#/types/awsx:awsx:ExistingLogGroup", + "plain": true, + "description": "Identity of an existing log group to use. Cannot be used in combination with `args` or `opts`." + } + }, + "type": "object" + }, + "awsx:awsx:RoleWithPolicy": { + "description": "The set of arguments for constructing a Role resource and Policy attachments.", + "properties": { + "description": { + "type": "string", + "description": "Description of the role.\n" + }, + "forceDetachPolicies": { + "type": "boolean", + "description": "Whether to force detaching any policies the role has before destroying it. Defaults to `false`.\n" + }, + "inlinePolicies": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:iam/RoleInlinePolicy:RoleInlinePolicy" + }, + "description": "Configuration block defining an exclusive set of IAM inline policies associated with the IAM role. See below. If no blocks are configured, Pulumi will not manage any inline policies in this resource. Configuring one empty block (i.e., `inline_policy {}`) will cause Pulumi to remove _all_ inline policies added out of band on `apply`.\n" + }, + "managedPolicyArns": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Set of exclusive IAM managed policy ARNs to attach to the IAM role. If this attribute is not configured, Pulumi will ignore policy attachments to this resource. When configured, Pulumi will align the role's managed policy attachments with this set by attaching or detaching managed policies. Configuring an empty set (i.e., `managed_policy_arns = []`) will cause Pulumi to remove _all_ managed policy attachments.\n" + }, + "maxSessionDuration": { + "type": "integer", + "description": "Maximum session duration (in seconds) that you want to set for the specified role. If you do not specify a value for this setting, the default maximum of one hour is applied. This setting can have a value from 1 hour to 12 hours.\n" + }, + "name": { + "type": "string", + "description": "Friendly name of the role. If omitted, the provider will assign a random, unique name. See [IAM Identifiers](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html) for more information.\n", + "willReplaceOnChanges": true + }, + "namePrefix": { + "type": "string", + "description": "Creates a unique friendly name beginning with the specified prefix. Conflicts with `name`.\n", + "willReplaceOnChanges": true + }, + "path": { + "type": "string", + "description": "Path to the role. See [IAM Identifiers](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html) for more information.\n", + "willReplaceOnChanges": true + }, + "permissionsBoundary": { + "type": "string", + "description": "ARN of the policy that is used to set the permissions boundary for the role.\n" + }, + "policyArns": { + "type": "array", + "items": { + "type": "string", + "plain": true + }, + "plain": true, + "description": "ARNs of the policies to attach to the created role." + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Key-value mapping of tags for the IAM role. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + } + }, + "type": "object" + }, + "awsx:awsx:SecurityGroup": { + "description": "The set of arguments for constructing a Security Group resource.", + "properties": { + "description": { + "type": "string", + "description": "Security group description. Defaults to `Managed by Pulumi`. Cannot be `\"\"`. **NOTE**: This field maps to the AWS `GroupDescription` attribute, for which there is no Update API. If you'd like to classify your security groups in a way that can be updated, use `tags`.\n", + "default": "Managed by Pulumi", + "willReplaceOnChanges": true + }, + "egress": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ec2/SecurityGroupEgress:SecurityGroupEgress" + }, + "description": "Configuration block for egress rules. Can be specified multiple times for each egress rule. Each egress block supports fields documented below. This argument is processed in attribute-as-blocks mode.\n" + }, + "ingress": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ec2/SecurityGroupIngress:SecurityGroupIngress" + }, + "description": "Configuration block for ingress rules. Can be specified multiple times for each ingress rule. Each ingress block supports fields documented below. This argument is processed in attribute-as-blocks mode.\n" + }, + "name": { + "type": "string", + "description": "Name of the security group. If omitted, the provider will assign a random, unique name.\n", + "willReplaceOnChanges": true + }, + "namePrefix": { + "type": "string", + "description": "Creates a unique name beginning with the specified prefix. Conflicts with `name`.\n", + "willReplaceOnChanges": true + }, + "revokeRulesOnDelete": { + "type": "boolean", + "description": "Instruct the provider to revoke all of the Security Groups attached ingress and egress rules before deleting the rule itself. This is normally not needed, however certain AWS services such as Elastic Map Reduce may automatically add required rules to security groups used with the service, and those rules may contain a cyclic dependency that prevent the security groups from being destroyed without removing the dependency first. Default `false`.\n" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Map of tags to assign to the resource. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + }, + "vpcId": { + "type": "string", + "description": "VPC ID. Defaults to the region's default VPC.\n", + "willReplaceOnChanges": true + } + }, + "type": "object" + }, + "awsx:cloudtrail:LogGroup": { + "description": "Defines the log group configuration for the CloudWatch Log Group to send logs to.", + "properties": { + "kmsKeyId": { + "type": "string", + "description": "The ARN of the KMS Key to use when encrypting log data." + }, + "namePrefix": { + "type": "string", + "description": "Creates a unique name beginning with the specified prefix" + }, + "retentionInDays": { + "type": "integer", + "description": "Specifies the number of days you want to retain log events in the specified log group. Possible values are: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653, and 0. If you select 0, the events in the log group are always retained and never expire." + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "A map of tags to assign to the resource. If configured with provider defaultTags present, tags with matching keys will overwrite those defined at the provider-level." + } + }, + "type": "object" + }, + "awsx:ec2:NatGatewayConfiguration": { + "description": "Configuration for NAT Gateways.", + "properties": { + "elasticIpAllocationIds": { + "type": "array", + "items": { + "type": "string" + }, + "plain": true, + "description": "A list of EIP allocation IDs to assign to the NAT Gateways. Optional. If specified, the number of supplied values must match the chosen strategy (either one, or the number of availability zones)." + }, + "strategy": { + "$ref": "#/types/awsx:ec2:NatGatewayStrategy", + "plain": true, + "description": "The strategy for deploying NAT Gateways." + } + }, + "type": "object", + "required": [ + "strategy" + ] + }, + "awsx:ec2:NatGatewayStrategy": { + "description": "A strategy for creating NAT Gateways for private subnets within a VPC.", + "type": "string", + "enum": [ + { + "description": "Do not create any NAT Gateways. Resources in private subnets will not be able to access the internet.", + "value": "None" + }, + { + "description": "Create a single NAT Gateway for the entire VPC. This configuration is not recommended for production infrastructure as it creates a single point of failure.", + "value": "Single" + }, + { + "description": "Create a NAT Gateway in each availability zone. This is the recommended configuration for production infrastructure.", + "value": "OnePerAz" + } + ] + }, + "awsx:ec2:ResolvedSubnetSpec": { + "description": "Configuration for a VPC subnet spec.", + "properties": { + "cidrBlocks": { + "type": "array", + "items": { + "type": "string" + }, + "description": "An optional list of CIDR blocks to assign to the subnet spec for each AZ. If specified, the count must match the number of AZs being used for the VPC, and must also be specified for all other subnet specs." + }, + "cidrMask": { + "type": "integer", + "description": "The netmask for the subnet's CIDR block. This is optional, the default value is inferred from the `cidrMask`, `cidrBlocks` or based on an even distribution of available space from the VPC's CIDR block after being divided evenly by availability zone." + }, + "name": { + "type": "string", + "description": "The subnet's name. Will be templated upon creation." + }, + "size": { + "type": "integer", + "description": "Optional size of the subnet's CIDR block - the number of hosts. This value must be a power of 2 (e.g. 256, 512, 1024, etc.). This is optional, the default value is inferred from the `cidrMask`, `cidrBlocks` or based on an even distribution of available space from the VPC's CIDR block after being divided evenly by availability zone." + }, + "type": { + "$ref": "#/types/awsx:ec2:SubnetType", + "description": "The type of subnet." + } + }, + "type": "object", + "required": [ + "type" + ] + }, + "awsx:ec2:SubnetAllocationStrategy": { + "description": "Strategy for calculating subnet ranges from the subnet specifications.", + "type": "string", + "enum": [ + { + "description": "Group private subnets first, followed by public subnets, followed by isolated subnets.", + "value": "Legacy" + }, + { + "description": "Order remains as specified by specs, allowing gaps where required.", + "value": "Auto" + }, + { + "description": "Whole range of VPC must be accounted for, using \"Unused\" spec types for deliberate gaps.", + "value": "Exact" + } + ] + }, + "awsx:ec2:SubnetSpec": { + "description": "Configuration for a VPC subnet.", + "properties": { + "cidrBlocks": { + "type": "array", + "items": { + "type": "string", + "plain": true + }, + "plain": true, + "description": "An optional list of CIDR blocks to assign to the subnet spec for each AZ. If specified, the count must match the number of AZs being used for the VPC, and must also be specified for all other subnet specs." + }, + "cidrMask": { + "type": "integer", + "plain": true, + "description": "The netmask for the subnet's CIDR block. This is optional, the default value is inferred from the `cidrMask`, `cidrBlocks` or based on an even distribution of available space from the VPC's CIDR block after being divided evenly by availability zone." + }, + "name": { + "type": "string", + "plain": true, + "description": "The subnet's name. Will be templated upon creation." + }, + "size": { + "type": "integer", + "plain": true, + "description": "Optional size of the subnet's CIDR block - the number of hosts. This value must be a power of 2 (e.g. 256, 512, 1024, etc.). This is optional, the default value is inferred from the `cidrMask`, `cidrBlocks` or based on an even distribution of available space from the VPC's CIDR block after being divided evenly by availability zone." + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "A map of tags to assign to the resource." + }, + "type": { + "$ref": "#/types/awsx:ec2:SubnetType", + "plain": true, + "description": "The type of subnet." + } + }, + "type": "object", + "required": [ + "type" + ] + }, + "awsx:ec2:SubnetType": { + "description": "A type of subnet within a VPC.", + "type": "string", + "enum": [ + { + "description": "A subnet whose hosts can directly communicate with the internet.", + "value": "Public" + }, + { + "description": "A subnet whose hosts can not directly communicate with the internet, but can initiate outbound network traffic via a NAT Gateway.", + "value": "Private" + }, + { + "description": "A subnet whose hosts have no connectivity with the internet.", + "value": "Isolated" + }, + { + "description": "A subnet range which is reserved, but no subnet will be created.", + "value": "Unused" + } + ] + }, + "awsx:ec2:VpcEndpointSpec": { + "description": "Provides a VPC Endpoint resource.\n\n\u003e **NOTE on VPC Endpoints and VPC Endpoint Associations:** The provider provides both standalone VPC Endpoint Associations for\nRoute Tables - (an association between a VPC endpoint and a single `route_table_id`),\nSecurity Groups - (an association between a VPC endpoint and a single `security_group_id`),\nand Subnets - (an association between a VPC endpoint and a single `subnet_id`) and\na VPC Endpoint resource with `route_table_ids` and `subnet_ids` attributes.\nDo not use the same resource ID in both a VPC Endpoint resource and a VPC Endpoint Association resource.\nDoing so will cause a conflict of associations and will overwrite the association.\n\n## Example Usage\n\n### Basic\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst s3 = new aws.ec2.VpcEndpoint(\"s3\", {\n vpcId: main.id,\n serviceName: \"com.amazonaws.us-west-2.s3\",\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\ns3 = aws.ec2.VpcEndpoint(\"s3\",\n vpc_id=main[\"id\"],\n service_name=\"com.amazonaws.us-west-2.s3\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var s3 = new Aws.Ec2.VpcEndpoint(\"s3\", new()\n {\n VpcId = main.Id,\n ServiceName = \"com.amazonaws.us-west-2.s3\",\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2\"\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 := ec2.NewVpcEndpoint(ctx, \"s3\", \u0026ec2.VpcEndpointArgs{\n\t\t\tVpcId: pulumi.Any(main.Id),\n\t\t\tServiceName: pulumi.String(\"com.amazonaws.us-west-2.s3\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.ec2.VpcEndpoint;\nimport com.pulumi.aws.ec2.VpcEndpointArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var s3 = new VpcEndpoint(\"s3\", VpcEndpointArgs.builder()\n .vpcId(main.id())\n .serviceName(\"com.amazonaws.us-west-2.s3\")\n .build());\n\n }\n}\n```\n```yaml\nresources:\n s3:\n type: aws:ec2:VpcEndpoint\n properties:\n vpcId: ${main.id}\n serviceName: com.amazonaws.us-west-2.s3\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Basic w/ Tags\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst s3 = new aws.ec2.VpcEndpoint(\"s3\", {\n vpcId: main.id,\n serviceName: \"com.amazonaws.us-west-2.s3\",\n tags: {\n Environment: \"test\",\n },\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\ns3 = aws.ec2.VpcEndpoint(\"s3\",\n vpc_id=main[\"id\"],\n service_name=\"com.amazonaws.us-west-2.s3\",\n tags={\n \"Environment\": \"test\",\n })\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var s3 = new Aws.Ec2.VpcEndpoint(\"s3\", new()\n {\n VpcId = main.Id,\n ServiceName = \"com.amazonaws.us-west-2.s3\",\n Tags = \n {\n { \"Environment\", \"test\" },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2\"\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 := ec2.NewVpcEndpoint(ctx, \"s3\", \u0026ec2.VpcEndpointArgs{\n\t\t\tVpcId: pulumi.Any(main.Id),\n\t\t\tServiceName: pulumi.String(\"com.amazonaws.us-west-2.s3\"),\n\t\t\tTags: pulumi.StringMap{\n\t\t\t\t\"Environment\": pulumi.String(\"test\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.ec2.VpcEndpoint;\nimport com.pulumi.aws.ec2.VpcEndpointArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var s3 = new VpcEndpoint(\"s3\", VpcEndpointArgs.builder()\n .vpcId(main.id())\n .serviceName(\"com.amazonaws.us-west-2.s3\")\n .tags(Map.of(\"Environment\", \"test\"))\n .build());\n\n }\n}\n```\n```yaml\nresources:\n s3:\n type: aws:ec2:VpcEndpoint\n properties:\n vpcId: ${main.id}\n serviceName: com.amazonaws.us-west-2.s3\n tags:\n Environment: test\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Interface Endpoint Type\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst ec2 = new aws.ec2.VpcEndpoint(\"ec2\", {\n vpcId: main.id,\n serviceName: \"com.amazonaws.us-west-2.ec2\",\n vpcEndpointType: \"Interface\",\n securityGroupIds: [sg1.id],\n privateDnsEnabled: true,\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nec2 = aws.ec2.VpcEndpoint(\"ec2\",\n vpc_id=main[\"id\"],\n service_name=\"com.amazonaws.us-west-2.ec2\",\n vpc_endpoint_type=\"Interface\",\n security_group_ids=[sg1[\"id\"]],\n private_dns_enabled=True)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var ec2 = new Aws.Ec2.VpcEndpoint(\"ec2\", new()\n {\n VpcId = main.Id,\n ServiceName = \"com.amazonaws.us-west-2.ec2\",\n VpcEndpointType = \"Interface\",\n SecurityGroupIds = new[]\n {\n sg1.Id,\n },\n PrivateDnsEnabled = true,\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2\"\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 := ec2.NewVpcEndpoint(ctx, \"ec2\", \u0026ec2.VpcEndpointArgs{\n\t\t\tVpcId: pulumi.Any(main.Id),\n\t\t\tServiceName: pulumi.String(\"com.amazonaws.us-west-2.ec2\"),\n\t\t\tVpcEndpointType: pulumi.String(\"Interface\"),\n\t\t\tSecurityGroupIds: pulumi.StringArray{\n\t\t\t\tsg1.Id,\n\t\t\t},\n\t\t\tPrivateDnsEnabled: pulumi.Bool(true),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.ec2.VpcEndpoint;\nimport com.pulumi.aws.ec2.VpcEndpointArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var ec2 = new VpcEndpoint(\"ec2\", VpcEndpointArgs.builder()\n .vpcId(main.id())\n .serviceName(\"com.amazonaws.us-west-2.ec2\")\n .vpcEndpointType(\"Interface\")\n .securityGroupIds(sg1.id())\n .privateDnsEnabled(true)\n .build());\n\n }\n}\n```\n```yaml\nresources:\n ec2:\n type: aws:ec2:VpcEndpoint\n properties:\n vpcId: ${main.id}\n serviceName: com.amazonaws.us-west-2.ec2\n vpcEndpointType: Interface\n securityGroupIds:\n - ${sg1.id}\n privateDnsEnabled: true\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Interface Endpoint Type with User-Defined IP Address\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst ec2 = new aws.ec2.VpcEndpoint(\"ec2\", {\n vpcId: example.id,\n serviceName: \"com.amazonaws.us-west-2.ec2\",\n vpcEndpointType: \"Interface\",\n subnetConfigurations: [\n {\n ipv4: \"10.0.1.10\",\n subnetId: example1.id,\n },\n {\n ipv4: \"10.0.2.10\",\n subnetId: example2.id,\n },\n ],\n subnetIds: [\n example1.id,\n example2.id,\n ],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nec2 = aws.ec2.VpcEndpoint(\"ec2\",\n vpc_id=example[\"id\"],\n service_name=\"com.amazonaws.us-west-2.ec2\",\n vpc_endpoint_type=\"Interface\",\n subnet_configurations=[\n {\n \"ipv4\": \"10.0.1.10\",\n \"subnet_id\": example1[\"id\"],\n },\n {\n \"ipv4\": \"10.0.2.10\",\n \"subnet_id\": example2[\"id\"],\n },\n ],\n subnet_ids=[\n example1[\"id\"],\n example2[\"id\"],\n ])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var ec2 = new Aws.Ec2.VpcEndpoint(\"ec2\", new()\n {\n VpcId = example.Id,\n ServiceName = \"com.amazonaws.us-west-2.ec2\",\n VpcEndpointType = \"Interface\",\n SubnetConfigurations = new[]\n {\n new Aws.Ec2.Inputs.VpcEndpointSubnetConfigurationArgs\n {\n Ipv4 = \"10.0.1.10\",\n SubnetId = example1.Id,\n },\n new Aws.Ec2.Inputs.VpcEndpointSubnetConfigurationArgs\n {\n Ipv4 = \"10.0.2.10\",\n SubnetId = example2.Id,\n },\n },\n SubnetIds = new[]\n {\n example1.Id,\n example2.Id,\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2\"\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 := ec2.NewVpcEndpoint(ctx, \"ec2\", \u0026ec2.VpcEndpointArgs{\n\t\t\tVpcId: pulumi.Any(example.Id),\n\t\t\tServiceName: pulumi.String(\"com.amazonaws.us-west-2.ec2\"),\n\t\t\tVpcEndpointType: pulumi.String(\"Interface\"),\n\t\t\tSubnetConfigurations: ec2.VpcEndpointSubnetConfigurationArray{\n\t\t\t\t\u0026ec2.VpcEndpointSubnetConfigurationArgs{\n\t\t\t\t\tIpv4: pulumi.String(\"10.0.1.10\"),\n\t\t\t\t\tSubnetId: pulumi.Any(example1.Id),\n\t\t\t\t},\n\t\t\t\t\u0026ec2.VpcEndpointSubnetConfigurationArgs{\n\t\t\t\t\tIpv4: pulumi.String(\"10.0.2.10\"),\n\t\t\t\t\tSubnetId: pulumi.Any(example2.Id),\n\t\t\t\t},\n\t\t\t},\n\t\t\tSubnetIds: pulumi.StringArray{\n\t\t\t\texample1.Id,\n\t\t\t\texample2.Id,\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.ec2.VpcEndpoint;\nimport com.pulumi.aws.ec2.VpcEndpointArgs;\nimport com.pulumi.aws.ec2.inputs.VpcEndpointSubnetConfigurationArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var ec2 = new VpcEndpoint(\"ec2\", VpcEndpointArgs.builder()\n .vpcId(example.id())\n .serviceName(\"com.amazonaws.us-west-2.ec2\")\n .vpcEndpointType(\"Interface\")\n .subnetConfigurations( \n VpcEndpointSubnetConfigurationArgs.builder()\n .ipv4(\"10.0.1.10\")\n .subnetId(example1.id())\n .build(),\n VpcEndpointSubnetConfigurationArgs.builder()\n .ipv4(\"10.0.2.10\")\n .subnetId(example2.id())\n .build())\n .subnetIds( \n example1.id(),\n example2.id())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n ec2:\n type: aws:ec2:VpcEndpoint\n properties:\n vpcId: ${example.id}\n serviceName: com.amazonaws.us-west-2.ec2\n vpcEndpointType: Interface\n subnetConfigurations:\n - ipv4: 10.0.1.10\n subnetId: ${example1.id}\n - ipv4: 10.0.2.10\n subnetId: ${example2.id}\n subnetIds:\n - ${example1.id}\n - ${example2.id}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Gateway Load Balancer Endpoint Type\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst current = aws.getCallerIdentity({});\nconst example = new aws.ec2.VpcEndpointService(\"example\", {\n acceptanceRequired: false,\n allowedPrincipals: [current.then(current =\u003e current.arn)],\n gatewayLoadBalancerArns: [exampleAwsLb.arn],\n});\nconst exampleVpcEndpoint = new aws.ec2.VpcEndpoint(\"example\", {\n serviceName: example.serviceName,\n subnetIds: [exampleAwsSubnet.id],\n vpcEndpointType: example.serviceType,\n vpcId: exampleAwsVpc.id,\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\ncurrent = aws.get_caller_identity()\nexample = aws.ec2.VpcEndpointService(\"example\",\n acceptance_required=False,\n allowed_principals=[current.arn],\n gateway_load_balancer_arns=[example_aws_lb[\"arn\"]])\nexample_vpc_endpoint = aws.ec2.VpcEndpoint(\"example\",\n service_name=example.service_name,\n subnet_ids=[example_aws_subnet[\"id\"]],\n vpc_endpoint_type=example.service_type,\n vpc_id=example_aws_vpc[\"id\"])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var current = Aws.GetCallerIdentity.Invoke();\n\n var example = new Aws.Ec2.VpcEndpointService(\"example\", new()\n {\n AcceptanceRequired = false,\n AllowedPrincipals = new[]\n {\n current.Apply(getCallerIdentityResult =\u003e getCallerIdentityResult.Arn),\n },\n GatewayLoadBalancerArns = new[]\n {\n exampleAwsLb.Arn,\n },\n });\n\n var exampleVpcEndpoint = new Aws.Ec2.VpcEndpoint(\"example\", new()\n {\n ServiceName = example.ServiceName,\n SubnetIds = new[]\n {\n exampleAwsSubnet.Id,\n },\n VpcEndpointType = example.ServiceType,\n VpcId = exampleAwsVpc.Id,\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws\"\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tcurrent, err := aws.GetCallerIdentity(ctx, \u0026aws.GetCallerIdentityArgs{}, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\texample, err := ec2.NewVpcEndpointService(ctx, \"example\", \u0026ec2.VpcEndpointServiceArgs{\n\t\t\tAcceptanceRequired: pulumi.Bool(false),\n\t\t\tAllowedPrincipals: pulumi.StringArray{\n\t\t\t\tpulumi.String(current.Arn),\n\t\t\t},\n\t\t\tGatewayLoadBalancerArns: pulumi.StringArray{\n\t\t\t\texampleAwsLb.Arn,\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ec2.NewVpcEndpoint(ctx, \"example\", \u0026ec2.VpcEndpointArgs{\n\t\t\tServiceName: example.ServiceName,\n\t\t\tSubnetIds: pulumi.StringArray{\n\t\t\t\texampleAwsSubnet.Id,\n\t\t\t},\n\t\t\tVpcEndpointType: example.ServiceType,\n\t\t\tVpcId: pulumi.Any(exampleAwsVpc.Id),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.AwsFunctions;\nimport com.pulumi.aws.inputs.GetCallerIdentityArgs;\nimport com.pulumi.aws.ec2.VpcEndpointService;\nimport com.pulumi.aws.ec2.VpcEndpointServiceArgs;\nimport com.pulumi.aws.ec2.VpcEndpoint;\nimport com.pulumi.aws.ec2.VpcEndpointArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n final var current = AwsFunctions.getCallerIdentity();\n\n var example = new VpcEndpointService(\"example\", VpcEndpointServiceArgs.builder()\n .acceptanceRequired(false)\n .allowedPrincipals(current.applyValue(getCallerIdentityResult -\u003e getCallerIdentityResult.arn()))\n .gatewayLoadBalancerArns(exampleAwsLb.arn())\n .build());\n\n var exampleVpcEndpoint = new VpcEndpoint(\"exampleVpcEndpoint\", VpcEndpointArgs.builder()\n .serviceName(example.serviceName())\n .subnetIds(exampleAwsSubnet.id())\n .vpcEndpointType(example.serviceType())\n .vpcId(exampleAwsVpc.id())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n example:\n type: aws:ec2:VpcEndpointService\n properties:\n acceptanceRequired: false\n allowedPrincipals:\n - ${current.arn}\n gatewayLoadBalancerArns:\n - ${exampleAwsLb.arn}\n exampleVpcEndpoint:\n type: aws:ec2:VpcEndpoint\n name: example\n properties:\n serviceName: ${example.serviceName}\n subnetIds:\n - ${exampleAwsSubnet.id}\n vpcEndpointType: ${example.serviceType}\n vpcId: ${exampleAwsVpc.id}\nvariables:\n current:\n fn::invoke:\n function: aws:getCallerIdentity\n arguments: {}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nUsing `pulumi import`, import VPC Endpoints using the VPC endpoint `id`. For example:\n\n```sh\n$ pulumi import aws:ec2/vpcEndpoint:VpcEndpoint endpoint1 vpce-3ecf2a57\n```\n", + "properties": { + "autoAccept": { + "type": "boolean", + "plain": true, + "description": "Accept the VPC endpoint (the VPC endpoint and service need to be in the same AWS account)." + }, + "dnsOptions": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ec2/VpcEndpointDnsOptions:VpcEndpointDnsOptions", + "description": "The DNS options for the endpoint. See dns_options below.\n" + }, + "ipAddressType": { + "type": "string", + "description": "The IP address type for the endpoint. Valid values are `ipv4`, `dualstack`, and `ipv6`.\n" + }, + "policy": { + "type": "string", + "description": "A policy to attach to the endpoint that controls access to the service. This is a JSON formatted string. Defaults to full access. All `Gateway` and some `Interface` endpoints support policies - see the [relevant AWS documentation](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-access.html) for more details.\n" + }, + "privateDnsEnabled": { + "type": "boolean", + "plain": true, + "description": "Whether or not to associate a private hosted zone with the specified VPC. Applicable for endpoints of type Interface. Defaults to `false`." + }, + "routeTableIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "One or more route table IDs. Applicable for endpoints of type `Gateway`.\n" + }, + "securityGroupIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The ID of one or more security groups to associate with the network interface. Applicable for endpoints of type `Interface`.\nIf no security groups are specified, the VPC's [default security group](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#DefaultSecurityGroup) is associated with the endpoint.\n" + }, + "serviceName": { + "type": "string", + "plain": true, + "description": "The service name. For AWS services the service name is usually in the form `com.amazonaws.\u003cregion\u003e.\u003cservice\u003e` (the SageMaker Notebook service is an exception to this rule, the service name is in the form `aws.sagemaker.\u003cregion\u003e.notebook`)." + }, + "serviceRegion": { + "type": "string", + "description": "The AWS region of the VPC Endpoint Service. If specified, the VPC endpoint will connect to the service in the provided region. Applicable for endpoints of type `Interface`.\n", + "willReplaceOnChanges": true + }, + "subnetConfigurations": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ec2/VpcEndpointSubnetConfiguration:VpcEndpointSubnetConfiguration" + }, + "description": "Subnet configuration for the endpoint, used to select specific IPv4 and/or IPv6 addresses to the endpoint. See subnet_configuration below.\n" + }, + "subnetIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The ID of one or more subnets in which to create a network interface for the endpoint. Applicable for endpoints of type `GatewayLoadBalancer` and `Interface`. Interface type endpoints cannot function without being assigned to a subnet.\n" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "A map of tags to assign to the resource. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + }, + "vpcEndpointType": { + "type": "string", + "description": "The VPC endpoint type, `Gateway`, `GatewayLoadBalancer`, or `Interface`. Defaults to `Gateway`.\n", + "willReplaceOnChanges": true + } + }, + "type": "object", + "required": [ + "serviceName" + ] + }, + "awsx:ecr:BuilderVersion": { + "description": "The version of the Docker builder", + "type": "string", + "enum": [ + { + "description": "The first generation builder for Docker Daemon.", + "value": "BuilderV1" + }, + { + "description": "The builder based on moby/buildkit project", + "value": "BuilderBuildKit" + } + ] + }, + "awsx:ecr:DockerBuild": { + "description": "Arguments for building a docker image", + "properties": { + "args": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "An optional map of named build-time argument variables to set during the Docker build. This flag allows you to pass built-time variables that can be accessed like environment variables inside the `RUN` instruction." + }, + "builderVersion": { + "$ref": "#/types/awsx:ecr:BuilderVersion", + "plain": true, + "description": "The version of the Docker builder." + }, + "cacheFrom": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Images to consider as cache sources" + }, + "context": { + "type": "string", + "description": "Path to a directory to use for the Docker build context, usually the directory in which the Dockerfile resides (although dockerfile may be used to choose a custom location independent of this choice). If not specified, the context defaults to the current working directory; if a relative path is used, it is relative to the current working directory that Pulumi is evaluating." + }, + "dockerfile": { + "type": "string", + "description": "dockerfile may be used to override the default Dockerfile name and/or location. By default, it is assumed to be a file named Dockerfile in the root of the build context." + }, + "imageName": { + "type": "string", + "description": "Custom name for the underlying Docker image resource. If omitted, the image tag assigned by the provider will be used" + }, + "imageTag": { + "type": "string", + "description": "Custom image tag for the resulting docker image. If omitted a random string will be used" + }, + "platform": { + "type": "string", + "description": "The architecture of the platform you want to build this image for, e.g. `linux/arm64`." + }, + "target": { + "type": "string", + "description": "The target of the dockerfile to build" + } + }, + "type": "object" + }, + "awsx:ecr:lifecyclePolicy": { + "description": "Simplified lifecycle policy model consisting of one or more rules that determine which images in a repository should be expired. See https://docs.aws.amazon.com/AmazonECR/latest/userguide/lifecycle_policy_examples.html for more details.", + "properties": { + "rules": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ecr:lifecyclePolicyRule" + }, + "description": "Specifies the rules to determine how images should be retired from this repository. Rules are ordered from lowest priority to highest. If there is a rule with a `selection` value of `any`, then it will have the highest priority." + }, + "skip": { + "type": "boolean", + "plain": true, + "description": "Skips creation of the policy if set to `true`." + } + }, + "type": "object" + }, + "awsx:ecr:lifecyclePolicyRule": { + "description": "A lifecycle policy rule that determine which images in a repository should be expired.", + "properties": { + "description": { + "type": "string", + "description": "Describes the purpose of a rule within a lifecycle policy." + }, + "maximumAgeLimit": { + "type": "number", + "description": "The maximum age limit (in days) for your images. Either [maximumNumberOfImages] or [maximumAgeLimit] must be provided." + }, + "maximumNumberOfImages": { + "type": "number", + "description": "The maximum number of images that you want to retain in your repository. Either [maximumNumberOfImages] or [maximumAgeLimit] must be provided." + }, + "tagPrefixList": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of image tag prefixes on which to take action with your lifecycle policy. Only used if you specified \"tagStatus\": \"tagged\". For example, if your images are tagged as prod, prod1, prod2, and so on, you would use the tag prefix prod to specify all of them. If you specify multiple tags, only the images with all specified tags are selected." + }, + "tagStatus": { + "$ref": "#/types/awsx:ecr:lifecycleTagStatus", + "description": "Determines whether the lifecycle policy rule that you are adding specifies a tag for an image. Acceptable options are tagged, untagged, or any. If you specify any, then all images have the rule evaluated against them. If you specify tagged, then you must also specify a tagPrefixList value. If you specify untagged, then you must omit tagPrefixList." + } + }, + "type": "object", + "required": [ + "tagStatus" + ] + }, + "awsx:ecr:lifecycleTagStatus": { + "type": "string", + "enum": [ + { + "name": "any", + "description": "Evaluate rule against all images", + "value": "any" + }, + { + "name": "untagged", + "description": "Only evaluate rule against untagged images", + "value": "untagged" + }, + { + "name": "tagged", + "description": "Only evaluated rule against images with specified prefixes", + "value": "tagged" + } + ] + }, + "awsx:ecs:EC2ServiceTaskDefinition": { + "description": "Create a TaskDefinition resource with the given unique name, arguments, and options.\nCreates required log-group and task \u0026 execution roles.\nPresents required Service load balancers if target group included in port mappings.", + "properties": { + "container": { + "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", + "plain": true, + "description": "Single container to make a TaskDefinition from. Useful for simple cases where there aren't\nmultiple containers, especially when creating a TaskDefinition to call [run] on.\n\nEither [container] or [containers] must be provided." + }, + "containers": { + "type": "object", + "additionalProperties": { + "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", + "plain": true + }, + "plain": true, + "description": "All the containers to make a TaskDefinition from. Useful when creating a Service that will\ncontain many containers within.\n\nEither [container] or [containers] must be provided." + }, + "cpu": { + "type": "string", + "description": "The number of cpu units used by the task. If not provided, a default will be computed based on the cumulative needs specified by [containerDefinitions]" + }, + "ephemeralStorage": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionEphemeralStorage:TaskDefinitionEphemeralStorage", + "description": "The amount of ephemeral storage to allocate for the task. This parameter is used to expand the total amount of ephemeral storage available, beyond the default amount, for tasks hosted on AWS Fargate. See Ephemeral Storage.\n", + "willReplaceOnChanges": true + }, + "executionRole": { + "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", + "plain": true, + "description": "The execution role that the Amazon ECS container agent and the Docker daemon can assume.\nWill be created automatically if not defined." + }, + "family": { + "type": "string", + "description": "An optional unique name for your task definition. If not specified, then a default will be created." + }, + "inferenceAccelerators": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionInferenceAccelerator:TaskDefinitionInferenceAccelerator" + }, + "description": "Configuration block(s) with Inference Accelerators settings. Detailed below.\n", + "willReplaceOnChanges": true + }, + "ipcMode": { + "type": "string", + "description": "IPC resource namespace to be used for the containers in the task The valid values are `host`, `task`, and `none`.\n", + "willReplaceOnChanges": true + }, + "logGroup": { + "$ref": "#/types/awsx:awsx:DefaultLogGroup", + "plain": true, + "description": "A set of volume blocks that containers in your task may use." + }, + "memory": { + "type": "string", + "description": "The amount (in MiB) of memory used by the task. If not provided, a default will be computed\nbased on the cumulative needs specified by [containerDefinitions]" + }, + "networkMode": { + "type": "string", + "description": "Docker networking mode to use for the containers in the task. Valid values are `none`, `bridge`, `awsvpc`, and `host`.\n", + "willReplaceOnChanges": true + }, + "pidMode": { + "type": "string", + "description": "Process namespace to use for the containers in the task. The valid values are `host` and `task`.\n", + "willReplaceOnChanges": true + }, + "placementConstraints": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionPlacementConstraint:TaskDefinitionPlacementConstraint" + }, + "description": "Configuration block for rules that are taken into consideration during task placement. Maximum number of `placement_constraints` is `10`. Detailed below.\n", + "willReplaceOnChanges": true + }, + "proxyConfiguration": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionProxyConfiguration:TaskDefinitionProxyConfiguration", + "description": "Configuration block for the App Mesh proxy. Detailed below.\n", + "willReplaceOnChanges": true + }, + "runtimePlatform": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionRuntimePlatform:TaskDefinitionRuntimePlatform", + "description": "Configuration block for runtime_platform that containers in your task may use.\n", + "willReplaceOnChanges": true + }, + "skipDestroy": { + "type": "boolean", + "description": "Whether to retain the old revision when the resource is destroyed or replacement is necessary. Default is `false`.\n" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Key-value map of resource tags. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + }, + "taskRole": { + "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", + "plain": true, + "description": "IAM role that allows your Amazon ECS container task to make calls to other AWS services.\nWill be created automatically if not defined." + }, + "trackLatest": { + "type": "boolean", + "description": "Whether should track latest `ACTIVE` task definition on AWS or the one created with the resource stored in state. Default is `false`. Useful in the event the task definition is modified outside of this resource.\n" + }, + "volumes": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionVolume:TaskDefinitionVolume" + }, + "description": "Configuration block for volumes that containers in your task may use. Detailed below.\n", + "willReplaceOnChanges": true + } + }, + "type": "object" + }, + "awsx:ecs:FargateServiceTaskDefinition": { + "description": "Create a TaskDefinition resource with the given unique name, arguments, and options.\nCreates required log-group and task \u0026 execution roles.\nPresents required Service load balancers if target group included in port mappings.", + "properties": { + "container": { + "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", + "plain": true, + "description": "Single container to make a TaskDefinition from. Useful for simple cases where there aren't\nmultiple containers, especially when creating a TaskDefinition to call [run] on.\n\nEither [container] or [containers] must be provided." + }, + "containers": { + "type": "object", + "additionalProperties": { + "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", + "plain": true + }, + "plain": true, + "description": "All the containers to make a TaskDefinition from. Useful when creating a Service that will\ncontain many containers within.\n\nEither [container] or [containers] must be provided." + }, + "cpu": { + "type": "string", + "description": "The number of cpu units used by the task. If not provided, a default will be computed based on the cumulative needs specified by [containerDefinitions]" + }, + "ephemeralStorage": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionEphemeralStorage:TaskDefinitionEphemeralStorage", + "description": "The amount of ephemeral storage to allocate for the task. This parameter is used to expand the total amount of ephemeral storage available, beyond the default amount, for tasks hosted on AWS Fargate. See Ephemeral Storage.\n", + "willReplaceOnChanges": true + }, + "executionRole": { + "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", + "plain": true, + "description": "The execution role that the Amazon ECS container agent and the Docker daemon can assume.\nWill be created automatically if not defined." + }, + "family": { + "type": "string", + "description": "An optional unique name for your task definition. If not specified, then a default will be created." + }, + "inferenceAccelerators": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionInferenceAccelerator:TaskDefinitionInferenceAccelerator" + }, + "description": "Configuration block(s) with Inference Accelerators settings. Detailed below.\n", + "willReplaceOnChanges": true + }, + "ipcMode": { + "type": "string", + "description": "IPC resource namespace to be used for the containers in the task The valid values are `host`, `task`, and `none`.\n", + "willReplaceOnChanges": true + }, + "logGroup": { + "$ref": "#/types/awsx:awsx:DefaultLogGroup", + "plain": true, + "description": "A set of volume blocks that containers in your task may use." + }, + "memory": { + "type": "string", + "description": "The amount (in MiB) of memory used by the task. If not provided, a default will be computed\nbased on the cumulative needs specified by [containerDefinitions]" + }, + "pidMode": { + "type": "string", + "description": "Process namespace to use for the containers in the task. The valid values are `host` and `task`.\n", + "willReplaceOnChanges": true + }, + "placementConstraints": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionPlacementConstraint:TaskDefinitionPlacementConstraint" + }, + "description": "Configuration block for rules that are taken into consideration during task placement. Maximum number of `placement_constraints` is `10`. Detailed below.\n", + "willReplaceOnChanges": true + }, + "proxyConfiguration": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionProxyConfiguration:TaskDefinitionProxyConfiguration", + "description": "Configuration block for the App Mesh proxy. Detailed below.\n", + "willReplaceOnChanges": true + }, + "runtimePlatform": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionRuntimePlatform:TaskDefinitionRuntimePlatform", + "description": "Configuration block for runtime_platform that containers in your task may use.\n", + "willReplaceOnChanges": true + }, + "skipDestroy": { + "type": "boolean", + "description": "Whether to retain the old revision when the resource is destroyed or replacement is necessary. Default is `false`.\n" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Key-value map of resource tags. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + }, + "taskRole": { + "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", + "plain": true, + "description": "IAM role that allows your Amazon ECS container task to make calls to other AWS services.\nWill be created automatically if not defined." + }, + "trackLatest": { + "type": "boolean", + "description": "Whether should track latest `ACTIVE` task definition on AWS or the one created with the resource stored in state. Default is `false`. Useful in the event the task definition is modified outside of this resource.\n" + }, + "volumes": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionVolume:TaskDefinitionVolume" + }, + "description": "Configuration block for volumes that containers in your task may use. Detailed below.\n", + "willReplaceOnChanges": true + } + }, + "type": "object" + }, + "awsx:ecs:TaskDefinitionContainerDefinition": { + "description": "List of container definitions that are passed to the Docker daemon on a container instance", + "properties": { + "command": { + "type": "array", + "items": { + "type": "string" + } + }, + "cpu": { + "type": "integer" + }, + "dependsOn": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDependency" + } + }, + "disableNetworking": { + "type": "boolean" + }, + "dnsSearchDomains": { + "type": "array", + "items": { + "type": "string" + } + }, + "dnsServers": { + "type": "array", + "items": { + "type": "string" + } + }, + "dockerLabels": { + "$ref": "pulumi.json#/Any" + }, + "dockerSecurityOptions": { + "type": "array", + "items": { + "type": "string" + } + }, + "entryPoint": { + "type": "array", + "items": { + "type": "string" + } + }, + "environment": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ecs:TaskDefinitionKeyValuePair" + }, + "description": "The environment variables to pass to a container" + }, + "environmentFiles": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ecs:TaskDefinitionEnvironmentFile" + }, + "description": "The list of one or more files that contain the environment variables to pass to a container" + }, + "essential": { + "type": "boolean" + }, + "extraHosts": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ecs:TaskDefinitionHostEntry" + } + }, + "firelensConfiguration": { + "$ref": "#/types/awsx:ecs:TaskDefinitionFirelensConfiguration" + }, + "healthCheck": { + "$ref": "#/types/awsx:ecs:TaskDefinitionHealthCheck" + }, + "hostname": { + "type": "string" + }, + "image": { + "type": "string", + "description": "The image used to start a container. This string is passed directly to the Docker daemon." + }, + "interactive": { + "type": "boolean" + }, + "links": { + "type": "array", + "items": { + "type": "string" + } + }, + "linuxParameters": { + "$ref": "#/types/awsx:ecs:TaskDefinitionLinuxParameters" + }, + "logConfiguration": { + "$ref": "#/types/awsx:ecs:TaskDefinitionLogConfiguration" + }, + "memory": { + "type": "integer", + "description": "The amount (in MiB) of memory to present to the container. If your container attempts to exceed the memory specified here, the container is killed." + }, + "memoryReservation": { + "type": "integer" + }, + "mountPoints": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ecs:TaskDefinitionMountPoint" + } + }, + "name": { + "type": "string", + "description": "The name of a container. Up to 255 letters (uppercase and lowercase), numbers, hyphens, and underscores are allowed" + }, + "portMappings": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ecs:TaskDefinitionPortMapping" + }, + "description": "Port mappings allow containers to access ports on the host container instance to send or receive traffic." + }, + "privileged": { + "type": "boolean" + }, + "pseudoTerminal": { + "type": "boolean" + }, + "readonlyRootFilesystem": { + "type": "boolean" + }, + "repositoryCredentials": { + "$ref": "#/types/awsx:ecs:TaskDefinitionRepositoryCredentials" + }, + "resourceRequirements": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ecs:TaskDefinitionResourceRequirement" + } + }, + "secrets": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ecs:TaskDefinitionSecret" + } + }, + "startTimeout": { + "type": "integer" + }, + "stopTimeout": { + "type": "integer" + }, + "systemControls": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ecs:TaskDefinitionSystemControl" + } + }, + "ulimits": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ecs:TaskDefinitionUlimit" + } + }, + "user": { + "type": "string" + }, + "volumesFrom": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ecs:TaskDefinitionVolumeFrom" + } + }, + "workingDirectory": { + "type": "string" + } + }, + "type": "object", + "required": [ + "image", + "name" + ] + }, + "awsx:ecs:TaskDefinitionContainerDependency": { + "properties": { + "condition": { + "type": "string" + }, + "containerName": { + "type": "string" + } + }, + "type": "object" + }, + "awsx:ecs:TaskDefinitionDevice": { + "properties": { + "containerPath": { + "type": "string" + }, + "hostPath": { + "type": "string" + }, + "permissions": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "type": "object" + }, + "awsx:ecs:TaskDefinitionEnvironmentFile": { + "properties": { + "type": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "awsx:ecs:TaskDefinitionFirelensConfiguration": { + "properties": { + "options": { + "$ref": "pulumi.json#/Any" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "awsx:ecs:TaskDefinitionHealthCheck": { + "description": "The health check command and associated configuration parameters for the container.", + "properties": { + "command": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A string array representing the command that the container runs to determine if it is healthy." + }, + "interval": { + "type": "integer", + "description": "The time period in seconds between each health check execution. You may specify between 5 and 300 seconds. The default value is 30 seconds." + }, + "retries": { + "type": "integer", + "description": "The number of times to retry a failed health check before the container is considered unhealthy. You may specify between 1 and 10 retries. The default value is three retries." + }, + "startPeriod": { + "type": "integer", + "description": "The optional grace period within which to provide containers time to bootstrap before failed health checks count towards the maximum number of retries. You may specify between 0 and 300 seconds. The startPeriod is disabled by default." + }, + "timeout": { + "type": "integer", + "description": "The time period in seconds to wait for a health check to succeed before it is considered a failure. You may specify between 2 and 60 seconds. The default value is 5 seconds." + } + }, + "type": "object" + }, + "awsx:ecs:TaskDefinitionHostEntry": { + "properties": { + "hostname": { + "type": "string" + }, + "ipAddress": { + "type": "string" + } + }, + "type": "object" + }, + "awsx:ecs:TaskDefinitionKernelCapabilities": { + "properties": { + "add": { + "type": "array", + "items": { + "type": "string" + } + }, + "drop": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "type": "object" + }, + "awsx:ecs:TaskDefinitionKeyValuePair": { + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "awsx:ecs:TaskDefinitionLinuxParameters": { + "properties": { + "capabilities": { + "$ref": "#/types/awsx:ecs:TaskDefinitionKernelCapabilities" + }, + "devices": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ecs:TaskDefinitionDevice" + } + }, + "initProcessEnabled": { + "type": "boolean" + }, + "maxSwap": { + "type": "integer" + }, + "sharedMemorySize": { + "type": "integer" + }, + "swappiness": { + "type": "integer" + }, + "tmpfs": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ecs:TaskDefinitionTmpfs" + } + } + }, + "type": "object" + }, + "awsx:ecs:TaskDefinitionLogConfiguration": { + "properties": { + "logDriver": { + "type": "string" + }, + "options": { + "$ref": "pulumi.json#/Any" + }, + "secretOptions": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ecs:TaskDefinitionSecret" + } + } + }, + "type": "object", + "required": [ + "logDriver" + ] + }, + "awsx:ecs:TaskDefinitionMountPoint": { + "properties": { + "containerPath": { + "type": "string" + }, + "readOnly": { + "type": "boolean" + }, + "sourceVolume": { + "type": "string" + } + }, + "type": "object" + }, + "awsx:ecs:TaskDefinitionPortMapping": { + "properties": { + "appProtocol": { + "$ref": "#/types/awsx:ecs:TaskDefinitionPortMappingAppProtocol" + }, + "containerPort": { + "type": "integer" + }, + "containerPortRange": { + "type": "string" + }, + "hostPort": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "protocol": { + "type": "string" + }, + "targetGroup": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2FtargetGroup:TargetGroup" + } + }, + "type": "object" + }, + "awsx:ecs:TaskDefinitionPortMappingAppProtocol": { + "type": "string", + "enum": [ + { + "name": "Http", + "value": "http" + }, + { + "name": "Http2", + "value": "http2" + }, + { + "name": "Grpc", + "value": "grpc" + } + ] + }, + "awsx:ecs:TaskDefinitionRepositoryCredentials": { + "properties": { + "credentialsParameter": { + "type": "string" + } + }, + "type": "object" + }, + "awsx:ecs:TaskDefinitionResourceRequirement": { + "properties": { + "type": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object", + "required": [ + "type", + "value" + ] + }, + "awsx:ecs:TaskDefinitionSecret": { + "properties": { + "name": { + "type": "string" + }, + "valueFrom": { + "type": "string" + } + }, + "type": "object", + "required": [ + "name", + "valueFrom" + ] + }, + "awsx:ecs:TaskDefinitionSystemControl": { + "properties": { + "namespace": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "awsx:ecs:TaskDefinitionTmpfs": { + "properties": { + "containerPath": { + "type": "string" + }, + "mountOptions": { + "type": "array", + "items": { + "type": "string" + } + }, + "size": { + "type": "integer" + } + }, + "type": "object", + "required": [ + "size" + ] + }, + "awsx:ecs:TaskDefinitionUlimit": { + "properties": { + "hardLimit": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "softLimit": { + "type": "integer" + } + }, + "type": "object", + "required": [ + "hardLimit", + "name", + "softLimit" + ] + }, + "awsx:ecs:TaskDefinitionVolumeFrom": { + "properties": { + "readOnly": { + "type": "boolean" + }, + "sourceContainer": { + "type": "string" + } + }, + "type": "object" + }, + "awsx:lb:Listener": { + "description": "Provides a Load Balancer Listener resource.\n\n\u003e **Note:** `aws.alb.Listener` is known as `aws.lb.Listener`. The functionality is identical.\n\n## Example Usage\n\n### Forward Action\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst frontEnd = new aws.lb.LoadBalancer(\"front_end\", {});\nconst frontEndTargetGroup = new aws.lb.TargetGroup(\"front_end\", {});\nconst frontEndListener = new aws.lb.Listener(\"front_end\", {\n loadBalancerArn: frontEnd.arn,\n port: 443,\n protocol: \"HTTPS\",\n sslPolicy: \"ELBSecurityPolicy-2016-08\",\n certificateArn: \"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\",\n defaultActions: [{\n type: \"forward\",\n targetGroupArn: frontEndTargetGroup.arn,\n }],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nfront_end = aws.lb.LoadBalancer(\"front_end\")\nfront_end_target_group = aws.lb.TargetGroup(\"front_end\")\nfront_end_listener = aws.lb.Listener(\"front_end\",\n load_balancer_arn=front_end.arn,\n port=443,\n protocol=\"HTTPS\",\n ssl_policy=\"ELBSecurityPolicy-2016-08\",\n certificate_arn=\"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\",\n default_actions=[{\n \"type\": \"forward\",\n \"target_group_arn\": front_end_target_group.arn,\n }])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var frontEnd = new Aws.LB.LoadBalancer(\"front_end\");\n\n var frontEndTargetGroup = new Aws.LB.TargetGroup(\"front_end\");\n\n var frontEndListener = new Aws.LB.Listener(\"front_end\", new()\n {\n LoadBalancerArn = frontEnd.Arn,\n Port = 443,\n Protocol = \"HTTPS\",\n SslPolicy = \"ELBSecurityPolicy-2016-08\",\n CertificateArn = \"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\",\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"forward\",\n TargetGroupArn = frontEndTargetGroup.Arn,\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tfrontEnd, err := lb.NewLoadBalancer(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfrontEndTargetGroup, err := lb.NewTargetGroup(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewListener(ctx, \"front_end\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: frontEnd.Arn,\n\t\t\tPort: pulumi.Int(443),\n\t\t\tProtocol: pulumi.String(\"HTTPS\"),\n\t\t\tSslPolicy: pulumi.String(\"ELBSecurityPolicy-2016-08\"),\n\t\t\tCertificateArn: pulumi.String(\"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\"),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"forward\"),\n\t\t\t\t\tTargetGroupArn: frontEndTargetGroup.Arn,\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.LoadBalancer;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var frontEnd = new LoadBalancer(\"frontEnd\");\n\n var frontEndTargetGroup = new TargetGroup(\"frontEndTargetGroup\");\n\n var frontEndListener = new Listener(\"frontEndListener\", ListenerArgs.builder()\n .loadBalancerArn(frontEnd.arn())\n .port(\"443\")\n .protocol(\"HTTPS\")\n .sslPolicy(\"ELBSecurityPolicy-2016-08\")\n .certificateArn(\"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\")\n .defaultActions(ListenerDefaultActionArgs.builder()\n .type(\"forward\")\n .targetGroupArn(frontEndTargetGroup.arn())\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n frontEnd:\n type: aws:lb:LoadBalancer\n name: front_end\n frontEndTargetGroup:\n type: aws:lb:TargetGroup\n name: front_end\n frontEndListener:\n type: aws:lb:Listener\n name: front_end\n properties:\n loadBalancerArn: ${frontEnd.arn}\n port: '443'\n protocol: HTTPS\n sslPolicy: ELBSecurityPolicy-2016-08\n certificateArn: arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\n defaultActions:\n - type: forward\n targetGroupArn: ${frontEndTargetGroup.arn}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\nTo a NLB:\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst frontEnd = new aws.lb.Listener(\"front_end\", {\n loadBalancerArn: frontEndAwsLb.arn,\n port: 443,\n protocol: \"TLS\",\n sslPolicy: \"ELBSecurityPolicy-2016-08\",\n certificateArn: \"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\",\n alpnPolicy: \"HTTP2Preferred\",\n defaultActions: [{\n type: \"forward\",\n targetGroupArn: frontEndAwsLbTargetGroup.arn,\n }],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nfront_end = aws.lb.Listener(\"front_end\",\n load_balancer_arn=front_end_aws_lb[\"arn\"],\n port=443,\n protocol=\"TLS\",\n ssl_policy=\"ELBSecurityPolicy-2016-08\",\n certificate_arn=\"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\",\n alpn_policy=\"HTTP2Preferred\",\n default_actions=[{\n \"type\": \"forward\",\n \"target_group_arn\": front_end_aws_lb_target_group[\"arn\"],\n }])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var frontEnd = new Aws.LB.Listener(\"front_end\", new()\n {\n LoadBalancerArn = frontEndAwsLb.Arn,\n Port = 443,\n Protocol = \"TLS\",\n SslPolicy = \"ELBSecurityPolicy-2016-08\",\n CertificateArn = \"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\",\n AlpnPolicy = \"HTTP2Preferred\",\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"forward\",\n TargetGroupArn = frontEndAwsLbTargetGroup.Arn,\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\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 := lb.NewListener(ctx, \"front_end\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: pulumi.Any(frontEndAwsLb.Arn),\n\t\t\tPort: pulumi.Int(443),\n\t\t\tProtocol: pulumi.String(\"TLS\"),\n\t\t\tSslPolicy: pulumi.String(\"ELBSecurityPolicy-2016-08\"),\n\t\t\tCertificateArn: pulumi.String(\"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\"),\n\t\t\tAlpnPolicy: pulumi.String(\"HTTP2Preferred\"),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"forward\"),\n\t\t\t\t\tTargetGroupArn: pulumi.Any(frontEndAwsLbTargetGroup.Arn),\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var frontEnd = new Listener(\"frontEnd\", ListenerArgs.builder()\n .loadBalancerArn(frontEndAwsLb.arn())\n .port(\"443\")\n .protocol(\"TLS\")\n .sslPolicy(\"ELBSecurityPolicy-2016-08\")\n .certificateArn(\"arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\")\n .alpnPolicy(\"HTTP2Preferred\")\n .defaultActions(ListenerDefaultActionArgs.builder()\n .type(\"forward\")\n .targetGroupArn(frontEndAwsLbTargetGroup.arn())\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n frontEnd:\n type: aws:lb:Listener\n name: front_end\n properties:\n loadBalancerArn: ${frontEndAwsLb.arn}\n port: '443'\n protocol: TLS\n sslPolicy: ELBSecurityPolicy-2016-08\n certificateArn: arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4\n alpnPolicy: HTTP2Preferred\n defaultActions:\n - type: forward\n targetGroupArn: ${frontEndAwsLbTargetGroup.arn}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Redirect Action\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst frontEnd = new aws.lb.LoadBalancer(\"front_end\", {});\nconst frontEndListener = new aws.lb.Listener(\"front_end\", {\n loadBalancerArn: frontEnd.arn,\n port: 80,\n protocol: \"HTTP\",\n defaultActions: [{\n type: \"redirect\",\n redirect: {\n port: \"443\",\n protocol: \"HTTPS\",\n statusCode: \"HTTP_301\",\n },\n }],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nfront_end = aws.lb.LoadBalancer(\"front_end\")\nfront_end_listener = aws.lb.Listener(\"front_end\",\n load_balancer_arn=front_end.arn,\n port=80,\n protocol=\"HTTP\",\n default_actions=[{\n \"type\": \"redirect\",\n \"redirect\": {\n \"port\": \"443\",\n \"protocol\": \"HTTPS\",\n \"status_code\": \"HTTP_301\",\n },\n }])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var frontEnd = new Aws.LB.LoadBalancer(\"front_end\");\n\n var frontEndListener = new Aws.LB.Listener(\"front_end\", new()\n {\n LoadBalancerArn = frontEnd.Arn,\n Port = 80,\n Protocol = \"HTTP\",\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"redirect\",\n Redirect = new Aws.LB.Inputs.ListenerDefaultActionRedirectArgs\n {\n Port = \"443\",\n Protocol = \"HTTPS\",\n StatusCode = \"HTTP_301\",\n },\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tfrontEnd, err := lb.NewLoadBalancer(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewListener(ctx, \"front_end\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: frontEnd.Arn,\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"HTTP\"),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"redirect\"),\n\t\t\t\t\tRedirect: \u0026lb.ListenerDefaultActionRedirectArgs{\n\t\t\t\t\t\tPort: pulumi.String(\"443\"),\n\t\t\t\t\t\tProtocol: pulumi.String(\"HTTPS\"),\n\t\t\t\t\t\tStatusCode: pulumi.String(\"HTTP_301\"),\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.LoadBalancer;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionRedirectArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var frontEnd = new LoadBalancer(\"frontEnd\");\n\n var frontEndListener = new Listener(\"frontEndListener\", ListenerArgs.builder()\n .loadBalancerArn(frontEnd.arn())\n .port(\"80\")\n .protocol(\"HTTP\")\n .defaultActions(ListenerDefaultActionArgs.builder()\n .type(\"redirect\")\n .redirect(ListenerDefaultActionRedirectArgs.builder()\n .port(\"443\")\n .protocol(\"HTTPS\")\n .statusCode(\"HTTP_301\")\n .build())\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n frontEnd:\n type: aws:lb:LoadBalancer\n name: front_end\n frontEndListener:\n type: aws:lb:Listener\n name: front_end\n properties:\n loadBalancerArn: ${frontEnd.arn}\n port: '80'\n protocol: HTTP\n defaultActions:\n - type: redirect\n redirect:\n port: '443'\n protocol: HTTPS\n statusCode: HTTP_301\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Fixed-response Action\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst frontEnd = new aws.lb.LoadBalancer(\"front_end\", {});\nconst frontEndListener = new aws.lb.Listener(\"front_end\", {\n loadBalancerArn: frontEnd.arn,\n port: 80,\n protocol: \"HTTP\",\n defaultActions: [{\n type: \"fixed-response\",\n fixedResponse: {\n contentType: \"text/plain\",\n messageBody: \"Fixed response content\",\n statusCode: \"200\",\n },\n }],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nfront_end = aws.lb.LoadBalancer(\"front_end\")\nfront_end_listener = aws.lb.Listener(\"front_end\",\n load_balancer_arn=front_end.arn,\n port=80,\n protocol=\"HTTP\",\n default_actions=[{\n \"type\": \"fixed-response\",\n \"fixed_response\": {\n \"content_type\": \"text/plain\",\n \"message_body\": \"Fixed response content\",\n \"status_code\": \"200\",\n },\n }])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var frontEnd = new Aws.LB.LoadBalancer(\"front_end\");\n\n var frontEndListener = new Aws.LB.Listener(\"front_end\", new()\n {\n LoadBalancerArn = frontEnd.Arn,\n Port = 80,\n Protocol = \"HTTP\",\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"fixed-response\",\n FixedResponse = new Aws.LB.Inputs.ListenerDefaultActionFixedResponseArgs\n {\n ContentType = \"text/plain\",\n MessageBody = \"Fixed response content\",\n StatusCode = \"200\",\n },\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tfrontEnd, err := lb.NewLoadBalancer(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewListener(ctx, \"front_end\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: frontEnd.Arn,\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"HTTP\"),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"fixed-response\"),\n\t\t\t\t\tFixedResponse: \u0026lb.ListenerDefaultActionFixedResponseArgs{\n\t\t\t\t\t\tContentType: pulumi.String(\"text/plain\"),\n\t\t\t\t\t\tMessageBody: pulumi.String(\"Fixed response content\"),\n\t\t\t\t\t\tStatusCode: pulumi.String(\"200\"),\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.LoadBalancer;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionFixedResponseArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var frontEnd = new LoadBalancer(\"frontEnd\");\n\n var frontEndListener = new Listener(\"frontEndListener\", ListenerArgs.builder()\n .loadBalancerArn(frontEnd.arn())\n .port(\"80\")\n .protocol(\"HTTP\")\n .defaultActions(ListenerDefaultActionArgs.builder()\n .type(\"fixed-response\")\n .fixedResponse(ListenerDefaultActionFixedResponseArgs.builder()\n .contentType(\"text/plain\")\n .messageBody(\"Fixed response content\")\n .statusCode(\"200\")\n .build())\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n frontEnd:\n type: aws:lb:LoadBalancer\n name: front_end\n frontEndListener:\n type: aws:lb:Listener\n name: front_end\n properties:\n loadBalancerArn: ${frontEnd.arn}\n port: '80'\n protocol: HTTP\n defaultActions:\n - type: fixed-response\n fixedResponse:\n contentType: text/plain\n messageBody: Fixed response content\n statusCode: '200'\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Authenticate-cognito Action\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst frontEnd = new aws.lb.LoadBalancer(\"front_end\", {});\nconst frontEndTargetGroup = new aws.lb.TargetGroup(\"front_end\", {});\nconst pool = new aws.cognito.UserPool(\"pool\", {});\nconst client = new aws.cognito.UserPoolClient(\"client\", {});\nconst domain = new aws.cognito.UserPoolDomain(\"domain\", {});\nconst frontEndListener = new aws.lb.Listener(\"front_end\", {\n loadBalancerArn: frontEnd.arn,\n port: 80,\n protocol: \"HTTP\",\n defaultActions: [\n {\n type: \"authenticate-cognito\",\n authenticateCognito: {\n userPoolArn: pool.arn,\n userPoolClientId: client.id,\n userPoolDomain: domain.domain,\n },\n },\n {\n type: \"forward\",\n targetGroupArn: frontEndTargetGroup.arn,\n },\n ],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nfront_end = aws.lb.LoadBalancer(\"front_end\")\nfront_end_target_group = aws.lb.TargetGroup(\"front_end\")\npool = aws.cognito.UserPool(\"pool\")\nclient = aws.cognito.UserPoolClient(\"client\")\ndomain = aws.cognito.UserPoolDomain(\"domain\")\nfront_end_listener = aws.lb.Listener(\"front_end\",\n load_balancer_arn=front_end.arn,\n port=80,\n protocol=\"HTTP\",\n default_actions=[\n {\n \"type\": \"authenticate-cognito\",\n \"authenticate_cognito\": {\n \"user_pool_arn\": pool.arn,\n \"user_pool_client_id\": client.id,\n \"user_pool_domain\": domain.domain,\n },\n },\n {\n \"type\": \"forward\",\n \"target_group_arn\": front_end_target_group.arn,\n },\n ])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var frontEnd = new Aws.LB.LoadBalancer(\"front_end\");\n\n var frontEndTargetGroup = new Aws.LB.TargetGroup(\"front_end\");\n\n var pool = new Aws.Cognito.UserPool(\"pool\");\n\n var client = new Aws.Cognito.UserPoolClient(\"client\");\n\n var domain = new Aws.Cognito.UserPoolDomain(\"domain\");\n\n var frontEndListener = new Aws.LB.Listener(\"front_end\", new()\n {\n LoadBalancerArn = frontEnd.Arn,\n Port = 80,\n Protocol = \"HTTP\",\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"authenticate-cognito\",\n AuthenticateCognito = new Aws.LB.Inputs.ListenerDefaultActionAuthenticateCognitoArgs\n {\n UserPoolArn = pool.Arn,\n UserPoolClientId = client.Id,\n UserPoolDomain = domain.Domain,\n },\n },\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"forward\",\n TargetGroupArn = frontEndTargetGroup.Arn,\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/cognito\"\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tfrontEnd, err := lb.NewLoadBalancer(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfrontEndTargetGroup, err := lb.NewTargetGroup(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tpool, err := cognito.NewUserPool(ctx, \"pool\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tclient, err := cognito.NewUserPoolClient(ctx, \"client\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdomain, err := cognito.NewUserPoolDomain(ctx, \"domain\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewListener(ctx, \"front_end\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: frontEnd.Arn,\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"HTTP\"),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"authenticate-cognito\"),\n\t\t\t\t\tAuthenticateCognito: \u0026lb.ListenerDefaultActionAuthenticateCognitoArgs{\n\t\t\t\t\t\tUserPoolArn: pool.Arn,\n\t\t\t\t\t\tUserPoolClientId: client.ID(),\n\t\t\t\t\t\tUserPoolDomain: domain.Domain,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"forward\"),\n\t\t\t\t\tTargetGroupArn: frontEndTargetGroup.Arn,\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.LoadBalancer;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.cognito.UserPool;\nimport com.pulumi.aws.cognito.UserPoolClient;\nimport com.pulumi.aws.cognito.UserPoolDomain;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionAuthenticateCognitoArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var frontEnd = new LoadBalancer(\"frontEnd\");\n\n var frontEndTargetGroup = new TargetGroup(\"frontEndTargetGroup\");\n\n var pool = new UserPool(\"pool\");\n\n var client = new UserPoolClient(\"client\");\n\n var domain = new UserPoolDomain(\"domain\");\n\n var frontEndListener = new Listener(\"frontEndListener\", ListenerArgs.builder()\n .loadBalancerArn(frontEnd.arn())\n .port(\"80\")\n .protocol(\"HTTP\")\n .defaultActions( \n ListenerDefaultActionArgs.builder()\n .type(\"authenticate-cognito\")\n .authenticateCognito(ListenerDefaultActionAuthenticateCognitoArgs.builder()\n .userPoolArn(pool.arn())\n .userPoolClientId(client.id())\n .userPoolDomain(domain.domain())\n .build())\n .build(),\n ListenerDefaultActionArgs.builder()\n .type(\"forward\")\n .targetGroupArn(frontEndTargetGroup.arn())\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n frontEnd:\n type: aws:lb:LoadBalancer\n name: front_end\n frontEndTargetGroup:\n type: aws:lb:TargetGroup\n name: front_end\n pool:\n type: aws:cognito:UserPool\n client:\n type: aws:cognito:UserPoolClient\n domain:\n type: aws:cognito:UserPoolDomain\n frontEndListener:\n type: aws:lb:Listener\n name: front_end\n properties:\n loadBalancerArn: ${frontEnd.arn}\n port: '80'\n protocol: HTTP\n defaultActions:\n - type: authenticate-cognito\n authenticateCognito:\n userPoolArn: ${pool.arn}\n userPoolClientId: ${client.id}\n userPoolDomain: ${domain.domain}\n - type: forward\n targetGroupArn: ${frontEndTargetGroup.arn}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Authenticate-OIDC Action\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst frontEnd = new aws.lb.LoadBalancer(\"front_end\", {});\nconst frontEndTargetGroup = new aws.lb.TargetGroup(\"front_end\", {});\nconst frontEndListener = new aws.lb.Listener(\"front_end\", {\n loadBalancerArn: frontEnd.arn,\n port: 80,\n protocol: \"HTTP\",\n defaultActions: [\n {\n type: \"authenticate-oidc\",\n authenticateOidc: {\n authorizationEndpoint: \"https://example.com/authorization_endpoint\",\n clientId: \"client_id\",\n clientSecret: \"client_secret\",\n issuer: \"https://example.com\",\n tokenEndpoint: \"https://example.com/token_endpoint\",\n userInfoEndpoint: \"https://example.com/user_info_endpoint\",\n },\n },\n {\n type: \"forward\",\n targetGroupArn: frontEndTargetGroup.arn,\n },\n ],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nfront_end = aws.lb.LoadBalancer(\"front_end\")\nfront_end_target_group = aws.lb.TargetGroup(\"front_end\")\nfront_end_listener = aws.lb.Listener(\"front_end\",\n load_balancer_arn=front_end.arn,\n port=80,\n protocol=\"HTTP\",\n default_actions=[\n {\n \"type\": \"authenticate-oidc\",\n \"authenticate_oidc\": {\n \"authorization_endpoint\": \"https://example.com/authorization_endpoint\",\n \"client_id\": \"client_id\",\n \"client_secret\": \"client_secret\",\n \"issuer\": \"https://example.com\",\n \"token_endpoint\": \"https://example.com/token_endpoint\",\n \"user_info_endpoint\": \"https://example.com/user_info_endpoint\",\n },\n },\n {\n \"type\": \"forward\",\n \"target_group_arn\": front_end_target_group.arn,\n },\n ])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var frontEnd = new Aws.LB.LoadBalancer(\"front_end\");\n\n var frontEndTargetGroup = new Aws.LB.TargetGroup(\"front_end\");\n\n var frontEndListener = new Aws.LB.Listener(\"front_end\", new()\n {\n LoadBalancerArn = frontEnd.Arn,\n Port = 80,\n Protocol = \"HTTP\",\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"authenticate-oidc\",\n AuthenticateOidc = new Aws.LB.Inputs.ListenerDefaultActionAuthenticateOidcArgs\n {\n AuthorizationEndpoint = \"https://example.com/authorization_endpoint\",\n ClientId = \"client_id\",\n ClientSecret = \"client_secret\",\n Issuer = \"https://example.com\",\n TokenEndpoint = \"https://example.com/token_endpoint\",\n UserInfoEndpoint = \"https://example.com/user_info_endpoint\",\n },\n },\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n Type = \"forward\",\n TargetGroupArn = frontEndTargetGroup.Arn,\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tfrontEnd, err := lb.NewLoadBalancer(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfrontEndTargetGroup, err := lb.NewTargetGroup(ctx, \"front_end\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewListener(ctx, \"front_end\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: frontEnd.Arn,\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"HTTP\"),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"authenticate-oidc\"),\n\t\t\t\t\tAuthenticateOidc: \u0026lb.ListenerDefaultActionAuthenticateOidcArgs{\n\t\t\t\t\t\tAuthorizationEndpoint: pulumi.String(\"https://example.com/authorization_endpoint\"),\n\t\t\t\t\t\tClientId: pulumi.String(\"client_id\"),\n\t\t\t\t\t\tClientSecret: pulumi.String(\"client_secret\"),\n\t\t\t\t\t\tIssuer: pulumi.String(\"https://example.com\"),\n\t\t\t\t\t\tTokenEndpoint: pulumi.String(\"https://example.com/token_endpoint\"),\n\t\t\t\t\t\tUserInfoEndpoint: pulumi.String(\"https://example.com/user_info_endpoint\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tType: pulumi.String(\"forward\"),\n\t\t\t\t\tTargetGroupArn: frontEndTargetGroup.Arn,\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.LoadBalancer;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionAuthenticateOidcArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var frontEnd = new LoadBalancer(\"frontEnd\");\n\n var frontEndTargetGroup = new TargetGroup(\"frontEndTargetGroup\");\n\n var frontEndListener = new Listener(\"frontEndListener\", ListenerArgs.builder()\n .loadBalancerArn(frontEnd.arn())\n .port(\"80\")\n .protocol(\"HTTP\")\n .defaultActions( \n ListenerDefaultActionArgs.builder()\n .type(\"authenticate-oidc\")\n .authenticateOidc(ListenerDefaultActionAuthenticateOidcArgs.builder()\n .authorizationEndpoint(\"https://example.com/authorization_endpoint\")\n .clientId(\"client_id\")\n .clientSecret(\"client_secret\")\n .issuer(\"https://example.com\")\n .tokenEndpoint(\"https://example.com/token_endpoint\")\n .userInfoEndpoint(\"https://example.com/user_info_endpoint\")\n .build())\n .build(),\n ListenerDefaultActionArgs.builder()\n .type(\"forward\")\n .targetGroupArn(frontEndTargetGroup.arn())\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n frontEnd:\n type: aws:lb:LoadBalancer\n name: front_end\n frontEndTargetGroup:\n type: aws:lb:TargetGroup\n name: front_end\n frontEndListener:\n type: aws:lb:Listener\n name: front_end\n properties:\n loadBalancerArn: ${frontEnd.arn}\n port: '80'\n protocol: HTTP\n defaultActions:\n - type: authenticate-oidc\n authenticateOidc:\n authorizationEndpoint: https://example.com/authorization_endpoint\n clientId: client_id\n clientSecret: client_secret\n issuer: https://example.com\n tokenEndpoint: https://example.com/token_endpoint\n userInfoEndpoint: https://example.com/user_info_endpoint\n - type: forward\n targetGroupArn: ${frontEndTargetGroup.arn}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Gateway Load Balancer Listener\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst example = new aws.lb.LoadBalancer(\"example\", {\n loadBalancerType: \"gateway\",\n name: \"example\",\n subnetMappings: [{\n subnetId: exampleAwsSubnet.id,\n }],\n});\nconst exampleTargetGroup = new aws.lb.TargetGroup(\"example\", {\n name: \"example\",\n port: 6081,\n protocol: \"GENEVE\",\n vpcId: exampleAwsVpc.id,\n healthCheck: {\n port: \"80\",\n protocol: \"HTTP\",\n },\n});\nconst exampleListener = new aws.lb.Listener(\"example\", {\n loadBalancerArn: example.id,\n defaultActions: [{\n targetGroupArn: exampleTargetGroup.id,\n type: \"forward\",\n }],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nexample = aws.lb.LoadBalancer(\"example\",\n load_balancer_type=\"gateway\",\n name=\"example\",\n subnet_mappings=[{\n \"subnet_id\": example_aws_subnet[\"id\"],\n }])\nexample_target_group = aws.lb.TargetGroup(\"example\",\n name=\"example\",\n port=6081,\n protocol=\"GENEVE\",\n vpc_id=example_aws_vpc[\"id\"],\n health_check={\n \"port\": \"80\",\n \"protocol\": \"HTTP\",\n })\nexample_listener = aws.lb.Listener(\"example\",\n load_balancer_arn=example.id,\n default_actions=[{\n \"target_group_arn\": example_target_group.id,\n \"type\": \"forward\",\n }])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var example = new Aws.LB.LoadBalancer(\"example\", new()\n {\n LoadBalancerType = \"gateway\",\n Name = \"example\",\n SubnetMappings = new[]\n {\n new Aws.LB.Inputs.LoadBalancerSubnetMappingArgs\n {\n SubnetId = exampleAwsSubnet.Id,\n },\n },\n });\n\n var exampleTargetGroup = new Aws.LB.TargetGroup(\"example\", new()\n {\n Name = \"example\",\n Port = 6081,\n Protocol = \"GENEVE\",\n VpcId = exampleAwsVpc.Id,\n HealthCheck = new Aws.LB.Inputs.TargetGroupHealthCheckArgs\n {\n Port = \"80\",\n Protocol = \"HTTP\",\n },\n });\n\n var exampleListener = new Aws.LB.Listener(\"example\", new()\n {\n LoadBalancerArn = example.Id,\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n TargetGroupArn = exampleTargetGroup.Id,\n Type = \"forward\",\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\texample, err := lb.NewLoadBalancer(ctx, \"example\", \u0026lb.LoadBalancerArgs{\n\t\t\tLoadBalancerType: pulumi.String(\"gateway\"),\n\t\t\tName: pulumi.String(\"example\"),\n\t\t\tSubnetMappings: lb.LoadBalancerSubnetMappingArray{\n\t\t\t\t\u0026lb.LoadBalancerSubnetMappingArgs{\n\t\t\t\t\tSubnetId: pulumi.Any(exampleAwsSubnet.Id),\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\t\texampleTargetGroup, err := lb.NewTargetGroup(ctx, \"example\", \u0026lb.TargetGroupArgs{\n\t\t\tName: pulumi.String(\"example\"),\n\t\t\tPort: pulumi.Int(6081),\n\t\t\tProtocol: pulumi.String(\"GENEVE\"),\n\t\t\tVpcId: pulumi.Any(exampleAwsVpc.Id),\n\t\t\tHealthCheck: \u0026lb.TargetGroupHealthCheckArgs{\n\t\t\t\tPort: pulumi.String(\"80\"),\n\t\t\t\tProtocol: pulumi.String(\"HTTP\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewListener(ctx, \"example\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: example.ID(),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tTargetGroupArn: exampleTargetGroup.ID(),\n\t\t\t\t\tType: pulumi.String(\"forward\"),\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.LoadBalancer;\nimport com.pulumi.aws.lb.LoadBalancerArgs;\nimport com.pulumi.aws.lb.inputs.LoadBalancerSubnetMappingArgs;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.TargetGroupArgs;\nimport com.pulumi.aws.lb.inputs.TargetGroupHealthCheckArgs;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var example = new LoadBalancer(\"example\", LoadBalancerArgs.builder()\n .loadBalancerType(\"gateway\")\n .name(\"example\")\n .subnetMappings(LoadBalancerSubnetMappingArgs.builder()\n .subnetId(exampleAwsSubnet.id())\n .build())\n .build());\n\n var exampleTargetGroup = new TargetGroup(\"exampleTargetGroup\", TargetGroupArgs.builder()\n .name(\"example\")\n .port(6081)\n .protocol(\"GENEVE\")\n .vpcId(exampleAwsVpc.id())\n .healthCheck(TargetGroupHealthCheckArgs.builder()\n .port(80)\n .protocol(\"HTTP\")\n .build())\n .build());\n\n var exampleListener = new Listener(\"exampleListener\", ListenerArgs.builder()\n .loadBalancerArn(example.id())\n .defaultActions(ListenerDefaultActionArgs.builder()\n .targetGroupArn(exampleTargetGroup.id())\n .type(\"forward\")\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n example:\n type: aws:lb:LoadBalancer\n properties:\n loadBalancerType: gateway\n name: example\n subnetMappings:\n - subnetId: ${exampleAwsSubnet.id}\n exampleTargetGroup:\n type: aws:lb:TargetGroup\n name: example\n properties:\n name: example\n port: 6081\n protocol: GENEVE\n vpcId: ${exampleAwsVpc.id}\n healthCheck:\n port: 80\n protocol: HTTP\n exampleListener:\n type: aws:lb:Listener\n name: example\n properties:\n loadBalancerArn: ${example.id}\n defaultActions:\n - targetGroupArn: ${exampleTargetGroup.id}\n type: forward\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Mutual TLS Authentication\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst example = new aws.lb.LoadBalancer(\"example\", {loadBalancerType: \"application\"});\nconst exampleTargetGroup = new aws.lb.TargetGroup(\"example\", {});\nconst exampleListener = new aws.lb.Listener(\"example\", {\n loadBalancerArn: example.id,\n defaultActions: [{\n targetGroupArn: exampleTargetGroup.id,\n type: \"forward\",\n }],\n mutualAuthentication: {\n mode: \"verify\",\n trustStoreArn: \"...\",\n },\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nexample = aws.lb.LoadBalancer(\"example\", load_balancer_type=\"application\")\nexample_target_group = aws.lb.TargetGroup(\"example\")\nexample_listener = aws.lb.Listener(\"example\",\n load_balancer_arn=example.id,\n default_actions=[{\n \"target_group_arn\": example_target_group.id,\n \"type\": \"forward\",\n }],\n mutual_authentication={\n \"mode\": \"verify\",\n \"trust_store_arn\": \"...\",\n })\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var example = new Aws.LB.LoadBalancer(\"example\", new()\n {\n LoadBalancerType = \"application\",\n });\n\n var exampleTargetGroup = new Aws.LB.TargetGroup(\"example\");\n\n var exampleListener = new Aws.LB.Listener(\"example\", new()\n {\n LoadBalancerArn = example.Id,\n DefaultActions = new[]\n {\n new Aws.LB.Inputs.ListenerDefaultActionArgs\n {\n TargetGroupArn = exampleTargetGroup.Id,\n Type = \"forward\",\n },\n },\n MutualAuthentication = new Aws.LB.Inputs.ListenerMutualAuthenticationArgs\n {\n Mode = \"verify\",\n TrustStoreArn = \"...\",\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\texample, err := lb.NewLoadBalancer(ctx, \"example\", \u0026lb.LoadBalancerArgs{\n\t\t\tLoadBalancerType: pulumi.String(\"application\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\texampleTargetGroup, err := lb.NewTargetGroup(ctx, \"example\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewListener(ctx, \"example\", \u0026lb.ListenerArgs{\n\t\t\tLoadBalancerArn: example.ID(),\n\t\t\tDefaultActions: lb.ListenerDefaultActionArray{\n\t\t\t\t\u0026lb.ListenerDefaultActionArgs{\n\t\t\t\t\tTargetGroupArn: exampleTargetGroup.ID(),\n\t\t\t\t\tType: pulumi.String(\"forward\"),\n\t\t\t\t},\n\t\t\t},\n\t\t\tMutualAuthentication: \u0026lb.ListenerMutualAuthenticationArgs{\n\t\t\t\tMode: pulumi.String(\"verify\"),\n\t\t\t\tTrustStoreArn: pulumi.String(\"...\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.LoadBalancer;\nimport com.pulumi.aws.lb.LoadBalancerArgs;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.Listener;\nimport com.pulumi.aws.lb.ListenerArgs;\nimport com.pulumi.aws.lb.inputs.ListenerDefaultActionArgs;\nimport com.pulumi.aws.lb.inputs.ListenerMutualAuthenticationArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var example = new LoadBalancer(\"example\", LoadBalancerArgs.builder()\n .loadBalancerType(\"application\")\n .build());\n\n var exampleTargetGroup = new TargetGroup(\"exampleTargetGroup\");\n\n var exampleListener = new Listener(\"exampleListener\", ListenerArgs.builder()\n .loadBalancerArn(example.id())\n .defaultActions(ListenerDefaultActionArgs.builder()\n .targetGroupArn(exampleTargetGroup.id())\n .type(\"forward\")\n .build())\n .mutualAuthentication(ListenerMutualAuthenticationArgs.builder()\n .mode(\"verify\")\n .trustStoreArn(\"...\")\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n example:\n type: aws:lb:LoadBalancer\n properties:\n loadBalancerType: application\n exampleTargetGroup:\n type: aws:lb:TargetGroup\n name: example\n exampleListener:\n type: aws:lb:Listener\n name: example\n properties:\n loadBalancerArn: ${example.id}\n defaultActions:\n - targetGroupArn: ${exampleTargetGroup.id}\n type: forward\n mutualAuthentication:\n mode: verify\n trustStoreArn: '...'\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nUsing `pulumi import`, import listeners using their ARN. For example:\n\n```sh\n$ pulumi import aws:lb/listener:Listener front_end arn:aws:elasticloadbalancing:us-west-2:187416307283:listener/app/front-end-alb/8e4497da625e2d8a/9ab28ade35828f96\n```\n", + "properties": { + "alpnPolicy": { + "type": "string", + "description": "Name of the Application-Layer Protocol Negotiation (ALPN) policy. Can be set if `protocol` is `TLS`. Valid values are `HTTP1Only`, `HTTP2Only`, `HTTP2Optional`, `HTTP2Preferred`, and `None`.\n" + }, + "certificateArn": { + "type": "string", + "description": "ARN of the default SSL server certificate. Exactly one certificate is required if the protocol is HTTPS. For adding additional SSL certificates, see the `aws.lb.ListenerCertificate` resource.\n" + }, + "defaultActions": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/ListenerDefaultAction:ListenerDefaultAction" + }, + "description": "Configuration block for default actions. See below.\n" + }, + "mutualAuthentication": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/ListenerMutualAuthentication:ListenerMutualAuthentication", + "description": "The mutual authentication configuration information. See below.\n" + }, + "port": { + "type": "integer", + "description": "Port on which the load balancer is listening. Not valid for Gateway Load Balancers.\n" + }, + "protocol": { + "type": "string", + "description": "Protocol for connections from clients to the load balancer. For Application Load Balancers, valid values are `HTTP` and `HTTPS`, with a default of `HTTP`. For Network Load Balancers, valid values are `TCP`, `TLS`, `UDP`, and `TCP_UDP`. Not valid to use `UDP` or `TCP_UDP` if dual-stack mode is enabled. Not valid for Gateway Load Balancers.\n" + }, + "sslPolicy": { + "type": "string", + "description": "Name of the SSL Policy for the listener. Required if `protocol` is `HTTPS` or `TLS`. Default is `ELBSecurityPolicy-2016-08`.\n" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "A map of tags to assign to the resource. .If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n\n\u003e **Note::** When a `Name` key is specified in the map, the AWS Console maps the value to the `Name Tag` column value inside the `Listener Rules` table within a specific load balancer listener page. Otherwise, the value resolves to `Default`.\n" + }, + "tcpIdleTimeoutSeconds": { + "type": "integer", + "description": "TCP idle timeout value in seconds. Can only be set if protocol is `TCP` on Network Load Balancer, or with a Gateway Load Balancer. Not supported for Application Load Balancers. Valid values are between `60` and `6000` inclusive. Default: `350`.\n" + } + }, + "type": "object" + }, + "awsx:lb:TargetGroup": { + "description": "Provides a Target Group resource for use with Load Balancer resources.\n\n\u003e **Note:** `aws.alb.TargetGroup` is known as `aws.lb.TargetGroup`. The functionality is identical.\n\n## Example Usage\n\n### Instance Target Group\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst main = new aws.ec2.Vpc(\"main\", {cidrBlock: \"10.0.0.0/16\"});\nconst test = new aws.lb.TargetGroup(\"test\", {\n name: \"tf-example-lb-tg\",\n port: 80,\n protocol: \"HTTP\",\n vpcId: main.id,\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nmain = aws.ec2.Vpc(\"main\", cidr_block=\"10.0.0.0/16\")\ntest = aws.lb.TargetGroup(\"test\",\n name=\"tf-example-lb-tg\",\n port=80,\n protocol=\"HTTP\",\n vpc_id=main.id)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var main = new Aws.Ec2.Vpc(\"main\", new()\n {\n CidrBlock = \"10.0.0.0/16\",\n });\n\n var test = new Aws.LB.TargetGroup(\"test\", new()\n {\n Name = \"tf-example-lb-tg\",\n Port = 80,\n Protocol = \"HTTP\",\n VpcId = main.Id,\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2\"\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tmain, err := ec2.NewVpc(ctx, \"main\", \u0026ec2.VpcArgs{\n\t\t\tCidrBlock: pulumi.String(\"10.0.0.0/16\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewTargetGroup(ctx, \"test\", \u0026lb.TargetGroupArgs{\n\t\t\tName: pulumi.String(\"tf-example-lb-tg\"),\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"HTTP\"),\n\t\t\tVpcId: main.ID(),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.ec2.Vpc;\nimport com.pulumi.aws.ec2.VpcArgs;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.TargetGroupArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var main = new Vpc(\"main\", VpcArgs.builder()\n .cidrBlock(\"10.0.0.0/16\")\n .build());\n\n var test = new TargetGroup(\"test\", TargetGroupArgs.builder()\n .name(\"tf-example-lb-tg\")\n .port(80)\n .protocol(\"HTTP\")\n .vpcId(main.id())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n test:\n type: aws:lb:TargetGroup\n properties:\n name: tf-example-lb-tg\n port: 80\n protocol: HTTP\n vpcId: ${main.id}\n main:\n type: aws:ec2:Vpc\n properties:\n cidrBlock: 10.0.0.0/16\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### IP Target Group\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst main = new aws.ec2.Vpc(\"main\", {cidrBlock: \"10.0.0.0/16\"});\nconst ip_example = new aws.lb.TargetGroup(\"ip-example\", {\n name: \"tf-example-lb-tg\",\n port: 80,\n protocol: \"HTTP\",\n targetType: \"ip\",\n vpcId: main.id,\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nmain = aws.ec2.Vpc(\"main\", cidr_block=\"10.0.0.0/16\")\nip_example = aws.lb.TargetGroup(\"ip-example\",\n name=\"tf-example-lb-tg\",\n port=80,\n protocol=\"HTTP\",\n target_type=\"ip\",\n vpc_id=main.id)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var main = new Aws.Ec2.Vpc(\"main\", new()\n {\n CidrBlock = \"10.0.0.0/16\",\n });\n\n var ip_example = new Aws.LB.TargetGroup(\"ip-example\", new()\n {\n Name = \"tf-example-lb-tg\",\n Port = 80,\n Protocol = \"HTTP\",\n TargetType = \"ip\",\n VpcId = main.Id,\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2\"\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tmain, err := ec2.NewVpc(ctx, \"main\", \u0026ec2.VpcArgs{\n\t\t\tCidrBlock: pulumi.String(\"10.0.0.0/16\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = lb.NewTargetGroup(ctx, \"ip-example\", \u0026lb.TargetGroupArgs{\n\t\t\tName: pulumi.String(\"tf-example-lb-tg\"),\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"HTTP\"),\n\t\t\tTargetType: pulumi.String(\"ip\"),\n\t\t\tVpcId: main.ID(),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.ec2.Vpc;\nimport com.pulumi.aws.ec2.VpcArgs;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.TargetGroupArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var main = new Vpc(\"main\", VpcArgs.builder()\n .cidrBlock(\"10.0.0.0/16\")\n .build());\n\n var ip_example = new TargetGroup(\"ip-example\", TargetGroupArgs.builder()\n .name(\"tf-example-lb-tg\")\n .port(80)\n .protocol(\"HTTP\")\n .targetType(\"ip\")\n .vpcId(main.id())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n ip-example:\n type: aws:lb:TargetGroup\n properties:\n name: tf-example-lb-tg\n port: 80\n protocol: HTTP\n targetType: ip\n vpcId: ${main.id}\n main:\n type: aws:ec2:Vpc\n properties:\n cidrBlock: 10.0.0.0/16\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Lambda Target Group\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst lambda_example = new aws.lb.TargetGroup(\"lambda-example\", {\n name: \"tf-example-lb-tg\",\n targetType: \"lambda\",\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nlambda_example = aws.lb.TargetGroup(\"lambda-example\",\n name=\"tf-example-lb-tg\",\n target_type=\"lambda\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var lambda_example = new Aws.LB.TargetGroup(\"lambda-example\", new()\n {\n Name = \"tf-example-lb-tg\",\n TargetType = \"lambda\",\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\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 := lb.NewTargetGroup(ctx, \"lambda-example\", \u0026lb.TargetGroupArgs{\n\t\t\tName: pulumi.String(\"tf-example-lb-tg\"),\n\t\t\tTargetType: pulumi.String(\"lambda\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.TargetGroupArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var lambda_example = new TargetGroup(\"lambda-example\", TargetGroupArgs.builder()\n .name(\"tf-example-lb-tg\")\n .targetType(\"lambda\")\n .build());\n\n }\n}\n```\n```yaml\nresources:\n lambda-example:\n type: aws:lb:TargetGroup\n properties:\n name: tf-example-lb-tg\n targetType: lambda\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### ALB Target Group\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst alb_example = new aws.lb.TargetGroup(\"alb-example\", {\n name: \"tf-example-lb-alb-tg\",\n targetType: \"alb\",\n port: 80,\n protocol: \"TCP\",\n vpcId: main.id,\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\nalb_example = aws.lb.TargetGroup(\"alb-example\",\n name=\"tf-example-lb-alb-tg\",\n target_type=\"alb\",\n port=80,\n protocol=\"TCP\",\n vpc_id=main[\"id\"])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var alb_example = new Aws.LB.TargetGroup(\"alb-example\", new()\n {\n Name = \"tf-example-lb-alb-tg\",\n TargetType = \"alb\",\n Port = 80,\n Protocol = \"TCP\",\n VpcId = main.Id,\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\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 := lb.NewTargetGroup(ctx, \"alb-example\", \u0026lb.TargetGroupArgs{\n\t\t\tName: pulumi.String(\"tf-example-lb-alb-tg\"),\n\t\t\tTargetType: pulumi.String(\"alb\"),\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"TCP\"),\n\t\t\tVpcId: pulumi.Any(main.Id),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.TargetGroupArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var alb_example = new TargetGroup(\"alb-example\", TargetGroupArgs.builder()\n .name(\"tf-example-lb-alb-tg\")\n .targetType(\"alb\")\n .port(80)\n .protocol(\"TCP\")\n .vpcId(main.id())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n alb-example:\n type: aws:lb:TargetGroup\n properties:\n name: tf-example-lb-alb-tg\n targetType: alb\n port: 80\n protocol: TCP\n vpcId: ${main.id}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Target group with unhealthy connection termination disabled\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst tcp_example = new aws.lb.TargetGroup(\"tcp-example\", {\n name: \"tf-example-lb-nlb-tg\",\n port: 25,\n protocol: \"TCP\",\n vpcId: main.id,\n targetHealthStates: [{\n enableUnhealthyConnectionTermination: false,\n }],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\ntcp_example = aws.lb.TargetGroup(\"tcp-example\",\n name=\"tf-example-lb-nlb-tg\",\n port=25,\n protocol=\"TCP\",\n vpc_id=main[\"id\"],\n target_health_states=[{\n \"enable_unhealthy_connection_termination\": False,\n }])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var tcp_example = new Aws.LB.TargetGroup(\"tcp-example\", new()\n {\n Name = \"tf-example-lb-nlb-tg\",\n Port = 25,\n Protocol = \"TCP\",\n VpcId = main.Id,\n TargetHealthStates = new[]\n {\n new Aws.LB.Inputs.TargetGroupTargetHealthStateArgs\n {\n EnableUnhealthyConnectionTermination = false,\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\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 := lb.NewTargetGroup(ctx, \"tcp-example\", \u0026lb.TargetGroupArgs{\n\t\t\tName: pulumi.String(\"tf-example-lb-nlb-tg\"),\n\t\t\tPort: pulumi.Int(25),\n\t\t\tProtocol: pulumi.String(\"TCP\"),\n\t\t\tVpcId: pulumi.Any(main.Id),\n\t\t\tTargetHealthStates: lb.TargetGroupTargetHealthStateArray{\n\t\t\t\t\u0026lb.TargetGroupTargetHealthStateArgs{\n\t\t\t\t\tEnableUnhealthyConnectionTermination: pulumi.Bool(false),\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.TargetGroupArgs;\nimport com.pulumi.aws.lb.inputs.TargetGroupTargetHealthStateArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var tcp_example = new TargetGroup(\"tcp-example\", TargetGroupArgs.builder()\n .name(\"tf-example-lb-nlb-tg\")\n .port(25)\n .protocol(\"TCP\")\n .vpcId(main.id())\n .targetHealthStates(TargetGroupTargetHealthStateArgs.builder()\n .enableUnhealthyConnectionTermination(false)\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n tcp-example:\n type: aws:lb:TargetGroup\n properties:\n name: tf-example-lb-nlb-tg\n port: 25\n protocol: TCP\n vpcId: ${main.id}\n targetHealthStates:\n - enableUnhealthyConnectionTermination: false\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n### Target group with health requirements\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nconst tcp_example = new aws.lb.TargetGroup(\"tcp-example\", {\n name: \"tf-example-lb-nlb-tg\",\n port: 80,\n protocol: \"TCP\",\n vpcId: main.id,\n targetGroupHealth: {\n dnsFailover: {\n minimumHealthyTargetsCount: \"1\",\n minimumHealthyTargetsPercentage: \"off\",\n },\n unhealthyStateRouting: {\n minimumHealthyTargetsCount: 1,\n minimumHealthyTargetsPercentage: \"off\",\n },\n },\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\n\ntcp_example = aws.lb.TargetGroup(\"tcp-example\",\n name=\"tf-example-lb-nlb-tg\",\n port=80,\n protocol=\"TCP\",\n vpc_id=main[\"id\"],\n target_group_health={\n \"dns_failover\": {\n \"minimum_healthy_targets_count\": \"1\",\n \"minimum_healthy_targets_percentage\": \"off\",\n },\n \"unhealthy_state_routing\": {\n \"minimum_healthy_targets_count\": 1,\n \"minimum_healthy_targets_percentage\": \"off\",\n },\n })\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var tcp_example = new Aws.LB.TargetGroup(\"tcp-example\", new()\n {\n Name = \"tf-example-lb-nlb-tg\",\n Port = 80,\n Protocol = \"TCP\",\n VpcId = main.Id,\n TargetGroupHealth = new Aws.LB.Inputs.TargetGroupTargetGroupHealthArgs\n {\n DnsFailover = new Aws.LB.Inputs.TargetGroupTargetGroupHealthDnsFailoverArgs\n {\n MinimumHealthyTargetsCount = \"1\",\n MinimumHealthyTargetsPercentage = \"off\",\n },\n UnhealthyStateRouting = new Aws.LB.Inputs.TargetGroupTargetGroupHealthUnhealthyStateRoutingArgs\n {\n MinimumHealthyTargetsCount = 1,\n MinimumHealthyTargetsPercentage = \"off\",\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/lb\"\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 := lb.NewTargetGroup(ctx, \"tcp-example\", \u0026lb.TargetGroupArgs{\n\t\t\tName: pulumi.String(\"tf-example-lb-nlb-tg\"),\n\t\t\tPort: pulumi.Int(80),\n\t\t\tProtocol: pulumi.String(\"TCP\"),\n\t\t\tVpcId: pulumi.Any(main.Id),\n\t\t\tTargetGroupHealth: \u0026lb.TargetGroupTargetGroupHealthArgs{\n\t\t\t\tDnsFailover: \u0026lb.TargetGroupTargetGroupHealthDnsFailoverArgs{\n\t\t\t\t\tMinimumHealthyTargetsCount: pulumi.String(\"1\"),\n\t\t\t\t\tMinimumHealthyTargetsPercentage: pulumi.String(\"off\"),\n\t\t\t\t},\n\t\t\t\tUnhealthyStateRouting: \u0026lb.TargetGroupTargetGroupHealthUnhealthyStateRoutingArgs{\n\t\t\t\t\tMinimumHealthyTargetsCount: pulumi.Int(1),\n\t\t\t\t\tMinimumHealthyTargetsPercentage: pulumi.String(\"off\"),\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\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.lb.TargetGroup;\nimport com.pulumi.aws.lb.TargetGroupArgs;\nimport com.pulumi.aws.lb.inputs.TargetGroupTargetGroupHealthArgs;\nimport com.pulumi.aws.lb.inputs.TargetGroupTargetGroupHealthDnsFailoverArgs;\nimport com.pulumi.aws.lb.inputs.TargetGroupTargetGroupHealthUnhealthyStateRoutingArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var tcp_example = new TargetGroup(\"tcp-example\", TargetGroupArgs.builder()\n .name(\"tf-example-lb-nlb-tg\")\n .port(80)\n .protocol(\"TCP\")\n .vpcId(main.id())\n .targetGroupHealth(TargetGroupTargetGroupHealthArgs.builder()\n .dnsFailover(TargetGroupTargetGroupHealthDnsFailoverArgs.builder()\n .minimumHealthyTargetsCount(\"1\")\n .minimumHealthyTargetsPercentage(\"off\")\n .build())\n .unhealthyStateRouting(TargetGroupTargetGroupHealthUnhealthyStateRoutingArgs.builder()\n .minimumHealthyTargetsCount(\"1\")\n .minimumHealthyTargetsPercentage(\"off\")\n .build())\n .build())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n tcp-example:\n type: aws:lb:TargetGroup\n properties:\n name: tf-example-lb-nlb-tg\n port: 80\n protocol: TCP\n vpcId: ${main.id}\n targetGroupHealth:\n dnsFailover:\n minimumHealthyTargetsCount: '1'\n minimumHealthyTargetsPercentage: off\n unhealthyStateRouting:\n minimumHealthyTargetsCount: '1'\n minimumHealthyTargetsPercentage: off\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nUsing `pulumi import`, import Target Groups using their ARN. For example:\n\n```sh\n$ pulumi import aws:lb/targetGroup:TargetGroup app_front_end arn:aws:elasticloadbalancing:us-west-2:187416307283:targetgroup/app-front-end/20cfe21448b66314\n```\n", + "properties": { + "connectionTermination": { + "type": "boolean", + "description": "Whether to terminate connections at the end of the deregistration timeout on Network Load Balancers. See [doc](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#deregistration-delay) for more information. Default is `false`.\n" + }, + "deregistrationDelay": { + "type": "integer", + "description": "Amount time for Elastic Load Balancing to wait before changing the state of a deregistering target from draining to unused. The range is 0-3600 seconds. The default value is 300 seconds.\n" + }, + "healthCheck": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/TargetGroupHealthCheck:TargetGroupHealthCheck", + "description": "Health Check configuration block. Detailed below.\n" + }, + "ipAddressType": { + "type": "string", + "description": "The type of IP addresses used by the target group, only supported when target type is set to `ip`. Possible values are `ipv4` or `ipv6`.\n", + "willReplaceOnChanges": true + }, + "lambdaMultiValueHeadersEnabled": { + "type": "boolean", + "description": "Whether the request and response headers exchanged between the load balancer and the Lambda function include arrays of values or strings. Only applies when `target_type` is `lambda`. Default is `false`.\n" + }, + "loadBalancingAlgorithmType": { + "type": "string", + "description": "Determines how the load balancer selects targets when routing requests. Only applicable for Application Load Balancer Target Groups. The value is `round_robin`, `least_outstanding_requests`, or `weighted_random`. The default is `round_robin`.\n" + }, + "loadBalancingAnomalyMitigation": { + "type": "string", + "description": "Determines whether to enable target anomaly mitigation. Target anomaly mitigation is only supported by the `weighted_random` load balancing algorithm type. See [doc](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html#automatic-target-weights) for more information. The value is `\"on\"` or `\"off\"`. The default is `\"off\"`.\n" + }, + "loadBalancingCrossZoneEnabled": { + "type": "string", + "description": "Indicates whether cross zone load balancing is enabled. The value is `\"true\"`, `\"false\"` or `\"use_load_balancer_configuration\"`. The default is `\"use_load_balancer_configuration\"`.\n" + }, + "name": { + "type": "string", + "description": "Name of the target group. If omitted, this provider will assign a random, unique name. This name must be unique per region per account, can have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and must not begin or end with a hyphen.\n", + "willReplaceOnChanges": true + }, + "namePrefix": { + "type": "string", + "description": "Creates a unique name beginning with the specified prefix. Conflicts with `name`. Cannot be longer than 6 characters.\n", + "willReplaceOnChanges": true + }, + "port": { + "type": "integer", + "description": "Port on which targets receive traffic, unless overridden when registering a specific target. Required when `target_type` is `instance`, `ip` or `alb`. Does not apply when `target_type` is `lambda`.\n", + "willReplaceOnChanges": true + }, + "preserveClientIp": { + "type": "string", + "description": "Whether client IP preservation is enabled. See [doc](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#client-ip-preservation) for more information.\n" + }, + "protocol": { + "type": "string", + "description": "Protocol to use for routing traffic to the targets.\nShould be one of `GENEVE`, `HTTP`, `HTTPS`, `TCP`, `TCP_UDP`, `TLS`, or `UDP`.\nRequired when `target_type` is `instance`, `ip`, or `alb`.\nDoes not apply when `target_type` is `lambda`.\n", + "willReplaceOnChanges": true + }, + "protocolVersion": { + "type": "string", + "description": "Only applicable when `protocol` is `HTTP` or `HTTPS`. The protocol version. Specify `GRPC` to send requests to targets using gRPC. Specify `HTTP2` to send requests to targets using HTTP/2. The default is `HTTP1`, which sends requests to targets using HTTP/1.1\n", + "willReplaceOnChanges": true + }, + "proxyProtocolV2": { + "type": "boolean", + "description": "Whether to enable support for proxy protocol v2 on Network Load Balancers. See [doc](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#proxy-protocol) for more information. Default is `false`.\n" + }, + "slowStart": { + "type": "integer", + "description": "Amount time for targets to warm up before the load balancer sends them a full share of requests. The range is 30-900 seconds or 0 to disable. The default value is 0 seconds.\n" + }, + "stickiness": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/TargetGroupStickiness:TargetGroupStickiness", + "description": "Stickiness configuration block. Detailed below.\n" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Map of tags to assign to the resource. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + }, + "targetFailovers": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/TargetGroupTargetFailover:TargetGroupTargetFailover" + }, + "description": "Target failover block. Only applicable for Gateway Load Balancer target groups. See target_failover for more information.\n" + }, + "targetGroupHealth": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/TargetGroupTargetGroupHealth:TargetGroupTargetGroupHealth", + "description": "Target health requirements block. See target_group_health for more information.\n" + }, + "targetHealthStates": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/TargetGroupTargetHealthState:TargetGroupTargetHealthState" + }, + "description": "Target health state block. Only applicable for Network Load Balancer target groups when `protocol` is `TCP` or `TLS`. See target_health_state for more information.\n" + }, + "targetType": { + "type": "string", + "description": "Type of target that you must specify when registering targets with this target group.\nSee [doc](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_CreateTargetGroup.html) for supported values.\nThe default is `instance`.\n\nNote that you can't specify targets for a target group using both instance IDs and IP addresses.\n\nIf the target type is `ip`, specify IP addresses from the subnets of the virtual private cloud (VPC) for the target group, the RFC 1918 range (10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16), and the RFC 6598 range (100.64.0.0/10). You can't specify publicly routable IP addresses.\n\nNetwork Load Balancers do not support the `lambda` target type.\n\nApplication Load Balancers do not support the `alb` target type.\n", + "willReplaceOnChanges": true + }, + "vpcId": { + "type": "string", + "description": "Identifier of the VPC in which to create the target group. Required when `target_type` is `instance`, `ip` or `alb`. Does not apply when `target_type` is `lambda`.\n", + "willReplaceOnChanges": true + } + }, + "type": "object" + } + }, + "provider": {}, + "resources": { + "awsx:cloudtrail:Trail": { + "properties": { + "bucket": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:s3%2Fbucket:Bucket", + "description": "The managed S3 Bucket where the Trail will place its logs." + }, + "logGroup": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:cloudwatch%2FlogGroup:LogGroup", + "description": "The managed Cloudwatch Log Group." + }, + "trail": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:cloudtrail%2Ftrail:Trail", + "description": "The CloudTrail Trail.", + "language": { + "csharp": { + "name": "AwsTrail" + } + } + } + }, + "required": [ + "trail" + ], + "inputProperties": { + "advancedEventSelectors": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:cloudtrail/TrailAdvancedEventSelector:TrailAdvancedEventSelector" + }, + "description": "Specifies an advanced event selector for enabling data event logging. Fields documented below. Conflicts with `event_selector`.\n" + }, + "cloudWatchLogsGroup": { + "$ref": "#/types/awsx:awsx:OptionalLogGroup", + "plain": true, + "description": "Log group to which CloudTrail logs will be delivered." + }, + "enableLogFileValidation": { + "type": "boolean", + "description": "Whether log file integrity validation is enabled. Defaults to `false`.\n" + }, + "enableLogging": { + "type": "boolean", + "description": "Enables logging for the trail. Defaults to `true`. Setting this to `false` will pause logging.\n" + }, + "eventSelectors": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:cloudtrail/TrailEventSelector:TrailEventSelector" + }, + "description": "Specifies an event selector for enabling data event logging. Fields documented below. Please note the [CloudTrail limits](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/WhatIsCloudTrail-Limits.html) when configuring these. Conflicts with `advanced_event_selector`.\n" + }, + "includeGlobalServiceEvents": { + "type": "boolean", + "description": "Whether the trail is publishing events from global services such as IAM to the log files. Defaults to `true`.\n" + }, + "insightSelectors": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:cloudtrail/TrailInsightSelector:TrailInsightSelector" + }, + "description": "Configuration block for identifying unusual operational activity. See details below.\n" + }, + "isMultiRegionTrail": { + "type": "boolean", + "description": "Whether the trail is created in the current region or in all regions. Defaults to `false`.\n" + }, + "isOrganizationTrail": { + "type": "boolean", + "description": "Whether the trail is an AWS Organizations trail. Organization trails log events for the master account and all member accounts. Can only be created in the organization master account. Defaults to `false`.\n" + }, + "kmsKeyId": { + "type": "string", + "description": "KMS key ARN to use to encrypt the logs delivered by CloudTrail.\n" + }, + "name": { + "type": "string", + "description": "Name of the trail.\n", + "willReplaceOnChanges": true + }, + "s3Bucket": { + "$ref": "#/types/awsx:awsx:RequiredBucket", + "plain": true, + "description": "S3 bucket designated for publishing log files." + }, + "s3KeyPrefix": { + "type": "string", + "description": "S3 key prefix that follows the name of the bucket you have designated for log file delivery.\n" + }, + "snsTopicName": { + "type": "string", + "description": "Name of the Amazon SNS topic defined for notification of log file delivery.\n" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Map of tags to assign to the trail. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + } + }, + "isComponent": true + }, + "awsx:ec2:DefaultVpc": { + "description": "Pseudo resource representing the default VPC and associated subnets for an account and region. This does not create any resources. This will be replaced with `getDefaultVpc` in the future.", + "properties": { + "privateSubnetIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "publicSubnetIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "vpcId": { + "type": "string", + "description": "The VPC ID for the default VPC" + } + }, + "required": [ + "vpcId", + "publicSubnetIds", + "privateSubnetIds" + ], + "isComponent": true + }, + "awsx:ec2:Vpc": { + "description": "The VPC component provides a VPC with configured subnets and NAT gateways.\n\n{{% examples %}}\n\n## Example Usage\n\n{{% example %}}\n\nBasic usage:\n\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as awsx from \"@pulumi/awsx\";\n\nconst vpc = new awsx.ec2.Vpc(\"vpc\", {});\nexport const vpcId = vpc.vpcId;\nexport const vpcPrivateSubnetIds = vpc.privateSubnetIds;\nexport const vpcPublicSubnetIds = vpc.publicSubnetIds;\n```\n\n```python\nimport pulumi\nimport pulumi_awsx as awsx\n\nvpc = awsx.ec2.Vpc(\"vpc\")\npulumi.export(\"vpcId\", vpc.vpc_id)\npulumi.export(\"vpcPrivateSubnetIds\", vpc.private_subnet_ids)\npulumi.export(\"vpcPublicSubnetIds\", vpc.public_subnet_ids)\n```\n\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Awsx = Pulumi.Awsx;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var vpc = new Awsx.Ec2.Vpc(\"vpc\");\n\n return new Dictionary\u003cstring, object?\u003e\n {\n [\"vpcId\"] = vpc.VpcId,\n [\"vpcPrivateSubnetIds\"] = vpc.PrivateSubnetIds,\n [\"vpcPublicSubnetIds\"] = vpc.PublicSubnetIds,\n };\n});\n```\n\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-awsx/sdk/v2/go/awsx/ec2\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tvpc, err := ec2.NewVpc(ctx, \"vpc\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tctx.Export(\"vpcId\", vpc.VpcId)\n\t\tctx.Export(\"vpcPrivateSubnetIds\", vpc.PrivateSubnetIds)\n\t\tctx.Export(\"vpcPublicSubnetIds\", vpc.PublicSubnetIds)\n\t\treturn nil\n\t})\n}\n```\n\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.awsx.ec2.Vpc;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var vpc = new Vpc(\"vpc\");\n\n ctx.export(\"vpcId\", vpc.vpcId());\n ctx.export(\"vpcPrivateSubnetIds\", vpc.privateSubnetIds());\n ctx.export(\"vpcPublicSubnetIds\", vpc.publicSubnetIds());\n }\n}\n```\n\n```yaml\nresources:\n vpc:\n type: awsx:ec2:Vpc\noutputs:\n vpcId: ${vpc.vpcId}\n vpcPrivateSubnetIds: ${vpc.privateSubnetIds}\n vpcPublicSubnetIds: ${vpc.publicSubnetIds}\n```\n\n{{% /example %}}\n{{% /examples %}}\n\n## Subnet Layout Strategies\n\nIf no subnet arguments are passed, then a public and private subnet will be created in each AZ with default sizing. The layout of these subnets can be customised by specifying additional arguments.\n\nAll strategies are designed to help build a uniform layout of subnets each each availability zone.\n\nIf no strategy is specified, \"Legacy\" will be used for backward compatibility reasons. In the next major version this will change to defaulting to \"Auto\".\n\n### Auto\n\nThe \"Auto\" strategy divides the VPC space evenly between the availability zones. Within each availability zone it allocates each subnet in the order they were specified. If a CIDR mask or size was not specified it will default to an even division of the availability zone range. If subnets have different sizes, spaces will be automatically added to ensure subnets don't overlap (e.g. where a previous subnet is smaller than the next).\n\n### Exact\n\nThe \"Exact\" strategy is the same as \"Auto\" with the additional requirement to explicitly specify what the whole of each zone's range will be used for. Where you expect to have a gap between or after subnets, these must be passed using the subnet specification type \"Unused\" to show all space has been properly accounted for.\n\n### Explicit CIDR Blocks\n\nIf you prefer to do your CIDR block calculations yourself, you can specify a list of CIDR blocks for each subnet spec which it will be allocated for in each availability zone. If using explicit layouts, all subnet specs must be declared with explicit CIDR blocks. Each list of CIDR blocks must have the same length as the number of availability zones for the VPC.\n\n### Legacy\n\nThe \"Legacy\" works similarly to the \"Auto\" strategy except that within each availability zone it allocates the private subnet first, followed by the public subnets, and lastly the isolated subnets. The order of subnet specifications of the same type can be changed, but the ordering of private, public, isolated is not overridable. For more flexibility we recommend moving to the \"Auto\" strategy. The output property `subnetLayout` shows the configuration required if specifying the \"Auto\" strategy to maintain the current layout.\n", + "properties": { + "eips": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2feip:Eip" + }, + "description": "The EIPs for any NAT Gateways for the VPC. If no NAT Gateways are specified, this will be an empty list." + }, + "internetGateway": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2finternetGateway:InternetGateway", + "description": "The Internet Gateway for the VPC." + }, + "isolatedSubnetIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "natGateways": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2fnatGateway:NatGateway" + }, + "description": "The NAT Gateways for the VPC. If no NAT Gateways are specified, this will be an empty list." + }, + "privateSubnetIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "publicSubnetIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "routeTableAssociations": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2frouteTableAssociation:RouteTableAssociation" + }, + "description": "The Route Table Associations for the VPC." + }, + "routeTables": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2frouteTable:RouteTable" + }, + "description": "The Route Tables for the VPC." + }, + "routes": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2froute:Route" + }, + "description": "The Routes for the VPC." + }, + "subnetLayout": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ec2:ResolvedSubnetSpec" + }, + "description": "The resolved subnet specs layout deployed to each availability zone." + }, + "subnets": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2fsubnet:Subnet" + }, + "description": "The VPC's subnets." + }, + "vpc": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2fvpc:Vpc", + "description": "The VPC.", + "language": { + "csharp": { + "name": "AwsVpc" + } + } + }, + "vpcEndpoints": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2fvpcEndpoint:VpcEndpoint" + }, + "description": "The VPC Endpoints that are enabled" + }, + "vpcId": { + "type": "string" + } + }, + "required": [ + "vpc", + "subnets", + "routeTables", + "routeTableAssociations", + "routes", + "internetGateway", + "natGateways", + "eips", + "subnetLayout", + "publicSubnetIds", + "privateSubnetIds", + "isolatedSubnetIds", + "vpcId", + "vpcEndpoints" + ], + "inputProperties": { + "assignGeneratedIpv6CidrBlock": { + "type": "boolean", + "description": "Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for the VPC. You cannot specify the range of IP addresses, or the size of the CIDR block. Default is `false`. Conflicts with `ipv6_ipam_pool_id`\n" + }, + "availabilityZoneCidrMask": { + "type": "integer", + "plain": true, + "description": "The netmask for each available zone to be aligned to. This is optional, the default value is inferred based on an even distribution of available space from the VPC's CIDR block after being divided evenly by the number of availability zones." + }, + "availabilityZoneNames": { + "type": "array", + "items": { + "type": "string", + "plain": true + }, + "plain": true, + "description": "A list of availability zone names to which the subnets defined in subnetSpecs will be deployed. Optional, defaults to the first 3 AZs in the current region." + }, + "cidrBlock": { + "type": "string", + "plain": true, + "description": "The CIDR block for the VPC. Optional. Defaults to 10.0.0.0/16." + }, + "enableDnsHostnames": { + "type": "boolean", + "description": "A boolean flag to enable/disable DNS hostnames in the VPC. Defaults false.\n" + }, + "enableDnsSupport": { + "type": "boolean", + "description": "A boolean flag to enable/disable DNS support in the VPC. Defaults to true.\n" + }, + "enableNetworkAddressUsageMetrics": { + "type": "boolean", + "description": "Indicates whether Network Address Usage metrics are enabled for your VPC. Defaults to false.\n" + }, + "instanceTenancy": { + "type": "string", + "description": "A tenancy option for instances launched into the VPC. Default is `default`, which ensures that EC2 instances launched in this VPC use the EC2 instance tenancy attribute specified when the EC2 instance is launched. The only other option is `dedicated`, which ensures that EC2 instances launched in this VPC are run on dedicated tenancy instances regardless of the tenancy attribute specified at launch. This has a dedicated per region fee of $2 per hour, plus an hourly per instance usage fee.\n" + }, + "ipv4IpamPoolId": { + "type": "string", + "description": "The ID of an IPv4 IPAM pool you want to use for allocating this VPC's CIDR. IPAM is a VPC feature that you can use to automate your IP address management workflows including assigning, tracking, troubleshooting, and auditing IP addresses across AWS Regions and accounts. Using IPAM you can monitor IP address usage throughout your AWS Organization.\n", + "willReplaceOnChanges": true + }, + "ipv4NetmaskLength": { + "type": "integer", + "description": "The netmask length of the IPv4 CIDR you want to allocate to this VPC. Requires specifying a `ipv4_ipam_pool_id`.\n", + "willReplaceOnChanges": true + }, + "ipv6CidrBlock": { + "type": "string", + "description": "IPv6 CIDR block to request from an IPAM Pool. Can be set explicitly or derived from IPAM using `ipv6_netmask_length`.\n" + }, + "ipv6CidrBlockNetworkBorderGroup": { + "type": "string", + "description": "By default when an IPv6 CIDR is assigned to a VPC a default ipv6_cidr_block_network_border_group will be set to the region of the VPC. This can be changed to restrict advertisement of public addresses to specific Network Border Groups such as LocalZones.\n" + }, + "ipv6IpamPoolId": { + "type": "string", + "description": "IPAM Pool ID for a IPv6 pool. Conflicts with `assign_generated_ipv6_cidr_block`.\n" + }, + "ipv6NetmaskLength": { + "type": "integer", + "description": "Netmask length to request from IPAM Pool. Conflicts with `ipv6_cidr_block`. This can be omitted if IPAM pool as a `allocation_default_netmask_length` set. Valid values are from `44` to `60` in increments of 4.\n" + }, + "natGateways": { + "$ref": "#/types/awsx:ec2:NatGatewayConfiguration", + "plain": true, + "description": "Configuration for NAT Gateways. Optional. If private and public subnets are both specified, defaults to one gateway per availability zone. Otherwise, no gateways will be created." + }, + "numberOfAvailabilityZones": { + "type": "integer", + "plain": true, + "description": "A number of availability zones to which the subnets defined in subnetSpecs will be deployed. Optional, defaults to the first 3 AZs in the current region." + }, + "subnetSpecs": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ec2:SubnetSpec", + "plain": true + }, + "plain": true, + "description": "A list of subnet specs that should be deployed to each AZ specified in availabilityZoneNames. Optional. Defaults to a (smaller) public subnet and a (larger) private subnet based on the size of the CIDR block for the VPC. Private subnets are allocated CIDR block ranges first, followed by Public subnets, and Isolated subnets are allocated last." + }, + "subnetStrategy": { + "$ref": "#/types/awsx:ec2:SubnetAllocationStrategy", + "plain": true, + "description": "The strategy to use when allocating subnets for the VPC. Optional. Defaults to `Legacy`." + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "A map of tags to assign to the resource. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + }, + "vpcEndpointSpecs": { + "type": "array", + "items": { + "$ref": "#/types/awsx:ec2:VpcEndpointSpec", + "plain": true + }, + "plain": true, + "description": "A list of VPC Endpoints specs to be deployed as part of the VPC" + } + }, + "isComponent": true + }, + "awsx:ecr:Image": { + "description": "Builds a docker image and pushes to the ECR repository", + "properties": { + "imageUri": { + "type": "string", + "description": "Unique identifier of the pushed image" + } + }, + "type": "object", + "required": [ + "imageUri" + ], + "inputProperties": { + "args": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "An optional map of named build-time argument variables to set during the Docker build. This flag allows you to pass built-time variables that can be accessed like environment variables inside the `RUN` instruction." + }, + "builderVersion": { + "$ref": "#/types/awsx:ecr:BuilderVersion", + "plain": true, + "description": "The version of the Docker builder." + }, + "cacheFrom": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Images to consider as cache sources" + }, + "context": { + "type": "string", + "description": "Path to a directory to use for the Docker build context, usually the directory in which the Dockerfile resides (although dockerfile may be used to choose a custom location independent of this choice). If not specified, the context defaults to the current working directory; if a relative path is used, it is relative to the current working directory that Pulumi is evaluating." + }, + "dockerfile": { + "type": "string", + "description": "dockerfile may be used to override the default Dockerfile name and/or location. By default, it is assumed to be a file named Dockerfile in the root of the build context." + }, + "imageName": { + "type": "string", + "description": "Custom name for the underlying Docker image resource. If omitted, the image tag assigned by the provider will be used" + }, + "imageTag": { + "type": "string", + "description": "Custom image tag for the resulting docker image. If omitted a random string will be used" + }, + "platform": { + "type": "string", + "description": "The architecture of the platform you want to build this image for, e.g. `linux/arm64`." + }, + "registryId": { + "type": "string", + "description": "ID of the ECR registry in which to store the image. If not provided, this will be inferred from the repository URL)" + }, + "repositoryUrl": { + "type": "string", + "description": "Url of the repository" + }, + "target": { + "type": "string", + "description": "The target of the dockerfile to build" + } + }, + "requiredInputs": [ + "repositoryUrl" + ], + "isComponent": true + }, + "awsx:ecr:Repository": { + "description": "A [Repository] represents an [aws.ecr.Repository] along with an associated [LifecyclePolicy] controlling how images are retained in the repo. \n\nDocker images can be built and pushed to the repo using the [buildAndPushImage] method. This will call into the `@pulumi/docker/buildAndPushImage` function using this repo as the appropriate destination registry.", + "properties": { + "lifecyclePolicy": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecr%2flifecyclePolicy:LifecyclePolicy", + "description": "Underlying repository lifecycle policy" + }, + "repository": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecr%2frepository:Repository", + "description": "Underlying Repository resource", + "language": { + "csharp": { + "name": "AwsRepository" + } + } + }, + "url": { + "type": "string", + "description": "The URL of the repository (in the form aws_account_id.dkr.ecr.region.amazonaws.com/repositoryName).\n" + } + }, + "type": "object", + "required": [ + "repository", + "url" + ], + "inputProperties": { + "encryptionConfigurations": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecr/RepositoryEncryptionConfiguration:RepositoryEncryptionConfiguration" + }, + "description": "Encryption configuration for the repository. See below for schema.\n", + "willReplaceOnChanges": true + }, + "forceDelete": { + "type": "boolean", + "description": "If `true`, will delete the repository even if it contains images.\nDefaults to `false`.\n" + }, + "imageScanningConfiguration": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecr/RepositoryImageScanningConfiguration:RepositoryImageScanningConfiguration", + "description": "Configuration block that defines image scanning configuration for the repository. By default, image scanning must be manually triggered. See the [ECR User Guide](https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning.html) for more information about image scanning.\n" + }, + "imageTagMutability": { + "type": "string", + "description": "The tag mutability setting for the repository. Must be one of: `MUTABLE` or `IMMUTABLE`. Defaults to `MUTABLE`.\n" + }, + "lifecyclePolicy": { + "$ref": "#/types/awsx:ecr:lifecyclePolicy", + "plain": true, + "description": "A lifecycle policy consists of one or more rules that determine which images in a repository should be expired. If not provided, this will default to untagged images expiring after 1 day." + }, + "name": { + "type": "string", + "description": "Name of the repository.\n", + "willReplaceOnChanges": true + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "A map of tags to assign to the resource. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + } + }, + "isComponent": true + }, + "awsx:ecs:EC2Service": { + "description": "Create an ECS Service resource for EC2 with the given unique name, arguments, and options.\nCreates Task definition if `taskDefinitionArgs` is specified.", + "properties": { + "service": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecs%2fservice:Service", + "description": "Underlying ECS Service resource" + }, + "taskDefinition": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecs%2FtaskDefinition:TaskDefinition", + "description": "Underlying EC2 Task definition component resource if created from args" + } + }, + "required": [ + "service" + ], + "inputProperties": { + "alarms": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceAlarms:ServiceAlarms", + "description": "Information about the CloudWatch alarms. See below.\n" + }, + "availabilityZoneRebalancing": { + "type": "string", + "description": "ECS automatically redistributes tasks within a service across Availability Zones (AZs) to mitigate the risk of impaired application availability due to underlying infrastructure failures and task lifecycle activities. The valid values are `ENABLED` and `DISABLED`. Defaults to `DISABLED`.\n" + }, + "cluster": { + "type": "string", + "description": "ARN of an ECS cluster.\n", + "willReplaceOnChanges": true + }, + "continueBeforeSteadyState": { + "type": "boolean", + "description": "If `true`, this provider will not wait for the service to reach a steady state (like [`aws ecs wait services-stable`](https://docs.aws.amazon.com/cli/latest/reference/ecs/wait/services-stable.html)) before continuing. Default `false`." + }, + "deploymentCircuitBreaker": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceDeploymentCircuitBreaker:ServiceDeploymentCircuitBreaker", + "description": "Configuration block for deployment circuit breaker. See below.\n" + }, + "deploymentController": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceDeploymentController:ServiceDeploymentController", + "description": "Configuration block for deployment controller configuration. See below.\n" + }, + "deploymentMaximumPercent": { + "type": "integer", + "description": "Upper limit (as a percentage of the service's desiredCount) of the number of running tasks that can be running in a service during a deployment. Not valid when using the `DAEMON` scheduling strategy.\n" + }, + "deploymentMinimumHealthyPercent": { + "type": "integer", + "description": "Lower limit (as a percentage of the service's desiredCount) of the number of running tasks that must remain running and healthy in a service during a deployment.\n" + }, + "desiredCount": { + "type": "integer", + "description": "Number of instances of the task definition to place and keep running. Defaults to 0. Do not specify if using the `DAEMON` scheduling strategy.\n" + }, + "enableEcsManagedTags": { + "type": "boolean", + "description": "Whether to enable Amazon ECS managed tags for the tasks within the service.\n" + }, + "enableExecuteCommand": { + "type": "boolean", + "description": "Whether to enable Amazon ECS Exec for the tasks within the service.\n" + }, + "forceDelete": { + "type": "boolean", + "description": "Enable to delete a service even if it wasn't scaled down to zero tasks. It's only necessary to use this if the service uses the `REPLICA` scheduling strategy.\n" + }, + "forceNewDeployment": { + "type": "boolean", + "description": "Enable to force a new task deployment of the service. This can be used to update tasks to use a newer Docker image with same image/tag combination (e.g., `myimage:latest`), roll Fargate tasks onto a newer platform version, or immediately deploy `ordered_placement_strategy` and `placement_constraints` updates.\nWhen using the forceNewDeployment property you also need to configure the triggers property.\n" + }, + "healthCheckGracePeriodSeconds": { + "type": "integer", + "description": "Seconds to ignore failing load balancer health checks on newly instantiated tasks to prevent premature shutdown, up to 2147483647. Only valid for services configured to use load balancers.\n" + }, + "iamRole": { + "type": "string", + "description": "ARN of the IAM role that allows Amazon ECS to make calls to your load balancer on your behalf. This parameter is required if you are using a load balancer with your service, but only if your task definition does not use the `awsvpc` network mode. If using `awsvpc` network mode, do not specify this role. If your account has already created the Amazon ECS service-linked role, that role is used by default for your service unless you specify a role here.\n", + "willReplaceOnChanges": true + }, + "loadBalancers": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceLoadBalancer:ServiceLoadBalancer" + }, + "description": "Configuration block for load balancers. See below.\n" + }, + "name": { + "type": "string", + "description": "Name of the service (up to 255 letters, numbers, hyphens, and underscores)\n\nThe following arguments are optional:\n", + "willReplaceOnChanges": true + }, + "networkConfiguration": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceNetworkConfiguration:ServiceNetworkConfiguration", + "description": "Network configuration for the service. This parameter is required for task definitions that use the `awsvpc` network mode to receive their own Elastic Network Interface, and it is not supported for other network modes. See below.\n" + }, + "orderedPlacementStrategies": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceOrderedPlacementStrategy:ServiceOrderedPlacementStrategy" + }, + "description": "Service level strategy rules that are taken into consideration during task placement. List from top to bottom in order of precedence. Updates to this configuration will take effect next task deployment unless `force_new_deployment` is enabled. The maximum number of `ordered_placement_strategy` blocks is `5`. See below.\n" + }, + "placementConstraints": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServicePlacementConstraint:ServicePlacementConstraint" + }, + "description": "Rules that are taken into consideration during task placement. Updates to this configuration will take effect next task deployment unless `force_new_deployment` is enabled. Maximum number of `placement_constraints` is `10`. See below.\n" + }, + "platformVersion": { + "type": "string", + "description": "Platform version on which to run your service. Only applicable for `launch_type` set to `FARGATE`. Defaults to `LATEST`. More information about Fargate platform versions can be found in the [AWS ECS User Guide](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html).\n" + }, + "propagateTags": { + "type": "string", + "description": "Whether to propagate the tags from the task definition or the service to the tasks. The valid values are `SERVICE` and `TASK_DEFINITION`.\n" + }, + "schedulingStrategy": { + "type": "string", + "description": "Scheduling strategy to use for the service. The valid values are `REPLICA` and `DAEMON`. Defaults to `REPLICA`. Note that [*Tasks using the Fargate launch type or the `CODE_DEPLOY` or `EXTERNAL` deployment controller types don't support the `DAEMON` scheduling strategy*](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html).\n", + "willReplaceOnChanges": true + }, + "serviceConnectConfiguration": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceServiceConnectConfiguration:ServiceServiceConnectConfiguration", + "description": "ECS Service Connect configuration for this service to discover and connect to services, and be discovered by, and connected from, other services within a namespace. See below.\n" + }, + "serviceRegistries": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceServiceRegistries:ServiceServiceRegistries", + "description": "Service discovery registries for the service. The maximum number of `service_registries` blocks is `1`. See below.\n" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Key-value map of resource tags. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + }, + "taskDefinition": { + "type": "string", + "description": "Family and revision (`family:revision`) or full ARN of the task definition that you want to run in your service. Either [taskDefinition] or [taskDefinitionArgs] must be provided." + }, + "taskDefinitionArgs": { + "$ref": "#/types/awsx:ecs:EC2ServiceTaskDefinition", + "plain": true, + "description": "The args of task definition that you want to run in your service. Either [taskDefinition] or [taskDefinitionArgs] must be provided." + }, + "triggers": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Map of arbitrary keys and values that, when changed, will trigger an in-place update (redeployment). Useful with `\"plantimestamp()\"`. When using the triggers property you also need to set the forceNewDeployment property to True.\n" + }, + "volumeConfiguration": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceVolumeConfiguration:ServiceVolumeConfiguration", + "description": "Configuration for a volume specified in the task definition as a volume that is configured at launch time. Currently, the only supported volume type is an Amazon EBS volume. See below.\n" + }, + "vpcLatticeConfigurations": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceVpcLatticeConfiguration:ServiceVpcLatticeConfiguration" + }, + "description": "The VPC Lattice configuration for your service that allows Lattice to connect, secure, and monitor your service across multiple accounts and VPCs. See below.\n" + } + }, + "isComponent": true + }, + "awsx:ecs:EC2TaskDefinition": { + "description": "Create a TaskDefinition resource with the given unique name, arguments, and options.\nCreates required log-group and task \u0026 execution roles.\nPresents required Service load balancers if target group included in port mappings.", + "properties": { + "executionRole": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:iam%2Frole:Role", + "description": "Auto-created IAM task execution role that the Amazon ECS container agent and the Docker daemon can assume." + }, + "loadBalancers": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs%2FServiceLoadBalancer:ServiceLoadBalancer" + }, + "description": "Computed load balancers from target groups specified of container port mappings." + }, + "logGroup": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:cloudwatch%2FlogGroup:LogGroup", + "description": "Auto-created Log Group resource for use by containers." + }, + "taskDefinition": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecs%2FtaskDefinition:TaskDefinition", + "description": "Underlying ECS Task Definition resource" + }, + "taskRole": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:iam%2Frole:Role", + "description": "Auto-created IAM role that allows your Amazon ECS container task to make calls to other AWS services." + } + }, + "required": [ + "taskDefinition", + "loadBalancers" + ], + "inputProperties": { + "container": { + "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", + "plain": true, + "description": "Single container to make a TaskDefinition from. Useful for simple cases where there aren't\nmultiple containers, especially when creating a TaskDefinition to call [run] on.\n\nEither [container] or [containers] must be provided." + }, + "containers": { + "type": "object", + "additionalProperties": { + "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", + "plain": true + }, + "plain": true, + "description": "All the containers to make a TaskDefinition from. Useful when creating a Service that will\ncontain many containers within.\n\nEither [container] or [containers] must be provided." + }, + "cpu": { + "type": "string", + "description": "The number of cpu units used by the task. If not provided, a default will be computed based on the cumulative needs specified by [containerDefinitions]" + }, + "ephemeralStorage": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionEphemeralStorage:TaskDefinitionEphemeralStorage", + "description": "The amount of ephemeral storage to allocate for the task. This parameter is used to expand the total amount of ephemeral storage available, beyond the default amount, for tasks hosted on AWS Fargate. See Ephemeral Storage.\n", + "willReplaceOnChanges": true + }, + "executionRole": { + "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", + "plain": true, + "description": "The execution role that the Amazon ECS container agent and the Docker daemon can assume.\nWill be created automatically if not defined." + }, + "family": { + "type": "string", + "description": "An optional unique name for your task definition. If not specified, then a default will be created." + }, + "inferenceAccelerators": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionInferenceAccelerator:TaskDefinitionInferenceAccelerator" + }, + "description": "Configuration block(s) with Inference Accelerators settings. Detailed below.\n", + "willReplaceOnChanges": true + }, + "ipcMode": { + "type": "string", + "description": "IPC resource namespace to be used for the containers in the task The valid values are `host`, `task`, and `none`.\n", + "willReplaceOnChanges": true + }, + "logGroup": { + "$ref": "#/types/awsx:awsx:DefaultLogGroup", + "plain": true, + "description": "A set of volume blocks that containers in your task may use." + }, + "memory": { + "type": "string", + "description": "The amount (in MiB) of memory used by the task. If not provided, a default will be computed\nbased on the cumulative needs specified by [containerDefinitions]" + }, + "networkMode": { + "type": "string", + "description": "Docker networking mode to use for the containers in the task. Valid values are `none`, `bridge`, `awsvpc`, and `host`.\n", + "willReplaceOnChanges": true + }, + "pidMode": { + "type": "string", + "description": "Process namespace to use for the containers in the task. The valid values are `host` and `task`.\n", + "willReplaceOnChanges": true + }, + "placementConstraints": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionPlacementConstraint:TaskDefinitionPlacementConstraint" + }, + "description": "Configuration block for rules that are taken into consideration during task placement. Maximum number of `placement_constraints` is `10`. Detailed below.\n", + "willReplaceOnChanges": true + }, + "proxyConfiguration": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionProxyConfiguration:TaskDefinitionProxyConfiguration", + "description": "Configuration block for the App Mesh proxy. Detailed below.\n", + "willReplaceOnChanges": true + }, + "runtimePlatform": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionRuntimePlatform:TaskDefinitionRuntimePlatform", + "description": "Configuration block for runtime_platform that containers in your task may use.\n", + "willReplaceOnChanges": true + }, + "skipDestroy": { + "type": "boolean", + "description": "Whether to retain the old revision when the resource is destroyed or replacement is necessary. Default is `false`.\n" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Key-value map of resource tags. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + }, + "taskRole": { + "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", + "plain": true, + "description": "IAM role that allows your Amazon ECS container task to make calls to other AWS services.\nWill be created automatically if not defined." + }, + "trackLatest": { + "type": "boolean", + "description": "Whether should track latest `ACTIVE` task definition on AWS or the one created with the resource stored in state. Default is `false`. Useful in the event the task definition is modified outside of this resource.\n" + }, + "volumes": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionVolume:TaskDefinitionVolume" + }, + "description": "Configuration block for volumes that containers in your task may use. Detailed below.\n", + "willReplaceOnChanges": true + } + }, + "isComponent": true + }, + "awsx:ecs:FargateService": { + "description": "Create an ECS Service resource for Fargate with the given unique name, arguments, and options.\nCreates Task definition if `taskDefinitionArgs` is specified.", + "properties": { + "service": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecs%2fservice:Service", + "description": "Underlying ECS Service resource" + }, + "taskDefinition": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecs%2FtaskDefinition:TaskDefinition", + "description": "Underlying Fargate component resource if created from args" + } + }, + "required": [ + "service" + ], + "inputProperties": { + "alarms": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceAlarms:ServiceAlarms", + "description": "Information about the CloudWatch alarms. See below.\n" + }, + "assignPublicIp": { + "type": "boolean", + "description": "Assign a public IP address to the ENI (Fargate launch type only). Valid values are `true` or `false`. Default `false`." + }, + "availabilityZoneRebalancing": { + "type": "string", + "description": "ECS automatically redistributes tasks within a service across Availability Zones (AZs) to mitigate the risk of impaired application availability due to underlying infrastructure failures and task lifecycle activities. The valid values are `ENABLED` and `DISABLED`. Defaults to `DISABLED`.\n" + }, + "cluster": { + "type": "string", + "description": "ARN of an ECS cluster.\n", + "willReplaceOnChanges": true + }, + "continueBeforeSteadyState": { + "type": "boolean", + "description": "If `true`, this provider will not wait for the service to reach a steady state (like [`aws ecs wait services-stable`](https://docs.aws.amazon.com/cli/latest/reference/ecs/wait/services-stable.html)) before continuing. Default `false`." + }, + "deploymentCircuitBreaker": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceDeploymentCircuitBreaker:ServiceDeploymentCircuitBreaker", + "description": "Configuration block for deployment circuit breaker. See below.\n" + }, + "deploymentController": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceDeploymentController:ServiceDeploymentController", + "description": "Configuration block for deployment controller configuration. See below.\n" + }, + "deploymentMaximumPercent": { + "type": "integer", + "description": "Upper limit (as a percentage of the service's desiredCount) of the number of running tasks that can be running in a service during a deployment. Not valid when using the `DAEMON` scheduling strategy.\n" + }, + "deploymentMinimumHealthyPercent": { + "type": "integer", + "description": "Lower limit (as a percentage of the service's desiredCount) of the number of running tasks that must remain running and healthy in a service during a deployment.\n" + }, + "desiredCount": { + "type": "integer", + "description": "Number of instances of the task definition to place and keep running. Defaults to 1. Do not specify if using the `DAEMON` scheduling strategy.\n" + }, + "enableEcsManagedTags": { + "type": "boolean", + "description": "Whether to enable Amazon ECS managed tags for the tasks within the service.\n" + }, + "enableExecuteCommand": { + "type": "boolean", + "description": "Whether to enable Amazon ECS Exec for the tasks within the service.\n" + }, + "forceDelete": { + "type": "boolean", + "description": "Enable to delete a service even if it wasn't scaled down to zero tasks. It's only necessary to use this if the service uses the `REPLICA` scheduling strategy.\n" + }, + "forceNewDeployment": { + "type": "boolean", + "description": "Enable to force a new task deployment of the service. This can be used to update tasks to use a newer Docker image with same image/tag combination (e.g., `myimage:latest`), roll Fargate tasks onto a newer platform version, or immediately deploy `ordered_placement_strategy` and `placement_constraints` updates.\nWhen using the forceNewDeployment property you also need to configure the triggers property.\n" + }, + "healthCheckGracePeriodSeconds": { + "type": "integer", + "description": "Seconds to ignore failing load balancer health checks on newly instantiated tasks to prevent premature shutdown, up to 2147483647. Only valid for services configured to use load balancers.\n" + }, + "iamRole": { + "type": "string", + "description": "ARN of the IAM role that allows Amazon ECS to make calls to your load balancer on your behalf. This parameter is required if you are using a load balancer with your service, but only if your task definition does not use the `awsvpc` network mode. If using `awsvpc` network mode, do not specify this role. If your account has already created the Amazon ECS service-linked role, that role is used by default for your service unless you specify a role here.\n", + "willReplaceOnChanges": true + }, + "loadBalancers": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceLoadBalancer:ServiceLoadBalancer" + }, + "description": "Configuration block for load balancers. See below.\n" + }, + "name": { + "type": "string", + "description": "Name of the service (up to 255 letters, numbers, hyphens, and underscores)\n\nThe following arguments are optional:\n", + "willReplaceOnChanges": true + }, + "networkConfiguration": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceNetworkConfiguration:ServiceNetworkConfiguration", + "description": "Network configuration for the service. This parameter is required for task definitions that use the `awsvpc` network mode to receive their own Elastic Network Interface, and it is not supported for other network modes. See below.\n" + }, + "placementConstraints": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServicePlacementConstraint:ServicePlacementConstraint" + }, + "description": "Rules that are taken into consideration during task placement. Updates to this configuration will take effect next task deployment unless `force_new_deployment` is enabled. Maximum number of `placement_constraints` is `10`. See below.\n" + }, + "platformVersion": { + "type": "string", + "description": "Platform version on which to run your service. Only applicable for `launch_type` set to `FARGATE`. Defaults to `LATEST`. More information about Fargate platform versions can be found in the [AWS ECS User Guide](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html).\n" + }, + "propagateTags": { + "type": "string", + "description": "Whether to propagate the tags from the task definition or the service to the tasks. The valid values are `SERVICE` and `TASK_DEFINITION`.\n" + }, + "schedulingStrategy": { + "type": "string", + "description": "Scheduling strategy to use for the service. The valid values are `REPLICA` and `DAEMON`. Defaults to `REPLICA`. Note that [*Tasks using the Fargate launch type or the `CODE_DEPLOY` or `EXTERNAL` deployment controller types don't support the `DAEMON` scheduling strategy*](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html).\n", + "willReplaceOnChanges": true + }, + "serviceConnectConfiguration": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceServiceConnectConfiguration:ServiceServiceConnectConfiguration", + "description": "ECS Service Connect configuration for this service to discover and connect to services, and be discovered by, and connected from, other services within a namespace. See below.\n" + }, + "serviceRegistries": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceServiceRegistries:ServiceServiceRegistries", + "description": "Service discovery registries for the service. The maximum number of `service_registries` blocks is `1`. See below.\n" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Key-value map of resource tags. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + }, + "taskDefinition": { + "type": "string", + "description": "Family and revision (`family:revision`) or full ARN of the task definition that you want to run in your service. Either [taskDefinition] or [taskDefinitionArgs] must be provided." + }, + "taskDefinitionArgs": { + "$ref": "#/types/awsx:ecs:FargateServiceTaskDefinition", + "plain": true, + "description": "The args of task definition that you want to run in your service. Either [taskDefinition] or [taskDefinitionArgs] must be provided." + }, + "triggers": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Map of arbitrary keys and values that, when changed, will trigger an in-place update (redeployment). Useful with `\"plantimestamp()\"`. When using the triggers property you also need to set the forceNewDeployment property to True.\n" + }, + "volumeConfiguration": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceVolumeConfiguration:ServiceVolumeConfiguration", + "description": "Configuration for a volume specified in the task definition as a volume that is configured at launch time. Currently, the only supported volume type is an Amazon EBS volume. See below.\n" + }, + "vpcLatticeConfigurations": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/ServiceVpcLatticeConfiguration:ServiceVpcLatticeConfiguration" + }, + "description": "The VPC Lattice configuration for your service that allows Lattice to connect, secure, and monitor your service across multiple accounts and VPCs. See below.\n" + } + }, + "isComponent": true + }, + "awsx:ecs:FargateTaskDefinition": { + "description": "Create a TaskDefinition resource with the given unique name, arguments, and options.\nCreates required log-group and task \u0026 execution roles.\nPresents required Service load balancers if target group included in port mappings.", + "properties": { + "executionRole": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:iam%2Frole:Role", + "description": "Auto-created IAM task execution role that the Amazon ECS container agent and the Docker daemon can assume." + }, + "loadBalancers": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs%2FServiceLoadBalancer:ServiceLoadBalancer" + }, + "description": "Computed load balancers from target groups specified of container port mappings." + }, + "logGroup": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:cloudwatch%2FlogGroup:LogGroup", + "description": "Auto-created Log Group resource for use by containers." + }, + "taskDefinition": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ecs%2FtaskDefinition:TaskDefinition", + "description": "Underlying ECS Task Definition resource" + }, + "taskRole": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:iam%2Frole:Role", + "description": "Auto-created IAM role that allows your Amazon ECS container task to make calls to other AWS services." + } + }, + "required": [ + "taskDefinition", + "loadBalancers" + ], + "inputProperties": { + "container": { + "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", + "plain": true, + "description": "Single container to make a TaskDefinition from. Useful for simple cases where there aren't\nmultiple containers, especially when creating a TaskDefinition to call [run] on.\n\nEither [container] or [containers] must be provided." + }, + "containers": { + "type": "object", + "additionalProperties": { + "$ref": "#/types/awsx:ecs:TaskDefinitionContainerDefinition", + "plain": true + }, + "plain": true, + "description": "All the containers to make a TaskDefinition from. Useful when creating a Service that will\ncontain many containers within.\n\nEither [container] or [containers] must be provided." + }, + "cpu": { + "type": "string", + "description": "The number of cpu units used by the task. If not provided, a default will be computed based on the cumulative needs specified by [containerDefinitions]" + }, + "ephemeralStorage": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionEphemeralStorage:TaskDefinitionEphemeralStorage", + "description": "The amount of ephemeral storage to allocate for the task. This parameter is used to expand the total amount of ephemeral storage available, beyond the default amount, for tasks hosted on AWS Fargate. See Ephemeral Storage.\n", + "willReplaceOnChanges": true + }, + "executionRole": { + "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", + "plain": true, + "description": "The execution role that the Amazon ECS container agent and the Docker daemon can assume.\nWill be created automatically if not defined." + }, + "family": { + "type": "string", + "description": "An optional unique name for your task definition. If not specified, then a default will be created." + }, + "inferenceAccelerators": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionInferenceAccelerator:TaskDefinitionInferenceAccelerator" + }, + "description": "Configuration block(s) with Inference Accelerators settings. Detailed below.\n", + "willReplaceOnChanges": true + }, + "ipcMode": { + "type": "string", + "description": "IPC resource namespace to be used for the containers in the task The valid values are `host`, `task`, and `none`.\n", + "willReplaceOnChanges": true + }, + "logGroup": { + "$ref": "#/types/awsx:awsx:DefaultLogGroup", + "plain": true, + "description": "A set of volume blocks that containers in your task may use." + }, + "memory": { + "type": "string", + "description": "The amount (in MiB) of memory used by the task. If not provided, a default will be computed\nbased on the cumulative needs specified by [containerDefinitions]" + }, + "pidMode": { + "type": "string", + "description": "Process namespace to use for the containers in the task. The valid values are `host` and `task`.\n", + "willReplaceOnChanges": true + }, + "placementConstraints": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionPlacementConstraint:TaskDefinitionPlacementConstraint" + }, + "description": "Configuration block for rules that are taken into consideration during task placement. Maximum number of `placement_constraints` is `10`. Detailed below.\n", + "willReplaceOnChanges": true + }, + "proxyConfiguration": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionProxyConfiguration:TaskDefinitionProxyConfiguration", + "description": "Configuration block for the App Mesh proxy. Detailed below.\n", + "willReplaceOnChanges": true + }, + "runtimePlatform": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionRuntimePlatform:TaskDefinitionRuntimePlatform", + "description": "Configuration block for runtime_platform that containers in your task may use.\n", + "willReplaceOnChanges": true + }, + "skipDestroy": { + "type": "boolean", + "description": "Whether to retain the old revision when the resource is destroyed or replacement is necessary. Default is `false`.\n" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Key-value map of resource tags. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + }, + "taskRole": { + "$ref": "#/types/awsx:awsx:DefaultRoleWithPolicy", + "plain": true, + "description": "IAM role that allows your Amazon ECS container task to make calls to other AWS services.\nWill be created automatically if not defined." + }, + "trackLatest": { + "type": "boolean", + "description": "Whether should track latest `ACTIVE` task definition on AWS or the one created with the resource stored in state. Default is `false`. Useful in the event the task definition is modified outside of this resource.\n" + }, + "volumes": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:ecs/TaskDefinitionVolume:TaskDefinitionVolume" + }, + "description": "Configuration block for volumes that containers in your task may use. Detailed below.\n", + "willReplaceOnChanges": true + } + }, + "isComponent": true + }, + "awsx:lb:ApplicationLoadBalancer": { + "description": "Provides an Application Load Balancer resource with listeners, default target group and default security group.", + "properties": { + "defaultSecurityGroup": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2fsecurityGroup:SecurityGroup", + "description": "Default security group, if auto-created" + }, + "defaultTargetGroup": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2ftargetGroup:TargetGroup", + "description": "Default target group, if auto-created" + }, + "listeners": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2flistener:Listener" + }, + "description": "Listeners created as part of this load balancer" + }, + "loadBalancer": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2floadBalancer:LoadBalancer", + "description": "Underlying Load Balancer resource" + }, + "vpcId": { + "type": "string", + "description": "Id of the VPC in which this load balancer is operating" + } + }, + "type": "object", + "required": [ + "loadBalancer", + "defaultTargetGroup" + ], + "inputProperties": { + "accessLogs": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/LoadBalancerAccessLogs:LoadBalancerAccessLogs", + "description": "Access Logs block. See below.\n" + }, + "clientKeepAlive": { + "type": "integer", + "description": "Client keep alive value in seconds. The valid range is 60-604800 seconds. The default is 3600 seconds.\n" + }, + "connectionLogs": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/LoadBalancerConnectionLogs:LoadBalancerConnectionLogs", + "description": "Connection Logs block. See below. Only valid for Load Balancers of type `application`.\n" + }, + "customerOwnedIpv4Pool": { + "type": "string", + "description": "ID of the customer owned ipv4 pool to use for this load balancer.\n", + "willReplaceOnChanges": true + }, + "defaultSecurityGroup": { + "$ref": "#/types/awsx:awsx:DefaultSecurityGroup", + "plain": true, + "description": "Options for creating a default security group if [securityGroups] not specified." + }, + "defaultTargetGroup": { + "$ref": "#/types/awsx:lb:TargetGroup", + "plain": true, + "description": "Options creating a default target group." + }, + "defaultTargetGroupPort": { + "type": "integer", + "description": "Port to use to connect with the target. Valid values are ports 1-65535. Defaults to 80.\n" + }, + "desyncMitigationMode": { + "type": "string", + "description": "How the load balancer handles requests that might pose a security risk to an application due to HTTP desync. Valid values are `monitor`, `defensive` (default), `strictest`.\n" + }, + "dnsRecordClientRoutingPolicy": { + "type": "string", + "description": "How traffic is distributed among the load balancer Availability Zones. Possible values are `any_availability_zone` (default), `availability_zone_affinity`, or `partial_availability_zone_affinity`. See [Availability Zone DNS affinity](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/network-load-balancers.html#zonal-dns-affinity) for additional details. Only valid for `network` type load balancers.\n" + }, + "dropInvalidHeaderFields": { + "type": "boolean", + "description": "Whether HTTP headers with header fields that are not valid are removed by the load balancer (true) or routed to targets (false). The default is false. Elastic Load Balancing requires that message header names contain only alphanumeric characters and hyphens. Only valid for Load Balancers of type `application`.\n" + }, + "enableDeletionProtection": { + "type": "boolean", + "description": "If true, deletion of the load balancer will be disabled via the AWS API. This will prevent this provider from deleting the load balancer. Defaults to `false`.\n" + }, + "enableHttp2": { + "type": "boolean", + "description": "Whether HTTP/2 is enabled in `application` load balancers. Defaults to `true`.\n" + }, + "enableTlsVersionAndCipherSuiteHeaders": { + "type": "boolean", + "description": "Whether the two headers (`x-amzn-tls-version` and `x-amzn-tls-cipher-suite`), which contain information about the negotiated TLS version and cipher suite, are added to the client request before sending it to the target. Only valid for Load Balancers of type `application`. Defaults to `false`\n" + }, + "enableWafFailOpen": { + "type": "boolean", + "description": "Whether to allow a WAF-enabled load balancer to route requests to targets if it is unable to forward the request to AWS WAF. Defaults to `false`.\n" + }, + "enableXffClientPort": { + "type": "boolean", + "description": "Whether the X-Forwarded-For header should preserve the source port that the client used to connect to the load balancer in `application` load balancers. Defaults to `false`.\n" + }, + "enableZonalShift": { + "type": "boolean", + "description": "Whether zonal shift is enabled. Defaults to `false`.\n" + }, + "enforceSecurityGroupInboundRulesOnPrivateLinkTraffic": { + "type": "string", + "description": "Whether inbound security group rules are enforced for traffic originating from a PrivateLink. Only valid for Load Balancers of type `network`. The possible values are `on` and `off`.\n" + }, + "idleTimeout": { + "type": "integer", + "description": "Time in seconds that the connection is allowed to be idle. Only valid for Load Balancers of type `application`. Default: 60.\n" + }, + "internal": { + "type": "boolean", + "description": "If true, the LB will be internal. Defaults to `false`.\n", + "willReplaceOnChanges": true + }, + "ipAddressType": { + "type": "string", + "description": "Type of IP addresses used by the subnets for your load balancer. The possible values depend upon the load balancer type: `ipv4` (all load balancer types), `dualstack` (all load balancer types), and `dualstack-without-public-ipv4` (type `application` only).\n" + }, + "listener": { + "$ref": "#/types/awsx:lb:Listener", + "plain": true, + "description": "A listener to create. Only one of [listener] and [listeners] can be specified." + }, + "listeners": { + "type": "array", + "items": { + "$ref": "#/types/awsx:lb:Listener", + "plain": true + }, + "plain": true, + "description": "List of listeners to create. Only one of [listener] and [listeners] can be specified." + }, + "name": { + "type": "string", + "description": "Name of the LB. This name must be unique within your AWS account, can have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and must not begin or end with a hyphen. If not specified, this provider will autogenerate a name beginning with `tf-lb`.\n", + "willReplaceOnChanges": true + }, + "namePrefix": { + "type": "string", + "description": "Creates a unique name beginning with the specified prefix. Conflicts with `name`.\n", + "willReplaceOnChanges": true + }, + "preserveHostHeader": { + "type": "boolean", + "description": "Whether the Application Load Balancer should preserve the Host header in the HTTP request and send it to the target without any change. Defaults to `false`.\n" + }, + "securityGroups": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of security group IDs to assign to the LB. Only valid for Load Balancers of type `application` or `network`. For load balancers of type `network` security groups cannot be added if none are currently present, and cannot all be removed once added. If either of these conditions are met, this will force a recreation of the resource.\n" + }, + "subnetIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of subnet IDs to attach to the LB. For Load Balancers of type `network` subnets can only be added (see [Availability Zones](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/network-load-balancers.html#availability-zones)), deleting a subnet for load balancers of type `network` will force a recreation of the resource.\n" + }, + "subnetMappings": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/LoadBalancerSubnetMapping:LoadBalancerSubnetMapping" + }, + "description": "Subnet mapping block. See below. For Load Balancers of type `network` subnet mappings can only be added.\n" + }, + "subnets": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2fsubnet:Subnet" + }, + "description": "A list of subnets to attach to the LB. Only one of [subnets], [subnetIds] or [subnetMappings] can be specified" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Map of tags to assign to the resource. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + }, + "xffHeaderProcessingMode": { + "type": "string", + "description": "Determines how the load balancer modifies the `X-Forwarded-For` header in the HTTP request before sending the request to the target. The possible values are `append`, `preserve`, and `remove`. Only valid for Load Balancers of type `application`. The default is `append`.\n" + } + }, + "isComponent": true + }, + "awsx:lb:NetworkLoadBalancer": { + "description": "Provides a Network Load Balancer resource with listeners and default target group.", + "properties": { + "defaultTargetGroup": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2ftargetGroup:TargetGroup", + "description": "Default target group, if auto-created" + }, + "listeners": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2flistener:Listener" + }, + "description": "Listeners created as part of this load balancer" + }, + "loadBalancer": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2floadBalancer:LoadBalancer", + "description": "Underlying Load Balancer resource" + }, + "vpcId": { + "type": "string", + "description": "Id of the VPC in which this load balancer is operating" + } + }, + "type": "object", + "required": [ + "loadBalancer", + "defaultTargetGroup" + ], + "inputProperties": { + "accessLogs": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/LoadBalancerAccessLogs:LoadBalancerAccessLogs", + "description": "Access Logs block. See below.\n" + }, + "clientKeepAlive": { + "type": "integer", + "description": "Client keep alive value in seconds. The valid range is 60-604800 seconds. The default is 3600 seconds.\n" + }, + "connectionLogs": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/LoadBalancerConnectionLogs:LoadBalancerConnectionLogs", + "description": "Connection Logs block. See below. Only valid for Load Balancers of type `application`.\n" + }, + "customerOwnedIpv4Pool": { + "type": "string", + "description": "ID of the customer owned ipv4 pool to use for this load balancer.\n", + "willReplaceOnChanges": true + }, + "defaultTargetGroup": { + "$ref": "#/types/awsx:lb:TargetGroup", + "plain": true, + "description": "Options creating a default target group." + }, + "defaultTargetGroupPort": { + "type": "integer", + "description": "Port to use to connect with the target. Valid values are ports 1-65535. Defaults to 80.\n" + }, + "desyncMitigationMode": { + "type": "string", + "description": "How the load balancer handles requests that might pose a security risk to an application due to HTTP desync. Valid values are `monitor`, `defensive` (default), `strictest`.\n" + }, + "dnsRecordClientRoutingPolicy": { + "type": "string", + "description": "How traffic is distributed among the load balancer Availability Zones. Possible values are `any_availability_zone` (default), `availability_zone_affinity`, or `partial_availability_zone_affinity`. See [Availability Zone DNS affinity](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/network-load-balancers.html#zonal-dns-affinity) for additional details. Only valid for `network` type load balancers.\n" + }, + "dropInvalidHeaderFields": { + "type": "boolean", + "description": "Whether HTTP headers with header fields that are not valid are removed by the load balancer (true) or routed to targets (false). The default is false. Elastic Load Balancing requires that message header names contain only alphanumeric characters and hyphens. Only valid for Load Balancers of type `application`.\n" + }, + "enableCrossZoneLoadBalancing": { + "type": "boolean", + "description": "If true, cross-zone load balancing of the load balancer will be enabled. For `network` and `gateway` type load balancers, this feature is disabled by default (`false`). For `application` load balancer this feature is always enabled (`true`) and cannot be disabled. Defaults to `false`.\n" + }, + "enableDeletionProtection": { + "type": "boolean", + "description": "If true, deletion of the load balancer will be disabled via the AWS API. This will prevent this provider from deleting the load balancer. Defaults to `false`.\n" + }, + "enableTlsVersionAndCipherSuiteHeaders": { + "type": "boolean", + "description": "Whether the two headers (`x-amzn-tls-version` and `x-amzn-tls-cipher-suite`), which contain information about the negotiated TLS version and cipher suite, are added to the client request before sending it to the target. Only valid for Load Balancers of type `application`. Defaults to `false`\n" + }, + "enableWafFailOpen": { + "type": "boolean", + "description": "Whether to allow a WAF-enabled load balancer to route requests to targets if it is unable to forward the request to AWS WAF. Defaults to `false`.\n" + }, + "enableXffClientPort": { + "type": "boolean", + "description": "Whether the X-Forwarded-For header should preserve the source port that the client used to connect to the load balancer in `application` load balancers. Defaults to `false`.\n" + }, + "enableZonalShift": { + "type": "boolean", + "description": "Whether zonal shift is enabled. Defaults to `false`.\n" + }, + "enforceSecurityGroupInboundRulesOnPrivateLinkTraffic": { + "type": "string", + "description": "Whether inbound security group rules are enforced for traffic originating from a PrivateLink. Only valid for Load Balancers of type `network`. The possible values are `on` and `off`.\n" + }, + "idleTimeout": { + "type": "integer", + "description": "Time in seconds that the connection is allowed to be idle. Only valid for Load Balancers of type `application`. Default: 60.\n" + }, + "internal": { + "type": "boolean", + "description": "If true, the LB will be internal. Defaults to `false`.\n", + "willReplaceOnChanges": true + }, + "ipAddressType": { + "type": "string", + "description": "Type of IP addresses used by the subnets for your load balancer. The possible values depend upon the load balancer type: `ipv4` (all load balancer types), `dualstack` (all load balancer types), and `dualstack-without-public-ipv4` (type `application` only).\n" + }, + "listener": { + "$ref": "#/types/awsx:lb:Listener", + "plain": true, + "description": "A listener to create. Only one of [listener] and [listeners] can be specified." + }, + "listeners": { + "type": "array", + "items": { + "$ref": "#/types/awsx:lb:Listener", + "plain": true + }, + "plain": true, + "description": "List of listeners to create. Only one of [listener] and [listeners] can be specified." + }, + "name": { + "type": "string", + "description": "Name of the LB. This name must be unique within your AWS account, can have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and must not begin or end with a hyphen. If not specified, this provider will autogenerate a name beginning with `tf-lb`.\n", + "willReplaceOnChanges": true + }, + "namePrefix": { + "type": "string", + "description": "Creates a unique name beginning with the specified prefix. Conflicts with `name`.\n", + "willReplaceOnChanges": true + }, + "preserveHostHeader": { + "type": "boolean", + "description": "Whether the Application Load Balancer should preserve the Host header in the HTTP request and send it to the target without any change. Defaults to `false`.\n" + }, + "securityGroups": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of security group IDs to assign to the LB. Only valid for Load Balancers of type `application` or `network`. For load balancers of type `network` security groups cannot be added if none are currently present, and cannot all be removed once added. If either of these conditions are met, this will force a recreation of the resource.\n" + }, + "subnetIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of subnet IDs to attach to the LB. For Load Balancers of type `network` subnets can only be added (see [Availability Zones](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/network-load-balancers.html#availability-zones)), deleting a subnet for load balancers of type `network` will force a recreation of the resource.\n" + }, + "subnetMappings": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/types/aws:lb/LoadBalancerSubnetMapping:LoadBalancerSubnetMapping" + }, + "description": "Subnet mapping block. See below. For Load Balancers of type `network` subnet mappings can only be added.\n" + }, + "subnets": { + "type": "array", + "items": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2fsubnet:Subnet" + }, + "description": "A list of subnets to attach to the LB. Only one of [subnets], [subnetIds] or [subnetMappings] can be specified" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Map of tags to assign to the resource. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.\n" + }, + "xffHeaderProcessingMode": { + "type": "string", + "description": "Determines how the load balancer modifies the `X-Forwarded-For` header in the HTTP request before sending the request to the target. The possible values are `append`, `preserve`, and `remove`. Only valid for Load Balancers of type `application`. The default is `append`.\n" + } + }, + "isComponent": true + }, + "awsx:lb:TargetGroupAttachment": { + "description": "Attach an EC2 instance or Lambda to a Load Balancer. This will create required permissions if attaching to a Lambda Function.", + "properties": { + "lambdaPermission": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lambda%2fpermission:Permission", + "description": "Auto-created Lambda permission, if targeting a Lambda function" + }, + "targetGroupAttachment": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2ftargetGroupAttachment:TargetGroupAttachment", + "description": "Underlying Target Group Attachment resource", + "language": { + "csharp": { + "name": "Attachment" + } + } + } + }, + "type": "object", + "required": [ + "targetGroupAttachment" + ], + "inputProperties": { + "instance": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:ec2%2finstance:Instance", + "description": "EC2 Instance to attach to the Target Group. Exactly 1 of [instance], [instanceId], [lambda] or [lambdaArn] must be provided." + }, + "instanceId": { + "type": "string", + "description": "ID of an EC2 Instance to attach to the Target Group. Exactly 1 of [instance], [instanceId], [lambda] or [lambdaArn] must be provided." + }, + "lambda": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lambda%2ffunction:Function", + "description": "Lambda Function to attach to the Target Group. Exactly 1 of [instance], [instanceId], [lambda] or [lambdaArn] must be provided.", + "language": { + "python": { + "name": "function" + } + } + }, + "lambdaArn": { + "type": "string", + "description": "ARN of a Lambda Function to attach to the Target Group. Exactly 1 of [instance], [instanceId], [lambda] or [lambdaArn] must be provided." + }, + "targetGroup": { + "$ref": "/aws/v6.66.2/schema.json#/resources/aws:lb%2ftargetGroup:TargetGroup", + "description": "Target Group to attach to. Exactly one of [targetGroup] or [targetGroupArn] must be specified." + }, + "targetGroupArn": { + "type": "string", + "description": "ARN of the Target Group to attach to. Exactly one of [targetGroup] or [targetGroupArn] must be specified." + } + }, + "isComponent": true + } + }, + "functions": { + "awsx:ec2:getDefaultVpc": { + "deprecationMessage": "Waiting for https://github.com/pulumi/pulumi/issues/7583. Use the DefaultVpc resource until resolved.", + "description": "[NOT YET IMPLEMENTED] Get the Default VPC for a region.", + "inputs": { + "description": "Arguments for getting the default VPC" + }, + "outputs": { + "description": "Outputs from the default VPC configuration", + "properties": { + "privateSubnetIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "publicSubnetIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "vpcId": { + "type": "string", + "description": "The VPC ID for the default VPC" + } + }, + "required": [ + "vpcId", + "publicSubnetIds", + "privateSubnetIds" + ] + } + } + } +} \ No newline at end of file diff --git a/sdk/dotnet/go.mod b/sdk/dotnet/go.mod new file mode 100644 index 000000000..ba4294727 --- /dev/null +++ b/sdk/dotnet/go.mod @@ -0,0 +1,3 @@ +module fake_dotnet_module // Exclude this directory from Go tools + +go 1.17 diff --git a/sdk/java/go.mod b/sdk/java/go.mod new file mode 100644 index 000000000..0a94ccbf2 --- /dev/null +++ b/sdk/java/go.mod @@ -0,0 +1,3 @@ +module fake_java_module // Exclude this directory from Go tools + +go 1.17 diff --git a/sdk/nodejs/go.mod b/sdk/nodejs/go.mod new file mode 100644 index 000000000..104eb1a8f --- /dev/null +++ b/sdk/nodejs/go.mod @@ -0,0 +1,3 @@ +module fake_nodejs_module // Exclude this directory from Go tools + +go 1.17 diff --git a/sdk/python/go.mod b/sdk/python/go.mod new file mode 100644 index 000000000..b91fcbc34 --- /dev/null +++ b/sdk/python/go.mod @@ -0,0 +1,3 @@ +module fake_python_module // Exclude this directory from Go tools + +go 1.17 From 6bb140f4e133072f635761cd714ce036e7507750 Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 15:00:52 -0500 Subject: [PATCH 15/25] Update to latest ci-mgmt --- .ci-mgmt.yaml | 4 +- .github/workflows/build_sdk.yml | 2 +- .github/workflows/prerequisites.yml | 4 +- .github/workflows/publish.yml | 2 +- .github/workflows/test.yml | 88 ++++++++--------------------- .mk/build.mk | 2 - Makefile | 52 ++++++++--------- scripts/ci-mgmt.sh | 5 +- 8 files changed, 56 insertions(+), 103 deletions(-) diff --git a/.ci-mgmt.yaml b/.ci-mgmt.yaml index da81f0a44..f873a7584 100644 --- a/.ci-mgmt.yaml +++ b/.ci-mgmt.yaml @@ -2,10 +2,8 @@ provider: awsx aws: true major-version: 2 template: generic -shards: 10 -# This is defined in .mk/build.mk instead of using the default Go builder. -customBuildProviderCmd: true +buildProviderCmd: "make PROVIDER_BIN=$(1) .make/provider" env: ALT_AWS_ACCESS_KEY_ID: ${{ secrets.ALT_AWS_ACCESS_KEY_ID }} diff --git a/.github/workflows/build_sdk.yml b/.github/workflows/build_sdk.yml index e8d826747..301ac6abd 100644 --- a/.github/workflows/build_sdk.yml +++ b/.github/workflows/build_sdk.yml @@ -67,7 +67,7 @@ jobs: tools: pulumictl, pulumicli, ${{ matrix.language }} - name: Prepare local workspace run: make prepare_local_workspace - - name: Download gen + - name: Download codegen uses: ./.github/actions/download-codegen - name: Update path run: echo "${{ github.workspace }}/bin" >> "$GITHUB_PATH" diff --git a/.github/workflows/prerequisites.yml b/.github/workflows/prerequisites.yml index 77660eaf0..71c17bf15 100644 --- a/.github/workflows/prerequisites.yml +++ b/.github/workflows/prerequisites.yml @@ -90,7 +90,7 @@ jobs: schema-tools compare -r github://api.github.com/pulumi -p awsx -o "${{ inputs.default_branch }}" -n --local-path=provider/cmd/pulumi-resource-awsx/schema.json; echo "$EOF"; } >> "$GITHUB_ENV" - - if: inputs.is_pr && inputs.is_automated == false + - if: inputs.is_pr && inputs.is_automated == false && github.actor != 'dependabot[bot]' name: Comment on PR with Details of Schema Check uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3.0.1 with: @@ -102,7 +102,7 @@ jobs: Maintainer note: consult the [runbook](https://github.com/pulumi/platform-providers-team/blob/main/playbooks/tf-provider-updating.md) for dealing with any breaking changes. - - name: Upload pulumi-gen-awsx + - name: Upload codegen binary for awsx uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 with: name: pulumi-gen-awsx diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 7668b4b6b..23c5f461b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -102,7 +102,7 @@ jobs: - name: Upload Provider Binaries run: aws s3 cp dist s3://get.pulumi.com/releases/plugins/ --recursive - name: Create GH Release - uses: softprops/action-gh-release@e7a8f85e1c67a31e6ed99a94b41bd0b71bbee6b8 # v2 + uses: softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda # v2 if: inputs.isPrerelease == false with: tag_name: v${{ inputs.version }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 52ad9ef4e..78b6cfe3d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -51,59 +51,29 @@ jobs: ref: ${{ env.PR_COMMIT_SHA }} persist-credentials: false - name: Checkout p/examples + if: matrix.testTarget == 'pulumiExamples' uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: repository: pulumi/examples path: p-examples - name: Setup tools uses: ./.github/actions/setup-tools + with: + tools: pulumictl, pulumicli, ${{ matrix.language }} - name: Prepare local workspace run: make prepare_local_workspace - name: Download bin uses: ./.github/actions/download-bin - - name: Download nodejs SDK - uses: ./.github/actions/download-sdk - with: - language: nodejs - - name: Restore makefile progress - run: make --touch provider schema build_nodejs - - name: Install dependencies - run: make install_nodejs_sdk - - name: Download python SDK - uses: ./.github/actions/download-sdk - with: - language: python - - name: Restore makefile progress - run: make --touch provider schema build_python - - name: Install dependencies - run: make install_python_sdk - - name: Download dotnet SDK - uses: ./.github/actions/download-sdk - with: - language: dotnet - - name: Restore makefile progress - run: make --touch provider schema build_dotnet - - name: Install dependencies - run: make install_dotnet_sdk - - name: Download go SDK - uses: ./.github/actions/download-sdk - with: - language: go - - name: Restore makefile progress - run: make --touch provider schema build_go - - name: Install dependencies - run: make install_go_sdk - - name: Download java SDK + - name: Download SDK uses: ./.github/actions/download-sdk with: - language: java + language: ${{ matrix.language }} - name: Restore makefile progress - run: make --touch provider schema build_java - - name: Install dependencies - run: make install_java_sdk + run: make --touch provider schema build_${{ matrix.language }} - name: Update path run: echo "${{ github.workspace }}/bin" >> "$GITHUB_PATH" - name: Install Python deps + if: matrix.language == 'python' run: |- pip3 install virtualenv==20.0.23 pip3 install pipenv @@ -116,31 +86,21 @@ jobs: role-duration-seconds: 7200 role-session-name: awsx@githubActions role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} - - name: Install gotestfmt - uses: GoTestTools/gotestfmt-action@v2 - with: - token: ${{ secrets.GITHUB_TOKEN }} - version: v2.5.0 - - name: Generate shard - run: make shard - env: - SHARD_TOTAL: ${{ matrix.total }} - SHARD_INDEX: ${{ matrix.index }} - - name: Run integration tests - run: make test_shard + - name: Install dependencies + run: make install_${{ matrix.language}}_sdk + - name: Run tests + if: matrix.testTarget == 'local' + run: cd examples && go test -v -count=1 -cover -timeout 2h -tags=${{ matrix.language }} -skip TestPulumiExamples -parallel 4 . + - name: Run pulumi/examples tests + if: matrix.testTarget == 'pulumiExamples' + run: cd examples && go test -v -count=1 -cover -timeout 2h -tags=${{ matrix.language }} -run TestPulumiExamples -parallel 4 . strategy: - fail-fast: false - matrix: - total: - - 10 - index: - - 0 - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - - 9 + fail-fast: false + matrix: + language: + - nodejs + - python + - dotnet + - go + - java + testTarget: [local] diff --git a/.mk/build.mk b/.mk/build.mk index 5c84d2f13..2a69c5d5e 100644 --- a/.mk/build.mk +++ b/.mk/build.mk @@ -1,5 +1,3 @@ -build_provider_cmd = make PROVIDER_BIN=$(1) .make/provider - PROVIDER_BIN := bin/${PROVIDER} PROVIDER_OS := $(shell go env GOOS) PROVIDER_ARCH := $(shell go env GOARCH) diff --git a/Makefile b/Makefile index 5fdb2bd21..e93c86b02 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ ORG := pulumi PROJECT := github.com/$(ORG)/pulumi-$(PACK) PROVIDER_PATH := provider/v2 VERSION_PATH := $(PROVIDER_PATH)/pkg/version.Version -TFGEN := pulumi-gen-$(PACK) +CODEGEN := pulumi-gen-$(PACK) PROVIDER := pulumi-resource-$(PACK) JAVA_GEN := pulumi-java-gen TESTPARALLELISM := 10 @@ -95,8 +95,8 @@ GEN_ENVS := PULUMI_HOME=$(GEN_PULUMI_HOME) PULUMI_CONVERT_EXAMPLES_CACHE_DIR=$(G generate_dotnet: .make/generate_dotnet build_dotnet: .make/build_dotnet .make/generate_dotnet: export PATH := $(WORKING_DIR)/.pulumi/bin:$(PATH) -.make/generate_dotnet: .make/install_plugins bin/$(TFGEN) - $(GEN_ENVS) $(WORKING_DIR)/bin/$(TFGEN) dotnet --out sdk/dotnet/ +.make/generate_dotnet: .make/install_plugins bin/$(CODEGEN) + $(GEN_ENVS) $(WORKING_DIR)/bin/$(CODEGEN) dotnet --out sdk/dotnet/ cd sdk/dotnet/ && \ printf "module fake_dotnet_module // Exclude this directory from Go tools\n\ngo 1.17\n" > go.mod && \ echo "$(VERSION_GENERIC)" >version.txt @@ -109,8 +109,8 @@ build_dotnet: .make/build_dotnet generate_go: .make/generate_go build_go: .make/build_go .make/generate_go: export PATH := $(WORKING_DIR)/.pulumi/bin:$(PATH) -.make/generate_go: .make/install_plugins bin/$(TFGEN) - $(GEN_ENVS) $(WORKING_DIR)/bin/$(TFGEN) go --out sdk/go/ +.make/generate_go: .make/install_plugins bin/$(CODEGEN) + $(GEN_ENVS) $(WORKING_DIR)/bin/$(CODEGEN) go --out sdk/go/ @touch $@ .make/build_go: .make/generate_go cd sdk && go list "$$(grep -e "^module" go.mod | cut -d ' ' -f 2)/go/..." | xargs -I {} bash -c 'go build {} && go clean -i {}' @@ -136,8 +136,8 @@ build_java: .make/build_java generate_nodejs: .make/generate_nodejs build_nodejs: .make/build_nodejs .make/generate_nodejs: export PATH := $(WORKING_DIR)/.pulumi/bin:$(PATH) -.make/generate_nodejs: .make/install_plugins bin/$(TFGEN) - $(GEN_ENVS) $(WORKING_DIR)/bin/$(TFGEN) nodejs --out sdk/nodejs/ +.make/generate_nodejs: .make/install_plugins bin/$(CODEGEN) + $(GEN_ENVS) $(WORKING_DIR)/bin/$(CODEGEN) nodejs --out sdk/nodejs/ printf "module fake_nodejs_module // Exclude this directory from Go tools\n\ngo 1.17\n" > sdk/nodejs/go.mod @touch $@ .make/build_nodejs: .make/generate_nodejs @@ -151,8 +151,8 @@ build_nodejs: .make/build_nodejs generate_python: .make/generate_python build_python: .make/build_python .make/generate_python: export PATH := $(WORKING_DIR)/.pulumi/bin:$(PATH) -.make/generate_python: .make/install_plugins bin/$(TFGEN) - $(GEN_ENVS) $(WORKING_DIR)/bin/$(TFGEN) python --out sdk/python/ +.make/generate_python: .make/install_plugins bin/$(CODEGEN) + $(GEN_ENVS) $(WORKING_DIR)/bin/$(CODEGEN) python --out sdk/python/ printf "module fake_python_module // Exclude this directory from Go tools\n\ngo 1.17\n" > sdk/python/go.mod cp README.md sdk/python/ @touch $@ @@ -193,7 +193,7 @@ install_nodejs_sdk: .make/install_nodejs_sdk install_python_sdk: .PHONY: install_dotnet_sdk install_go_sdk install_java_sdk install_nodejs_sdk install_python_sdk -# Install Pulumi plugins required for TFGen to resolve references +# Install Pulumi plugins required for CODEGEN to resolve references install_plugins: .make/install_plugins .make/install_plugins: export PULUMI_HOME := $(WORKING_DIR)/.pulumi .make/install_plugins: export PATH := $(WORKING_DIR)/.pulumi/bin:$(PATH) @@ -212,6 +212,7 @@ lint_provider.fix: # `make provider_no_deps` builds the provider binary directly, without ensuring that # `cmd/pulumi-resource-awsx/schema.json` is valid and up to date. # To create a release ready binary, you should use `make provider`. +build_provider_cmd = make PROVIDER_BIN=$(1) .make/provider provider: bin/$(PROVIDER) provider_no_deps: $(call build_provider_cmd,$(WORKING_DIR)/bin/$(PROVIDER)) @@ -242,18 +243,19 @@ tfgen_no_deps: .make/schema .make/schema: export PULUMI_CONVERT_EXAMPLES_CACHE_DIR := $(WORKING_DIR)/.pulumi/examples-cache .make/schema: export PULUMI_DISABLE_AUTOMATIC_PLUGIN_ACQUISITION := $(PULUMI_CONVERT) .make/schema: export PULUMI_MISSING_DOCS_ERROR := $(PULUMI_MISSING_DOCS_ERROR) -.make/schema: bin/$(TFGEN) .make/install_plugins .make/upstream - $(WORKING_DIR)/bin/$(TFGEN) schema --out provider/cmd/$(PROVIDER) +.make/schema: bin/$(CODEGEN) .make/install_plugins .make/upstream + $(WORKING_DIR)/bin/$(CODEGEN) schema --out provider/cmd/$(PROVIDER) (cd provider && VERSION=$(VERSION_GENERIC) go generate cmd/$(PROVIDER)/main.go) @touch $@ -tfgen_build_only: bin/$(TFGEN) -bin/$(TFGEN): provider/*.go $(wildcard go.mod provider/go.mod) .make/upstream - (cd provider && go build $(PULUMI_PROVIDER_BUILD_PARALLELISM) -o $(WORKING_DIR)/bin/$(TFGEN) -ldflags "$(LDFLAGS_PROJ_VERSION) $(LDFLAGS_EXTRAS)" $(PROJECT)/$(PROVIDER_PATH)/cmd/$(TFGEN)) +tfgen_build_only: bin/$(CODEGEN) +bin/$(CODEGEN): provider/*.go provider/go.* .make/upstream + (cd provider && go build $(PULUMI_PROVIDER_BUILD_PARALLELISM) -o $(WORKING_DIR)/bin/$(CODEGEN) -ldflags "$(LDFLAGS_PROJ_VERSION) $(LDFLAGS_EXTRAS)" $(PROJECT)/$(PROVIDER_PATH)/cmd/$(CODEGEN)) .PHONY: tfgen schema tfgen_no_deps tfgen_build_only upstream: .make/upstream .make/upstream: @touch $@ +.PHONY: upstream bin/pulumi-java-gen: .pulumi-java-gen.version pulumictl download-binary -n pulumi-language-java -v v$(shell cat .pulumi-java-gen.version) -r pulumi/pulumi-java @@ -283,12 +285,12 @@ ci-mgmt: .ci-mgmt.yaml fi # Compute the version of Pulumi to use by inspecting the Go dependencies of the provider. -.pulumi/version: $(wildcard go.mod provider/go.mod) +.pulumi/version: provider/go.mod cd provider && go list -f "{{slice .Version 1}}" -m github.com/pulumi/pulumi/pkg/v3 | tee ../$@ # Start debug server for tfgen debug_tfgen: - dlv --listen=:2345 --headless=true --api-version=2 exec $(WORKING_DIR)/bin/$(TFGEN) -- schema --out provider/cmd/$(PROVIDER) + dlv --listen=:2345 --headless=true --api-version=2 exec $(WORKING_DIR)/bin/$(CODEGEN) -- schema --out provider/cmd/$(PROVIDER) .PHONY: debug_tfgen # Provider cross-platform build & packaging @@ -314,15 +316,16 @@ bin/windows-amd64/$(PROVIDER).exe: export GOOS := windows bin/windows-amd64/$(PROVIDER).exe: export GOARCH := amd64 bin/%/$(PROVIDER) bin/%/$(PROVIDER).exe: bin/jsign-6.0.jar $(call build_provider_cmd,$(WORKING_DIR)/$@) + @# Only sign windows binary if fully configured. @# Test variables set by joining with | between and looking for || showing at least one variable is empty. @# Move the binary to a temporary location and sign it there to avoid the target being up-to-date if signing fails. - set -e; \ - if [[ "${GOOS}-${GOARCH}" = "windows-amd64" && ${SKIP_SIGNING} != "true" ]]; then \ + @set -e; \ + if [[ "${GOOS}-${GOARCH}" = "windows-amd64" && "${SKIP_SIGNING}" != "true" ]]; then \ if [[ "|${AZURE_SIGNING_CLIENT_ID}|${AZURE_SIGNING_CLIENT_SECRET}|${AZURE_SIGNING_TENANT_ID}|${AZURE_SIGNING_KEY_VAULT_URI}|" == *"||"* ]]; then \ echo "Can't sign windows binaries as required configuration not set: AZURE_SIGNING_CLIENT_ID, AZURE_SIGNING_CLIENT_SECRET, AZURE_SIGNING_TENANT_ID, AZURE_SIGNING_KEY_VAULT_URI"; \ echo "To rebuild with signing delete the unsigned $@ and rebuild with the fixed configuration"; \ - if [[ ${CI} == "true" ]]; then exit 1; fi; \ + if [[ "${CI}" == "true" ]]; then exit 1; fi; \ else \ mv $@ $@.unsigned; \ az login --service-principal \ @@ -370,13 +373,6 @@ provider_dist-darwin-arm64: bin/$(PROVIDER)-v$(VERSION_GENERIC)-darwin-arm64.tar provider_dist-windows-amd64: bin/$(PROVIDER)-v$(VERSION_GENERIC)-windows-amd64.tar.gz provider_dist: provider_dist-linux-amd64 provider_dist-linux-arm64 provider_dist-darwin-amd64 provider_dist-darwin-arm64 provider_dist-windows-amd64 .PHONY: provider_dist-linux-amd64 provider_dist-linux-arm64 provider_dist-darwin-amd64 provider_dist-darwin-arm64 provider_dist-windows-amd64 provider_dist -# shard computes tests to run and modifies the CI runner's environment. -shard: - @(cd examples && go run github.com/pulumi/shard@6dbd62a9c3c5ef92806a9a030b18fe073228ddd2 --total $(SHARD_TOTAL) --index $(SHARD_INDEX) --output env) >> "$(GITHUB_ENV)" - -# test_shard runs the tests specified by a regex contained in $SHARD_TESTS for paths $SHARD_PATHS. -test_shard: - cd examples && \ - go test -tags=all -v -count=1 -coverprofile="coverage.txt" -coverpkg=./... -timeout 3h -parallel ${TESTPARALLELISM} -run "$(SHARD_TESTS)" $(SHARD_PATHS) + # Permit providers to extend the Makefile with provider-specific Make includes. include $(wildcard .mk/*.mk) diff --git a/scripts/ci-mgmt.sh b/scripts/ci-mgmt.sh index 6cd2d4c5f..8cc688454 100755 --- a/scripts/ci-mgmt.sh +++ b/scripts/ci-mgmt.sh @@ -2,5 +2,6 @@ set -euo pipefail -REF=$(cd ~/code/ci-mgmt && git rev-parse HEAD) -go run github.com/pulumi/ci-mgmt/provider-ci@${REF} generate --skip-migrations +(cd ~/code/ci-mgmt/provider-ci && go build) + +~/code/ci-mgmt/provider-ci/provider-ci generate --skip-migrations From 4697ee41bcfbd8b0882c4d66cbfa1bfbcab79282 Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 16:54:52 -0500 Subject: [PATCH 16/25] Automatically install pulumictl --- Makefile | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index e93c86b02..9e845507b 100644 --- a/Makefile +++ b/Makefile @@ -14,11 +14,17 @@ PULUMI_PROVIDER_BUILD_PARALLELISM ?= PULUMI_CONVERT := 0 PULUMI_MISSING_DOCS_ERROR := true +PULUMICTL_VERSION := v0.0.46 +PULUMICTL := $(shell which pulumictl || \ + (test ! -e $(WORKING_DIR)/bin/pulumictl && \ + GOPATH="$(WORKING_DIR)" go install "github.com/pulumi/pulumictl/cmd/pulumictl@$(PULUMICTL_VERSION)"; \ + echo "$(WORKING_DIR)/bin/puluimctl")) + # Override during CI using `make [TARGET] PROVIDER_VERSION=""` or by setting a PROVIDER_VERSION environment variable # Local & branch builds will just used this fixed default version unless specified PROVIDER_VERSION ?= 2.0.0-alpha.0+dev # Use this normalised version everywhere rather than the raw input to ensure consistency. -VERSION_GENERIC = $(shell pulumictl convert-version --language generic --version "$(PROVIDER_VERSION)") +VERSION_GENERIC = $(shell $(PULUMICTL) convert-version --language generic --version "$(PROVIDER_VERSION)") # Strips debug information from the provider binary to reduce its size and speed up builds LDFLAGS_STRIP_SYMBOLS=-s -w @@ -258,7 +264,7 @@ upstream: .make/upstream .PHONY: upstream bin/pulumi-java-gen: .pulumi-java-gen.version - pulumictl download-binary -n pulumi-language-java -v v$(shell cat .pulumi-java-gen.version) -r pulumi/pulumi-java + $(PULUMICTL) download-binary -n pulumi-language-java -v v$(shell cat .pulumi-java-gen.version) -r pulumi/pulumi-java # To make an immediately observable change to .ci-mgmt.yaml: # From f64404b200eddd2f8cc61dd3d2ef04fa362b9782 Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 17:38:14 -0500 Subject: [PATCH 17/25] chore: clean up .ci-mgmt.yaml --- .ci-mgmt.yaml | 62 --------------------------------------------------- 1 file changed, 62 deletions(-) diff --git a/.ci-mgmt.yaml b/.ci-mgmt.yaml index f873a7584..daf5e1aea 100644 --- a/.ci-mgmt.yaml +++ b/.ci-mgmt.yaml @@ -25,65 +25,3 @@ env: SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} PULUMI_ENABLE_RESOURCE_REFERENCES: 1 PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget - -# lint: false -# parallel: 1 -# timeout: 150 -# generate-nightly-test-workflow: true -# providerVersion: github.com/hashicorp/terraform-provider-aws/version.ProviderVersion -# toolVersions: -# dotnet: "6.0.x" -# go: "1.23.x" -# java: "11" -# gradle: "7.6" -# nodejs: "20.x" -# pulumi: "dev" -# python: "3.11.8" -# env: -# PULUMI_MISSING_DOCS_ERROR: true -# AWS_REGION: "us-west-2" -# OIDC_ROLE_ARN: ${{ secrets.OIDC_ROLE_ARN }} -# makeTemplate: bridged -# checkoutSubmodules: true -# freeDiskSpaceBeforeBuild: true -# freeDiskSpaceBeforeSdkBuild: true -# freeDiskSpaceBeforeTest: true -# # TODO: remove XrunUpstreamTools flag after work to add docs replacement strategies to resources.go is completed -# # Tracked in in https://github.com/pulumi/pulumi-aws/issues/2757 -# XrunUpstreamTools: true -# plugins: -# - name: archive -# version: "0.0.1" -# - name: tls -# version: "4.10.0" -# - name: github -# version: "4.10.0" -# - name: kubernetes -# version: "4.11.0" -# - name: "null" -# version: "0.0.3" -# - name: "local" -# version: "0.1.0" -# - name: random -# version: "4.8.2" -# - name: github -# version: "5.14.0" -# - name: std -# version: "1.6.2" -# - name: terraform -# version: "1.0.17" -# kind: converter -# # Use `pulumi convert` for translating examples from TF to Pulumi. -# pulumiConvert: 1 -# goBuildParallelism: 2 -# actions: -# preTest: -# - name: Configure AWS Credentials -# uses: aws-actions/configure-aws-credentials@v4 -# with: -# aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} -# aws-region: ${{ env.AWS_REGION }} -# aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} -# role-duration-seconds: 7200 -# role-session-name: aws@githubActions -# role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} From 1531fd88dd4fc7fb62ac9ebcaae2eea5e8f94b56 Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 17:41:15 -0500 Subject: [PATCH 18/25] Configure release verification --- .ci-mgmt.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.ci-mgmt.yaml b/.ci-mgmt.yaml index daf5e1aea..2664bbd34 100644 --- a/.ci-mgmt.yaml +++ b/.ci-mgmt.yaml @@ -25,3 +25,9 @@ env: SIGNING_PASSWORD: ${{ secrets.JAVA_SIGNING_PASSWORD }} PULUMI_ENABLE_RESOURCE_REFERENCES: 1 PULUMI_LOCAL_NUGET: ${{ github.workspace }}/nuget + +releaseVerification: + nodejs: examples/vpc/nodejs/default-args + python: examples/cloudtrail/python + dotnet: examples/cloudtrail/dotnet + go: examples/cloudtrail/go From 7a755f6ea4a52da79293528b5d7710775b304fed Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 17:41:26 -0500 Subject: [PATCH 19/25] Regenerate ci-mgmt workflows --- .github/workflows/verify-release.yml | 45 +++++++++++++++++++++------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/.github/workflows/verify-release.yml b/.github/workflows/verify-release.yml index 89552c998..545eed682 100644 --- a/.github/workflows/verify-release.yml +++ b/.github/workflows/verify-release.yml @@ -69,18 +69,13 @@ env: jobs: verify-release: name: verify-release - # We don't have any release verification configurations, so we never run this workflow. - # Configure your .ci-mgmt.yaml files to include the release verification configurations e.g. - # releaseVerification: - # nodejs: path/to/nodejs/project - # python: path/to/python/project - # dotnet: path/to/dotnet/project - # go: path/to/go/project - if: false strategy: matrix: - # We don't have any release verification configurations, so we only run on Linux to print warnings to help users configure the release verification. - runner: ["ubuntu-latest"] + # We always run on Linux and Windows, and optionally on MacOS. This is because MacOS runners have limited availability. + # Expression expands to ["ubuntu-latest","windows-latest"] or ["ubuntu-latest","windows-latest","macos-latest"] + # GitHub expressions don't have 'if' statements, so we use a ternary operator to conditionally include the MacOS runner suffix. + # See the docs for a similar example to this: https://docs.github.com/en/actions/learn-github-actions/expressions#fromjson + runner: ${{ fromJSON(format('["ubuntu-latest","windows-latest"{0}]', github.event.inputs.enableMacRunner == 'true' && ',"macos-latest"' || '')) }} runs-on: ${{ matrix.runner }} steps: - name: Checkout Repo @@ -91,3 +86,33 @@ jobs: uses: ./.github/actions/setup-tools with: tools: pulumicli, nodejs, python, dotnet, go, java + - name: Verify nodejs release + uses: pulumi/verify-provider-release@v1 + with: + runtime: nodejs + directory: examples/vpc/nodejs/default-args + provider: awsx + providerVersion: ${{ inputs.providerVersion }} + - name: Verify python release + uses: pulumi/verify-provider-release@v1 + with: + runtime: python + directory: examples/cloudtrail/python + provider: awsx + providerVersion: ${{ inputs.providerVersion }} + packageVersion: ${{ inputs.pythonVersion || inputs.providerVersion }} + - name: Verify dotnet release + uses: pulumi/verify-provider-release@v1 + with: + runtime: dotnet + directory: examples/cloudtrail/dotnet + provider: awsx + providerVersion: ${{ inputs.providerVersion }} + - name: Verify go release + uses: pulumi/verify-provider-release@v1 + if: inputs.skipGoSdk == false + with: + runtime: go + directory: examples/cloudtrail/go + provider: awsx + providerVersion: ${{ inputs.providerVersion }} From faf79928b4f6455500b1a2d53d9e8890c1302027 Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Mon, 13 Jan 2025 17:48:03 -0500 Subject: [PATCH 20/25] Temporarily SKIP all the acc tests --- examples/examples_dotnet_test.go | 2 ++ examples/examples_go_test.go | 1 + examples/examples_nodejs_test.go | 8 ++++++++ examples/examples_python_test.go | 2 ++ 4 files changed, 13 insertions(+) diff --git a/examples/examples_dotnet_test.go b/examples/examples_dotnet_test.go index c60e3c916..c8b7c8fad 100644 --- a/examples/examples_dotnet_test.go +++ b/examples/examples_dotnet_test.go @@ -47,6 +47,8 @@ func TestAccEcsDotnet(t *testing.T) { } func getDotnetBaseOptions(t *testing.T) integration.ProgramTestOptions { + t.Skip() // TODO remove + if os.Getenv("PULUMI_LOCAL_NUGET") == "" { localNugetDir, err := filepath.Abs("../nuget") if err != nil { diff --git a/examples/examples_go_test.go b/examples/examples_go_test.go index cfbb3b8e8..37fd645fb 100644 --- a/examples/examples_go_test.go +++ b/examples/examples_go_test.go @@ -34,6 +34,7 @@ func TestAccTrail(t *testing.T) { } func getGoBaseOptions(t *testing.T) integration.ProgramTestOptions { + t.Skip() // TODO remove region := getEnvRegion(t) base := getBaseOptions(t) goBase := base.With(integration.ProgramTestOptions{ diff --git a/examples/examples_nodejs_test.go b/examples/examples_nodejs_test.go index 0c494329e..d89917ed3 100644 --- a/examples/examples_nodejs_test.go +++ b/examples/examples_nodejs_test.go @@ -56,6 +56,8 @@ func TestAccEcsCapacityProviderService(t *testing.T) { } func TestRegress1112(t *testing.T) { + t.Skip() // TODO remove + t.Setenv("AWS_REGION", "") os.Unsetenv("AWS_REGION") test := integration.ProgramTestOptions{ @@ -351,6 +353,8 @@ func TestVpc(t *testing.T) { } func TestAccEcsParallel(t *testing.T) { + t.Skip() // TODO remove + maxDuration(15*time.Minute, t, func(t *testing.T) { test := getNodeJSBaseOptions(t). With(integration.ProgramTestOptions{ @@ -369,6 +373,8 @@ func TestAccEcsParallel(t *testing.T) { } func TestDockerUpgrade(t *testing.T) { + t.Skip() // TODO remove + providerName := "awsx" baselineVersion := "2.19.0" t.Parallel() @@ -454,6 +460,8 @@ func TestDockerUpgrade(t *testing.T) { } func getNodeJSBaseOptions(t *testing.T) integration.ProgramTestOptions { + t.Skip() // TODO remove + base := getBaseOptions(t) nodeBase := base.With(integration.ProgramTestOptions{ Dependencies: []string{ diff --git a/examples/examples_python_test.go b/examples/examples_python_test.go index 3e95b1bb6..dd281f1d4 100644 --- a/examples/examples_python_test.go +++ b/examples/examples_python_test.go @@ -43,6 +43,8 @@ func TestAccEcsPython(t *testing.T) { } func getPythonBaseOptions(t *testing.T) integration.ProgramTestOptions { + t.Skip() // TODO remove + region := getEnvRegion(t) base := getBaseOptions(t) pyBase := base.With(integration.ProgramTestOptions{ From ce3ef4cde20474a4cb3fc9bac9686f9b8608a222 Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Tue, 14 Jan 2025 10:41:54 -0500 Subject: [PATCH 21/25] Configure AWS credentials for release verification --- .github/actions/setup-tools/action.yml | 2 +- .github/workflows/verify-release.yml | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/actions/setup-tools/action.yml b/.github/actions/setup-tools/action.yml index 14cd282f7..75b82a9a7 100644 --- a/.github/actions/setup-tools/action.yml +++ b/.github/actions/setup-tools/action.yml @@ -47,7 +47,7 @@ runs: - name: Install Pulumi CLI if: inputs.tools == 'all' || contains(inputs.tools, 'pulumicli') - uses: pulumi/actions@c7fad9e2f0b79653172b36538b8b34b3c0291952 # v6 + uses: pulumi/actions@13b8b7177d6fb736766875dac9b78aab07bd785f # v6 with: pulumi-version: "dev" diff --git a/.github/workflows/verify-release.yml b/.github/workflows/verify-release.yml index 545eed682..a196efa8a 100644 --- a/.github/workflows/verify-release.yml +++ b/.github/workflows/verify-release.yml @@ -86,6 +86,15 @@ jobs: uses: ./.github/actions/setup-tools with: tools: pulumicli, nodejs, python, dotnet, go, java + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-region: ${{ env.AWS_REGION }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + role-duration-seconds: 7200 + role-session-name: awsx@githubActions + role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} - name: Verify nodejs release uses: pulumi/verify-provider-release@v1 with: From 5fc3635d738ff7ee2e6bd5b8db890c4735651c49 Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Tue, 14 Jan 2025 10:53:02 -0500 Subject: [PATCH 22/25] Fix indent --- .github/workflows/verify-release.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/verify-release.yml b/.github/workflows/verify-release.yml index a196efa8a..0e88f90f6 100644 --- a/.github/workflows/verify-release.yml +++ b/.github/workflows/verify-release.yml @@ -86,15 +86,15 @@ jobs: uses: ./.github/actions/setup-tools with: tools: pulumicli, nodejs, python, dotnet, go, java - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-region: ${{ env.AWS_REGION }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - role-duration-seconds: 7200 - role-session-name: awsx@githubActions - role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-region: ${{ env.AWS_REGION }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + role-duration-seconds: 7200 + role-session-name: awsx@githubActions + role-to-assume: ${{ secrets.AWS_CI_ROLE_ARN }} - name: Verify nodejs release uses: pulumi/verify-provider-release@v1 with: From be11c8026ed88c02da2de0aaa63fc9b3da3c32c6 Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Tue, 14 Jan 2025 11:26:07 -0500 Subject: [PATCH 23/25] Configure renovate to call generate_sdks --- renovate.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renovate.json5 b/renovate.json5 index 0c6288ab3..b0d74ccbb 100644 --- a/renovate.json5 +++ b/renovate.json5 @@ -8,7 +8,7 @@ // // https://docs.renovatebot.com/configuration-options/#postupgradetasks postUpgradeTasks: { - commands: ["make renovate"], + commands: ["make generate_sdks"], executionMode: "branch", // Only run once. }, }, From 343f740f8f02b217f563561a90279bf7da42ab6d Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Tue, 14 Jan 2025 12:53:53 -0500 Subject: [PATCH 24/25] restore running tests --- examples/examples_dotnet_test.go | 2 -- examples/examples_go_test.go | 1 - examples/examples_nodejs_test.go | 8 -------- examples/examples_python_test.go | 2 -- 4 files changed, 13 deletions(-) diff --git a/examples/examples_dotnet_test.go b/examples/examples_dotnet_test.go index c8b7c8fad..c60e3c916 100644 --- a/examples/examples_dotnet_test.go +++ b/examples/examples_dotnet_test.go @@ -47,8 +47,6 @@ func TestAccEcsDotnet(t *testing.T) { } func getDotnetBaseOptions(t *testing.T) integration.ProgramTestOptions { - t.Skip() // TODO remove - if os.Getenv("PULUMI_LOCAL_NUGET") == "" { localNugetDir, err := filepath.Abs("../nuget") if err != nil { diff --git a/examples/examples_go_test.go b/examples/examples_go_test.go index 37fd645fb..cfbb3b8e8 100644 --- a/examples/examples_go_test.go +++ b/examples/examples_go_test.go @@ -34,7 +34,6 @@ func TestAccTrail(t *testing.T) { } func getGoBaseOptions(t *testing.T) integration.ProgramTestOptions { - t.Skip() // TODO remove region := getEnvRegion(t) base := getBaseOptions(t) goBase := base.With(integration.ProgramTestOptions{ diff --git a/examples/examples_nodejs_test.go b/examples/examples_nodejs_test.go index d89917ed3..0c494329e 100644 --- a/examples/examples_nodejs_test.go +++ b/examples/examples_nodejs_test.go @@ -56,8 +56,6 @@ func TestAccEcsCapacityProviderService(t *testing.T) { } func TestRegress1112(t *testing.T) { - t.Skip() // TODO remove - t.Setenv("AWS_REGION", "") os.Unsetenv("AWS_REGION") test := integration.ProgramTestOptions{ @@ -353,8 +351,6 @@ func TestVpc(t *testing.T) { } func TestAccEcsParallel(t *testing.T) { - t.Skip() // TODO remove - maxDuration(15*time.Minute, t, func(t *testing.T) { test := getNodeJSBaseOptions(t). With(integration.ProgramTestOptions{ @@ -373,8 +369,6 @@ func TestAccEcsParallel(t *testing.T) { } func TestDockerUpgrade(t *testing.T) { - t.Skip() // TODO remove - providerName := "awsx" baselineVersion := "2.19.0" t.Parallel() @@ -460,8 +454,6 @@ func TestDockerUpgrade(t *testing.T) { } func getNodeJSBaseOptions(t *testing.T) integration.ProgramTestOptions { - t.Skip() // TODO remove - base := getBaseOptions(t) nodeBase := base.With(integration.ProgramTestOptions{ Dependencies: []string{ diff --git a/examples/examples_python_test.go b/examples/examples_python_test.go index dd281f1d4..3e95b1bb6 100644 --- a/examples/examples_python_test.go +++ b/examples/examples_python_test.go @@ -43,8 +43,6 @@ func TestAccEcsPython(t *testing.T) { } func getPythonBaseOptions(t *testing.T) integration.ProgramTestOptions { - t.Skip() // TODO remove - region := getEnvRegion(t) base := getBaseOptions(t) pyBase := base.With(integration.ProgramTestOptions{ From 1af57dfc6bcd4349b7be38420076f59f812fe5be Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Tue, 14 Jan 2025 12:54:13 -0500 Subject: [PATCH 25/25] Remove Makefile.old --- Makefile.old | 293 --------------------------------------------------- 1 file changed, 293 deletions(-) delete mode 100644 Makefile.old diff --git a/Makefile.old b/Makefile.old deleted file mode 100644 index 4c64116a3..000000000 --- a/Makefile.old +++ /dev/null @@ -1,293 +0,0 @@ -MAKEFLAGS := --jobs=$(shell nproc) --warn-undefined-variables -PROJECT_NAME := Pulumi Infrastructure Components for AWS - -TESTPARALLELISM := 10 - -PACK := awsx -PROVIDER := pulumi-resource-${PACK} -CODEGEN := pulumi-gen-${PACK} -BIN := ${PROVIDER} - -JAVA_GEN := pulumi-java-gen -JAVA_GEN_VERSION := v0.9.7 - -AWSX_SRC := $(wildcard awsx/*.*) $(wildcard awsx/*/*.ts) -AWSX_CLASSIC_SRC:= $(wildcard awsx-classic/*.*) $(wildcard awsx-classic/*/*.ts) -CODEGEN_SRC := $(shell find schemagen -type f) - -WORKING_DIR := $(shell pwd) - -GOPATH := $(shell go env GOPATH) -GOBIN := ${GOPATH}/bin -export GOBIN=${GOPATH}/bin -LanguageTags ?= "all" -LOCAL_PLAT ?= "" - -PKG_ARGS := --no-bytecode --public-packages "*" --public - -# Override during CI using `make [TARGET] PROVIDER_VERSION=""` or by setting a PROVIDER_VERSION environment variable -# Local & branch builds will just used this fixed default version unless specified -PROVIDER_VERSION ?= 2.0.0-alpha.0+dev -# Use this normalised version everywhere rather than the raw input to ensure consistency. -# Note recursive call to Make to auto-install pulumictl needs VERSION_GENERIC seeded to avoid infinite recursion. -VERSION_GENERIC ?= $(shell make VERSION_GENERIC=$(PROVIDER_VERSION) version_generic) -PULUMICTL_VERSION := v0.0.47 -PULUMICTL_BIN := $(shell which pulumictl 2>/dev/null) - - -GZIP_PREFIX := pulumi-resource-${PACK}-v${VERSION_GENERIC} - -# Pre-requisites: ensure these folders exist -_ := $(shell mkdir -p .make bin dist) - -all:: lint lint_classic provider build_sdks test_provider - -bin/${CODEGEN}: ${CODEGEN_SRC} - cd schemagen && go build -o $(WORKING_DIR)/bin/${CODEGEN} $(WORKING_DIR)/schemagen/cmd/$(CODEGEN) - -.make/schema: bin/${CODEGEN} awsx/package.json - bin/${CODEGEN} schema $(WORKING_DIR) - @touch $@ - -.make/awsx_node_modules: awsx/package.json awsx/yarn.lock - yarn install --cwd awsx --no-progress - @touch $@ - -.make/gen_types: .make/awsx_node_modules .make/schema - cd awsx && yarn gen-types - @touch $@ - -.make/awsx_bin: .make/awsx_node_modules .make/gen_types ${AWSX_SRC} - @cd awsx && \ - yarn tsc && \ - cp package.json ../schema.json ./bin/ && \ - sed -i.bak -e "s/\$${VERSION}/$(VERSION_GENERIC)/g" ./bin/package.json - @touch $@ - -# Re-use the local platform if provided (e.g. `make provider LOCAL_PLAT=linux-amd64`) -ifneq ($(LOCAL_PLAT),"") -bin/${PROVIDER}:: bin/provider/$(LOCAL_PLAT)/${PROVIDER} - cp bin/provider/$(LOCAL_PLAT)/${PROVIDER} bin/${PROVIDER} -else -bin/${PROVIDER}: .make/awsx_bin .make/awsx_node_modules .make/gen_types - cd awsx && yarn run pkg . ${PKG_ARGS} --target node16 --output $(WORKING_DIR)/bin/${PROVIDER} -endif - -bin/provider/linux-amd64/${PROVIDER}:: TARGET := node16-linuxstatic-x64 -bin/provider/linux-arm64/${PROVIDER}:: TARGET := node16-linuxstatic-arm64 -bin/provider/darwin-amd64/${PROVIDER}:: TARGET := node16-macos-x64 -bin/provider/darwin-arm64/${PROVIDER}:: TARGET := node16-macos-arm64 -bin/provider/windows-amd64/${PROVIDER}.exe:: TARGET := node16-win-x64 -bin/provider/%:: .make/awsx_bin .make/gen_types - test ${TARGET} - cd awsx && \ - yarn run pkg . ${PKG_ARGS} --target ${TARGET} --output ${WORKING_DIR}/$@ - -dist/${GZIP_PREFIX}-linux-amd64.tar.gz:: bin/provider/linux-amd64/${PROVIDER} -dist/${GZIP_PREFIX}-linux-arm64.tar.gz:: bin/provider/linux-arm64/${PROVIDER} -dist/${GZIP_PREFIX}-darwin-amd64.tar.gz:: bin/provider/darwin-amd64/${PROVIDER} -dist/${GZIP_PREFIX}-darwin-arm64.tar.gz:: bin/provider/darwin-arm64/${PROVIDER} -dist/${GZIP_PREFIX}-windows-amd64.tar.gz:: bin/provider/windows-amd64/${PROVIDER}.exe - -dist/${GZIP_PREFIX}-%.tar.gz:: - @mkdir -p dist - @# $< is the last dependency (the binary path from above) - tar --gzip -cf $@ README.md LICENSE -C $$(dirname $<) . - -.make/generate_nodejs: bin/${CODEGEN} .make/schema ${AWSX_CLASSIC_SRC} - rm -rf sdk/nodejs - bin/${CODEGEN} nodejs sdk/nodejs schema.json $(VERSION_GENERIC) - @touch $@ -.make/build_nodejs: .make/generate_nodejs - cd sdk/nodejs && \ - yarn install --no-progress && \ - yarn run tsc --version && \ - yarn run tsc && \ - cp package.json ../../README.md ../../LICENSE bin/ - @touch $@ - -.make/generate_java: bin/pulumi-java-gen .make/schema ${AWSX_CLASSIC_SRC} - rm -rf sdk/java - $(WORKING_DIR)/bin/$(JAVA_GEN) generate --schema schema.json --out sdk/java --build gradle-nexus - @touch $@ -.make/build_java: PACKAGE_VERSION := $(VERSION_GENERIC) -.make/build_java: .make/generate_java - cd sdk/java && \ - gradle --console=plain build - @touch $@ - -bin/pulumi-java-gen: ensure-pulumictl - @$(PULUMICTL_BIN) download-binary -n pulumi-language-java -v $(JAVA_GEN_VERSION) -r pulumi/pulumi-java - -.make/generate_python: bin/${CODEGEN} .make/schema README.md - rm -rf sdk/python - bin/${CODEGEN} python sdk/python schema.json $(VERSION_GENERIC) - cp README.md sdk/python/ - @touch $@ -.make/build_python: .make/generate_python - cd sdk/python/ && \ - rm -rf ./bin/ ../python.bin/ && cp -R . ../python.bin && mv ../python.bin ./bin && \ - python3 -m venv venv && \ - ./venv/bin/python -m pip install build && \ - cd ./bin && \ - ../venv/bin/python -m build . - -.make/generate_go: bin/${CODEGEN} .make/schema - rm -rf sdk/go - bin/${CODEGEN} go sdk/go schema.json $(VERSION_GENERIC) - @touch $@ -.make/build_go: AWS_VERSION := $(shell node -e 'console.log(require("./awsx/package.json").dependencies["@pulumi/aws"])') -.make/build_go: .make/generate_go - cd sdk && \ - go get github.com/pulumi/pulumi-aws/sdk/v6@v$(AWS_VERSION) && \ - go mod tidy && \ - go test -v ./... -check.vv - @touch $@ - -.make/generate_dotnet: bin/${CODEGEN} .make/schema - rm -rf sdk/dotnet - bin/${CODEGEN} dotnet sdk/dotnet schema.json $(VERSION_GENERIC) - @touch $@ -.make/build_dotnet: .make/generate_dotnet - cd sdk/dotnet/ && \ - dotnet build - @touch $@ - -# Phony targets - -generate_nodejs: .make/generate_nodejs -build_nodejs: .make/build_nodejs -generate_python: .make/generate_python -build_python: .make/build_python -generate_go: .make/generate_go -build_go: .make/build_go -generate_dotnet: .make/generate_dotnet -build_dotnet: .make/build_dotnet -generate_java: .make/generate_java -build_java: .make/build_java -gen_types: .make/gen_types - -install_provider: bin/${PROVIDER} - rm -f ${GOBIN}/${PROVIDER} - cp bin/${PROVIDER} ${GOBIN}/${PROVIDER} - -install_sdks: install_nodejs_sdk install_python_sdk install_go_sdk install_dotnet_sdk - -install_nodejs_sdk: .make/build_nodejs - yarn link --cwd $(WORKING_DIR)/sdk/nodejs/bin - -install_python_sdk: .make/build_python - #Intentionall empty for CI / CD templating - -install_go_sdk: .make/build_go - #Intentionally empty for CI / CD templating - -install_dotnet_sdk: .make/build_dotnet - mkdir -p $(WORKING_DIR)/nuget - find sdk/dotnet/bin -name '*.nupkg' -print -exec cp -p {} ${WORKING_DIR}/nuget \; - @if ! dotnet nuget list source | grep ${WORKING_DIR}; then \ - dotnet nuget add source ${WORKING_DIR}/nuget --name ${WORKING_DIR} \ - ; fi\ - -lint_classic: - cd awsx-classic && \ - yarn install --no-progress && \ - yarn lint - -lint:: .make/awsx_node_modules - cd awsx && \ - yarn format && yarn lint - -test_provider:: PATH := $(WORKING_DIR)/bin:$(PATH) -test_provider:: .make/awsx_node_modules .make/gen_types bin/${PROVIDER} bin/gotestfmt - cd awsx && yarn test - @export PATH - cd provider && go test -tags=yaml -v -json -count=1 -cover -timeout 3h -parallel ${TESTPARALLELISM} . 2>&1 | tee /tmp/gotest.log | gotestfmt - -istanbul_tests:: - cd awsx-classic/tests && \ - yarn && yarn run build && yarn run mocha $$(find bin -name '*.spec.js') - -test_nodejs:: PATH := $(WORKING_DIR)/bin:$(PATH) -test_nodejs:: bin/${PROVIDER} install_nodejs_sdk bin/gotestfmt - @export PATH - cd provider && go test -tags=nodejs -v -json -count=1 -cover -timeout 3h -parallel ${TESTPARALLELISM} . 2>&1 | tee /tmp/gotest.log | gotestfmt - cd examples && go test -tags=nodejs -v -json -count=1 -cover -timeout 3h -parallel ${TESTPARALLELISM} . 2>&1 | tee /tmp/gotest.log | gotestfmt - -test_python:: PATH := $(WORKING_DIR)/bin:$(PATH) -test_python:: bin/${PROVIDER} bin/gotestfmt - @export PATH - cd provider && go test -tags=python -v -json -count=1 -cover -timeout 3h -parallel ${TESTPARALLELISM} . 2>&1 | tee /tmp/gotest.log | gotestfmt - cd examples && go test -tags=python -v -json -count=1 -cover -timeout 3h -parallel ${TESTPARALLELISM} . 2>&1 | tee /tmp/gotest.log | gotestfmt - -test_java:: PATH := $(WORKING_DIR)/bin:$(PATH) -test_java:: bin/${PROVIDER} bin/gotestfmt - @export PATH - cd provider && go test -tags=java -v -json -count=1 -cover -timeout 3h -parallel ${TESTPARALLELISM} . 2>&1 | tee /tmp/gotest.log | gotestfmt - cd examples && go test -tags=java -v -json -count=1 -cover -timeout 3h -parallel ${TESTPARALLELISM} . 2>&1 | tee /tmp/gotest.log | gotestfmt - -test_go:: PATH := $(WORKING_DIR)/bin:$(PATH) -test_go:: bin/${PROVIDER} bin/gotestfmt - @export PATH - cd provider && go test -tags=go -v -json -count=1 -cover -timeout 3h -parallel ${TESTPARALLELISM} . 2>&1 | tee /tmp/gotest.log | gotestfmt - cd examples && go test -tags=go -v -json -count=1 -cover -timeout 3h -parallel ${TESTPARALLELISM} . 2>&1 | tee /tmp/gotest.log | gotestfmt - -test_dotnet:: PATH := $(WORKING_DIR)/bin:$(PATH) -test_dotnet:: bin/${PROVIDER} install_dotnet_sdk bin/gotestfmt - @export PATH - cd provider && go test -tags=dotnet -v -json -count=1 -cover -timeout 3h -parallel ${TESTPARALLELISM} . 2>&1 | tee /tmp/gotest.log | gotestfmt - cd examples && go test -tags=dotnet -v -json -count=1 -cover -timeout 3h -parallel ${TESTPARALLELISM} . 2>&1 | tee /tmp/gotest.log | gotestfmt - -test:: PATH := $(WORKING_DIR)/bin:$(PATH) -test:: bin/gotestfmt - @export PATH - @if [ -z "${Test}" ]; then \ - cd examples && go test -tags=$(LanguageTags) -v -json -count=1 -cover -timeout 3h -parallel ${TESTPARALLELISM} . 2>&1 | tee /tmp/gotest.log | gotestfmt; \ - else \ - cd examples && go test -tags=$(LanguageTags) -v -json -count=1 -cover -timeout 3h . --run=${Test} 2>&1 | tee /tmp/gotest.log; \ - fi - -schemagen:: bin/${CODEGEN} -schema: .make/schema -provider: bin/${PROVIDER} -dist:: dist/${GZIP_PREFIX}-linux-amd64.tar.gz -dist:: dist/${GZIP_PREFIX}-linux-arm64.tar.gz -dist:: dist/${GZIP_PREFIX}-darwin-amd64.tar.gz -dist:: dist/${GZIP_PREFIX}-darwin-arm64.tar.gz -dist:: dist/${GZIP_PREFIX}-windows-amd64.tar.gz - -clean: - rm -rf bin dist .make awsx/bin awsx/node_modules - -build_sdks: build_nodejs build_python build_go build_dotnet build_java - -build:: provider test_provider build_sdks - -dev:: lint test_provider build_nodejs - -$(HOME)/.yarn/bin: - curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0 - -echo_path: - echo $(PATH) - -renovate_generate:: PATH := $(HOME)/.yarn/bin:$(HOME)/.config/yarn/global/node_modules/.bin:$(PATH) -renovate_generate:: echo_path schema generate_nodejs generate_python generate_go generate_dotnet generate_java gen_types - -renovate:: $(HOME)/.yarn/bin -renovate:: renovate_generate - -ensure-pulumictl: -ifeq ($(PULUMICTL_BIN),) - @if [ ! -f "$(GOPATH)/bin/pulumictl" ]; then go install "github.com/pulumi/pulumictl/cmd/pulumictl@$(PULUMICTL_VERSION)"; fi - @$(eval PULUMICTL_BIN=$(GOPATH)/bin/pulumictl) -endif - -version_generic: ensure-pulumictl - @$(PULUMICTL_BIN) convert-version --language generic --version "$(PROVIDER_VERSION)" - -bin/gotestfmt: - @mkdir -p bin - @GOBIN="${PWD}/bin" go install github.com/gotesttools/gotestfmt/v2/cmd/gotestfmt@v2.5.0 - -.PHONY: clean provider install_% dist sdk/go schema generate gen_types renovate generate_nodejs generate_python generate_go generate_dotnet generate_java build_nodejs build_python build_go build_dotnet build_java