From 018c2a16034bc950babeda785a22ca35c12acafd Mon Sep 17 00:00:00 2001 From: Yvan Guidoin Date: Fri, 10 Dec 2021 16:53:39 +0000 Subject: [PATCH 01/38] [WIP] feat(globalaccelerator): starting to create resources for custom routing global accelerator --- .../custom_routing_accelerator.go | 316 ++++++++++++++++++ .../custom_routing_accelerator_data_source.go | 153 +++++++++ .../custom_routing_endpoint_group.go | 282 ++++++++++++++++ .../globalaccelerator/custom_routing_find.go | 152 +++++++++ .../custom_routing_listener.go | 168 ++++++++++ internal/service/globalaccelerator/status.go | 17 + internal/service/globalaccelerator/wait.go | 18 + 7 files changed, 1106 insertions(+) create mode 100644 internal/service/globalaccelerator/custom_routing_accelerator.go create mode 100644 internal/service/globalaccelerator/custom_routing_accelerator_data_source.go create mode 100644 internal/service/globalaccelerator/custom_routing_endpoint_group.go create mode 100644 internal/service/globalaccelerator/custom_routing_find.go create mode 100644 internal/service/globalaccelerator/custom_routing_listener.go diff --git a/internal/service/globalaccelerator/custom_routing_accelerator.go b/internal/service/globalaccelerator/custom_routing_accelerator.go new file mode 100644 index 000000000000..18cd4a527819 --- /dev/null +++ b/internal/service/globalaccelerator/custom_routing_accelerator.go @@ -0,0 +1,316 @@ +package globalaccelerator + +import ( + "fmt" + "log" + "regexp" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/globalaccelerator" + "github.com/hashicorp/aws-sdk-go-base/tfawserr" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "github.com/hashicorp/terraform-provider-aws/internal/conns" + tftags "github.com/hashicorp/terraform-provider-aws/internal/tags" + "github.com/hashicorp/terraform-provider-aws/internal/tfresource" + "github.com/hashicorp/terraform-provider-aws/internal/verify" +) + +func ResourceCustomRoutingAccelerator() *schema.Resource { + return &schema.Resource{ + Create: resourceCustomRoutingAcceleratorCreate, + Read: resourceCustomRoutingAcceleratorRead, + Update: resourceCustomRoutingAcceleratorUpdate, + Delete: resourceCustomRoutingAcceleratorDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + Timeouts: &schema.ResourceTimeout{ + Create: schema.DefaultTimeout(30 * time.Minute), + Update: schema.DefaultTimeout(30 * time.Minute), + }, + + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.All( + validation.StringLenBetween(1, 255), + validation.StringMatch(regexp.MustCompile(`^[0-9A-Za-z-]+$`), "only alphanumeric characters and hyphens are allowed"), + validation.StringDoesNotMatch(regexp.MustCompile(`^-`), "cannot start with a hyphen"), + validation.StringDoesNotMatch(regexp.MustCompile(`-$`), "cannot end with a hyphen"), + ), + }, + "ip_address_type": { + Type: schema.TypeString, + Optional: true, + Default: globalaccelerator.IpAddressTypeIpv4, + ValidateFunc: validation.StringInSlice(globalaccelerator.IpAddressType_Values(), false), + }, + "enabled": { + Type: schema.TypeBool, + Optional: true, + Default: true, + }, + "dns_name": { + Type: schema.TypeString, + Computed: true, + }, + "hosted_zone_id": { + Type: schema.TypeString, + Computed: true, + }, + "ip_sets": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "ip_addresses": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "ip_family": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + "tags": tftags.TagsSchema(), + + "tags_all": tftags.TagsSchemaComputed(), + }, + + CustomizeDiff: verify.SetTagsDiff, + } +} + +func resourceCustomRoutingAcceleratorCreate(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig + tags := defaultTagsConfig.MergeTags(tftags.New(d.Get("tags").(map[string]interface{}))) + + name := d.Get("name").(string) + input := &globalaccelerator.CreateCustomRoutingAcceleratorInput{ + Name: aws.String(name), + IdempotencyToken: aws.String(resource.UniqueId()), + Enabled: aws.Bool(d.Get("enabled").(bool)), + Tags: Tags(tags.IgnoreAWS()), + } + + if v, ok := d.GetOk("ip_address_type"); ok { + input.IpAddressType = aws.String(v.(string)) + } + + log.Printf("[DEBUG] Creating Global Accelerator Custom Routing Accelerator: %s", input) + output, err := conn.CreateCustomRoutingAccelerator(input) + + if err != nil { + return fmt.Errorf("error creating Global Accelerator Custom Routing Accelerator (%s): %w", name, err) + } + + d.SetId(aws.StringValue(output.Accelerator.AcceleratorArn)) + + if _, err := waitCustomRoutingAcceleratorDeployed(conn, d.Id(), d.Timeout(schema.TimeoutCreate)); err != nil { + return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", d.Id(), err) + } + + if v, ok := d.GetOk("attributes"); ok && len(v.([]interface{})) > 0 && v.([]interface{})[0] != nil { + input := expandGlobalAcceleratorUpdateAcceleratorAttributesInput(v.([]interface{})[0].(map[string]interface{})) + input.AcceleratorArn = aws.String(d.Id()) + + log.Printf("[DEBUG] Updating Global Accelerator Accelerator attributes: %s", input) + if _, err := conn.UpdateAcceleratorAttributes(input); err != nil { + return fmt.Errorf("error updating Global Accelerator Accelerator (%s) attributes: %w", d.Id(), err) + } + + if _, err := waitCustomRoutingAcceleratorDeployed(conn, d.Id(), d.Timeout(schema.TimeoutCreate)); err != nil { + return fmt.Errorf("error waiting for Global Accelerator Accelerator (%s) deployment: %w", d.Id(), err) + } + } + + return resourceCustomRoutingAcceleratorRead(d, meta) +} + +func resourceCustomRoutingAcceleratorRead(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig + ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig + + accelerator, err := FindCustomRoutingAcceleratorByARN(conn, d.Id()) + + if !d.IsNewResource() && tfresource.NotFound(err) { + log.Printf("[WARN] Global Accelerator Custom Routing Accelerator (%s) not found, removing from state", d.Id()) + d.SetId("") + return nil + } + + if err != nil { + return fmt.Errorf("error reading Global Accelerator Custom Routing Accelerator (%s): %w", d.Id(), err) + } + + d.Set("enabled", accelerator.Enabled) + d.Set("dns_name", accelerator.DnsName) + d.Set("hosted_zone_id", globalAcceleratorRoute53ZoneID) + d.Set("name", accelerator.Name) + d.Set("ip_address_type", accelerator.IpAddressType) + + if err := d.Set("ip_sets", flattenGlobalAcceleratorIpSets(accelerator.IpSets)); err != nil { + return fmt.Errorf("error setting ip_sets: %w", err) + } + + acceleratorAttributes, err := FindCustomRoutingAcceleratorAttributesByARN(conn, d.Id()) + + if err != nil { + return fmt.Errorf("error reading Global Accelerator Custom Routing Accelerator (%s) attributes: %w", d.Id(), err) + } + + if err := d.Set("attributes", []interface{}{flattenGlobalAcceleratorCustomRoutingAcceleratorAttributes(acceleratorAttributes)}); err != nil { + return fmt.Errorf("error setting attributes: %w", err) + } + + tags, err := ListTags(conn, d.Id()) + if err != nil { + return fmt.Errorf("error listing tags for Global Accelerator Custom Routing Accelerator (%s): %w", d.Id(), err) + } + + tags = tags.IgnoreAWS().IgnoreConfig(ignoreTagsConfig) + + //lintignore:AWSR002 + if err := d.Set("tags", tags.RemoveDefaultConfig(defaultTagsConfig).Map()); err != nil { + return fmt.Errorf("error setting tags: %w", err) + } + + if err := d.Set("tags_all", tags.Map()); err != nil { + return fmt.Errorf("error setting tags_all: %w", err) + } + + return nil +} + +func resourceCustomRoutingAcceleratorUpdate(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + + if d.HasChanges("name", "ip_address_type", "enabled") { + input := &globalaccelerator.UpdateCustomRoutingAcceleratorInput{ + AcceleratorArn: aws.String(d.Id()), + Name: aws.String(d.Get("name").(string)), + Enabled: aws.Bool(d.Get("enabled").(bool)), + } + + if v, ok := d.GetOk("ip_address_type"); ok { + input.IpAddressType = aws.String(v.(string)) + } + + log.Printf("[DEBUG] Updating Global Accelerator Custom Routing Accelerator: %s", input) + if _, err := conn.UpdateCustomRoutingAccelerator(input); err != nil { + return fmt.Errorf("error updating Global Accelerator Custom Routing Accelerator (%s): %w", d.Id(), err) + } + + if _, err := waitCustomRoutingAcceleratorDeployed(conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil { + return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", d.Id(), err) + } + } + + if d.HasChange("attributes") { + o, n := d.GetChange("attributes") + if len(o.([]interface{})) > 0 && o.([]interface{})[0] != nil { + if len(n.([]interface{})) > 0 && n.([]interface{})[0] != nil { + oInput := expandGlobalAcceleratorUpdateCustomRoutingAcceleratorAttributesInput(o.([]interface{})[0].(map[string]interface{})) + oInput.AcceleratorArn = aws.String(d.Id()) + nInput := expandGlobalAcceleratorUpdateCustomRoutingAcceleratorAttributesInput(n.([]interface{})[0].(map[string]interface{})) + nInput.AcceleratorArn = aws.String(d.Id()) + + // To change flow logs bucket and prefix attributes while flows are enabled, first disable flow logs. + if aws.BoolValue(oInput.FlowLogsEnabled) && aws.BoolValue(nInput.FlowLogsEnabled) { + oInput.FlowLogsEnabled = aws.Bool(false) + + log.Printf("[DEBUG] Updating Global Accelerator Custom Routing Accelerator attributes: %s", oInput) + if _, err := conn.UpdateCustomRoutingAcceleratorAttributes(oInput); err != nil { + return fmt.Errorf("error updating Global Accelerator Custom Routing Accelerator (%s) attributes: %w", d.Id(), err) + } + + if _, err := waitCustomRoutingAcceleratorDeployed(conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil { + return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", d.Id(), err) + } + } + + log.Printf("[DEBUG] Updating Global Accelerator Accelerator attributes: %s", nInput) + if _, err := conn.UpdateCustomRoutingAcceleratorAttributes(nInput); err != nil { + return fmt.Errorf("error updating Global Accelerator Custom Routing Accelerator (%s) attributes: %w", d.Id(), err) + } + + if _, err := waitCustomRoutingAcceleratorDeployed(conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil { + return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", d.Id(), err) + } + } + } + } + + if d.HasChange("tags_all") { + o, n := d.GetChange("tags_all") + + if err := UpdateTags(conn, d.Id(), o, n); err != nil { + return fmt.Errorf("error updating Global Accelerator Custom Routing Accelerator (%s) tags: %w", d.Id(), err) + } + } + + return resourceCustomRoutingAcceleratorRead(d, meta) +} + +func resourceCustomRoutingAcceleratorDelete(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + + { + input := &globalaccelerator.UpdateCustomRoutingAcceleratorInput{ + AcceleratorArn: aws.String(d.Id()), + Enabled: aws.Bool(false), + } + + log.Printf("[DEBUG] Updating Global Accelerator Custom Routing Accelerator: %s", input) + _, err := conn.UpdateCustomRoutingAccelerator(input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { + return nil + } + + if err != nil { + return fmt.Errorf("error disabling Global Accelerator Custom Routing Accelerator (%s): %w", d.Id(), err) + } + + if _, err := waitCustomRoutingAcceleratorDeployed(conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil { + return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", d.Id(), err) + } + } + + { + input := &globalaccelerator.DeleteCustomRoutingAcceleratorInput{ + AcceleratorArn: aws.String(d.Id()), + } + + log.Printf("[DEBUG] Deleting Global Accelerator Custom Routing Accelerator (%s)", d.Id()) + _, err := conn.DeleteCustomRoutingAccelerator(input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { + return nil + } + + if err != nil { + return fmt.Errorf("error deleting Global Accelerator Custom Routing Accelerator (%s): %w", d.Id(), err) + } + } + + return nil +} + +func expandGlobalAcceleratorUpdateCustomRoutingAcceleratorAttributesInput(tfMap map[string]interface{}) *globalaccelerator.UpdateCustomRoutingAcceleratorAttributesInput { + return (*globalaccelerator.UpdateCustomRoutingAcceleratorAttributesInput)(expandGlobalAcceleratorUpdateAcceleratorAttributesInput(tfMap)) +} + +func flattenGlobalAcceleratorCustomRoutingAcceleratorAttributes(apiObject *globalaccelerator.CustomRoutingAcceleratorAttributes) map[string]interface{} { + return flattenGlobalAcceleratorAcceleratorAttributes((*globalaccelerator.AcceleratorAttributes)(apiObject)) +} diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go b/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go new file mode 100644 index 000000000000..2307c48ab795 --- /dev/null +++ b/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go @@ -0,0 +1,153 @@ +package globalaccelerator + +import ( + "fmt" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/globalaccelerator" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-provider-aws/internal/conns" + tftags "github.com/hashicorp/terraform-provider-aws/internal/tags" +) + +func DataSourceCustomRoutingAccelerator() *schema.Resource { + return &schema.Resource{ + Read: dataSourceCustomRoutingAcceleratorRead, + + Schema: map[string]*schema.Schema{ + "arn": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + "ip_address_type": { + Type: schema.TypeString, + Computed: true, + }, + "enabled": { + Type: schema.TypeBool, + Computed: true, + }, + "dns_name": { + Type: schema.TypeString, + Computed: true, + }, + "hosted_zone_id": { + Type: schema.TypeString, + Computed: true, + }, + "ip_sets": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "ip_addresses": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "ip_family": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + "attributes": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "flow_logs_enabled": { + Type: schema.TypeBool, + Computed: true, + }, + "flow_logs_s3_bucket": { + Type: schema.TypeString, + Computed: true, + }, + "flow_logs_s3_prefix": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + + "tags": tftags.TagsSchemaComputed(), + }, + } +} + +func dataSourceCustomRoutingAcceleratorRead(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig + + var results []*globalaccelerator.CustomRoutingAccelerator + + err := conn.ListCustomRoutingAcceleratorsPages(&globalaccelerator.ListCustomRoutingAcceleratorsInput{}, func(page *globalaccelerator.ListCustomRoutingAcceleratorsOutput, lastPage bool) bool { + if page == nil { + return !lastPage + } + + for _, l := range page.Accelerators { + if l == nil { + continue + } + + if v, ok := d.GetOk("arn"); ok && v.(string) != aws.StringValue(l.AcceleratorArn) { + continue + } + + if v, ok := d.GetOk("name"); ok && v.(string) != aws.StringValue(l.Name) { + continue + } + + results = append(results, l) + } + + return !lastPage + }) + + if err != nil { + return fmt.Errorf("error reading AWS Global Custom ROuting Accelerator: %w", err) + } + + if len(results) != 1 { + return fmt.Errorf("Search returned %d results, please revise so only one is returned", len(results)) + } + + accelerator := results[0] + d.SetId(aws.StringValue(accelerator.AcceleratorArn)) + d.Set("arn", accelerator.AcceleratorArn) + d.Set("enabled", accelerator.Enabled) + d.Set("dns_name", accelerator.DnsName) + d.Set("hosted_zone_id", globalAcceleratorRoute53ZoneID) + d.Set("name", accelerator.Name) + d.Set("ip_address_type", accelerator.IpAddressType) + d.Set("ip_sets", flattenGlobalAcceleratorIpSets(accelerator.IpSets)) + + acceleratorAttributes, err := FindCustomRoutingAcceleratorAttributesByARN(conn, d.Id()) + if err != nil { + return fmt.Errorf("error reading Global Accelerator Custom Routing Accelerator (%s) attributes: %w", d.Id(), err) + } + + if err := d.Set("attributes", []interface{}{flattenGlobalAcceleratorCustomRoutingAcceleratorAttributes(acceleratorAttributes)}); err != nil { + return fmt.Errorf("error setting attributes: %w", err) + } + + tags, err := ListTags(conn, d.Id()) + if err != nil { + return fmt.Errorf("error listing tags for Global Accelerator Custom Routing Accelerator (%s): %w", d.Id(), err) + } + + if err := d.Set("tags", tags.IgnoreAWS().IgnoreConfig(ignoreTagsConfig).Map()); err != nil { + return fmt.Errorf("error setting tags: %w", err) + } + return nil +} diff --git a/internal/service/globalaccelerator/custom_routing_endpoint_group.go b/internal/service/globalaccelerator/custom_routing_endpoint_group.go new file mode 100644 index 000000000000..1d8adbc59a7c --- /dev/null +++ b/internal/service/globalaccelerator/custom_routing_endpoint_group.go @@ -0,0 +1,282 @@ +package globalaccelerator + +import ( + "fmt" + "log" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/ec2" + "github.com/aws/aws-sdk-go/service/globalaccelerator" + "github.com/hashicorp/aws-sdk-go-base/tfawserr" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/tfresource" + "github.com/hashicorp/terraform-provider-aws/internal/verify" +) + +func ResourceCustomRoutingEndpointGroup() *schema.Resource { + return &schema.Resource{ + Create: resourceCustomRoutingEndpointGroupCreate, + Read: resourceCustomRoutingEndpointGroupRead, + Delete: resourceCustomRoutingEndpointGroupDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + Timeouts: &schema.ResourceTimeout{ + Create: schema.DefaultTimeout(30 * time.Minute), + Delete: schema.DefaultTimeout(30 * time.Minute), + }, + + Schema: map[string]*schema.Schema{ + "arn": { + Type: schema.TypeString, + Computed: true, + }, + + "endpoint_group_region": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ForceNew: true, + ValidateFunc: validation.StringLenBetween(1, 255), + }, + + "destination_configuration": { + Type: schema.TypeSet, + Optional: true, + ForceNew: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "from_port": { + Type: schema.TypeInt, + Required: true, + ValidateFunc: validation.IsPortNumber, + }, + + "to_port": { + Type: schema.TypeInt, + Required: true, + ValidateFunc: validation.IsPortNumber, + }, + + "protocols": { + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + ValidateFunc: validation.StringInSlice(ec2.TransportProtocol_Values(), false), + }, + }, + }, + }, + }, + + "endpoint_configuration": { + Type: schema.TypeSet, + Optional: true, + ForceNew: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "endpoint_id": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringLenBetween(1, 255), + }, + }, + }, + }, + + "listener_arn": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: verify.ValidARN, + }, + }, + } +} + +func resourceCustomRoutingEndpointGroupCreate(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + region := meta.(*conns.AWSClient).Region + + opts := &globalaccelerator.CreateCustomRoutingEndpointGroupInput{ + EndpointGroupRegion: aws.String(region), + IdempotencyToken: aws.String(resource.UniqueId()), + ListenerArn: aws.String(d.Get("listener_arn").(string)), + } + + if v, ok := d.GetOk("destination_configuration"); ok { + opts.DestinationConfigurations = expandGlobalAcceleratorCustomRoutingDestinationConfigurations(v.(*schema.Set).List()) + } + + log.Printf("[DEBUG] Create Global Accelerator custom routing endpoint group: %s", opts) + + resp, err := conn.CreateCustomRoutingEndpointGroup(opts) + + if err != nil { + return fmt.Errorf("error creating Global Accelerator custom routing endpoint group: %w", err) + } + + d.SetId(aws.StringValue(resp.EndpointGroup.EndpointGroupArn)) + + acceleratorARN, err := ListenerOrEndpointGroupARNToAcceleratorARN(d.Id()) + + if err != nil { + return err + } + + if _, err := waitCustomRoutingAcceleratorDeployed(conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { + return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) + } + + if v, ok := d.GetOk("endpoint_configuration"); ok { + optsEndpoints := &globalaccelerator.AddCustomRoutingEndpointsInput{ + EndpointGroupArn: resp.EndpointGroup.EndpointGroupArn, + EndpointConfigurations: expandGlobalAcceleratorCustomRoutingEndpointConfigurations(v.(*schema.Set).List()), + } + + _, err := conn.AddCustomRoutingEndpoints(optsEndpoints) + if err != nil { + return err + } + + if _, err := waitCustomRoutingAcceleratorDeployed(conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { + return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) + } + } + + return resourceCustomRoutingEndpointGroupRead(d, meta) +} + +func resourceCustomRoutingEndpointGroupRead(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + + endpointGroup, err := FindCustomRoutingEndpointGroupByARN(conn, d.Id()) + + if !d.IsNewResource() && tfresource.NotFound(err) { + log.Printf("[WARN] Global Accelerator custom routing endpoint group (%s) not found, removing from state", d.Id()) + d.SetId("") + return nil + } + + if err != nil { + return fmt.Errorf("error reading Global Accelerator custom routing endpoint group (%s): %w", d.Id(), err) + } + + listenerARN, err := EndpointGroupARNToListenerARN(d.Id()) + + if err != nil { + return err + } + + d.Set("arn", endpointGroup.EndpointGroupArn) + if err := d.Set("destination_configuration", flattenGlobalAcceleratorCustomRoutingDestinationDescriptions(endpointGroup.DestinationDescriptions)); err != nil { + return fmt.Errorf("error setting destination_configuration: %w", err) + } + d.Set("endpoint_group_region", endpointGroup.EndpointGroupRegion) + if err := d.Set("endpoint_configuration", flattenGlobalAcceleratorCustomRoutingEndpointDescriptions(endpointGroup.EndpointDescriptions)); err != nil { + return fmt.Errorf("error setting endpoint_configuration: %w", err) + } + d.Set("listener_arn", listenerARN) + + return nil +} + +func resourceCustomRoutingEndpointGroupDelete(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + + input := &globalaccelerator.DeleteCustomRoutingEndpointGroupInput{ + EndpointGroupArn: aws.String(d.Id()), + } + + log.Printf("[DEBUG] Deleting Global Accelerator custom routing endpoint group (%s)", d.Id()) + _, err := conn.DeleteCustomRoutingEndpointGroup(input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeEndpointGroupNotFoundException) { + return nil + } + + if err != nil { + return fmt.Errorf("error deleting Global Accelerator custom routing endpoint group (%s): %w", d.Id(), err) + } + + acceleratorARN, err := ListenerOrEndpointGroupARNToAcceleratorARN(d.Id()) + + if err != nil { + return err + } + + if _, err := waitCustomRoutingAcceleratorDeployed(conn, acceleratorARN, d.Timeout(schema.TimeoutDelete)); err != nil { + return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) + } + + return nil +} + +func expandGlobalAcceleratorCustomRoutingDestinationConfigurations(configurations []interface{}) []*globalaccelerator.CustomRoutingDestinationConfiguration { + out := make([]*globalaccelerator.CustomRoutingDestinationConfiguration, len(configurations)) + + for i, raw := range configurations { + configuration := raw.(map[string]interface{}) + m := globalaccelerator.CustomRoutingDestinationConfiguration{} + + m.FromPort = aws.Int64(int64(configuration["from_port"].(int))) + m.ToPort = aws.Int64(int64(configuration["to_port"].(int))) + m.Protocols = aws.StringSlice(configuration["protocols"].([]string)) + + out[i] = &m + } + + return out +} + +func expandGlobalAcceleratorCustomRoutingEndpointConfigurations(configurations []interface{}) []*globalaccelerator.CustomRoutingEndpointConfiguration { + out := make([]*globalaccelerator.CustomRoutingEndpointConfiguration, len(configurations)) + + for i, raw := range configurations { + configuration := raw.(map[string]interface{}) + m := globalaccelerator.CustomRoutingEndpointConfiguration{} + + m.EndpointId = aws.String(configuration["endpoint_id"].(string)) + + out[i] = &m + } + + return out +} + +func flattenGlobalAcceleratorCustomRoutingEndpointDescriptions(configurations []*globalaccelerator.CustomRoutingEndpointDescription) []interface{} { + out := make([]interface{}, len(configurations)) + + for i, configuration := range configurations { + m := make(map[string]interface{}) + + m["endpoint_id"] = aws.StringValue(configuration.EndpointId) + + out[i] = m + } + + return out +} + +func flattenGlobalAcceleratorCustomRoutingDestinationDescriptions(configurations []*globalaccelerator.CustomRoutingDestinationDescription) []interface{} { + out := make([]interface{}, len(configurations)) + + for i, configuration := range configurations { + m := make(map[string]interface{}) + + m["from_port"] = int(aws.Int64Value(configuration.FromPort)) + m["to_port"] = int(aws.Int64Value(configuration.ToPort)) + m["protocols"] = aws.StringValueSlice(configuration.Protocols) + + out[i] = m + } + + return out +} diff --git a/internal/service/globalaccelerator/custom_routing_find.go b/internal/service/globalaccelerator/custom_routing_find.go new file mode 100644 index 000000000000..934bc7d42941 --- /dev/null +++ b/internal/service/globalaccelerator/custom_routing_find.go @@ -0,0 +1,152 @@ +package globalaccelerator + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/globalaccelerator" + "github.com/hashicorp/aws-sdk-go-base/tfawserr" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +// FindCustomRoutingAcceleratorByARN returns the custom routing accelerator corresponding to the specified ARN. +// Returns NotFoundError if no custom routing accelerator is found. +func FindCustomRoutingAcceleratorByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingAccelerator, error) { + input := &globalaccelerator.DescribeCustomRoutingAcceleratorInput{ + AcceleratorArn: aws.String(arn), + } + + return FindCustomRoutingAccelerator(conn, input) +} + +// FindCustomRoutingAccelerator returns the custom routing accelerator corresponding to the specified input. +// Returns NotFoundError if no custom routing accelerator is found. +func FindCustomRoutingAccelerator(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingAcceleratorInput) (*globalaccelerator.CustomRoutingAccelerator, error) { + output, err := conn.DescribeCustomRoutingAccelerator(input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { + return nil, &resource.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err + } + + if output == nil || output.Accelerator == nil { + return nil, &resource.NotFoundError{ + Message: "Empty result", + LastRequest: input, + } + } + + return output.Accelerator, nil +} + +// FindCustomRoutingAcceleratorAttributesByARN returns the custom routing accelerator attributes corresponding to the specified ARN. +// Returns NotFoundError if no custom routing accelerator is found. +func FindCustomRoutingAcceleratorAttributesByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingAcceleratorAttributes, error) { + input := &globalaccelerator.DescribeCustomRoutingAcceleratorAttributesInput{ + AcceleratorArn: aws.String(arn), + } + + return FindCustomRoutingAcceleratorAttributes(conn, input) +} + +// FindCustomRoutingAcceleratorAttributes returns the custom routing accelerator attributes corresponding to the specified input. +// Returns NotFoundError if no custom routing accelerator is found. +func FindCustomRoutingAcceleratorAttributes(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingAcceleratorAttributesInput) (*globalaccelerator.CustomRoutingAcceleratorAttributes, error) { + output, err := conn.DescribeCustomRoutingAcceleratorAttributes(input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { + return nil, &resource.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err + } + + if output == nil || output.AcceleratorAttributes == nil { + return nil, &resource.NotFoundError{ + Message: "Empty result", + LastRequest: input, + } + } + + return output.AcceleratorAttributes, nil +} + +// FindCustomRoutingEndpointGroupByARN returns the custom routing endpoint group corresponding to the specified ARN. +// Returns NotFoundError if no custom routing endpoint group is found. +func FindCustomRoutingEndpointGroupByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingEndpointGroup, error) { + input := &globalaccelerator.DescribeCustomRoutingEndpointGroupInput{ + EndpointGroupArn: aws.String(arn), + } + + return FindCustomRoutingEndpointGroup(conn, input) +} + +// FindCustomRoutingEndpointGroup returns the custom routing endpoint group corresponding to the specified input. +// Returns NotFoundError if no custom routing endpoint group is found. +func FindCustomRoutingEndpointGroup(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingEndpointGroupInput) (*globalaccelerator.CustomRoutingEndpointGroup, error) { + output, err := conn.DescribeCustomRoutingEndpointGroup(input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeEndpointGroupNotFoundException) { + return nil, &resource.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err + } + + if output == nil || output.EndpointGroup == nil { + return nil, &resource.NotFoundError{ + Message: "Empty result", + LastRequest: input, + } + } + + return output.EndpointGroup, nil +} + +// FindCustomRoutingListenerByARN returns the custom routing listener corresponding to the specified ARN. +// Returns NotFoundError if no custom routing listener is found. +func FindCustomRoutingListenerByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingListener, error) { + input := &globalaccelerator.DescribeCustomRoutingListenerInput{ + ListenerArn: aws.String(arn), + } + + return FindCustomRoutingListener(conn, input) +} + +// FindCustomRoutingListener returns the custom routing listener corresponding to the specified input. +// Returns NotFoundError if no custom routing listener is found. +func FindCustomRoutingListener(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingListenerInput) (*globalaccelerator.CustomRoutingListener, error) { + output, err := conn.DescribeCustomRoutingListener(input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeListenerNotFoundException) { + return nil, &resource.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err + } + + if output == nil || output.Listener == nil { + return nil, &resource.NotFoundError{ + Message: "Empty result", + LastRequest: input, + } + } + + return output.Listener, nil +} diff --git a/internal/service/globalaccelerator/custom_routing_listener.go b/internal/service/globalaccelerator/custom_routing_listener.go new file mode 100644 index 000000000000..b64830870274 --- /dev/null +++ b/internal/service/globalaccelerator/custom_routing_listener.go @@ -0,0 +1,168 @@ +package globalaccelerator + +import ( + "fmt" + "log" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/globalaccelerator" + "github.com/hashicorp/aws-sdk-go-base/tfawserr" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/tfresource" +) + +func ResourceCustomRoutingListener() *schema.Resource { + return &schema.Resource{ + Create: resourceCustomRoutingListenerCreate, + Read: resourceCustomRoutingListenerRead, + Update: resourceCustomRoutingListenerUpdate, + Delete: resourceCustomRoutingListenerDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + Timeouts: &schema.ResourceTimeout{ + Create: schema.DefaultTimeout(30 * time.Minute), + Update: schema.DefaultTimeout(30 * time.Minute), + Delete: schema.DefaultTimeout(30 * time.Minute), + }, + + Schema: map[string]*schema.Schema{ + "accelerator_arn": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + "port_range": { + Type: schema.TypeSet, + Required: true, + MinItems: 1, + MaxItems: 10, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "from_port": { + Type: schema.TypeInt, + Optional: true, + ValidateFunc: validation.IsPortNumber, + }, + "to_port": { + Type: schema.TypeInt, + Optional: true, + ValidateFunc: validation.IsPortNumber, + }, + }, + }, + }, + }, + } +} + +func resourceCustomRoutingListenerCreate(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + acceleratorARN := d.Get("accelerator_arn").(string) + + opts := &globalaccelerator.CreateCustomRoutingListenerInput{ + AcceleratorArn: aws.String(acceleratorARN), + IdempotencyToken: aws.String(resource.UniqueId()), + PortRanges: resourceListenerExpandPortRanges(d.Get("port_range").(*schema.Set).List()), + } + + log.Printf("[DEBUG] Create Global Accelerator custom routing listener: %s", opts) + + resp, err := conn.CreateCustomRoutingListener(opts) + if err != nil { + return fmt.Errorf("error creating Global Accelerator custom routing listener: %w", err) + } + + d.SetId(aws.StringValue(resp.Listener.ListenerArn)) + + // Creating a listener triggers the accelerator to change status to InPending. + if _, err := waitCustomRoutingAcceleratorDeployed(conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { + return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) + } + + return resourceCustomRoutingListenerRead(d, meta) +} + +func resourceCustomRoutingListenerRead(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + + listener, err := FindCustomRoutingListenerByARN(conn, d.Id()) + + if !d.IsNewResource() && tfresource.NotFound(err) { + log.Printf("[WARN] Global Accelerator listener (%s) not found, removing from state", d.Id()) + d.SetId("") + return nil + } + + if err != nil { + return fmt.Errorf("error reading Global Accelerator listener (%s): %w", d.Id(), err) + } + + acceleratorARN, err := ListenerOrEndpointGroupARNToAcceleratorARN(d.Id()) + + if err != nil { + return err + } + + d.Set("accelerator_arn", acceleratorARN) + if err := d.Set("port_range", resourceListenerFlattenPortRanges(listener.PortRanges)); err != nil { + return fmt.Errorf("error setting port_range: %w", err) + } + + return nil +} + +func resourceCustomRoutingListenerUpdate(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + acceleratorARN := d.Get("accelerator_arn").(string) + + input := &globalaccelerator.UpdateCustomRoutingListenerInput{ + ListenerArn: aws.String(d.Id()), + PortRanges: resourceListenerExpandPortRanges(d.Get("port_range").(*schema.Set).List()), + } + + log.Printf("[DEBUG] Updating Global Accelerator custom routing listener: %s", input) + if _, err := conn.UpdateCustomRoutingListener(input); err != nil { + return fmt.Errorf("error updating Global Accelerator custom routing listener (%s): %w", d.Id(), err) + } + + // Updating a listener triggers the accelerator to change status to InPending. + if _, err := waitCustomRoutingAcceleratorDeployed(conn, acceleratorARN, d.Timeout(schema.TimeoutUpdate)); err != nil { + return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) + } + + return resourceCustomRoutingListenerRead(d, meta) +} + +func resourceCustomRoutingListenerDelete(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + acceleratorARN := d.Get("accelerator_arn").(string) + + input := &globalaccelerator.DeleteCustomRoutingListenerInput{ + ListenerArn: aws.String(d.Id()), + } + + log.Printf("[DEBUG] Deleting Global Accelerator custom routing listener (%s)", d.Id()) + _, err := conn.DeleteCustomRoutingListener(input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeListenerNotFoundException) { + return nil + } + + if err != nil { + return fmt.Errorf("error deleting Global Accelerator custom routing listener (%s): %w", d.Id(), err) + } + + // Deleting a listener triggers the accelerator to change status to InPending. + if _, err := waitCustomRoutingAcceleratorDeployed(conn, acceleratorARN, d.Timeout(schema.TimeoutDelete)); err != nil { + return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) + } + + return nil +} diff --git a/internal/service/globalaccelerator/status.go b/internal/service/globalaccelerator/status.go index cf5e8448f796..1cc16671ba3e 100644 --- a/internal/service/globalaccelerator/status.go +++ b/internal/service/globalaccelerator/status.go @@ -24,3 +24,20 @@ func statusAccelerator(ctx context.Context, conn *globalaccelerator.GlobalAccele return accelerator, aws.StringValue(accelerator.Status), nil } } + +// statusCustomRoutingAccelerator fetches the Custom Routing Accelerator and its Status +func statusCustomRoutingAccelerator(conn *globalaccelerator.GlobalAccelerator, arn string) resource.StateRefreshFunc { + return func() (interface{}, string, error) { + accelerator, err := FindCustomRoutingAcceleratorByARN(conn, arn) + + if tfresource.NotFound(err) { + return nil, "", nil + } + + if err != nil { + return nil, "", err + } + + return accelerator, aws.StringValue(accelerator.Status), nil + } +} diff --git a/internal/service/globalaccelerator/wait.go b/internal/service/globalaccelerator/wait.go index b05f01f7430e..8c143630e3ab 100644 --- a/internal/service/globalaccelerator/wait.go +++ b/internal/service/globalaccelerator/wait.go @@ -24,3 +24,21 @@ func waitAcceleratorDeployed(ctx context.Context, conn *globalaccelerator.Global return nil, err } + +// waitCustomRoutingAcceleratorDeployed waits for a Custom Routing Accelerator to return Deployed +func waitCustomRoutingAcceleratorDeployed(conn *globalaccelerator.GlobalAccelerator, arn string, timeout time.Duration) (*globalaccelerator.CustomRoutingAccelerator, error) { //nolint:unparam + stateConf := &resource.StateChangeConf{ + Pending: []string{globalaccelerator.AcceleratorStatusInProgress}, + Target: []string{globalaccelerator.AcceleratorStatusDeployed}, + Refresh: statusCustomRoutingAccelerator(conn, arn), + Timeout: timeout, + } + + outputRaw, err := stateConf.WaitForState() + + if v, ok := outputRaw.(*globalaccelerator.CustomRoutingAccelerator); ok { + return v, err + } + + return nil, err +} From c54d969bf55f0a8cb26586f038e28c4272eb0fde Mon Sep 17 00:00:00 2001 From: Yvan Guidoin Date: Mon, 13 Dec 2021 17:20:55 +0000 Subject: [PATCH 02/38] Basic testing --- .../custom_routing_accelerator_test.go | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 internal/service/globalaccelerator/custom_routing_accelerator_test.go diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_test.go b/internal/service/globalaccelerator/custom_routing_accelerator_test.go new file mode 100644 index 000000000000..653f712086b2 --- /dev/null +++ b/internal/service/globalaccelerator/custom_routing_accelerator_test.go @@ -0,0 +1,57 @@ +package globalaccelerator_test + +import ( + "fmt" + "regexp" + "testing" + + "github.com/aws/aws-sdk-go/service/globalaccelerator" + sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-provider-aws/internal/acctest" +) + +func TestAccGlobalAcceleratorCustomRoutingAccelerator_basic(t *testing.T) { + resourceName := "aws_globalaccelerator_customroutingaccelerator.test" + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + ipRegex := regexp.MustCompile(`\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}`) + dnsNameRegex := regexp.MustCompile(`^a[a-f0-9]{16}\.awsglobalaccelerator\.com$`) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(t); testAccPreCheckGlobalAccelerator(t) }, + ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), + Providers: acctest.Providers, + CheckDestroy: testAccCheckGlobalAcceleratorAcceleratorDestroy, + Steps: []resource.TestStep{ + { + Config: testAccGlobalAcceleratorCustomRoutingAcceleratorConfig(rName), + Check: resource.ComposeTestCheckFunc( + testAccCheckGlobalAcceleratorAcceleratorExists(resourceName), + resource.TestMatchResourceAttr(resourceName, "dns_name", dnsNameRegex), + resource.TestCheckResourceAttr(resourceName, "enabled", "true"), + resource.TestCheckResourceAttr(resourceName, "hosted_zone_id", "Z2BJ6XQ5FK7U4H"), + resource.TestCheckResourceAttr(resourceName, "ip_address_type", "IPV4"), + resource.TestCheckResourceAttr(resourceName, "ip_sets.#", "1"), + resource.TestCheckResourceAttr(resourceName, "ip_sets.0.ip_addresses.#", "2"), + resource.TestMatchResourceAttr(resourceName, "ip_sets.0.ip_addresses.0", ipRegex), + resource.TestMatchResourceAttr(resourceName, "ip_sets.0.ip_addresses.1", ipRegex), + resource.TestCheckResourceAttr(resourceName, "ip_sets.0.ip_family", "IPv4"), + resource.TestCheckResourceAttr(resourceName, "name", rName), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testAccGlobalAcceleratorCustomRoutingAcceleratorConfig(rName string) string { + return fmt.Sprintf(` +resource "aws_globalaccelerator_customroutingaccelerator" "test" { + name = %[1]q +} +`, rName) +} From c13828c68023693359c7c62af5b0a5885277c619 Mon Sep 17 00:00:00 2001 From: Yvan Guidoin Date: Fri, 4 Feb 2022 15:28:30 +0000 Subject: [PATCH 03/38] Add datasource testing --- ...om_routing_accelerator_data_source_test.go | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go b/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go new file mode 100644 index 000000000000..a48d9600fa8d --- /dev/null +++ b/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go @@ -0,0 +1,65 @@ +package globalaccelerator_test + +import ( + "fmt" + "testing" + + "github.com/aws/aws-sdk-go/service/globalaccelerator" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-provider-aws/internal/acctest" +) + +func TestAccGlobalAcceleratorCustomRoutingAcceleratorDataSource_basic(t *testing.T) { + resourceName := "aws_globalaccelerator_customroutingaccelerator.test" + dataSourceName := "data.aws_globalaccelerator_customroutingaccelerator.test_by_arn" + dataSourceName2 := "data.aws_globalaccelerator_customroutingaccelerator.test_by_name" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(t); testAccPreCheckGlobalAccelerator(t) }, + ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), + Providers: acctest.Providers, + Steps: []resource.TestStep{ + { + Config: testAccGlobalAcceleratorCustomRoutingAcceleratorDataSourceConfig(resourceName), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrPair(dataSourceName, "name", resourceName, "name"), + resource.TestCheckResourceAttrPair(dataSourceName, "enabled", resourceName, "enabled"), + resource.TestCheckResourceAttrPair(dataSourceName, "dns_name", resourceName, "dns_name"), + resource.TestCheckResourceAttrPair(dataSourceName, "hosted_zone_id", resourceName, "hosted_zone_id"), + resource.TestCheckResourceAttrPair(dataSourceName, "ip_sets.#", resourceName, "ip_sets.#"), + resource.TestCheckResourceAttrPair(dataSourceName, "ip_sets.0.ip_addresses.#", resourceName, "ip_sets.0.ip_addresses.#"), + resource.TestCheckResourceAttrPair(dataSourceName, "ip_sets.0.ip_addresses.0", resourceName, "ip_sets.0.ip_addresses.0"), + resource.TestCheckResourceAttrPair(dataSourceName, "ip_sets.0.ip_addresses.1", resourceName, "ip_sets.0.ip_addresses.1"), + resource.TestCheckResourceAttrPair(dataSourceName, "ip_sets.0.ip_family", resourceName, "ip_sets.0.ip_family"), + resource.TestCheckResourceAttrPair(dataSourceName2, "name", resourceName, "name"), + resource.TestCheckResourceAttrPair(dataSourceName2, "enabled", resourceName, "enabled"), + resource.TestCheckResourceAttrPair(dataSourceName2, "dns_name", resourceName, "dns_name"), + resource.TestCheckResourceAttrPair(dataSourceName2, "hosted_zone_id", resourceName, "hosted_zone_id"), + resource.TestCheckResourceAttrPair(dataSourceName2, "ip_sets.#", resourceName, "ip_sets.#"), + resource.TestCheckResourceAttrPair(dataSourceName2, "ip_sets.0.ip_addresses.#", resourceName, "ip_sets.0.ip_addresses.#"), + resource.TestCheckResourceAttrPair(dataSourceName2, "ip_sets.0.ip_addresses.0", resourceName, "ip_sets.0.ip_addresses.0"), + resource.TestCheckResourceAttrPair(dataSourceName2, "ip_sets.0.ip_addresses.1", resourceName, "ip_sets.0.ip_addresses.1"), + resource.TestCheckResourceAttrPair(dataSourceName2, "ip_sets.0.ip_family", resourceName, "ip_sets.0.ip_family"), + ), + }, + }, + }) + +} + +func testAccGlobalAcceleratorCustomRoutingAcceleratorDataSourceConfig(rName string) string { + return fmt.Sprintf(` +resource "aws_globalaccelerator_customroutingaccelerator" "test" { + name = %[1]q +} + + +data "aws_globalaccelerator_customroutingaccelerator" "test_by_arn" { + arn = aws_globalaccelerator_accelerator.test.id + } + + data "aws_globalaccelerator_customroutingaccelerator" "test_by_name" { + name = aws_globalaccelerator_accelerator.test.name + } +`, rName) +} From b96a2509fdc42f4ec25fadd9e89a679d5007a319 Mon Sep 17 00:00:00 2001 From: Yvan Guidoin Date: Mon, 7 Feb 2022 15:37:20 +0000 Subject: [PATCH 04/38] Add more tests --- internal/provider/provider.go | 12 ++- ...om_routing_accelerator_data_source_test.go | 23 +++--- .../custom_routing_accelerator_test.go | 58 ++++++++++++- .../custom_routing_endpoint_group_test.go | 81 +++++++++++++++++++ .../custom_routing_listener_test.go | 55 +++++++++++++ 5 files changed, 211 insertions(+), 18 deletions(-) create mode 100644 internal/service/globalaccelerator/custom_routing_endpoint_group_test.go create mode 100644 internal/service/globalaccelerator/custom_routing_listener_test.go diff --git a/internal/provider/provider.go b/internal/provider/provider.go index f8d463cef743..f4550c2cc865 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -667,6 +667,9 @@ func New(ctx context.Context) (*schema.Provider, error) { "aws_fsx_openzfs_snapshot": fsx.DataSourceOpenzfsSnapshot(), + "aws_globalaccelerator_accelerator": globalaccelerator.DataSourceAccelerator(), + "aws_globalaccelerator_custom_routing_accelerator": globalaccelerator.DataSourceCustomRoutingAccelerator(), + "aws_glue_catalog_table": glue.DataSourceCatalogTable(), "aws_glue_connection": glue.DataSourceConnection(), "aws_glue_data_catalog_encryption_settings": glue.DataSourceDataCatalogEncryptionSettings(), @@ -1563,9 +1566,12 @@ func New(ctx context.Context) (*schema.Provider, error) { "aws_glacier_vault": glacier.ResourceVault(), "aws_glacier_vault_lock": glacier.ResourceVaultLock(), - "aws_globalaccelerator_accelerator": globalaccelerator.ResourceAccelerator(), - "aws_globalaccelerator_endpoint_group": globalaccelerator.ResourceEndpointGroup(), - "aws_globalaccelerator_listener": globalaccelerator.ResourceListener(), + "aws_globalaccelerator_accelerator": globalaccelerator.ResourceAccelerator(), + "aws_globalaccelerator_endpoint_group": globalaccelerator.ResourceEndpointGroup(), + "aws_globalaccelerator_listener": globalaccelerator.ResourceListener(), + "aws_globalaccelerator_custom_routing_accelerator": globalaccelerator.ResourceCustomRoutingAccelerator(), + "aws_globalaccelerator_custom_routing_endpoint_group": globalaccelerator.ResourceCustomRoutingEndpointGroup(), + "aws_globalaccelerator_custom_routing_listener": globalaccelerator.ResourceCustomRoutingListener(), "aws_glue_catalog_database": glue.ResourceCatalogDatabase(), "aws_glue_catalog_table": glue.ResourceCatalogTable(), diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go b/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go index a48d9600fa8d..678cbea96e8f 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go @@ -10,14 +10,15 @@ import ( ) func TestAccGlobalAcceleratorCustomRoutingAcceleratorDataSource_basic(t *testing.T) { - resourceName := "aws_globalaccelerator_customroutingaccelerator.test" - dataSourceName := "data.aws_globalaccelerator_customroutingaccelerator.test_by_arn" - dataSourceName2 := "data.aws_globalaccelerator_customroutingaccelerator.test_by_name" + resourceName := "aws_globalaccelerator_custom_routing_accelerator.test" + dataSourceName := "data.aws_globalaccelerator_custom_routing_accelerator.test_by_arn" + dataSourceName2 := "data.aws_globalaccelerator_custom_routing_accelerator.test_by_name" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { acctest.PreCheck(t); testAccPreCheckGlobalAccelerator(t) }, - ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), - Providers: acctest.Providers, + PreCheck: func() { acctest.PreCheck(t); testAccPreCheckGlobalAccelerator(t) }, + ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), + Providers: acctest.Providers, + CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, Steps: []resource.TestStep{ { Config: testAccGlobalAcceleratorCustomRoutingAcceleratorDataSourceConfig(resourceName), @@ -49,17 +50,17 @@ func TestAccGlobalAcceleratorCustomRoutingAcceleratorDataSource_basic(t *testing func testAccGlobalAcceleratorCustomRoutingAcceleratorDataSourceConfig(rName string) string { return fmt.Sprintf(` -resource "aws_globalaccelerator_customroutingaccelerator" "test" { +resource "aws_globalaccelerator_custom_routing_accelerator" "test" { name = %[1]q } -data "aws_globalaccelerator_customroutingaccelerator" "test_by_arn" { - arn = aws_globalaccelerator_accelerator.test.id +data "aws_globalaccelerator_custom_routing_accelerator" "test_by_arn" { + arn = aws_globalaccelerator_custom_routing_accelerator.test.id } - data "aws_globalaccelerator_customroutingaccelerator" "test_by_name" { - name = aws_globalaccelerator_accelerator.test.name + data "aws_globalaccelerator_custom_routing_accelerator" "test_by_name" { + name = aws_globalaccelerator_custom_routing_accelerator.test.name } `, rName) } diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_test.go b/internal/service/globalaccelerator/custom_routing_accelerator_test.go index 653f712086b2..b1c1b8d21530 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_test.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_test.go @@ -8,11 +8,15 @@ import ( "github.com/aws/aws-sdk-go/service/globalaccelerator" sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/hashicorp/terraform-provider-aws/internal/acctest" + "github.com/hashicorp/terraform-provider-aws/internal/conns" + tfglobalaccelerator "github.com/hashicorp/terraform-provider-aws/internal/service/globalaccelerator" + "github.com/hashicorp/terraform-provider-aws/internal/tfresource" ) func TestAccGlobalAcceleratorCustomRoutingAccelerator_basic(t *testing.T) { - resourceName := "aws_globalaccelerator_customroutingaccelerator.test" + resourceName := "aws_globalaccelerator_custom_routing_accelerator.test" rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) ipRegex := regexp.MustCompile(`\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}`) dnsNameRegex := regexp.MustCompile(`^a[a-f0-9]{16}\.awsglobalaccelerator\.com$`) @@ -21,12 +25,12 @@ func TestAccGlobalAcceleratorCustomRoutingAccelerator_basic(t *testing.T) { PreCheck: func() { acctest.PreCheck(t); testAccPreCheckGlobalAccelerator(t) }, ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), Providers: acctest.Providers, - CheckDestroy: testAccCheckGlobalAcceleratorAcceleratorDestroy, + CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, Steps: []resource.TestStep{ { Config: testAccGlobalAcceleratorCustomRoutingAcceleratorConfig(rName), Check: resource.ComposeTestCheckFunc( - testAccCheckGlobalAcceleratorAcceleratorExists(resourceName), + testAccCheckGlobalAcceleratorCustomRoutingAcceleratorExists(resourceName), resource.TestMatchResourceAttr(resourceName, "dns_name", dnsNameRegex), resource.TestCheckResourceAttr(resourceName, "enabled", "true"), resource.TestCheckResourceAttr(resourceName, "hosted_zone_id", "Z2BJ6XQ5FK7U4H"), @@ -50,8 +54,54 @@ func TestAccGlobalAcceleratorCustomRoutingAccelerator_basic(t *testing.T) { func testAccGlobalAcceleratorCustomRoutingAcceleratorConfig(rName string) string { return fmt.Sprintf(` -resource "aws_globalaccelerator_customroutingaccelerator" "test" { +resource "aws_globalaccelerator_custom_routing_accelerator" "test" { name = %[1]q } `, rName) } + +func testAccCheckGlobalAcceleratorCustomRoutingAcceleratorExists(name string) resource.TestCheckFunc { + return func(s *terraform.State) error { + conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn + + rs, ok := s.RootModule().Resources[name] + if !ok { + return fmt.Errorf("Not found: %s", name) + } + + if rs.Primary.ID == "" { + return fmt.Errorf("No ID is set") + } + + _, err := tfglobalaccelerator.FindCustomRoutingAcceleratorByARN(conn, rs.Primary.ID) + + if err != nil { + return err + } + + return nil + } +} + +func testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy(s *terraform.State) error { + conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn + + for _, rs := range s.RootModule().Resources { + if rs.Type != "aws_globalaccelerator_custom_routing_accelerator" { + continue + } + + _, err := tfglobalaccelerator.FindCustomRoutingAcceleratorByARN(conn, rs.Primary.ID) + + if tfresource.NotFound(err) { + continue + } + + if err != nil { + return err + } + + return fmt.Errorf("Global Accelerator Accelerator %s still exists", rs.Primary.ID) + } + return nil +} diff --git a/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go b/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go new file mode 100644 index 000000000000..835d289aeab3 --- /dev/null +++ b/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go @@ -0,0 +1,81 @@ +package globalaccelerator_test + +import ( + "fmt" + "testing" + + "github.com/aws/aws-sdk-go/service/globalaccelerator" + sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/hashicorp/terraform-provider-aws/internal/acctest" + "github.com/hashicorp/terraform-provider-aws/internal/conns" + tfglobalaccelerator "github.com/hashicorp/terraform-provider-aws/internal/service/globalaccelerator" +) + +func TestAccGlobalAcceleratorCustomRoutingEndpointGroup_basic(t *testing.T) { + var v globalaccelerator.CustomRoutingEndpointGroup + resourceName := "aws_globalaccelerator_custom_routing_endpoint_group.test" + accName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(t); testAccPreCheckGlobalAccelerator(t) }, + ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), + Providers: acctest.Providers, + CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, + Steps: []resource.TestStep{ + { + Config: testAccGlobalAcceleratorCustomRoutingEndpointGroupConfig(accName), + Check: resource.ComposeTestCheckFunc( + testAccCheckGlobalAcceleratorCustomRoutingAcceleratorExists(accName), + testAccCheckGlobalAcceleratorCustomRoutingEndpointGroupExists(resourceName, &v), + ), + }, + }, + }) + +} + +func testAccGlobalAcceleratorCustomRoutingEndpointGroupConfig(accName string) string { + return fmt.Sprintf(` +resource "aws_globalaccelerator_custom_routing_accelerator" "test_acc" { + name = %[1]q +} + +resource "aws_globalaccelerator_custom_routing_listener" "test_listener" { + accelerator_arn = aws_globalaccelerator_custom_routing_accelerator.test_acc.id + port_range = { + from_port = 443 + to_port = 443 + } +} + +resource "aws_globalaccelerator_custom_routing_endpoint_group" "test" { + listener_arn: aws_globalaccelerator_custom_routing_listener.test_listener.id +} +`, accName) +} + +func testAccCheckGlobalAcceleratorCustomRoutingEndpointGroupExists(name string, v *globalaccelerator.CustomRoutingEndpointGroup) resource.TestCheckFunc { + return func(s *terraform.State) error { + conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn + + rs, ok := s.RootModule().Resources[name] + if !ok { + return fmt.Errorf("Not found: %s", name) + } + + if rs.Primary.ID == "" { + return fmt.Errorf("No Global Accelerator endpoint group ID is set") + } + + customRoutingEndpointGroup, err := tfglobalaccelerator.FindCustomRoutingEndpointGroupByARN(conn, rs.Primary.ID) + + if err != nil { + return err + } + + *v = *customRoutingEndpointGroup + + return nil + } +} diff --git a/internal/service/globalaccelerator/custom_routing_listener_test.go b/internal/service/globalaccelerator/custom_routing_listener_test.go new file mode 100644 index 000000000000..68bfe1d705a0 --- /dev/null +++ b/internal/service/globalaccelerator/custom_routing_listener_test.go @@ -0,0 +1,55 @@ +package globalaccelerator_test + +import ( + "fmt" + "testing" + + "github.com/aws/aws-sdk-go/service/globalaccelerator" + sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-provider-aws/internal/acctest" +) + +func TestAccGlobalAcceleratorCustomRoutingListener_basic(t *testing.T) { + resourceName := "aws_globalaccelerator_custom_routing_listener.test" + accName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(t); testAccPreCheckGlobalAccelerator(t) }, + ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), + Providers: acctest.Providers, + CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, + Steps: []resource.TestStep{ + { + Config: testAccGlobalAcceleratorCustomRoutingListenerConfig(accName), + Check: resource.ComposeTestCheckFunc( + testAccCheckGlobalAcceleratorCustomRoutingAcceleratorExists(accName), + resource.TestCheckResourceAttr(resourceName, "port_range.#", "2"), + resource.TestCheckResourceAttr(resourceName, "port_range.0.from_port", "443"), + resource.TestCheckResourceAttr(resourceName, "port_range.0.to_port", "443"), + resource.TestCheckResourceAttr(resourceName, "port_range.1.from_port", "10000"), + resource.TestCheckResourceAttr(resourceName, "port_range.1.to_port", "30000"), + ), + }, + }, + }) +} + +func testAccGlobalAcceleratorCustomRoutingListenerConfig(accName string) string { + return fmt.Sprintf(` +resource "aws_globalaccelerator_custom_routing_accelerator" "test_acc" { + name = %[1]q +} + +resource "aws_globalaccelerator_custom_routing_listener" "test" { + accelerator_arn = aws_globalaccelerator_custom_routing_accelerator.test_acc.id + port_range = { + from_port = 443 + to_port = 443 + } + port_range = { + from_port = 10000 + to_port = 30000 + } +} +`, accName) +} From 459d7c26fb724abc3a5afc1f5d4d5165a8edaf87 Mon Sep 17 00:00:00 2001 From: justin Date: Tue, 17 Jan 2023 09:37:39 +1000 Subject: [PATCH 05/38] chore: refactor to latest SDK style --- .changelog/28922.txt | 11 +++ internal/provider/provider.go | 1 - .../custom_routing_accelerator.go | 53 +++++++++---- .../custom_routing_accelerator_data_source.go | 8 +- ...om_routing_accelerator_data_source_test.go | 8 +- .../custom_routing_accelerator_test.go | 12 +-- .../custom_routing_endpoint_group.go | 75 +++++++++++++------ .../custom_routing_endpoint_group_test.go | 10 +-- .../custom_routing_listener.go | 14 ++-- .../custom_routing_listener_test.go | 8 +- 10 files changed, 133 insertions(+), 67 deletions(-) create mode 100644 .changelog/28922.txt diff --git a/.changelog/28922.txt b/.changelog/28922.txt new file mode 100644 index 000000000000..d4a7f676ea10 --- /dev/null +++ b/.changelog/28922.txt @@ -0,0 +1,11 @@ +```release-note:new-resource +aws_globalaccelerator_custom_routing_accelerator +``` + +```release-note:new-resource +aws_globalaccelerator_custom_routing_listener +``` + +```release-note:new-resource +aws_globalaccelerator_custom_routing_endpoint_group +``` \ No newline at end of file diff --git a/internal/provider/provider.go b/internal/provider/provider.go index f4550c2cc865..777511155153 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -667,7 +667,6 @@ func New(ctx context.Context) (*schema.Provider, error) { "aws_fsx_openzfs_snapshot": fsx.DataSourceOpenzfsSnapshot(), - "aws_globalaccelerator_accelerator": globalaccelerator.DataSourceAccelerator(), "aws_globalaccelerator_custom_routing_accelerator": globalaccelerator.DataSourceCustomRoutingAccelerator(), "aws_glue_catalog_table": glue.DataSourceCatalogTable(), diff --git a/internal/service/globalaccelerator/custom_routing_accelerator.go b/internal/service/globalaccelerator/custom_routing_accelerator.go index 18cd4a527819..df6c2f65fb02 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator.go @@ -34,6 +34,31 @@ func ResourceCustomRoutingAccelerator() *schema.Resource { }, Schema: map[string]*schema.Schema{ + "attributes": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + DiffSuppressFunc: verify.SuppressMissingOptionalConfigurationBlock, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "flow_logs_enabled": { + Type: schema.TypeBool, + Optional: true, + Default: false, + }, + "flow_logs_s3_bucket": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringLenBetween(0, 255), + }, + "flow_logs_s3_prefix": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringLenBetween(0, 255), + }, + }, + }, + }, "name": { Type: schema.TypeString, Required: true, @@ -90,7 +115,7 @@ func ResourceCustomRoutingAccelerator() *schema.Resource { } func resourceCustomRoutingAcceleratorCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig tags := defaultTagsConfig.MergeTags(tftags.New(d.Get("tags").(map[string]interface{}))) @@ -120,7 +145,7 @@ func resourceCustomRoutingAcceleratorCreate(d *schema.ResourceData, meta interfa } if v, ok := d.GetOk("attributes"); ok && len(v.([]interface{})) > 0 && v.([]interface{})[0] != nil { - input := expandGlobalAcceleratorUpdateAcceleratorAttributesInput(v.([]interface{})[0].(map[string]interface{})) + input := expandUpdateAcceleratorAttributesInput(v.([]interface{})[0].(map[string]interface{})) input.AcceleratorArn = aws.String(d.Id()) log.Printf("[DEBUG] Updating Global Accelerator Accelerator attributes: %s", input) @@ -137,7 +162,7 @@ func resourceCustomRoutingAcceleratorCreate(d *schema.ResourceData, meta interfa } func resourceCustomRoutingAcceleratorRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig @@ -155,11 +180,11 @@ func resourceCustomRoutingAcceleratorRead(d *schema.ResourceData, meta interface d.Set("enabled", accelerator.Enabled) d.Set("dns_name", accelerator.DnsName) - d.Set("hosted_zone_id", globalAcceleratorRoute53ZoneID) + d.Set("hosted_zone_id", route53ZoneID) d.Set("name", accelerator.Name) d.Set("ip_address_type", accelerator.IpAddressType) - if err := d.Set("ip_sets", flattenGlobalAcceleratorIpSets(accelerator.IpSets)); err != nil { + if err := d.Set("ip_sets", flattenIPSets(accelerator.IpSets)); err != nil { return fmt.Errorf("error setting ip_sets: %w", err) } @@ -169,7 +194,7 @@ func resourceCustomRoutingAcceleratorRead(d *schema.ResourceData, meta interface return fmt.Errorf("error reading Global Accelerator Custom Routing Accelerator (%s) attributes: %w", d.Id(), err) } - if err := d.Set("attributes", []interface{}{flattenGlobalAcceleratorCustomRoutingAcceleratorAttributes(acceleratorAttributes)}); err != nil { + if err := d.Set("attributes", []interface{}{flattenCustomRoutingAcceleratorAttributes(acceleratorAttributes)}); err != nil { return fmt.Errorf("error setting attributes: %w", err) } @@ -193,7 +218,7 @@ func resourceCustomRoutingAcceleratorRead(d *schema.ResourceData, meta interface } func resourceCustomRoutingAcceleratorUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() if d.HasChanges("name", "ip_address_type", "enabled") { input := &globalaccelerator.UpdateCustomRoutingAcceleratorInput{ @@ -220,9 +245,9 @@ func resourceCustomRoutingAcceleratorUpdate(d *schema.ResourceData, meta interfa o, n := d.GetChange("attributes") if len(o.([]interface{})) > 0 && o.([]interface{})[0] != nil { if len(n.([]interface{})) > 0 && n.([]interface{})[0] != nil { - oInput := expandGlobalAcceleratorUpdateCustomRoutingAcceleratorAttributesInput(o.([]interface{})[0].(map[string]interface{})) + oInput := expandUpdateCustomRoutingAcceleratorAttributesInput(o.([]interface{})[0].(map[string]interface{})) oInput.AcceleratorArn = aws.String(d.Id()) - nInput := expandGlobalAcceleratorUpdateCustomRoutingAcceleratorAttributesInput(n.([]interface{})[0].(map[string]interface{})) + nInput := expandUpdateCustomRoutingAcceleratorAttributesInput(n.([]interface{})[0].(map[string]interface{})) nInput.AcceleratorArn = aws.String(d.Id()) // To change flow logs bucket and prefix attributes while flows are enabled, first disable flow logs. @@ -263,7 +288,7 @@ func resourceCustomRoutingAcceleratorUpdate(d *schema.ResourceData, meta interfa } func resourceCustomRoutingAcceleratorDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() { input := &globalaccelerator.UpdateCustomRoutingAcceleratorInput{ @@ -307,10 +332,10 @@ func resourceCustomRoutingAcceleratorDelete(d *schema.ResourceData, meta interfa return nil } -func expandGlobalAcceleratorUpdateCustomRoutingAcceleratorAttributesInput(tfMap map[string]interface{}) *globalaccelerator.UpdateCustomRoutingAcceleratorAttributesInput { - return (*globalaccelerator.UpdateCustomRoutingAcceleratorAttributesInput)(expandGlobalAcceleratorUpdateAcceleratorAttributesInput(tfMap)) +func expandUpdateCustomRoutingAcceleratorAttributesInput(tfMap map[string]interface{}) *globalaccelerator.UpdateCustomRoutingAcceleratorAttributesInput { + return (*globalaccelerator.UpdateCustomRoutingAcceleratorAttributesInput)(expandUpdateAcceleratorAttributesInput(tfMap)) } -func flattenGlobalAcceleratorCustomRoutingAcceleratorAttributes(apiObject *globalaccelerator.CustomRoutingAcceleratorAttributes) map[string]interface{} { - return flattenGlobalAcceleratorAcceleratorAttributes((*globalaccelerator.AcceleratorAttributes)(apiObject)) +func flattenCustomRoutingAcceleratorAttributes(apiObject *globalaccelerator.CustomRoutingAcceleratorAttributes) map[string]interface{} { + return flattenAcceleratorAttributes((*globalaccelerator.AcceleratorAttributes)(apiObject)) } diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go b/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go index 2307c48ab795..1c0247e0fa16 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go @@ -85,7 +85,7 @@ func DataSourceCustomRoutingAccelerator() *schema.Resource { } func dataSourceCustomRoutingAcceleratorRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig var results []*globalaccelerator.CustomRoutingAccelerator @@ -127,17 +127,17 @@ func dataSourceCustomRoutingAcceleratorRead(d *schema.ResourceData, meta interfa d.Set("arn", accelerator.AcceleratorArn) d.Set("enabled", accelerator.Enabled) d.Set("dns_name", accelerator.DnsName) - d.Set("hosted_zone_id", globalAcceleratorRoute53ZoneID) + d.Set("hosted_zone_id", route53ZoneID) d.Set("name", accelerator.Name) d.Set("ip_address_type", accelerator.IpAddressType) - d.Set("ip_sets", flattenGlobalAcceleratorIpSets(accelerator.IpSets)) + d.Set("ip_sets", flattenIPSets(accelerator.IpSets)) acceleratorAttributes, err := FindCustomRoutingAcceleratorAttributesByARN(conn, d.Id()) if err != nil { return fmt.Errorf("error reading Global Accelerator Custom Routing Accelerator (%s) attributes: %w", d.Id(), err) } - if err := d.Set("attributes", []interface{}{flattenGlobalAcceleratorCustomRoutingAcceleratorAttributes(acceleratorAttributes)}); err != nil { + if err := d.Set("attributes", []interface{}{flattenCustomRoutingAcceleratorAttributes(acceleratorAttributes)}); err != nil { return fmt.Errorf("error setting attributes: %w", err) } diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go b/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go index 678cbea96e8f..a9be4cf10a10 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go @@ -15,10 +15,10 @@ func TestAccGlobalAcceleratorCustomRoutingAcceleratorDataSource_basic(t *testing dataSourceName2 := "data.aws_globalaccelerator_custom_routing_accelerator.test_by_name" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { acctest.PreCheck(t); testAccPreCheckGlobalAccelerator(t) }, - ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), - Providers: acctest.Providers, - CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, + PreCheck: func() { acctest.PreCheck(t); testAccPreCheck(t) }, + ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, Steps: []resource.TestStep{ { Config: testAccGlobalAcceleratorCustomRoutingAcceleratorDataSourceConfig(resourceName), diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_test.go b/internal/service/globalaccelerator/custom_routing_accelerator_test.go index b1c1b8d21530..eea580e08c3a 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_test.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_test.go @@ -22,10 +22,10 @@ func TestAccGlobalAcceleratorCustomRoutingAccelerator_basic(t *testing.T) { dnsNameRegex := regexp.MustCompile(`^a[a-f0-9]{16}\.awsglobalaccelerator\.com$`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { acctest.PreCheck(t); testAccPreCheckGlobalAccelerator(t) }, - ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), - Providers: acctest.Providers, - CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, + PreCheck: func() { acctest.PreCheck(t); testAccPreCheck(t) }, + ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, Steps: []resource.TestStep{ { Config: testAccGlobalAcceleratorCustomRoutingAcceleratorConfig(rName), @@ -62,7 +62,7 @@ resource "aws_globalaccelerator_custom_routing_accelerator" "test" { func testAccCheckGlobalAcceleratorCustomRoutingAcceleratorExists(name string) resource.TestCheckFunc { return func(s *terraform.State) error { - conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn + conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn() rs, ok := s.RootModule().Resources[name] if !ok { @@ -84,7 +84,7 @@ func testAccCheckGlobalAcceleratorCustomRoutingAcceleratorExists(name string) re } func testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy(s *terraform.State) error { - conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn + conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn() for _, rs := range s.RootModule().Resources { if rs.Type != "aws_globalaccelerator_custom_routing_accelerator" { diff --git a/internal/service/globalaccelerator/custom_routing_endpoint_group.go b/internal/service/globalaccelerator/custom_routing_endpoint_group.go index 1d8adbc59a7c..91b910288ce6 100644 --- a/internal/service/globalaccelerator/custom_routing_endpoint_group.go +++ b/internal/service/globalaccelerator/custom_routing_endpoint_group.go @@ -2,11 +2,11 @@ package globalaccelerator import ( "fmt" + "github.com/hashicorp/terraform-provider-aws/internal/flex" "log" "time" "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/ec2" "github.com/aws/aws-sdk-go/service/globalaccelerator" "github.com/hashicorp/aws-sdk-go-base/tfawserr" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" @@ -69,7 +69,7 @@ func ResourceCustomRoutingEndpointGroup() *schema.Resource { Optional: true, Elem: &schema.Schema{ Type: schema.TypeString, - ValidateFunc: validation.StringInSlice(ec2.TransportProtocol_Values(), false), + ValidateFunc: validation.StringInSlice(globalaccelerator.CustomRoutingProtocol_Values(), false), }, }, }, @@ -102,7 +102,7 @@ func ResourceCustomRoutingEndpointGroup() *schema.Resource { } func resourceCustomRoutingEndpointGroupCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() region := meta.(*conns.AWSClient).Region opts := &globalaccelerator.CreateCustomRoutingEndpointGroupInput{ @@ -112,7 +112,7 @@ func resourceCustomRoutingEndpointGroupCreate(d *schema.ResourceData, meta inter } if v, ok := d.GetOk("destination_configuration"); ok { - opts.DestinationConfigurations = expandGlobalAcceleratorCustomRoutingDestinationConfigurations(v.(*schema.Set).List()) + opts.DestinationConfigurations = expandCustomRoutingDestinationConfigurations(v.(*schema.Set).List()) } log.Printf("[DEBUG] Create Global Accelerator custom routing endpoint group: %s", opts) @@ -138,7 +138,7 @@ func resourceCustomRoutingEndpointGroupCreate(d *schema.ResourceData, meta inter if v, ok := d.GetOk("endpoint_configuration"); ok { optsEndpoints := &globalaccelerator.AddCustomRoutingEndpointsInput{ EndpointGroupArn: resp.EndpointGroup.EndpointGroupArn, - EndpointConfigurations: expandGlobalAcceleratorCustomRoutingEndpointConfigurations(v.(*schema.Set).List()), + EndpointConfigurations: expandCustomRoutingEndpointConfigurations(v.(*schema.Set).List()), } _, err := conn.AddCustomRoutingEndpoints(optsEndpoints) @@ -155,7 +155,7 @@ func resourceCustomRoutingEndpointGroupCreate(d *schema.ResourceData, meta inter } func resourceCustomRoutingEndpointGroupRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() endpointGroup, err := FindCustomRoutingEndpointGroupByARN(conn, d.Id()) @@ -176,11 +176,11 @@ func resourceCustomRoutingEndpointGroupRead(d *schema.ResourceData, meta interfa } d.Set("arn", endpointGroup.EndpointGroupArn) - if err := d.Set("destination_configuration", flattenGlobalAcceleratorCustomRoutingDestinationDescriptions(endpointGroup.DestinationDescriptions)); err != nil { + if err := d.Set("destination_configuration", flattenCustomRoutingDestinationDescriptions(endpointGroup.DestinationDescriptions)); err != nil { return fmt.Errorf("error setting destination_configuration: %w", err) } d.Set("endpoint_group_region", endpointGroup.EndpointGroupRegion) - if err := d.Set("endpoint_configuration", flattenGlobalAcceleratorCustomRoutingEndpointDescriptions(endpointGroup.EndpointDescriptions)); err != nil { + if err := d.Set("endpoint_configuration", flattenCustomRoutingEndpointDescriptions(endpointGroup.EndpointDescriptions)); err != nil { return fmt.Errorf("error setting endpoint_configuration: %w", err) } d.Set("listener_arn", listenerARN) @@ -189,7 +189,7 @@ func resourceCustomRoutingEndpointGroupRead(d *schema.ResourceData, meta interfa } func resourceCustomRoutingEndpointGroupDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() input := &globalaccelerator.DeleteCustomRoutingEndpointGroupInput{ EndpointGroupArn: aws.String(d.Id()), @@ -219,24 +219,55 @@ func resourceCustomRoutingEndpointGroupDelete(d *schema.ResourceData, meta inter return nil } -func expandGlobalAcceleratorCustomRoutingDestinationConfigurations(configurations []interface{}) []*globalaccelerator.CustomRoutingDestinationConfiguration { - out := make([]*globalaccelerator.CustomRoutingDestinationConfiguration, len(configurations)) +func expandCustomRoutingDestinationConfigurations(configurations []interface{}) []*globalaccelerator.CustomRoutingDestinationConfiguration { + if len(configurations) == 0 { + return nil + } - for i, raw := range configurations { - configuration := raw.(map[string]interface{}) - m := globalaccelerator.CustomRoutingDestinationConfiguration{} + var apiObjects []*globalaccelerator.CustomRoutingDestinationConfiguration - m.FromPort = aws.Int64(int64(configuration["from_port"].(int))) - m.ToPort = aws.Int64(int64(configuration["to_port"].(int))) - m.Protocols = aws.StringSlice(configuration["protocols"].([]string)) + for _, tfMapRaw := range configurations { + tfMap, ok := tfMapRaw.(map[string]interface{}) - out[i] = &m + if !ok { + continue + } + + apiObject := expandCustomRoutingEndpointDestinationConfiguration(tfMap) + + if apiObject == nil { + continue + } + + apiObjects = append(apiObjects, apiObject) } - return out + return apiObjects +} + +func expandCustomRoutingEndpointDestinationConfiguration(tfMap map[string]interface{}) *globalaccelerator.CustomRoutingDestinationConfiguration { + if tfMap == nil { + return nil + } + + apiObject := &globalaccelerator.CustomRoutingDestinationConfiguration{} + + if v, ok := tfMap["from_port"].(int64); ok { + apiObject.FromPort = aws.Int64(v) + } + + if v, ok := tfMap["to_port"].(int64); ok { + apiObject.ToPort = aws.Int64(v) + } + + if v, ok := tfMap["protocols"].(*schema.Set); ok { + apiObject.Protocols = flex.ExpandStringSet(v) + } + + return apiObject } -func expandGlobalAcceleratorCustomRoutingEndpointConfigurations(configurations []interface{}) []*globalaccelerator.CustomRoutingEndpointConfiguration { +func expandCustomRoutingEndpointConfigurations(configurations []interface{}) []*globalaccelerator.CustomRoutingEndpointConfiguration { out := make([]*globalaccelerator.CustomRoutingEndpointConfiguration, len(configurations)) for i, raw := range configurations { @@ -251,7 +282,7 @@ func expandGlobalAcceleratorCustomRoutingEndpointConfigurations(configurations [ return out } -func flattenGlobalAcceleratorCustomRoutingEndpointDescriptions(configurations []*globalaccelerator.CustomRoutingEndpointDescription) []interface{} { +func flattenCustomRoutingEndpointDescriptions(configurations []*globalaccelerator.CustomRoutingEndpointDescription) []interface{} { out := make([]interface{}, len(configurations)) for i, configuration := range configurations { @@ -265,7 +296,7 @@ func flattenGlobalAcceleratorCustomRoutingEndpointDescriptions(configurations [] return out } -func flattenGlobalAcceleratorCustomRoutingDestinationDescriptions(configurations []*globalaccelerator.CustomRoutingDestinationDescription) []interface{} { +func flattenCustomRoutingDestinationDescriptions(configurations []*globalaccelerator.CustomRoutingDestinationDescription) []interface{} { out := make([]interface{}, len(configurations)) for i, configuration := range configurations { diff --git a/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go b/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go index 835d289aeab3..c432ec9e9b82 100644 --- a/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go +++ b/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go @@ -18,10 +18,10 @@ func TestAccGlobalAcceleratorCustomRoutingEndpointGroup_basic(t *testing.T) { resourceName := "aws_globalaccelerator_custom_routing_endpoint_group.test" accName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { acctest.PreCheck(t); testAccPreCheckGlobalAccelerator(t) }, - ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), - Providers: acctest.Providers, - CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, + PreCheck: func() { acctest.PreCheck(t); testAccPreCheck(t) }, + ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, Steps: []resource.TestStep{ { Config: testAccGlobalAcceleratorCustomRoutingEndpointGroupConfig(accName), @@ -57,7 +57,7 @@ resource "aws_globalaccelerator_custom_routing_endpoint_group" "test" { func testAccCheckGlobalAcceleratorCustomRoutingEndpointGroupExists(name string, v *globalaccelerator.CustomRoutingEndpointGroup) resource.TestCheckFunc { return func(s *terraform.State) error { - conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn + conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn() rs, ok := s.RootModule().Resources[name] if !ok { diff --git a/internal/service/globalaccelerator/custom_routing_listener.go b/internal/service/globalaccelerator/custom_routing_listener.go index b64830870274..b6501b779c14 100644 --- a/internal/service/globalaccelerator/custom_routing_listener.go +++ b/internal/service/globalaccelerator/custom_routing_listener.go @@ -63,13 +63,13 @@ func ResourceCustomRoutingListener() *schema.Resource { } func resourceCustomRoutingListenerCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() acceleratorARN := d.Get("accelerator_arn").(string) opts := &globalaccelerator.CreateCustomRoutingListenerInput{ AcceleratorArn: aws.String(acceleratorARN), IdempotencyToken: aws.String(resource.UniqueId()), - PortRanges: resourceListenerExpandPortRanges(d.Get("port_range").(*schema.Set).List()), + PortRanges: expandPortRanges(d.Get("port_range").(*schema.Set).List()), } log.Printf("[DEBUG] Create Global Accelerator custom routing listener: %s", opts) @@ -90,7 +90,7 @@ func resourceCustomRoutingListenerCreate(d *schema.ResourceData, meta interface{ } func resourceCustomRoutingListenerRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() listener, err := FindCustomRoutingListenerByARN(conn, d.Id()) @@ -111,7 +111,7 @@ func resourceCustomRoutingListenerRead(d *schema.ResourceData, meta interface{}) } d.Set("accelerator_arn", acceleratorARN) - if err := d.Set("port_range", resourceListenerFlattenPortRanges(listener.PortRanges)); err != nil { + if err := d.Set("port_range", flattenPortRanges(listener.PortRanges)); err != nil { return fmt.Errorf("error setting port_range: %w", err) } @@ -119,12 +119,12 @@ func resourceCustomRoutingListenerRead(d *schema.ResourceData, meta interface{}) } func resourceCustomRoutingListenerUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() acceleratorARN := d.Get("accelerator_arn").(string) input := &globalaccelerator.UpdateCustomRoutingListenerInput{ ListenerArn: aws.String(d.Id()), - PortRanges: resourceListenerExpandPortRanges(d.Get("port_range").(*schema.Set).List()), + PortRanges: expandPortRanges(d.Get("port_range").(*schema.Set).List()), } log.Printf("[DEBUG] Updating Global Accelerator custom routing listener: %s", input) @@ -141,7 +141,7 @@ func resourceCustomRoutingListenerUpdate(d *schema.ResourceData, meta interface{ } func resourceCustomRoutingListenerDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*conns.AWSClient).GlobalAcceleratorConn + conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() acceleratorARN := d.Get("accelerator_arn").(string) input := &globalaccelerator.DeleteCustomRoutingListenerInput{ diff --git a/internal/service/globalaccelerator/custom_routing_listener_test.go b/internal/service/globalaccelerator/custom_routing_listener_test.go index 68bfe1d705a0..30989df8621d 100644 --- a/internal/service/globalaccelerator/custom_routing_listener_test.go +++ b/internal/service/globalaccelerator/custom_routing_listener_test.go @@ -14,10 +14,10 @@ func TestAccGlobalAcceleratorCustomRoutingListener_basic(t *testing.T) { resourceName := "aws_globalaccelerator_custom_routing_listener.test" accName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { acctest.PreCheck(t); testAccPreCheckGlobalAccelerator(t) }, - ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), - Providers: acctest.Providers, - CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, + PreCheck: func() { acctest.PreCheck(t); testAccPreCheck(t) }, + ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, Steps: []resource.TestStep{ { Config: testAccGlobalAcceleratorCustomRoutingListenerConfig(accName), From d4311ae6716526a8417a7eb25b695e50259de1ed Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 28 Mar 2023 14:41:47 -0400 Subject: [PATCH 06/38] r/aws_globalaccelerator_accelerator: Move some functions around. --- .../service/globalaccelerator/accelerator.go | 91 +++++++++++++++++++ internal/service/globalaccelerator/find.go | 58 ------------ internal/service/globalaccelerator/status.go | 18 ---- internal/service/globalaccelerator/wait.go | 18 ---- 4 files changed, 91 insertions(+), 94 deletions(-) diff --git a/internal/service/globalaccelerator/accelerator.go b/internal/service/globalaccelerator/accelerator.go index 44bb94632e62..9ad3a391e8bc 100644 --- a/internal/service/globalaccelerator/accelerator.go +++ b/internal/service/globalaccelerator/accelerator.go @@ -346,6 +346,97 @@ func resourceAcceleratorDelete(ctx context.Context, d *schema.ResourceData, meta return nil } +func FindAcceleratorByARN(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.Accelerator, error) { + input := &globalaccelerator.DescribeAcceleratorInput{ + AcceleratorArn: aws.String(arn), + } + + return findAccelerator(ctx, conn, input) +} + +func findAccelerator(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeAcceleratorInput) (*globalaccelerator.Accelerator, error) { + output, err := conn.DescribeAcceleratorWithContext(ctx, input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { + return nil, &resource.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err + } + + if output == nil || output.Accelerator == nil { + return nil, tfresource.NewEmptyResultError(input) + } + + return output.Accelerator, nil +} + +func FindAcceleratorAttributesByARN(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.AcceleratorAttributes, error) { + input := &globalaccelerator.DescribeAcceleratorAttributesInput{ + AcceleratorArn: aws.String(arn), + } + + return findAcceleratorAttributes(ctx, conn, input) +} + +func findAcceleratorAttributes(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeAcceleratorAttributesInput) (*globalaccelerator.AcceleratorAttributes, error) { + output, err := conn.DescribeAcceleratorAttributesWithContext(ctx, input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { + return nil, &resource.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err + } + + if output == nil || output.AcceleratorAttributes == nil { + return nil, tfresource.NewEmptyResultError(input) + } + + return output.AcceleratorAttributes, nil +} + +func statusAccelerator(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) resource.StateRefreshFunc { + return func() (interface{}, string, error) { + accelerator, err := FindAcceleratorByARN(ctx, conn, arn) + + if tfresource.NotFound(err) { + return nil, "", nil + } + + if err != nil { + return nil, "", err + } + + return accelerator, aws.StringValue(accelerator.Status), nil + } +} + +func waitAcceleratorDeployed(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string, timeout time.Duration) (*globalaccelerator.Accelerator, error) { //nolint:unparam + stateConf := &resource.StateChangeConf{ + Pending: []string{globalaccelerator.AcceleratorStatusInProgress}, + Target: []string{globalaccelerator.AcceleratorStatusDeployed}, + Refresh: statusAccelerator(ctx, conn, arn), + Timeout: timeout, + } + + outputRaw, err := stateConf.WaitForStateContext(ctx) + + if output, ok := outputRaw.(*globalaccelerator.Accelerator); ok { + return output, err + } + + return nil, err +} + func expandUpdateAcceleratorAttributesInput(tfMap map[string]interface{}) *globalaccelerator.UpdateAcceleratorAttributesInput { if tfMap == nil { return nil diff --git a/internal/service/globalaccelerator/find.go b/internal/service/globalaccelerator/find.go index f45b17263bd0..311d4929ad9d 100644 --- a/internal/service/globalaccelerator/find.go +++ b/internal/service/globalaccelerator/find.go @@ -10,64 +10,6 @@ import ( "github.com/hashicorp/terraform-provider-aws/internal/tfresource" ) -func FindAcceleratorByARN(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.Accelerator, error) { - input := &globalaccelerator.DescribeAcceleratorInput{ - AcceleratorArn: aws.String(arn), - } - - return FindAccelerator(ctx, conn, input) -} - -func FindAccelerator(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeAcceleratorInput) (*globalaccelerator.Accelerator, error) { - output, err := conn.DescribeAcceleratorWithContext(ctx, input) - - if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { - return nil, &resource.NotFoundError{ - LastError: err, - LastRequest: input, - } - } - - if err != nil { - return nil, err - } - - if output == nil || output.Accelerator == nil { - return nil, tfresource.NewEmptyResultError(input) - } - - return output.Accelerator, nil -} - -func FindAcceleratorAttributesByARN(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.AcceleratorAttributes, error) { - input := &globalaccelerator.DescribeAcceleratorAttributesInput{ - AcceleratorArn: aws.String(arn), - } - - return FindAcceleratorAttributes(ctx, conn, input) -} - -func FindAcceleratorAttributes(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeAcceleratorAttributesInput) (*globalaccelerator.AcceleratorAttributes, error) { - output, err := conn.DescribeAcceleratorAttributesWithContext(ctx, input) - - if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { - return nil, &resource.NotFoundError{ - LastError: err, - LastRequest: input, - } - } - - if err != nil { - return nil, err - } - - if output == nil || output.AcceleratorAttributes == nil { - return nil, tfresource.NewEmptyResultError(input) - } - - return output.AcceleratorAttributes, nil -} - func FindEndpointGroupByARN(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.EndpointGroup, error) { input := &globalaccelerator.DescribeEndpointGroupInput{ EndpointGroupArn: aws.String(arn), diff --git a/internal/service/globalaccelerator/status.go b/internal/service/globalaccelerator/status.go index 1cc16671ba3e..43dad5381de8 100644 --- a/internal/service/globalaccelerator/status.go +++ b/internal/service/globalaccelerator/status.go @@ -1,30 +1,12 @@ package globalaccelerator import ( - "context" - "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/globalaccelerator" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-provider-aws/internal/tfresource" ) -func statusAccelerator(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - accelerator, err := FindAcceleratorByARN(ctx, conn, arn) - - if tfresource.NotFound(err) { - return nil, "", nil - } - - if err != nil { - return nil, "", err - } - - return accelerator, aws.StringValue(accelerator.Status), nil - } -} - // statusCustomRoutingAccelerator fetches the Custom Routing Accelerator and its Status func statusCustomRoutingAccelerator(conn *globalaccelerator.GlobalAccelerator, arn string) resource.StateRefreshFunc { return func() (interface{}, string, error) { diff --git a/internal/service/globalaccelerator/wait.go b/internal/service/globalaccelerator/wait.go index 8c143630e3ab..f39a4b46f63e 100644 --- a/internal/service/globalaccelerator/wait.go +++ b/internal/service/globalaccelerator/wait.go @@ -1,30 +1,12 @@ package globalaccelerator import ( - "context" "time" "github.com/aws/aws-sdk-go/service/globalaccelerator" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) -func waitAcceleratorDeployed(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string, timeout time.Duration) (*globalaccelerator.Accelerator, error) { //nolint:unparam - stateConf := &resource.StateChangeConf{ - Pending: []string{globalaccelerator.AcceleratorStatusInProgress}, - Target: []string{globalaccelerator.AcceleratorStatusDeployed}, - Refresh: statusAccelerator(ctx, conn, arn), - Timeout: timeout, - } - - outputRaw, err := stateConf.WaitForStateContext(ctx) - - if output, ok := outputRaw.(*globalaccelerator.Accelerator); ok { - return output, err - } - - return nil, err -} - // waitCustomRoutingAcceleratorDeployed waits for a Custom Routing Accelerator to return Deployed func waitCustomRoutingAcceleratorDeployed(conn *globalaccelerator.GlobalAccelerator, arn string, timeout time.Duration) (*globalaccelerator.CustomRoutingAccelerator, error) { //nolint:unparam stateConf := &resource.StateChangeConf{ From e8c8218fd32fb13bacdda49995dc4dc1a870b1ac Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 28 Mar 2023 14:43:14 -0400 Subject: [PATCH 07/38] r/aws_globalaccelerator_listener: Move some functions around. --- internal/service/globalaccelerator/find.go | 29 ------------------- .../service/globalaccelerator/listener.go | 29 +++++++++++++++++++ 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/internal/service/globalaccelerator/find.go b/internal/service/globalaccelerator/find.go index 311d4929ad9d..c0b61f86456e 100644 --- a/internal/service/globalaccelerator/find.go +++ b/internal/service/globalaccelerator/find.go @@ -38,32 +38,3 @@ func FindEndpointGroup(ctx context.Context, conn *globalaccelerator.GlobalAccele return output.EndpointGroup, nil } - -func FindListenerByARN(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.Listener, error) { - input := &globalaccelerator.DescribeListenerInput{ - ListenerArn: aws.String(arn), - } - - return FindListener(ctx, conn, input) -} - -func FindListener(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeListenerInput) (*globalaccelerator.Listener, error) { - output, err := conn.DescribeListenerWithContext(ctx, input) - - if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeListenerNotFoundException) { - return nil, &resource.NotFoundError{ - LastError: err, - LastRequest: input, - } - } - - if err != nil { - return nil, err - } - - if output == nil || output.Listener == nil { - return nil, tfresource.NewEmptyResultError(input) - } - - return output.Listener, nil -} diff --git a/internal/service/globalaccelerator/listener.go b/internal/service/globalaccelerator/listener.go index c24626ea826f..9e873d0e7565 100644 --- a/internal/service/globalaccelerator/listener.go +++ b/internal/service/globalaccelerator/listener.go @@ -184,6 +184,35 @@ func resourceListenerDelete(ctx context.Context, d *schema.ResourceData, meta in return nil } +func FindListenerByARN(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.Listener, error) { + input := &globalaccelerator.DescribeListenerInput{ + ListenerArn: aws.String(arn), + } + + return findListener(ctx, conn, input) +} + +func findListener(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeListenerInput) (*globalaccelerator.Listener, error) { + output, err := conn.DescribeListenerWithContext(ctx, input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeListenerNotFoundException) { + return nil, &resource.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err + } + + if output == nil || output.Listener == nil { + return nil, tfresource.NewEmptyResultError(input) + } + + return output.Listener, nil +} + func expandPortRange(tfMap map[string]interface{}) *globalaccelerator.PortRange { if tfMap == nil { return nil From 6eca2fdb072755641fe7017ecfe20e79dc7b6c36 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 28 Mar 2023 14:45:49 -0400 Subject: [PATCH 08/38] r/aws_globalaccelerator_endpoint_group: Move some functions around. --- .../globalaccelerator/endpoint_group.go | 29 ++++++++++++++ internal/service/globalaccelerator/find.go | 40 ------------------- 2 files changed, 29 insertions(+), 40 deletions(-) delete mode 100644 internal/service/globalaccelerator/find.go diff --git a/internal/service/globalaccelerator/endpoint_group.go b/internal/service/globalaccelerator/endpoint_group.go index 1531c73f97b0..12af5365673d 100644 --- a/internal/service/globalaccelerator/endpoint_group.go +++ b/internal/service/globalaccelerator/endpoint_group.go @@ -332,6 +332,35 @@ func resourceEndpointGroupDelete(ctx context.Context, d *schema.ResourceData, me return nil } +func FindEndpointGroupByARN(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.EndpointGroup, error) { + input := &globalaccelerator.DescribeEndpointGroupInput{ + EndpointGroupArn: aws.String(arn), + } + + return findEndpointGroup(ctx, conn, input) +} + +func findEndpointGroup(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeEndpointGroupInput) (*globalaccelerator.EndpointGroup, error) { + output, err := conn.DescribeEndpointGroupWithContext(ctx, input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeEndpointGroupNotFoundException) { + return nil, &resource.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err + } + + if output == nil || output.EndpointGroup == nil { + return nil, tfresource.NewEmptyResultError(input) + } + + return output.EndpointGroup, nil +} + func expandEndpointConfiguration(tfMap map[string]interface{}) *globalaccelerator.EndpointConfiguration { if tfMap == nil { return nil diff --git a/internal/service/globalaccelerator/find.go b/internal/service/globalaccelerator/find.go deleted file mode 100644 index c0b61f86456e..000000000000 --- a/internal/service/globalaccelerator/find.go +++ /dev/null @@ -1,40 +0,0 @@ -package globalaccelerator - -import ( - "context" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/globalaccelerator" - "github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-provider-aws/internal/tfresource" -) - -func FindEndpointGroupByARN(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.EndpointGroup, error) { - input := &globalaccelerator.DescribeEndpointGroupInput{ - EndpointGroupArn: aws.String(arn), - } - - return FindEndpointGroup(ctx, conn, input) -} - -func FindEndpointGroup(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeEndpointGroupInput) (*globalaccelerator.EndpointGroup, error) { - output, err := conn.DescribeEndpointGroupWithContext(ctx, input) - - if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeEndpointGroupNotFoundException) { - return nil, &resource.NotFoundError{ - LastError: err, - LastRequest: input, - } - } - - if err != nil { - return nil, err - } - - if output == nil || output.EndpointGroup == nil { - return nil, tfresource.NewEmptyResultError(input) - } - - return output.EndpointGroup, nil -} From 426423392afe3a5ebf041b29f330ab0797f0e3e5 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 28 Mar 2023 14:49:46 -0400 Subject: [PATCH 09/38] r/aws_globalaccelerator_custom_routing_accelerator: Move some functions around. --- .../custom_routing_accelerator.go | 91 +++++++++++++++++++ .../globalaccelerator/custom_routing_find.go | 72 --------------- internal/service/globalaccelerator/status.go | 25 ----- internal/service/globalaccelerator/wait.go | 26 ------ 4 files changed, 91 insertions(+), 123 deletions(-) delete mode 100644 internal/service/globalaccelerator/status.go delete mode 100644 internal/service/globalaccelerator/wait.go diff --git a/internal/service/globalaccelerator/custom_routing_accelerator.go b/internal/service/globalaccelerator/custom_routing_accelerator.go index cd5f4c8a4555..cbbb07197d43 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator.go @@ -334,6 +334,97 @@ func resourceCustomRoutingAcceleratorDelete(d *schema.ResourceData, meta interfa return nil } +func FindCustomRoutingAcceleratorByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingAccelerator, error) { + input := &globalaccelerator.DescribeCustomRoutingAcceleratorInput{ + AcceleratorArn: aws.String(arn), + } + + return findCustomRoutingAccelerator(conn, input) +} + +func findCustomRoutingAccelerator(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingAcceleratorInput) (*globalaccelerator.CustomRoutingAccelerator, error) { + output, err := conn.DescribeCustomRoutingAccelerator(input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { + return nil, &resource.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err + } + + if output == nil || output.Accelerator == nil { + return nil, tfresource.NewEmptyResultError(input) + } + + return output.Accelerator, nil +} + +func FindCustomRoutingAcceleratorAttributesByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingAcceleratorAttributes, error) { + input := &globalaccelerator.DescribeCustomRoutingAcceleratorAttributesInput{ + AcceleratorArn: aws.String(arn), + } + + return findCustomRoutingAcceleratorAttributes(conn, input) +} + +func findCustomRoutingAcceleratorAttributes(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingAcceleratorAttributesInput) (*globalaccelerator.CustomRoutingAcceleratorAttributes, error) { + output, err := conn.DescribeCustomRoutingAcceleratorAttributes(input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { + return nil, &resource.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err + } + + if output == nil || output.AcceleratorAttributes == nil { + return nil, tfresource.NewEmptyResultError(input) + } + + return output.AcceleratorAttributes, nil +} + +func statusCustomRoutingAccelerator(conn *globalaccelerator.GlobalAccelerator, arn string) resource.StateRefreshFunc { + return func() (interface{}, string, error) { + accelerator, err := FindCustomRoutingAcceleratorByARN(conn, arn) + + if tfresource.NotFound(err) { + return nil, "", nil + } + + if err != nil { + return nil, "", err + } + + return accelerator, aws.StringValue(accelerator.Status), nil + } +} + +func waitCustomRoutingAcceleratorDeployed(conn *globalaccelerator.GlobalAccelerator, arn string, timeout time.Duration) (*globalaccelerator.CustomRoutingAccelerator, error) { //nolint:unparam + stateConf := &resource.StateChangeConf{ + Pending: []string{globalaccelerator.AcceleratorStatusInProgress}, + Target: []string{globalaccelerator.AcceleratorStatusDeployed}, + Refresh: statusCustomRoutingAccelerator(conn, arn), + Timeout: timeout, + } + + outputRaw, err := stateConf.WaitForState() + + if v, ok := outputRaw.(*globalaccelerator.CustomRoutingAccelerator); ok { + return v, err + } + + return nil, err +} + func expandUpdateCustomRoutingAcceleratorAttributesInput(tfMap map[string]interface{}) *globalaccelerator.UpdateCustomRoutingAcceleratorAttributesInput { return (*globalaccelerator.UpdateCustomRoutingAcceleratorAttributesInput)(expandUpdateAcceleratorAttributesInput(tfMap)) } diff --git a/internal/service/globalaccelerator/custom_routing_find.go b/internal/service/globalaccelerator/custom_routing_find.go index 136a668300a9..3b0e2f048fa5 100644 --- a/internal/service/globalaccelerator/custom_routing_find.go +++ b/internal/service/globalaccelerator/custom_routing_find.go @@ -7,78 +7,6 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) -// FindCustomRoutingAcceleratorByARN returns the custom routing accelerator corresponding to the specified ARN. -// Returns NotFoundError if no custom routing accelerator is found. -func FindCustomRoutingAcceleratorByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingAccelerator, error) { - input := &globalaccelerator.DescribeCustomRoutingAcceleratorInput{ - AcceleratorArn: aws.String(arn), - } - - return FindCustomRoutingAccelerator(conn, input) -} - -// FindCustomRoutingAccelerator returns the custom routing accelerator corresponding to the specified input. -// Returns NotFoundError if no custom routing accelerator is found. -func FindCustomRoutingAccelerator(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingAcceleratorInput) (*globalaccelerator.CustomRoutingAccelerator, error) { - output, err := conn.DescribeCustomRoutingAccelerator(input) - - if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { - return nil, &resource.NotFoundError{ - LastError: err, - LastRequest: input, - } - } - - if err != nil { - return nil, err - } - - if output == nil || output.Accelerator == nil { - return nil, &resource.NotFoundError{ - Message: "Empty result", - LastRequest: input, - } - } - - return output.Accelerator, nil -} - -// FindCustomRoutingAcceleratorAttributesByARN returns the custom routing accelerator attributes corresponding to the specified ARN. -// Returns NotFoundError if no custom routing accelerator is found. -func FindCustomRoutingAcceleratorAttributesByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingAcceleratorAttributes, error) { - input := &globalaccelerator.DescribeCustomRoutingAcceleratorAttributesInput{ - AcceleratorArn: aws.String(arn), - } - - return FindCustomRoutingAcceleratorAttributes(conn, input) -} - -// FindCustomRoutingAcceleratorAttributes returns the custom routing accelerator attributes corresponding to the specified input. -// Returns NotFoundError if no custom routing accelerator is found. -func FindCustomRoutingAcceleratorAttributes(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingAcceleratorAttributesInput) (*globalaccelerator.CustomRoutingAcceleratorAttributes, error) { - output, err := conn.DescribeCustomRoutingAcceleratorAttributes(input) - - if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { - return nil, &resource.NotFoundError{ - LastError: err, - LastRequest: input, - } - } - - if err != nil { - return nil, err - } - - if output == nil || output.AcceleratorAttributes == nil { - return nil, &resource.NotFoundError{ - Message: "Empty result", - LastRequest: input, - } - } - - return output.AcceleratorAttributes, nil -} - // FindCustomRoutingEndpointGroupByARN returns the custom routing endpoint group corresponding to the specified ARN. // Returns NotFoundError if no custom routing endpoint group is found. func FindCustomRoutingEndpointGroupByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingEndpointGroup, error) { diff --git a/internal/service/globalaccelerator/status.go b/internal/service/globalaccelerator/status.go deleted file mode 100644 index 43dad5381de8..000000000000 --- a/internal/service/globalaccelerator/status.go +++ /dev/null @@ -1,25 +0,0 @@ -package globalaccelerator - -import ( - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/globalaccelerator" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-provider-aws/internal/tfresource" -) - -// statusCustomRoutingAccelerator fetches the Custom Routing Accelerator and its Status -func statusCustomRoutingAccelerator(conn *globalaccelerator.GlobalAccelerator, arn string) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - accelerator, err := FindCustomRoutingAcceleratorByARN(conn, arn) - - if tfresource.NotFound(err) { - return nil, "", nil - } - - if err != nil { - return nil, "", err - } - - return accelerator, aws.StringValue(accelerator.Status), nil - } -} diff --git a/internal/service/globalaccelerator/wait.go b/internal/service/globalaccelerator/wait.go deleted file mode 100644 index f39a4b46f63e..000000000000 --- a/internal/service/globalaccelerator/wait.go +++ /dev/null @@ -1,26 +0,0 @@ -package globalaccelerator - -import ( - "time" - - "github.com/aws/aws-sdk-go/service/globalaccelerator" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" -) - -// waitCustomRoutingAcceleratorDeployed waits for a Custom Routing Accelerator to return Deployed -func waitCustomRoutingAcceleratorDeployed(conn *globalaccelerator.GlobalAccelerator, arn string, timeout time.Duration) (*globalaccelerator.CustomRoutingAccelerator, error) { //nolint:unparam - stateConf := &resource.StateChangeConf{ - Pending: []string{globalaccelerator.AcceleratorStatusInProgress}, - Target: []string{globalaccelerator.AcceleratorStatusDeployed}, - Refresh: statusCustomRoutingAccelerator(conn, arn), - Timeout: timeout, - } - - outputRaw, err := stateConf.WaitForState() - - if v, ok := outputRaw.(*globalaccelerator.CustomRoutingAccelerator); ok { - return v, err - } - - return nil, err -} From b8144322cd5e835f2739160f13bbe16a4075a01b Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 28 Mar 2023 15:21:43 -0400 Subject: [PATCH 10/38] r/aws_globalaccelerator_custom_routing_endpoint_group: Move some functions around. --- .../custom_routing_endpoint_group.go | 29 +++++++++++++++ .../globalaccelerator/custom_routing_find.go | 36 ------------------- 2 files changed, 29 insertions(+), 36 deletions(-) diff --git a/internal/service/globalaccelerator/custom_routing_endpoint_group.go b/internal/service/globalaccelerator/custom_routing_endpoint_group.go index b3fbff837006..15bf61a8c9ec 100644 --- a/internal/service/globalaccelerator/custom_routing_endpoint_group.go +++ b/internal/service/globalaccelerator/custom_routing_endpoint_group.go @@ -221,6 +221,35 @@ func resourceCustomRoutingEndpointGroupDelete(d *schema.ResourceData, meta inter return nil } +func FindCustomRoutingEndpointGroupByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingEndpointGroup, error) { + input := &globalaccelerator.DescribeCustomRoutingEndpointGroupInput{ + EndpointGroupArn: aws.String(arn), + } + + return findCustomRoutingEndpointGroup(conn, input) +} + +func findCustomRoutingEndpointGroup(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingEndpointGroupInput) (*globalaccelerator.CustomRoutingEndpointGroup, error) { + output, err := conn.DescribeCustomRoutingEndpointGroup(input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeEndpointGroupNotFoundException) { + return nil, &resource.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err + } + + if output == nil || output.EndpointGroup == nil { + return nil, tfresource.NewEmptyResultError(input) + } + + return output.EndpointGroup, nil +} + func expandCustomRoutingDestinationConfigurations(configurations []interface{}) []*globalaccelerator.CustomRoutingDestinationConfiguration { if len(configurations) == 0 { return nil diff --git a/internal/service/globalaccelerator/custom_routing_find.go b/internal/service/globalaccelerator/custom_routing_find.go index 3b0e2f048fa5..b58a8fb0bac1 100644 --- a/internal/service/globalaccelerator/custom_routing_find.go +++ b/internal/service/globalaccelerator/custom_routing_find.go @@ -7,42 +7,6 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) -// FindCustomRoutingEndpointGroupByARN returns the custom routing endpoint group corresponding to the specified ARN. -// Returns NotFoundError if no custom routing endpoint group is found. -func FindCustomRoutingEndpointGroupByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingEndpointGroup, error) { - input := &globalaccelerator.DescribeCustomRoutingEndpointGroupInput{ - EndpointGroupArn: aws.String(arn), - } - - return FindCustomRoutingEndpointGroup(conn, input) -} - -// FindCustomRoutingEndpointGroup returns the custom routing endpoint group corresponding to the specified input. -// Returns NotFoundError if no custom routing endpoint group is found. -func FindCustomRoutingEndpointGroup(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingEndpointGroupInput) (*globalaccelerator.CustomRoutingEndpointGroup, error) { - output, err := conn.DescribeCustomRoutingEndpointGroup(input) - - if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeEndpointGroupNotFoundException) { - return nil, &resource.NotFoundError{ - LastError: err, - LastRequest: input, - } - } - - if err != nil { - return nil, err - } - - if output == nil || output.EndpointGroup == nil { - return nil, &resource.NotFoundError{ - Message: "Empty result", - LastRequest: input, - } - } - - return output.EndpointGroup, nil -} - // FindCustomRoutingListenerByARN returns the custom routing listener corresponding to the specified ARN. // Returns NotFoundError if no custom routing listener is found. func FindCustomRoutingListenerByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingListener, error) { From 824a24b5194ebaff65b3ca9282810d48eb1e7fb8 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 28 Mar 2023 15:23:29 -0400 Subject: [PATCH 11/38] r/aws_globalaccelerator_custom_routing_listener: Move some functions around. --- .../globalaccelerator/custom_routing_find.go | 44 ------------------- .../custom_routing_listener.go | 29 ++++++++++++ 2 files changed, 29 insertions(+), 44 deletions(-) delete mode 100644 internal/service/globalaccelerator/custom_routing_find.go diff --git a/internal/service/globalaccelerator/custom_routing_find.go b/internal/service/globalaccelerator/custom_routing_find.go deleted file mode 100644 index b58a8fb0bac1..000000000000 --- a/internal/service/globalaccelerator/custom_routing_find.go +++ /dev/null @@ -1,44 +0,0 @@ -package globalaccelerator - -import ( - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/globalaccelerator" - "github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" -) - -// FindCustomRoutingListenerByARN returns the custom routing listener corresponding to the specified ARN. -// Returns NotFoundError if no custom routing listener is found. -func FindCustomRoutingListenerByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingListener, error) { - input := &globalaccelerator.DescribeCustomRoutingListenerInput{ - ListenerArn: aws.String(arn), - } - - return FindCustomRoutingListener(conn, input) -} - -// FindCustomRoutingListener returns the custom routing listener corresponding to the specified input. -// Returns NotFoundError if no custom routing listener is found. -func FindCustomRoutingListener(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingListenerInput) (*globalaccelerator.CustomRoutingListener, error) { - output, err := conn.DescribeCustomRoutingListener(input) - - if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeListenerNotFoundException) { - return nil, &resource.NotFoundError{ - LastError: err, - LastRequest: input, - } - } - - if err != nil { - return nil, err - } - - if output == nil || output.Listener == nil { - return nil, &resource.NotFoundError{ - Message: "Empty result", - LastRequest: input, - } - } - - return output.Listener, nil -} diff --git a/internal/service/globalaccelerator/custom_routing_listener.go b/internal/service/globalaccelerator/custom_routing_listener.go index 2432e5255af1..8e6d90bc9c97 100644 --- a/internal/service/globalaccelerator/custom_routing_listener.go +++ b/internal/service/globalaccelerator/custom_routing_listener.go @@ -167,3 +167,32 @@ func resourceCustomRoutingListenerDelete(d *schema.ResourceData, meta interface{ return nil } + +func FindCustomRoutingListenerByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingListener, error) { + input := &globalaccelerator.DescribeCustomRoutingListenerInput{ + ListenerArn: aws.String(arn), + } + + return findCustomRoutingListener(conn, input) +} + +func findCustomRoutingListener(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingListenerInput) (*globalaccelerator.CustomRoutingListener, error) { + output, err := conn.DescribeCustomRoutingListener(input) + + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeListenerNotFoundException) { + return nil, &resource.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err + } + + if output == nil || output.Listener == nil { + return nil, tfresource.NewEmptyResultError(input) + } + + return output.Listener, nil +} From ffc9c35d7ab9c90729c5fc10dba7017eb1d2bf3e Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 28 Mar 2023 15:28:38 -0400 Subject: [PATCH 12/38] r/aws_globalaccelerator_custom_routing_accelerator: Alphabetize attributes. --- .../custom_routing_accelerator.go | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/internal/service/globalaccelerator/custom_routing_accelerator.go b/internal/service/globalaccelerator/custom_routing_accelerator.go index cbbb07197d43..a1bb87fca210 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator.go @@ -26,6 +26,7 @@ func ResourceCustomRoutingAccelerator() *schema.Resource { Read: resourceCustomRoutingAcceleratorRead, Update: resourceCustomRoutingAcceleratorUpdate, Delete: resourceCustomRoutingAcceleratorDelete, + Importer: &schema.ResourceImporter{ State: schema.ImportStatePassthrough, }, @@ -61,35 +62,25 @@ func ResourceCustomRoutingAccelerator() *schema.Resource { }, }, }, - "name": { + "dns_name": { Type: schema.TypeString, - Required: true, - ValidateFunc: validation.All( - validation.StringLenBetween(1, 255), - validation.StringMatch(regexp.MustCompile(`^[0-9A-Za-z-]+$`), "only alphanumeric characters and hyphens are allowed"), - validation.StringDoesNotMatch(regexp.MustCompile(`^-`), "cannot start with a hyphen"), - validation.StringDoesNotMatch(regexp.MustCompile(`-$`), "cannot end with a hyphen"), - ), - }, - "ip_address_type": { - Type: schema.TypeString, - Optional: true, - Default: globalaccelerator.IpAddressTypeIpv4, - ValidateFunc: validation.StringInSlice(globalaccelerator.IpAddressType_Values(), false), + Computed: true, }, "enabled": { Type: schema.TypeBool, Optional: true, Default: true, }, - "dns_name": { - Type: schema.TypeString, - Computed: true, - }, "hosted_zone_id": { Type: schema.TypeString, Computed: true, }, + "ip_address_type": { + Type: schema.TypeString, + Optional: true, + Default: globalaccelerator.IpAddressTypeIpv4, + ValidateFunc: validation.StringInSlice(globalaccelerator.IpAddressType_Values(), false), + }, "ip_sets": { Type: schema.TypeList, Computed: true, @@ -107,8 +98,17 @@ func ResourceCustomRoutingAccelerator() *schema.Resource { }, }, }, - "tags": tftags.TagsSchema(), - + "name": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.All( + validation.StringLenBetween(1, 255), + validation.StringMatch(regexp.MustCompile(`^[0-9A-Za-z-]+$`), "only alphanumeric characters and hyphens are allowed"), + validation.StringDoesNotMatch(regexp.MustCompile(`^-`), "cannot start with a hyphen"), + validation.StringDoesNotMatch(regexp.MustCompile(`-$`), "cannot end with a hyphen"), + ), + }, + "tags": tftags.TagsSchema(), "tags_all": tftags.TagsSchemaComputed(), }, From f84b0e9402bb9f37ea09903a6438b1959f4f1856 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 28 Mar 2023 16:13:38 -0400 Subject: [PATCH 13/38] d/aws_globalaccelerator_custom_routing_accelerator: Alphabetize attributes. --- .../custom_routing_accelerator_data_source.go | 49 +++++++++---------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go b/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go index 2703d178f875..9506def1c921 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go @@ -22,12 +22,27 @@ func DataSourceCustomRoutingAccelerator() *schema.Resource { Optional: true, Computed: true, }, - "name": { - Type: schema.TypeString, - Optional: true, + "attributes": { + Type: schema.TypeList, Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "flow_logs_enabled": { + Type: schema.TypeBool, + Computed: true, + }, + "flow_logs_s3_bucket": { + Type: schema.TypeString, + Computed: true, + }, + "flow_logs_s3_prefix": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, }, - "ip_address_type": { + "dns_name": { Type: schema.TypeString, Computed: true, }, @@ -35,11 +50,11 @@ func DataSourceCustomRoutingAccelerator() *schema.Resource { Type: schema.TypeBool, Computed: true, }, - "dns_name": { + "hosted_zone_id": { Type: schema.TypeString, Computed: true, }, - "hosted_zone_id": { + "ip_address_type": { Type: schema.TypeString, Computed: true, }, @@ -60,27 +75,11 @@ func DataSourceCustomRoutingAccelerator() *schema.Resource { }, }, }, - "attributes": { - Type: schema.TypeList, + "name": { + Type: schema.TypeString, + Optional: true, Computed: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "flow_logs_enabled": { - Type: schema.TypeBool, - Computed: true, - }, - "flow_logs_s3_bucket": { - Type: schema.TypeString, - Computed: true, - }, - "flow_logs_s3_prefix": { - Type: schema.TypeString, - Computed: true, - }, - }, - }, }, - "tags": tftags.TagsSchemaComputed(), }, } From 18605e4653325e02ac9ad52682d57b0482300d39 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 28 Mar 2023 16:30:36 -0400 Subject: [PATCH 14/38] r/aws_globalaccelerator_custom_routing_accelerator: Context. --- .../custom_routing_accelerator.go | 197 +++++++++--------- .../custom_routing_accelerator_data_source.go | 39 ++-- ...om_routing_accelerator_data_source_test.go | 16 +- .../custom_routing_accelerator_test.go | 51 ++--- .../custom_routing_endpoint_group.go | 7 +- .../custom_routing_endpoint_group_test.go | 43 ++-- .../custom_routing_listener.go | 7 +- .../custom_routing_listener_test.go | 34 +-- 8 files changed, 203 insertions(+), 191 deletions(-) diff --git a/internal/service/globalaccelerator/custom_routing_accelerator.go b/internal/service/globalaccelerator/custom_routing_accelerator.go index a1bb87fca210..01b2a6825d49 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator.go @@ -2,7 +2,6 @@ package globalaccelerator import ( "context" - "fmt" "log" "regexp" "time" @@ -10,10 +9,12 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/globalaccelerator" "github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag" tftags "github.com/hashicorp/terraform-provider-aws/internal/tags" "github.com/hashicorp/terraform-provider-aws/internal/tfresource" "github.com/hashicorp/terraform-provider-aws/internal/verify" @@ -22,13 +23,13 @@ import ( // @SDKResource("aws_globalaccelerator_custom_routing_accelerator") func ResourceCustomRoutingAccelerator() *schema.Resource { return &schema.Resource{ - Create: resourceCustomRoutingAcceleratorCreate, - Read: resourceCustomRoutingAcceleratorRead, - Update: resourceCustomRoutingAcceleratorUpdate, - Delete: resourceCustomRoutingAcceleratorDelete, + CreateWithoutTimeout: resourceCustomRoutingAcceleratorCreate, + ReadWithoutTimeout: resourceCustomRoutingAcceleratorRead, + UpdateWithoutTimeout: resourceCustomRoutingAcceleratorUpdate, + DeleteWithoutTimeout: resourceCustomRoutingAcceleratorDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ @@ -116,7 +117,8 @@ func ResourceCustomRoutingAccelerator() *schema.Resource { } } -func resourceCustomRoutingAcceleratorCreate(d *schema.ResourceData, meta interface{}) error { +func resourceCustomRoutingAcceleratorCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var diags diag.Diagnostics conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig tags := defaultTagsConfig.MergeTags(tftags.New(context.TODO(), d.Get("tags").(map[string]interface{}))) @@ -133,93 +135,93 @@ func resourceCustomRoutingAcceleratorCreate(d *schema.ResourceData, meta interfa input.IpAddressType = aws.String(v.(string)) } - log.Printf("[DEBUG] Creating Global Accelerator Custom Routing Accelerator: %s", input) - output, err := conn.CreateCustomRoutingAccelerator(input) + output, err := conn.CreateCustomRoutingAcceleratorWithContext(ctx, input) if err != nil { - return fmt.Errorf("error creating Global Accelerator Custom Routing Accelerator (%s): %w", name, err) + return sdkdiag.AppendErrorf(diags, "creating Global Accelerator Custom Routing Accelerator (%s): %s", name, err) } d.SetId(aws.StringValue(output.Accelerator.AcceleratorArn)) - if _, err := waitCustomRoutingAcceleratorDeployed(conn, d.Id(), d.Timeout(schema.TimeoutCreate)); err != nil { - return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", d.Id(), err) + if _, err := waitCustomRoutingAcceleratorDeployed(ctx, conn, d.Id(), d.Timeout(schema.TimeoutCreate)); err != nil { + return sdkdiag.AppendErrorf(diags, "waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %s", d.Id(), err) } if v, ok := d.GetOk("attributes"); ok && len(v.([]interface{})) > 0 && v.([]interface{})[0] != nil { input := expandUpdateAcceleratorAttributesInput(v.([]interface{})[0].(map[string]interface{})) input.AcceleratorArn = aws.String(d.Id()) - log.Printf("[DEBUG] Updating Global Accelerator Accelerator attributes: %s", input) - if _, err := conn.UpdateAcceleratorAttributes(input); err != nil { - return fmt.Errorf("error updating Global Accelerator Accelerator (%s) attributes: %w", d.Id(), err) + if _, err := conn.UpdateAcceleratorAttributesWithContext(ctx, input); err != nil { + return sdkdiag.AppendErrorf(diags, "updating Global Accelerator Custom Routing Accelerator (%s) attributes: %s", d.Id(), err) } - if _, err := waitCustomRoutingAcceleratorDeployed(conn, d.Id(), d.Timeout(schema.TimeoutCreate)); err != nil { - return fmt.Errorf("error waiting for Global Accelerator Accelerator (%s) deployment: %w", d.Id(), err) + if _, err := waitCustomRoutingAcceleratorDeployed(ctx, conn, d.Id(), d.Timeout(schema.TimeoutCreate)); err != nil { + return sdkdiag.AppendErrorf(diags, "waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %s", d.Id(), err) } } - return resourceCustomRoutingAcceleratorRead(d, meta) + return append(diags, resourceCustomRoutingAcceleratorRead(ctx, d, meta)...) } -func resourceCustomRoutingAcceleratorRead(d *schema.ResourceData, meta interface{}) error { +func resourceCustomRoutingAcceleratorRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var diags diag.Diagnostics conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig - accelerator, err := FindCustomRoutingAcceleratorByARN(conn, d.Id()) + accelerator, err := FindCustomRoutingAcceleratorByARN(ctx, conn, d.Id()) if !d.IsNewResource() && tfresource.NotFound(err) { log.Printf("[WARN] Global Accelerator Custom Routing Accelerator (%s) not found, removing from state", d.Id()) d.SetId("") - return nil + return diags } if err != nil { - return fmt.Errorf("error reading Global Accelerator Custom Routing Accelerator (%s): %w", d.Id(), err) + return sdkdiag.AppendErrorf(diags, "reading Global Accelerator Custom Routing Accelerator (%s): %s", d.Id(), err) } - d.Set("enabled", accelerator.Enabled) d.Set("dns_name", accelerator.DnsName) + d.Set("enabled", accelerator.Enabled) d.Set("hosted_zone_id", route53ZoneID) - d.Set("name", accelerator.Name) d.Set("ip_address_type", accelerator.IpAddressType) - if err := d.Set("ip_sets", flattenIPSets(accelerator.IpSets)); err != nil { - return fmt.Errorf("error setting ip_sets: %w", err) + return sdkdiag.AppendErrorf(diags, "setting ip_sets: %s", err) } + d.Set("name", accelerator.Name) - acceleratorAttributes, err := FindCustomRoutingAcceleratorAttributesByARN(conn, d.Id()) + acceleratorAttributes, err := FindCustomRoutingAcceleratorAttributesByARN(ctx, conn, d.Id()) if err != nil { - return fmt.Errorf("error reading Global Accelerator Custom Routing Accelerator (%s) attributes: %w", d.Id(), err) + return sdkdiag.AppendErrorf(diags, "reading Global Accelerator Custom Routing Accelerator (%s) attributes: %s", d.Id(), err) } if err := d.Set("attributes", []interface{}{flattenCustomRoutingAcceleratorAttributes(acceleratorAttributes)}); err != nil { - return fmt.Errorf("error setting attributes: %w", err) + return sdkdiag.AppendErrorf(diags, "setting attributes: %s", err) } - tags, err := ListTags(context.TODO(), conn, d.Id()) + tags, err := ListTags(ctx, conn, d.Id()) + if err != nil { - return fmt.Errorf("error listing tags for Global Accelerator Custom Routing Accelerator (%s): %w", d.Id(), err) + return sdkdiag.AppendErrorf(diags, "listing tags for Global Accelerator Custom Routing Accelerator (%s): %s", d.Id(), err) } tags = tags.IgnoreAWS().IgnoreConfig(ignoreTagsConfig) //lintignore:AWSR002 if err := d.Set("tags", tags.RemoveDefaultConfig(defaultTagsConfig).Map()); err != nil { - return fmt.Errorf("error setting tags: %w", err) + return sdkdiag.AppendErrorf(diags, "setting tags: %s", err) } if err := d.Set("tags_all", tags.Map()); err != nil { - return fmt.Errorf("error setting tags_all: %w", err) + return sdkdiag.AppendErrorf(diags, "setting tags_all: %s", err) } - return nil + return diags } -func resourceCustomRoutingAcceleratorUpdate(d *schema.ResourceData, meta interface{}) error { +func resourceCustomRoutingAcceleratorUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var diags diag.Diagnostics conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() if d.HasChanges("name", "ip_address_type", "enabled") { @@ -233,13 +235,14 @@ func resourceCustomRoutingAcceleratorUpdate(d *schema.ResourceData, meta interfa input.IpAddressType = aws.String(v.(string)) } - log.Printf("[DEBUG] Updating Global Accelerator Custom Routing Accelerator: %s", input) - if _, err := conn.UpdateCustomRoutingAccelerator(input); err != nil { - return fmt.Errorf("error updating Global Accelerator Custom Routing Accelerator (%s): %w", d.Id(), err) + _, err := conn.UpdateCustomRoutingAcceleratorWithContext(ctx, input) + + if err != nil { + return sdkdiag.AppendErrorf(diags, "updating Global Accelerator Custom Routing Accelerator (%s): %s", d.Id(), err) } - if _, err := waitCustomRoutingAcceleratorDeployed(conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil { - return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", d.Id(), err) + if _, err := waitCustomRoutingAcceleratorDeployed(ctx, conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil { + return sdkdiag.AppendErrorf(diags, "waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %s", d.Id(), err) } } @@ -256,23 +259,25 @@ func resourceCustomRoutingAcceleratorUpdate(d *schema.ResourceData, meta interfa if aws.BoolValue(oInput.FlowLogsEnabled) && aws.BoolValue(nInput.FlowLogsEnabled) { oInput.FlowLogsEnabled = aws.Bool(false) - log.Printf("[DEBUG] Updating Global Accelerator Custom Routing Accelerator attributes: %s", oInput) - if _, err := conn.UpdateCustomRoutingAcceleratorAttributes(oInput); err != nil { - return fmt.Errorf("error updating Global Accelerator Custom Routing Accelerator (%s) attributes: %w", d.Id(), err) + _, err := conn.UpdateCustomRoutingAcceleratorAttributesWithContext(ctx, oInput) + + if err != nil { + return sdkdiag.AppendErrorf(diags, "updating Global Accelerator Custom Routing Accelerator (%s) attributes: %s", d.Id(), err) } - if _, err := waitCustomRoutingAcceleratorDeployed(conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil { - return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", d.Id(), err) + if _, err := waitCustomRoutingAcceleratorDeployed(ctx, conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil { + return sdkdiag.AppendErrorf(diags, "waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %s", d.Id(), err) } } - log.Printf("[DEBUG] Updating Global Accelerator Accelerator attributes: %s", nInput) - if _, err := conn.UpdateCustomRoutingAcceleratorAttributes(nInput); err != nil { - return fmt.Errorf("error updating Global Accelerator Custom Routing Accelerator (%s) attributes: %w", d.Id(), err) + _, err := conn.UpdateCustomRoutingAcceleratorAttributesWithContext(ctx, nInput) + + if err != nil { + return sdkdiag.AppendErrorf(diags, "updating Global Accelerator Custom Routing Accelerator (%s) attributes: %s", d.Id(), err) } - if _, err := waitCustomRoutingAcceleratorDeployed(conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil { - return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", d.Id(), err) + if _, err := waitCustomRoutingAcceleratorDeployed(ctx, conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil { + return sdkdiag.AppendErrorf(diags, "waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %s", d.Id(), err) } } } @@ -281,69 +286,63 @@ func resourceCustomRoutingAcceleratorUpdate(d *schema.ResourceData, meta interfa if d.HasChange("tags_all") { o, n := d.GetChange("tags_all") - if err := UpdateTags(context.TODO(), conn, d.Id(), o, n); err != nil { - return fmt.Errorf("error updating Global Accelerator Custom Routing Accelerator (%s) tags: %w", d.Id(), err) + if err := UpdateTags(ctx, conn, d.Id(), o, n); err != nil { + return sdkdiag.AppendErrorf(diags, "updating Global Accelerator Custom Routing Accelerator (%s) tags: %s", d.Id(), err) } } - return resourceCustomRoutingAcceleratorRead(d, meta) + return append(diags, resourceCustomRoutingAcceleratorRead(ctx, d, meta)...) } -func resourceCustomRoutingAcceleratorDelete(d *schema.ResourceData, meta interface{}) error { +func resourceCustomRoutingAcceleratorDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var diags diag.Diagnostics conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() - { - input := &globalaccelerator.UpdateCustomRoutingAcceleratorInput{ - AcceleratorArn: aws.String(d.Id()), - Enabled: aws.Bool(false), - } - - log.Printf("[DEBUG] Updating Global Accelerator Custom Routing Accelerator: %s", input) - _, err := conn.UpdateCustomRoutingAccelerator(input) + input := &globalaccelerator.UpdateCustomRoutingAcceleratorInput{ + AcceleratorArn: aws.String(d.Id()), + Enabled: aws.Bool(false), + } - if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { - return nil - } + _, err := conn.UpdateCustomRoutingAcceleratorWithContext(ctx, input) - if err != nil { - return fmt.Errorf("error disabling Global Accelerator Custom Routing Accelerator (%s): %w", d.Id(), err) - } + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { + return nil + } - if _, err := waitCustomRoutingAcceleratorDeployed(conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil { - return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", d.Id(), err) - } + if err != nil { + return sdkdiag.AppendErrorf(diags, "disabling Global Accelerator Custom Routing Accelerator (%s): %s", d.Id(), err) } - { - input := &globalaccelerator.DeleteCustomRoutingAcceleratorInput{ - AcceleratorArn: aws.String(d.Id()), - } + if _, err := waitCustomRoutingAcceleratorDeployed(ctx, conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil { + return sdkdiag.AppendErrorf(diags, "waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %s", d.Id(), err) + } - log.Printf("[DEBUG] Deleting Global Accelerator Custom Routing Accelerator (%s)", d.Id()) - _, err := conn.DeleteCustomRoutingAccelerator(input) + log.Printf("[DEBUG] Deleting Global Accelerator Custom Routing Accelerator (%s)", d.Id()) + _, err = conn.DeleteCustomRoutingAcceleratorWithContext(ctx, &globalaccelerator.DeleteCustomRoutingAcceleratorInput{ + AcceleratorArn: aws.String(d.Id()), + }) - if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { - return nil - } + if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { + return nil + } - if err != nil { - return fmt.Errorf("error deleting Global Accelerator Custom Routing Accelerator (%s): %w", d.Id(), err) - } + if err != nil { + return sdkdiag.AppendErrorf(diags, "deleting Global Accelerator Custom Routing Accelerator (%s): %s", d.Id(), err) } - return nil + return diags } -func FindCustomRoutingAcceleratorByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingAccelerator, error) { +func FindCustomRoutingAcceleratorByARN(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingAccelerator, error) { input := &globalaccelerator.DescribeCustomRoutingAcceleratorInput{ AcceleratorArn: aws.String(arn), } - return findCustomRoutingAccelerator(conn, input) + return findCustomRoutingAccelerator(ctx, conn, input) } -func findCustomRoutingAccelerator(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingAcceleratorInput) (*globalaccelerator.CustomRoutingAccelerator, error) { - output, err := conn.DescribeCustomRoutingAccelerator(input) +func findCustomRoutingAccelerator(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingAcceleratorInput) (*globalaccelerator.CustomRoutingAccelerator, error) { + output, err := conn.DescribeCustomRoutingAcceleratorWithContext(ctx, input) if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { return nil, &resource.NotFoundError{ @@ -363,16 +362,16 @@ func findCustomRoutingAccelerator(conn *globalaccelerator.GlobalAccelerator, inp return output.Accelerator, nil } -func FindCustomRoutingAcceleratorAttributesByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingAcceleratorAttributes, error) { +func FindCustomRoutingAcceleratorAttributesByARN(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingAcceleratorAttributes, error) { input := &globalaccelerator.DescribeCustomRoutingAcceleratorAttributesInput{ AcceleratorArn: aws.String(arn), } - return findCustomRoutingAcceleratorAttributes(conn, input) + return findCustomRoutingAcceleratorAttributes(ctx, conn, input) } -func findCustomRoutingAcceleratorAttributes(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingAcceleratorAttributesInput) (*globalaccelerator.CustomRoutingAcceleratorAttributes, error) { - output, err := conn.DescribeCustomRoutingAcceleratorAttributes(input) +func findCustomRoutingAcceleratorAttributes(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingAcceleratorAttributesInput) (*globalaccelerator.CustomRoutingAcceleratorAttributes, error) { + output, err := conn.DescribeCustomRoutingAcceleratorAttributesWithContext(ctx, input) if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) { return nil, &resource.NotFoundError{ @@ -392,9 +391,9 @@ func findCustomRoutingAcceleratorAttributes(conn *globalaccelerator.GlobalAccele return output.AcceleratorAttributes, nil } -func statusCustomRoutingAccelerator(conn *globalaccelerator.GlobalAccelerator, arn string) resource.StateRefreshFunc { +func statusCustomRoutingAccelerator(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) resource.StateRefreshFunc { return func() (interface{}, string, error) { - accelerator, err := FindCustomRoutingAcceleratorByARN(conn, arn) + accelerator, err := FindCustomRoutingAcceleratorByARN(ctx, conn, arn) if tfresource.NotFound(err) { return nil, "", nil @@ -408,18 +407,18 @@ func statusCustomRoutingAccelerator(conn *globalaccelerator.GlobalAccelerator, a } } -func waitCustomRoutingAcceleratorDeployed(conn *globalaccelerator.GlobalAccelerator, arn string, timeout time.Duration) (*globalaccelerator.CustomRoutingAccelerator, error) { //nolint:unparam +func waitCustomRoutingAcceleratorDeployed(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string, timeout time.Duration) (*globalaccelerator.CustomRoutingAccelerator, error) { //nolint:unparam stateConf := &resource.StateChangeConf{ Pending: []string{globalaccelerator.AcceleratorStatusInProgress}, Target: []string{globalaccelerator.AcceleratorStatusDeployed}, - Refresh: statusCustomRoutingAccelerator(conn, arn), + Refresh: statusCustomRoutingAccelerator(ctx, conn, arn), Timeout: timeout, } - outputRaw, err := stateConf.WaitForState() + outputRaw, err := stateConf.WaitForStateContext(ctx) - if v, ok := outputRaw.(*globalaccelerator.CustomRoutingAccelerator); ok { - return v, err + if output, ok := outputRaw.(*globalaccelerator.CustomRoutingAccelerator); ok { + return output, err } return nil, err diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go b/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go index 9506def1c921..38dc256e3233 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go @@ -2,19 +2,20 @@ package globalaccelerator import ( "context" - "fmt" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/globalaccelerator" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag" tftags "github.com/hashicorp/terraform-provider-aws/internal/tags" ) // @SDKDataSource("aws_globalaccelerator_custom_routing_accelerator") func DataSourceCustomRoutingAccelerator() *schema.Resource { return &schema.Resource{ - Read: dataSourceCustomRoutingAcceleratorRead, + ReadWithoutTimeout: dataSourceCustomRoutingAcceleratorRead, Schema: map[string]*schema.Schema{ "arn": { @@ -85,7 +86,8 @@ func DataSourceCustomRoutingAccelerator() *schema.Resource { } } -func dataSourceCustomRoutingAcceleratorRead(d *schema.ResourceData, meta interface{}) error { +func dataSourceCustomRoutingAcceleratorRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var diags diag.Diagnostics conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig @@ -116,39 +118,44 @@ func dataSourceCustomRoutingAcceleratorRead(d *schema.ResourceData, meta interfa }) if err != nil { - return fmt.Errorf("error reading AWS Global Custom ROuting Accelerator: %w", err) + return sdkdiag.AppendErrorf(diags, "listing Global Accelerator Custom Routing Accelerators: %s", err) } - if len(results) != 1 { - return fmt.Errorf("Search returned %d results, please revise so only one is returned", len(results)) + if count := len(results); count != 1 { + return sdkdiag.AppendErrorf(diags, "search returned %d results, please revise so only one is returned", count) } accelerator := results[0] d.SetId(aws.StringValue(accelerator.AcceleratorArn)) d.Set("arn", accelerator.AcceleratorArn) - d.Set("enabled", accelerator.Enabled) d.Set("dns_name", accelerator.DnsName) + d.Set("enabled", accelerator.Enabled) d.Set("hosted_zone_id", route53ZoneID) - d.Set("name", accelerator.Name) d.Set("ip_address_type", accelerator.IpAddressType) - d.Set("ip_sets", flattenIPSets(accelerator.IpSets)) + if err := d.Set("ip_sets", flattenIPSets(accelerator.IpSets)); err != nil { + return sdkdiag.AppendErrorf(diags, "setting ip_sets: %s", err) + } + d.Set("name", accelerator.Name) + + acceleratorAttributes, err := FindCustomRoutingAcceleratorAttributesByARN(ctx, conn, d.Id()) - acceleratorAttributes, err := FindCustomRoutingAcceleratorAttributesByARN(conn, d.Id()) if err != nil { - return fmt.Errorf("error reading Global Accelerator Custom Routing Accelerator (%s) attributes: %w", d.Id(), err) + return sdkdiag.AppendErrorf(diags, "reading Global Accelerator Custom Routing Accelerator (%s) attributes: %s", d.Id(), err) } if err := d.Set("attributes", []interface{}{flattenCustomRoutingAcceleratorAttributes(acceleratorAttributes)}); err != nil { - return fmt.Errorf("error setting attributes: %w", err) + return sdkdiag.AppendErrorf(diags, "setting attributes: %s", err) } - tags, err := ListTags(context.TODO(), conn, d.Id()) + tags, err := ListTags(ctx, conn, d.Id()) + if err != nil { - return fmt.Errorf("error listing tags for Global Accelerator Custom Routing Accelerator (%s): %w", d.Id(), err) + return sdkdiag.AppendErrorf(diags, "listing tags for Global Accelerator Custom Routing Accelerator (%s): %s", d.Id(), err) } if err := d.Set("tags", tags.IgnoreAWS().IgnoreConfig(ignoreTagsConfig).Map()); err != nil { - return fmt.Errorf("error setting tags: %w", err) + return sdkdiag.AppendErrorf(diags, "setting tags: %s", err) } - return nil + + return diags } diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go b/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go index 10b11506fd29..b27034c231eb 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go @@ -19,10 +19,9 @@ func TestAccGlobalAcceleratorCustomRoutingAcceleratorDataSource_basic(t *testing PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) }, ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, - CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, Steps: []resource.TestStep{ { - Config: testAccGlobalAcceleratorCustomRoutingAcceleratorDataSourceConfig(resourceName), + Config: testAccCustomRoutingAcceleratorDataSourceConfig_basic(resourceName), Check: resource.ComposeAggregateTestCheckFunc( resource.TestCheckResourceAttrPair(dataSourceName, "name", resourceName, "name"), resource.TestCheckResourceAttrPair(dataSourceName, "enabled", resourceName, "enabled"), @@ -49,19 +48,18 @@ func TestAccGlobalAcceleratorCustomRoutingAcceleratorDataSource_basic(t *testing } -func testAccGlobalAcceleratorCustomRoutingAcceleratorDataSourceConfig(rName string) string { +func testAccCustomRoutingAcceleratorDataSourceConfig_basic(rName string) string { return fmt.Sprintf(` resource "aws_globalaccelerator_custom_routing_accelerator" "test" { name = %[1]q } - data "aws_globalaccelerator_custom_routing_accelerator" "test_by_arn" { - arn = aws_globalaccelerator_custom_routing_accelerator.test.id - } + arn = aws_globalaccelerator_custom_routing_accelerator.test.id +} - data "aws_globalaccelerator_custom_routing_accelerator" "test_by_name" { - name = aws_globalaccelerator_custom_routing_accelerator.test.name - } +data "aws_globalaccelerator_custom_routing_accelerator" "test_by_name" { + name = aws_globalaccelerator_custom_routing_accelerator.test.name +} `, rName) } diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_test.go b/internal/service/globalaccelerator/custom_routing_accelerator_test.go index 7a8fe7fa1a75..4c30d8f84d5a 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_test.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_test.go @@ -1,6 +1,7 @@ package globalaccelerator_test import ( + "context" "fmt" "regexp" "testing" @@ -26,12 +27,12 @@ func TestAccGlobalAcceleratorCustomRoutingAccelerator_basic(t *testing.T) { PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) }, ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, - CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, + CheckDestroy: testAccCheckCustomRoutingAcceleratorDestroy(ctx), Steps: []resource.TestStep{ { - Config: testAccGlobalAcceleratorCustomRoutingAcceleratorConfig(rName), + Config: testAccCustomRoutingAcceleratorConfig_basic(rName), Check: resource.ComposeTestCheckFunc( - testAccCheckGlobalAcceleratorCustomRoutingAcceleratorExists(resourceName), + testAccCheckCustomRoutingAcceleratorExists(ctx, resourceName), resource.TestMatchResourceAttr(resourceName, "dns_name", dnsNameRegex), resource.TestCheckResourceAttr(resourceName, "enabled", "true"), resource.TestCheckResourceAttr(resourceName, "hosted_zone_id", "Z2BJ6XQ5FK7U4H"), @@ -53,7 +54,7 @@ func TestAccGlobalAcceleratorCustomRoutingAccelerator_basic(t *testing.T) { }) } -func testAccGlobalAcceleratorCustomRoutingAcceleratorConfig(rName string) string { +func testAccCustomRoutingAcceleratorConfig_basic(rName string) string { return fmt.Sprintf(` resource "aws_globalaccelerator_custom_routing_accelerator" "test" { name = %[1]q @@ -61,20 +62,20 @@ resource "aws_globalaccelerator_custom_routing_accelerator" "test" { `, rName) } -func testAccCheckGlobalAcceleratorCustomRoutingAcceleratorExists(name string) resource.TestCheckFunc { +func testAccCheckCustomRoutingAcceleratorExists(ctx context.Context, n string) resource.TestCheckFunc { return func(s *terraform.State) error { conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn() - rs, ok := s.RootModule().Resources[name] + rs, ok := s.RootModule().Resources[n] if !ok { - return fmt.Errorf("Not found: %s", name) + return fmt.Errorf("Not found: %s", n) } if rs.Primary.ID == "" { - return fmt.Errorf("No ID is set") + return fmt.Errorf("No Global Accelerator Custom Routing Accelerator ID is set") } - _, err := tfglobalaccelerator.FindCustomRoutingAcceleratorByARN(conn, rs.Primary.ID) + _, err := tfglobalaccelerator.FindCustomRoutingAcceleratorByARN(ctx, conn, rs.Primary.ID) if err != nil { return err @@ -84,25 +85,27 @@ func testAccCheckGlobalAcceleratorCustomRoutingAcceleratorExists(name string) re } } -func testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy(s *terraform.State) error { - conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn() +func testAccCheckCustomRoutingAcceleratorDestroy(ctx context.Context) resource.TestCheckFunc { + return func(s *terraform.State) error { + conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn() - for _, rs := range s.RootModule().Resources { - if rs.Type != "aws_globalaccelerator_custom_routing_accelerator" { - continue - } + for _, rs := range s.RootModule().Resources { + if rs.Type != "aws_globalaccelerator_custom_routing_accelerator" { + continue + } - _, err := tfglobalaccelerator.FindCustomRoutingAcceleratorByARN(conn, rs.Primary.ID) + _, err := tfglobalaccelerator.FindCustomRoutingAcceleratorByARN(ctx, conn, rs.Primary.ID) - if tfresource.NotFound(err) { - continue - } + if tfresource.NotFound(err) { + continue + } - if err != nil { - return err - } + if err != nil { + return err + } - return fmt.Errorf("Global Accelerator Accelerator %s still exists", rs.Primary.ID) + return fmt.Errorf("Global Accelerator Custom Routing Accelerator %s still exists", rs.Primary.ID) + } + return nil } - return nil } diff --git a/internal/service/globalaccelerator/custom_routing_endpoint_group.go b/internal/service/globalaccelerator/custom_routing_endpoint_group.go index 15bf61a8c9ec..7e241705ad0a 100644 --- a/internal/service/globalaccelerator/custom_routing_endpoint_group.go +++ b/internal/service/globalaccelerator/custom_routing_endpoint_group.go @@ -1,6 +1,7 @@ package globalaccelerator import ( + "context" "fmt" "log" "time" @@ -133,7 +134,7 @@ func resourceCustomRoutingEndpointGroupCreate(d *schema.ResourceData, meta inter return err } - if _, err := waitCustomRoutingAcceleratorDeployed(conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { + if _, err := waitCustomRoutingAcceleratorDeployed(context.TODO(), conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) } @@ -148,7 +149,7 @@ func resourceCustomRoutingEndpointGroupCreate(d *schema.ResourceData, meta inter return err } - if _, err := waitCustomRoutingAcceleratorDeployed(conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { + if _, err := waitCustomRoutingAcceleratorDeployed(context.TODO(), conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) } } @@ -214,7 +215,7 @@ func resourceCustomRoutingEndpointGroupDelete(d *schema.ResourceData, meta inter return err } - if _, err := waitCustomRoutingAcceleratorDeployed(conn, acceleratorARN, d.Timeout(schema.TimeoutDelete)); err != nil { + if _, err := waitCustomRoutingAcceleratorDeployed(context.TODO(), conn, acceleratorARN, d.Timeout(schema.TimeoutDelete)); err != nil { return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) } diff --git a/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go b/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go index 77e90c442892..7b8b13455926 100644 --- a/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go +++ b/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go @@ -1,6 +1,7 @@ package globalaccelerator_test import ( + "context" "fmt" "testing" @@ -17,19 +18,18 @@ func TestAccGlobalAcceleratorCustomRoutingEndpointGroup_basic(t *testing.T) { ctx := acctest.Context(t) var v globalaccelerator.CustomRoutingEndpointGroup resourceName := "aws_globalaccelerator_custom_routing_endpoint_group.test" - accName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) }, ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, - CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, + CheckDestroy: testAccCheckCustomRoutingAcceleratorDestroy(ctx), Steps: []resource.TestStep{ { - Config: testAccGlobalAcceleratorCustomRoutingEndpointGroupConfig(accName), + Config: testAccCustomRoutingEndpointGroupConfig_basic(rName), Check: resource.ComposeTestCheckFunc( - testAccCheckGlobalAcceleratorCustomRoutingAcceleratorExists(accName), - testAccCheckGlobalAcceleratorCustomRoutingEndpointGroupExists(resourceName, &v), + testAccCheckCustomRoutingEndpointGroupExists(ctx, resourceName, &v), ), }, }, @@ -37,46 +37,47 @@ func TestAccGlobalAcceleratorCustomRoutingEndpointGroup_basic(t *testing.T) { } -func testAccGlobalAcceleratorCustomRoutingEndpointGroupConfig(accName string) string { +func testAccCustomRoutingEndpointGroupConfig_basic(rName string) string { return fmt.Sprintf(` -resource "aws_globalaccelerator_custom_routing_accelerator" "test_acc" { +resource "aws_globalaccelerator_custom_routing_accelerator" "test" { name = %[1]q } -resource "aws_globalaccelerator_custom_routing_listener" "test_listener" { - accelerator_arn = aws_globalaccelerator_custom_routing_accelerator.test_acc.id - port_range = { - from_port = 443 - to_port = 443 - } +resource "aws_globalaccelerator_custom_routing_listener" "test" { + accelerator_arn = aws_globalaccelerator_custom_routing_accelerator.test.id + + port_range = { + from_port = 443 + to_port = 443 + } } resource "aws_globalaccelerator_custom_routing_endpoint_group" "test" { - listener_arn: aws_globalaccelerator_custom_routing_listener.test_listener.id + listener_arn = aws_globalaccelerator_custom_routing_listener.test.id } -`, accName) +`, rName) } -func testAccCheckGlobalAcceleratorCustomRoutingEndpointGroupExists(name string, v *globalaccelerator.CustomRoutingEndpointGroup) resource.TestCheckFunc { +func testAccCheckCustomRoutingEndpointGroupExists(ctx context.Context, n string, v *globalaccelerator.CustomRoutingEndpointGroup) resource.TestCheckFunc { return func(s *terraform.State) error { conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn() - rs, ok := s.RootModule().Resources[name] + rs, ok := s.RootModule().Resources[n] if !ok { - return fmt.Errorf("Not found: %s", name) + return fmt.Errorf("Not found: %s", n) } if rs.Primary.ID == "" { - return fmt.Errorf("No Global Accelerator endpoint group ID is set") + return fmt.Errorf("No Global Accelerator Custom Routing Endpoint Group ID is set") } - customRoutingEndpointGroup, err := tfglobalaccelerator.FindCustomRoutingEndpointGroupByARN(conn, rs.Primary.ID) + output, err := tfglobalaccelerator.FindCustomRoutingEndpointGroupByARN(conn, rs.Primary.ID) if err != nil { return err } - *v = *customRoutingEndpointGroup + *v = *output return nil } diff --git a/internal/service/globalaccelerator/custom_routing_listener.go b/internal/service/globalaccelerator/custom_routing_listener.go index 8e6d90bc9c97..7c9b039c0ae2 100644 --- a/internal/service/globalaccelerator/custom_routing_listener.go +++ b/internal/service/globalaccelerator/custom_routing_listener.go @@ -1,6 +1,7 @@ package globalaccelerator import ( + "context" "fmt" "log" "time" @@ -83,7 +84,7 @@ func resourceCustomRoutingListenerCreate(d *schema.ResourceData, meta interface{ d.SetId(aws.StringValue(resp.Listener.ListenerArn)) // Creating a listener triggers the accelerator to change status to InPending. - if _, err := waitCustomRoutingAcceleratorDeployed(conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { + if _, err := waitCustomRoutingAcceleratorDeployed(context.TODO(), conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) } @@ -134,7 +135,7 @@ func resourceCustomRoutingListenerUpdate(d *schema.ResourceData, meta interface{ } // Updating a listener triggers the accelerator to change status to InPending. - if _, err := waitCustomRoutingAcceleratorDeployed(conn, acceleratorARN, d.Timeout(schema.TimeoutUpdate)); err != nil { + if _, err := waitCustomRoutingAcceleratorDeployed(context.TODO(), conn, acceleratorARN, d.Timeout(schema.TimeoutUpdate)); err != nil { return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) } @@ -161,7 +162,7 @@ func resourceCustomRoutingListenerDelete(d *schema.ResourceData, meta interface{ } // Deleting a listener triggers the accelerator to change status to InPending. - if _, err := waitCustomRoutingAcceleratorDeployed(conn, acceleratorARN, d.Timeout(schema.TimeoutDelete)); err != nil { + if _, err := waitCustomRoutingAcceleratorDeployed(context.TODO(), conn, acceleratorARN, d.Timeout(schema.TimeoutDelete)); err != nil { return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) } diff --git a/internal/service/globalaccelerator/custom_routing_listener_test.go b/internal/service/globalaccelerator/custom_routing_listener_test.go index ef6cca8ffb27..e36d241491c5 100644 --- a/internal/service/globalaccelerator/custom_routing_listener_test.go +++ b/internal/service/globalaccelerator/custom_routing_listener_test.go @@ -13,18 +13,18 @@ import ( func TestAccGlobalAcceleratorCustomRoutingListener_basic(t *testing.T) { ctx := acctest.Context(t) resourceName := "aws_globalaccelerator_custom_routing_listener.test" - accName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) }, ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, - CheckDestroy: testAccCheckGlobalAcceleratorCustomRoutingAcceleratorDestroy, + CheckDestroy: testAccCheckCustomRoutingAcceleratorDestroy(ctx), Steps: []resource.TestStep{ { - Config: testAccGlobalAcceleratorCustomRoutingListenerConfig(accName), + Config: testAccCustomRoutingListenerConfig_basic(rName), Check: resource.ComposeTestCheckFunc( - testAccCheckGlobalAcceleratorCustomRoutingAcceleratorExists(accName), + testAccCheckCustomRoutingAcceleratorExists(ctx, rName), resource.TestCheckResourceAttr(resourceName, "port_range.#", "2"), resource.TestCheckResourceAttr(resourceName, "port_range.0.from_port", "443"), resource.TestCheckResourceAttr(resourceName, "port_range.0.to_port", "443"), @@ -36,22 +36,24 @@ func TestAccGlobalAcceleratorCustomRoutingListener_basic(t *testing.T) { }) } -func testAccGlobalAcceleratorCustomRoutingListenerConfig(accName string) string { +func testAccCustomRoutingListenerConfig_basic(rName string) string { return fmt.Sprintf(` -resource "aws_globalaccelerator_custom_routing_accelerator" "test_acc" { +resource "aws_globalaccelerator_custom_routing_accelerator" "test" { name = %[1]q } resource "aws_globalaccelerator_custom_routing_listener" "test" { - accelerator_arn = aws_globalaccelerator_custom_routing_accelerator.test_acc.id - port_range = { - from_port = 443 - to_port = 443 - } - port_range = { - from_port = 10000 - to_port = 30000 - } + accelerator_arn = aws_globalaccelerator_custom_routing_accelerator.test.id + + port_range = { + from_port = 443 + to_port = 443 + } + + port_range = { + from_port = 10000 + to_port = 30000 + } } -`, accName) +`, rName) } From 3af849cd0007024fe2748aad118d33735cb2e7f2 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 28 Mar 2023 16:58:06 -0400 Subject: [PATCH 15/38] r/aws_globalaccelerator_custom_routing_listener: Context. --- .../custom_routing_listener.go | 94 ++++++++++--------- 1 file changed, 49 insertions(+), 45 deletions(-) diff --git a/internal/service/globalaccelerator/custom_routing_listener.go b/internal/service/globalaccelerator/custom_routing_listener.go index 7c9b039c0ae2..1f47f11141a4 100644 --- a/internal/service/globalaccelerator/custom_routing_listener.go +++ b/internal/service/globalaccelerator/custom_routing_listener.go @@ -2,30 +2,31 @@ package globalaccelerator import ( "context" - "fmt" "log" "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/globalaccelerator" "github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag" "github.com/hashicorp/terraform-provider-aws/internal/tfresource" ) // @SDKResource("aws_globalaccelerator_custom_routing_listener") func ResourceCustomRoutingListener() *schema.Resource { return &schema.Resource{ - Create: resourceCustomRoutingListenerCreate, - Read: resourceCustomRoutingListenerRead, - Update: resourceCustomRoutingListenerUpdate, - Delete: resourceCustomRoutingListenerDelete, + CreateWithoutTimeout: resourceCustomRoutingListenerCreate, + ReadWithoutTimeout: resourceCustomRoutingListenerRead, + UpdateWithoutTimeout: resourceCustomRoutingListenerUpdate, + DeleteWithoutTimeout: resourceCustomRoutingListenerDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ @@ -64,63 +65,65 @@ func ResourceCustomRoutingListener() *schema.Resource { } } -func resourceCustomRoutingListenerCreate(d *schema.ResourceData, meta interface{}) error { +func resourceCustomRoutingListenerCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var diags diag.Diagnostics conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() - acceleratorARN := d.Get("accelerator_arn").(string) - opts := &globalaccelerator.CreateCustomRoutingListenerInput{ + acceleratorARN := d.Get("accelerator_arn").(string) + input := &globalaccelerator.CreateCustomRoutingListenerInput{ AcceleratorArn: aws.String(acceleratorARN), IdempotencyToken: aws.String(resource.UniqueId()), PortRanges: expandPortRanges(d.Get("port_range").(*schema.Set).List()), } - log.Printf("[DEBUG] Create Global Accelerator custom routing listener: %s", opts) + output, err := conn.CreateCustomRoutingListenerWithContext(ctx, input) - resp, err := conn.CreateCustomRoutingListener(opts) if err != nil { - return fmt.Errorf("error creating Global Accelerator custom routing listener: %w", err) + return sdkdiag.AppendErrorf(diags, "creating Global Accelerator Custom Routing Listener: %s", err) } - d.SetId(aws.StringValue(resp.Listener.ListenerArn)) + d.SetId(aws.StringValue(output.Listener.ListenerArn)) // Creating a listener triggers the accelerator to change status to InPending. - if _, err := waitCustomRoutingAcceleratorDeployed(context.TODO(), conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { - return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) + if _, err := waitCustomRoutingAcceleratorDeployed(ctx, conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { + return sdkdiag.AppendErrorf(diags, "waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) } - return resourceCustomRoutingListenerRead(d, meta) + return append(diags, resourceCustomRoutingListenerRead(ctx, d, meta)...) } -func resourceCustomRoutingListenerRead(d *schema.ResourceData, meta interface{}) error { +func resourceCustomRoutingListenerRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var diags diag.Diagnostics conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() - listener, err := FindCustomRoutingListenerByARN(conn, d.Id()) + listener, err := FindCustomRoutingListenerByARN(ctx, conn, d.Id()) if !d.IsNewResource() && tfresource.NotFound(err) { - log.Printf("[WARN] Global Accelerator listener (%s) not found, removing from state", d.Id()) + log.Printf("[WARN] Global Accelerator Custom Routing Listener (%s) not found, removing from state", d.Id()) d.SetId("") - return nil + return diags } if err != nil { - return fmt.Errorf("error reading Global Accelerator listener (%s): %w", d.Id(), err) + return sdkdiag.AppendErrorf(diags, "reading Global Accelerator Custom Routing Listener (%s): %s", d.Id(), err) } acceleratorARN, err := ListenerOrEndpointGroupARNToAcceleratorARN(d.Id()) if err != nil { - return err + return sdkdiag.AppendFromErr(diags, err) } d.Set("accelerator_arn", acceleratorARN) if err := d.Set("port_range", flattenPortRanges(listener.PortRanges)); err != nil { - return fmt.Errorf("error setting port_range: %w", err) + return sdkdiag.AppendErrorf(diags, "setting port_range: %s", err) } - return nil + return diags } -func resourceCustomRoutingListenerUpdate(d *schema.ResourceData, meta interface{}) error { +func resourceCustomRoutingListenerUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var diags diag.Diagnostics conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() acceleratorARN := d.Get("accelerator_arn").(string) @@ -129,56 +132,57 @@ func resourceCustomRoutingListenerUpdate(d *schema.ResourceData, meta interface{ PortRanges: expandPortRanges(d.Get("port_range").(*schema.Set).List()), } - log.Printf("[DEBUG] Updating Global Accelerator custom routing listener: %s", input) - if _, err := conn.UpdateCustomRoutingListener(input); err != nil { - return fmt.Errorf("error updating Global Accelerator custom routing listener (%s): %w", d.Id(), err) + _, err := conn.UpdateCustomRoutingListenerWithContext(ctx, input) + + if err != nil { + return sdkdiag.AppendErrorf(diags, "updating Global Accelerator Custom Routing Listener (%s): %s", d.Id(), err) } // Updating a listener triggers the accelerator to change status to InPending. - if _, err := waitCustomRoutingAcceleratorDeployed(context.TODO(), conn, acceleratorARN, d.Timeout(schema.TimeoutUpdate)); err != nil { - return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) + if _, err := waitCustomRoutingAcceleratorDeployed(ctx, conn, acceleratorARN, d.Timeout(schema.TimeoutUpdate)); err != nil { + return sdkdiag.AppendErrorf(diags, "waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %s", acceleratorARN, err) } - return resourceCustomRoutingListenerRead(d, meta) + return append(diags, resourceCustomRoutingListenerRead(ctx, d, meta)...) } -func resourceCustomRoutingListenerDelete(d *schema.ResourceData, meta interface{}) error { +func resourceCustomRoutingListenerDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var diags diag.Diagnostics conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() + acceleratorARN := d.Get("accelerator_arn").(string) - input := &globalaccelerator.DeleteCustomRoutingListenerInput{ + log.Printf("[DEBUG] Deleting Global Accelerator Custom Routing Listener (%s)", d.Id()) + _, err := conn.DeleteCustomRoutingListener(&globalaccelerator.DeleteCustomRoutingListenerInput{ ListenerArn: aws.String(d.Id()), - } - - log.Printf("[DEBUG] Deleting Global Accelerator custom routing listener (%s)", d.Id()) - _, err := conn.DeleteCustomRoutingListener(input) + }) if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeListenerNotFoundException) { return nil } if err != nil { - return fmt.Errorf("error deleting Global Accelerator custom routing listener (%s): %w", d.Id(), err) + return sdkdiag.AppendErrorf(diags, "deleting Global Accelerator Custom Routing Listener (%s): %s", d.Id(), err) } // Deleting a listener triggers the accelerator to change status to InPending. - if _, err := waitCustomRoutingAcceleratorDeployed(context.TODO(), conn, acceleratorARN, d.Timeout(schema.TimeoutDelete)); err != nil { - return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) + if _, err := waitCustomRoutingAcceleratorDeployed(ctx, conn, acceleratorARN, d.Timeout(schema.TimeoutDelete)); err != nil { + return sdkdiag.AppendErrorf(diags, "waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %s", acceleratorARN, err) } - return nil + return diags } -func FindCustomRoutingListenerByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingListener, error) { +func FindCustomRoutingListenerByARN(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingListener, error) { input := &globalaccelerator.DescribeCustomRoutingListenerInput{ ListenerArn: aws.String(arn), } - return findCustomRoutingListener(conn, input) + return findCustomRoutingListener(ctx, conn, input) } -func findCustomRoutingListener(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingListenerInput) (*globalaccelerator.CustomRoutingListener, error) { - output, err := conn.DescribeCustomRoutingListener(input) +func findCustomRoutingListener(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingListenerInput) (*globalaccelerator.CustomRoutingListener, error) { + output, err := conn.DescribeCustomRoutingListenerWithContext(ctx, input) if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeListenerNotFoundException) { return nil, &resource.NotFoundError{ From 97dee7e4d62d744208b8783a75b7a0cca45e7e86 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 28 Mar 2023 17:06:54 -0400 Subject: [PATCH 16/38] r/aws_globalaccelerator_custom_routing_endpoint_group: Alphabetize attributes. --- .../custom_routing_endpoint_group.go | 35 ++++++++----------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/internal/service/globalaccelerator/custom_routing_endpoint_group.go b/internal/service/globalaccelerator/custom_routing_endpoint_group.go index 7e241705ad0a..47db1eb0ce05 100644 --- a/internal/service/globalaccelerator/custom_routing_endpoint_group.go +++ b/internal/service/globalaccelerator/custom_routing_endpoint_group.go @@ -6,8 +6,6 @@ import ( "log" "time" - "github.com/hashicorp/terraform-provider-aws/internal/flex" - "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/globalaccelerator" "github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr" @@ -15,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/flex" "github.com/hashicorp/terraform-provider-aws/internal/tfresource" "github.com/hashicorp/terraform-provider-aws/internal/verify" ) @@ -27,7 +26,7 @@ func ResourceCustomRoutingEndpointGroup() *schema.Resource { Delete: resourceCustomRoutingEndpointGroupDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ @@ -40,15 +39,6 @@ func ResourceCustomRoutingEndpointGroup() *schema.Resource { Type: schema.TypeString, Computed: true, }, - - "endpoint_group_region": { - Type: schema.TypeString, - Optional: true, - Computed: true, - ForceNew: true, - ValidateFunc: validation.StringLenBetween(1, 255), - }, - "destination_configuration": { Type: schema.TypeSet, Optional: true, @@ -60,13 +50,6 @@ func ResourceCustomRoutingEndpointGroup() *schema.Resource { Required: true, ValidateFunc: validation.IsPortNumber, }, - - "to_port": { - Type: schema.TypeInt, - Required: true, - ValidateFunc: validation.IsPortNumber, - }, - "protocols": { Type: schema.TypeSet, Optional: true, @@ -75,10 +58,14 @@ func ResourceCustomRoutingEndpointGroup() *schema.Resource { ValidateFunc: validation.StringInSlice(globalaccelerator.CustomRoutingProtocol_Values(), false), }, }, + "to_port": { + Type: schema.TypeInt, + Required: true, + ValidateFunc: validation.IsPortNumber, + }, }, }, }, - "endpoint_configuration": { Type: schema.TypeSet, Optional: true, @@ -93,7 +80,13 @@ func ResourceCustomRoutingEndpointGroup() *schema.Resource { }, }, }, - + "endpoint_group_region": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ForceNew: true, + ValidateFunc: validation.StringLenBetween(1, 255), + }, "listener_arn": { Type: schema.TypeString, Required: true, From b18e5c9dedbd6163ddca9b35d97d3f4279cdb8a0 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 28 Mar 2023 17:18:20 -0400 Subject: [PATCH 17/38] r/aws_globalaccelerator_custom_routing_endpoint_group: Context. --- .../custom_routing_endpoint_group.go | 89 ++++++++++--------- .../custom_routing_endpoint_group_test.go | 2 +- 2 files changed, 46 insertions(+), 45 deletions(-) diff --git a/internal/service/globalaccelerator/custom_routing_endpoint_group.go b/internal/service/globalaccelerator/custom_routing_endpoint_group.go index 47db1eb0ce05..ec23c198c219 100644 --- a/internal/service/globalaccelerator/custom_routing_endpoint_group.go +++ b/internal/service/globalaccelerator/custom_routing_endpoint_group.go @@ -2,17 +2,18 @@ package globalaccelerator import ( "context" - "fmt" "log" "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/globalaccelerator" "github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag" "github.com/hashicorp/terraform-provider-aws/internal/flex" "github.com/hashicorp/terraform-provider-aws/internal/tfresource" "github.com/hashicorp/terraform-provider-aws/internal/verify" @@ -21,9 +22,9 @@ import ( // @SDKResource("aws_globalaccelerator_custom_routing_endpoint_group") func ResourceCustomRoutingEndpointGroup() *schema.Resource { return &schema.Resource{ - Create: resourceCustomRoutingEndpointGroupCreate, - Read: resourceCustomRoutingEndpointGroupRead, - Delete: resourceCustomRoutingEndpointGroupDelete, + CreateWithoutTimeout: resourceCustomRoutingEndpointGroupCreate, + ReadWithoutTimeout: resourceCustomRoutingEndpointGroupRead, + DeleteWithoutTimeout: resourceCustomRoutingEndpointGroupDelete, Importer: &schema.ResourceImporter{ StateContext: schema.ImportStatePassthroughContext, @@ -97,134 +98,134 @@ func ResourceCustomRoutingEndpointGroup() *schema.Resource { } } -func resourceCustomRoutingEndpointGroupCreate(d *schema.ResourceData, meta interface{}) error { +func resourceCustomRoutingEndpointGroupCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var diags diag.Diagnostics conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() region := meta.(*conns.AWSClient).Region - opts := &globalaccelerator.CreateCustomRoutingEndpointGroupInput{ + input := &globalaccelerator.CreateCustomRoutingEndpointGroupInput{ EndpointGroupRegion: aws.String(region), IdempotencyToken: aws.String(resource.UniqueId()), ListenerArn: aws.String(d.Get("listener_arn").(string)), } if v, ok := d.GetOk("destination_configuration"); ok { - opts.DestinationConfigurations = expandCustomRoutingDestinationConfigurations(v.(*schema.Set).List()) + input.DestinationConfigurations = expandCustomRoutingDestinationConfigurations(v.(*schema.Set).List()) } - log.Printf("[DEBUG] Create Global Accelerator custom routing endpoint group: %s", opts) - - resp, err := conn.CreateCustomRoutingEndpointGroup(opts) + output, err := conn.CreateCustomRoutingEndpointGroupWithContext(ctx, input) if err != nil { - return fmt.Errorf("error creating Global Accelerator custom routing endpoint group: %w", err) + return sdkdiag.AppendErrorf(diags, "creating Global Accelerator Custom Routing Endpoint Group: %s", err) } - d.SetId(aws.StringValue(resp.EndpointGroup.EndpointGroupArn)) + d.SetId(aws.StringValue(output.EndpointGroup.EndpointGroupArn)) acceleratorARN, err := ListenerOrEndpointGroupARNToAcceleratorARN(d.Id()) if err != nil { - return err + return sdkdiag.AppendFromErr(diags, err) } - if _, err := waitCustomRoutingAcceleratorDeployed(context.TODO(), conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { - return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) + if _, err := waitCustomRoutingAcceleratorDeployed(ctx, conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { + return sdkdiag.AppendErrorf(diags, "waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %s", acceleratorARN, err) } if v, ok := d.GetOk("endpoint_configuration"); ok { optsEndpoints := &globalaccelerator.AddCustomRoutingEndpointsInput{ - EndpointGroupArn: resp.EndpointGroup.EndpointGroupArn, + EndpointGroupArn: aws.String(d.Id()), EndpointConfigurations: expandCustomRoutingEndpointConfigurations(v.(*schema.Set).List()), } _, err := conn.AddCustomRoutingEndpoints(optsEndpoints) + if err != nil { - return err + return sdkdiag.AppendErrorf(diags, "adding Global Accelerator Custom Routing Endpoint Group (%s) endpoints: %s", d.Id(), err) } - if _, err := waitCustomRoutingAcceleratorDeployed(context.TODO(), conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { - return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) + if _, err := waitCustomRoutingAcceleratorDeployed(ctx, conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { + return sdkdiag.AppendErrorf(diags, "waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %s", acceleratorARN, err) } } - return resourceCustomRoutingEndpointGroupRead(d, meta) + return append(diags, resourceCustomRoutingEndpointGroupRead(ctx, d, meta)...) } -func resourceCustomRoutingEndpointGroupRead(d *schema.ResourceData, meta interface{}) error { +func resourceCustomRoutingEndpointGroupRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var diags diag.Diagnostics conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() - endpointGroup, err := FindCustomRoutingEndpointGroupByARN(conn, d.Id()) + endpointGroup, err := FindCustomRoutingEndpointGroupByARN(ctx, conn, d.Id()) if !d.IsNewResource() && tfresource.NotFound(err) { - log.Printf("[WARN] Global Accelerator custom routing endpoint group (%s) not found, removing from state", d.Id()) + log.Printf("[WARN] Global Accelerator Custom Routing Endpoint Group (%s) not found, removing from state", d.Id()) d.SetId("") - return nil + return diags } if err != nil { - return fmt.Errorf("error reading Global Accelerator custom routing endpoint group (%s): %w", d.Id(), err) + return sdkdiag.AppendErrorf(diags, "reading Global Accelerator Custom Routing Endpoint Group (%s): %s", d.Id(), err) } listenerARN, err := EndpointGroupARNToListenerARN(d.Id()) if err != nil { - return err + return sdkdiag.AppendFromErr(diags, err) } d.Set("arn", endpointGroup.EndpointGroupArn) if err := d.Set("destination_configuration", flattenCustomRoutingDestinationDescriptions(endpointGroup.DestinationDescriptions)); err != nil { - return fmt.Errorf("error setting destination_configuration: %w", err) + return sdkdiag.AppendErrorf(diags, "setting destination_configuration: %s", err) } d.Set("endpoint_group_region", endpointGroup.EndpointGroupRegion) if err := d.Set("endpoint_configuration", flattenCustomRoutingEndpointDescriptions(endpointGroup.EndpointDescriptions)); err != nil { - return fmt.Errorf("error setting endpoint_configuration: %w", err) + return sdkdiag.AppendErrorf(diags, "setting endpoint_configuration: %s", err) } d.Set("listener_arn", listenerARN) - return nil + return diags } -func resourceCustomRoutingEndpointGroupDelete(d *schema.ResourceData, meta interface{}) error { +func resourceCustomRoutingEndpointGroupDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var diags diag.Diagnostics conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() - input := &globalaccelerator.DeleteCustomRoutingEndpointGroupInput{ + log.Printf("[DEBUG] Deleting Global Accelerator Custom Routing Endpoint Group (%s)", d.Id()) + _, err := conn.DeleteCustomRoutingEndpointGroup(&globalaccelerator.DeleteCustomRoutingEndpointGroupInput{ EndpointGroupArn: aws.String(d.Id()), - } - - log.Printf("[DEBUG] Deleting Global Accelerator custom routing endpoint group (%s)", d.Id()) - _, err := conn.DeleteCustomRoutingEndpointGroup(input) + }) if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeEndpointGroupNotFoundException) { return nil } if err != nil { - return fmt.Errorf("error deleting Global Accelerator custom routing endpoint group (%s): %w", d.Id(), err) + return sdkdiag.AppendErrorf(diags, "deleting Global Accelerator Custom Routing Endpoint Group (%s): %s", d.Id(), err) } acceleratorARN, err := ListenerOrEndpointGroupARNToAcceleratorARN(d.Id()) if err != nil { - return err + return sdkdiag.AppendFromErr(diags, err) } - if _, err := waitCustomRoutingAcceleratorDeployed(context.TODO(), conn, acceleratorARN, d.Timeout(schema.TimeoutDelete)); err != nil { - return fmt.Errorf("error waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) + if _, err := waitCustomRoutingAcceleratorDeployed(ctx, conn, acceleratorARN, d.Timeout(schema.TimeoutDelete)); err != nil { + return sdkdiag.AppendErrorf(diags, "waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %s", acceleratorARN, err) } - return nil + return diags } -func FindCustomRoutingEndpointGroupByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingEndpointGroup, error) { +func FindCustomRoutingEndpointGroupByARN(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.CustomRoutingEndpointGroup, error) { input := &globalaccelerator.DescribeCustomRoutingEndpointGroupInput{ EndpointGroupArn: aws.String(arn), } - return findCustomRoutingEndpointGroup(conn, input) + return findCustomRoutingEndpointGroup(ctx, conn, input) } -func findCustomRoutingEndpointGroup(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingEndpointGroupInput) (*globalaccelerator.CustomRoutingEndpointGroup, error) { - output, err := conn.DescribeCustomRoutingEndpointGroup(input) +func findCustomRoutingEndpointGroup(ctx context.Context, conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeCustomRoutingEndpointGroupInput) (*globalaccelerator.CustomRoutingEndpointGroup, error) { + output, err := conn.DescribeCustomRoutingEndpointGroupWithContext(ctx, input) if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeEndpointGroupNotFoundException) { return nil, &resource.NotFoundError{ diff --git a/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go b/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go index 7b8b13455926..7639c92b65fd 100644 --- a/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go +++ b/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go @@ -71,7 +71,7 @@ func testAccCheckCustomRoutingEndpointGroupExists(ctx context.Context, n string, return fmt.Errorf("No Global Accelerator Custom Routing Endpoint Group ID is set") } - output, err := tfglobalaccelerator.FindCustomRoutingEndpointGroupByARN(conn, rs.Primary.ID) + output, err := tfglobalaccelerator.FindCustomRoutingEndpointGroupByARN(ctx, conn, rs.Primary.ID) if err != nil { return err From 224a191ec7499f8f87a1e4ea9168772c2d48d910 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 08:03:16 -0400 Subject: [PATCH 18/38] Add 'AWSClient.GlobalAcceleratorHostedZoneID()'. --- internal/conns/awsclient.go | 8 +++++++- internal/service/globalaccelerator/accelerator.go | 7 +------ .../service/globalaccelerator/accelerator_data_source.go | 2 +- .../globalaccelerator/custom_routing_accelerator.go | 2 +- .../custom_routing_accelerator_data_source.go | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/internal/conns/awsclient.go b/internal/conns/awsclient.go index 97f9c1c2b075..cc6cc27ddc1a 100644 --- a/internal/conns/awsclient.go +++ b/internal/conns/awsclient.go @@ -39,7 +39,7 @@ func (client *AWSClient) HTTPClient() *http.Client { return client.httpClient } -// CloudFrontDistributionHostedZoneIDForPartition returns for the Route 53 hosted zone ID +// CloudFrontDistributionHostedZoneID returns the Route 53 hosted zone ID // for Amazon CloudFront distributions in the configured AWS partition. func (client *AWSClient) CloudFrontDistributionHostedZoneID() string { if client.Partition == endpoints.AwsCnPartitionID { @@ -68,3 +68,9 @@ func (client *AWSClient) DefaultKMSKeyPolicy() string { } `, client.Partition, client.AccountID) } + +// GlobalAcceleratorHostedZoneID returns the Route 53 hosted zone ID +// for AWS Global Accelerator accelerators in the configured AWS partition. +func (client *AWSClient) GlobalAcceleratorHostedZoneID() string { + return "Z2BJ6XQ5FK7U4H" // See https://docs.aws.amazon.com/general/latest/gr/global_accelerator.html#global_accelerator_region +} diff --git a/internal/service/globalaccelerator/accelerator.go b/internal/service/globalaccelerator/accelerator.go index 9ad3a391e8bc..2882e7784e64 100644 --- a/internal/service/globalaccelerator/accelerator.go +++ b/internal/service/globalaccelerator/accelerator.go @@ -20,11 +20,6 @@ import ( "github.com/hashicorp/terraform-provider-aws/internal/verify" ) -// Global Route53 Zone ID for Global Accelerators, exported as a -// convenience attribute for Route53 aliases (see -// https://docs.aws.amazon.com/Route53/latest/APIReference/API_AliasTarget.html). -const route53ZoneID = "Z2BJ6XQ5FK7U4H" - // @SDKResource("aws_globalaccelerator_accelerator") func ResourceAccelerator() *schema.Resource { return &schema.Resource{ @@ -198,7 +193,7 @@ func resourceAcceleratorRead(ctx context.Context, d *schema.ResourceData, meta i d.Set("dns_name", accelerator.DnsName) d.Set("enabled", accelerator.Enabled) - d.Set("hosted_zone_id", route53ZoneID) + d.Set("hosted_zone_id", meta.(*conns.AWSClient).GlobalAcceleratorHostedZoneID()) d.Set("ip_address_type", accelerator.IpAddressType) if err := d.Set("ip_sets", flattenIPSets(accelerator.IpSets)); err != nil { return diag.Errorf("setting ip_sets: %s", err) diff --git a/internal/service/globalaccelerator/accelerator_data_source.go b/internal/service/globalaccelerator/accelerator_data_source.go index f480a79be3b5..f891ac731702 100644 --- a/internal/service/globalaccelerator/accelerator_data_source.go +++ b/internal/service/globalaccelerator/accelerator_data_source.go @@ -151,7 +151,7 @@ func (d *dataSourceAccelerator) Read(ctx context.Context, request datasource.Rea } data.DnsName = flex.StringToFrameworkLegacy(ctx, accelerator.DnsName) data.Enabled = flex.BoolToFrameworkLegacy(ctx, accelerator.Enabled) - data.HostedZoneID = types.StringValue(route53ZoneID) + data.HostedZoneID = types.StringValue(d.Meta().GlobalAcceleratorHostedZoneID()) data.ID = types.StringValue(acceleratorARN) data.IpAddressType = flex.StringToFrameworkLegacy(ctx, accelerator.IpAddressType) data.IpSets = d.flattenIPSetsFramework(ctx, accelerator.IpSets) diff --git a/internal/service/globalaccelerator/custom_routing_accelerator.go b/internal/service/globalaccelerator/custom_routing_accelerator.go index 01b2a6825d49..94a21a61a845 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator.go @@ -183,7 +183,7 @@ func resourceCustomRoutingAcceleratorRead(ctx context.Context, d *schema.Resourc d.Set("dns_name", accelerator.DnsName) d.Set("enabled", accelerator.Enabled) - d.Set("hosted_zone_id", route53ZoneID) + d.Set("hosted_zone_id", meta.(*conns.AWSClient).GlobalAcceleratorHostedZoneID()) d.Set("ip_address_type", accelerator.IpAddressType) if err := d.Set("ip_sets", flattenIPSets(accelerator.IpSets)); err != nil { return sdkdiag.AppendErrorf(diags, "setting ip_sets: %s", err) diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go b/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go index 38dc256e3233..33d306621cea 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go @@ -130,7 +130,7 @@ func dataSourceCustomRoutingAcceleratorRead(ctx context.Context, d *schema.Resou d.Set("arn", accelerator.AcceleratorArn) d.Set("dns_name", accelerator.DnsName) d.Set("enabled", accelerator.Enabled) - d.Set("hosted_zone_id", route53ZoneID) + d.Set("hosted_zone_id", meta.(*conns.AWSClient).GlobalAcceleratorHostedZoneID()) d.Set("ip_address_type", accelerator.IpAddressType) if err := d.Set("ip_sets", flattenIPSets(accelerator.IpSets)); err != nil { return sdkdiag.AppendErrorf(diags, "setting ip_sets: %s", err) From f8238f2045472fba4f82eec21b7354a5a934c527 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 08:08:50 -0400 Subject: [PATCH 19/38] r/aws_globalaccelerator_custom_routing_accelerator: Add 'ip_addresses' argument. --- .../service/globalaccelerator/accelerator_test.go | 2 +- .../globalaccelerator/custom_routing_accelerator.go | 11 +++++++++++ .../custom_routing_accelerator_test.go | 7 ++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/internal/service/globalaccelerator/accelerator_test.go b/internal/service/globalaccelerator/accelerator_test.go index 063d3d58fc38..a1f4d286dc3d 100644 --- a/internal/service/globalaccelerator/accelerator_test.go +++ b/internal/service/globalaccelerator/accelerator_test.go @@ -33,7 +33,7 @@ func TestAccGlobalAcceleratorAccelerator_basic(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccAcceleratorConfig_basic(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckAcceleratorExists(ctx, resourceName), resource.TestCheckResourceAttr(resourceName, "attributes.#", "1"), resource.TestCheckResourceAttr(resourceName, "attributes.0.flow_logs_enabled", "false"), diff --git a/internal/service/globalaccelerator/custom_routing_accelerator.go b/internal/service/globalaccelerator/custom_routing_accelerator.go index 94a21a61a845..61296c041c22 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator.go @@ -15,6 +15,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/hashicorp/terraform-provider-aws/internal/conns" "github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag" + "github.com/hashicorp/terraform-provider-aws/internal/flex" tftags "github.com/hashicorp/terraform-provider-aws/internal/tags" "github.com/hashicorp/terraform-provider-aws/internal/tfresource" "github.com/hashicorp/terraform-provider-aws/internal/verify" @@ -82,6 +83,12 @@ func ResourceCustomRoutingAccelerator() *schema.Resource { Default: globalaccelerator.IpAddressTypeIpv4, ValidateFunc: validation.StringInSlice(globalaccelerator.IpAddressType_Values(), false), }, + "ip_addresses": { + Type: schema.TypeList, + Optional: true, + ForceNew: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, "ip_sets": { Type: schema.TypeList, Computed: true, @@ -135,6 +142,10 @@ func resourceCustomRoutingAcceleratorCreate(ctx context.Context, d *schema.Resou input.IpAddressType = aws.String(v.(string)) } + if v, ok := d.GetOk("ip_addresses"); ok && len(v.([]interface{})) > 0 { + input.IpAddresses = flex.ExpandStringList(v.([]interface{})) + } + output, err := conn.CreateCustomRoutingAcceleratorWithContext(ctx, input) if err != nil { diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_test.go b/internal/service/globalaccelerator/custom_routing_accelerator_test.go index 4c30d8f84d5a..8f50c8ba9a67 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_test.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_test.go @@ -31,12 +31,17 @@ func TestAccGlobalAcceleratorCustomRoutingAccelerator_basic(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccCustomRoutingAcceleratorConfig_basic(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckCustomRoutingAcceleratorExists(ctx, resourceName), + resource.TestCheckResourceAttr(resourceName, "attributes.#", "1"), + resource.TestCheckResourceAttr(resourceName, "attributes.0.flow_logs_enabled", "false"), + resource.TestCheckResourceAttr(resourceName, "attributes.0.flow_logs_s3_bucket", ""), + resource.TestCheckResourceAttr(resourceName, "attributes.0.flow_logs_s3_prefix", ""), resource.TestMatchResourceAttr(resourceName, "dns_name", dnsNameRegex), resource.TestCheckResourceAttr(resourceName, "enabled", "true"), resource.TestCheckResourceAttr(resourceName, "hosted_zone_id", "Z2BJ6XQ5FK7U4H"), resource.TestCheckResourceAttr(resourceName, "ip_address_type", "IPV4"), + resource.TestCheckResourceAttr(resourceName, "ip_addresses.#", "0"), resource.TestCheckResourceAttr(resourceName, "ip_sets.#", "1"), resource.TestCheckResourceAttr(resourceName, "ip_sets.0.ip_addresses.#", "2"), resource.TestMatchResourceAttr(resourceName, "ip_sets.0.ip_addresses.0", ipRegex), From e401a1125ea2361fc6fe1624c9f2429479255a5a Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 08:28:46 -0400 Subject: [PATCH 20/38] aws_globalaccelerator_accelerator: Add 'dual_stack_dns_name' attribute. --- .changelog/28922.txt | 8 ++++++ .../service/globalaccelerator/accelerator.go | 5 ++++ .../accelerator_data_source.go | 25 +++++++++++-------- .../accelerator_data_source_test.go | 2 ++ .../globalaccelerator/accelerator_test.go | 3 +++ ...lobalaccelerator_accelerator.html.markdown | 1 + 6 files changed, 34 insertions(+), 10 deletions(-) diff --git a/.changelog/28922.txt b/.changelog/28922.txt index d4a7f676ea10..cdfbc9d7a266 100644 --- a/.changelog/28922.txt +++ b/.changelog/28922.txt @@ -8,4 +8,12 @@ aws_globalaccelerator_custom_routing_listener ```release-note:new-resource aws_globalaccelerator_custom_routing_endpoint_group +``` + +```release-note:enhancement +resource/aws_globalaccelerator_accelerator: Add `dual_stack_dns_name` attribute +``` + +```release-note:enhancement +data-source/aws_globalaccelerator_accelerator: Add `dual_stack_dns_name` attribute ``` \ No newline at end of file diff --git a/internal/service/globalaccelerator/accelerator.go b/internal/service/globalaccelerator/accelerator.go index 2882e7784e64..5b8f587ec97c 100644 --- a/internal/service/globalaccelerator/accelerator.go +++ b/internal/service/globalaccelerator/accelerator.go @@ -67,6 +67,10 @@ func ResourceAccelerator() *schema.Resource { Type: schema.TypeString, Computed: true, }, + "dual_stack_dns_name": { + Type: schema.TypeString, + Computed: true, + }, "enabled": { Type: schema.TypeBool, Optional: true, @@ -192,6 +196,7 @@ func resourceAcceleratorRead(ctx context.Context, d *schema.ResourceData, meta i } d.Set("dns_name", accelerator.DnsName) + d.Set("dual_stack_dns_name", accelerator.DualStackDnsName) d.Set("enabled", accelerator.Enabled) d.Set("hosted_zone_id", meta.(*conns.AWSClient).GlobalAcceleratorHostedZoneID()) d.Set("ip_address_type", accelerator.IpAddressType) diff --git a/internal/service/globalaccelerator/accelerator_data_source.go b/internal/service/globalaccelerator/accelerator_data_source.go index f891ac731702..39815b73f492 100644 --- a/internal/service/globalaccelerator/accelerator_data_source.go +++ b/internal/service/globalaccelerator/accelerator_data_source.go @@ -56,6 +56,9 @@ func (d *dataSourceAccelerator) Schema(ctx context.Context, req datasource.Schem "dns_name": schema.StringAttribute{ Computed: true, }, + "dual_stack_dns_name": schema.StringAttribute{ + Computed: true, + }, "enabled": schema.BoolAttribute{ Computed: true, }, @@ -150,6 +153,7 @@ func (d *dataSourceAccelerator) Read(ctx context.Context, request datasource.Rea data.ARN = fwtypes.ARNValue(v) } data.DnsName = flex.StringToFrameworkLegacy(ctx, accelerator.DnsName) + data.DualStackDNSName = flex.StringToFrameworkLegacy(ctx, accelerator.DualStackDnsName) data.Enabled = flex.BoolToFrameworkLegacy(ctx, accelerator.Enabled) data.HostedZoneID = types.StringValue(d.Meta().GlobalAcceleratorHostedZoneID()) data.ID = types.StringValue(acceleratorARN) @@ -240,14 +244,15 @@ func (d *dataSourceAccelerator) flattenAcceleratorAttributesFramework(ctx contex } type dataSourceAcceleratorData struct { - ARN fwtypes.ARN `tfsdk:"arn"` - Attributes types.List `tfsdk:"attributes"` - DnsName types.String `tfsdk:"dns_name"` - Enabled types.Bool `tfsdk:"enabled"` - HostedZoneID types.String `tfsdk:"hosted_zone_id"` - ID types.String `tfsdk:"id"` - IpAddressType types.String `tfsdk:"ip_address_type"` - IpSets types.List `tfsdk:"ip_sets"` - Name types.String `tfsdk:"name"` - Tags types.Map `tfsdk:"tags"` + ARN fwtypes.ARN `tfsdk:"arn"` + Attributes types.List `tfsdk:"attributes"` + DnsName types.String `tfsdk:"dns_name"` + DualStackDNSName types.String `tfsdk:"dual_stack_dns_name"` + Enabled types.Bool `tfsdk:"enabled"` + HostedZoneID types.String `tfsdk:"hosted_zone_id"` + ID types.String `tfsdk:"id"` + IpAddressType types.String `tfsdk:"ip_address_type"` + IpSets types.List `tfsdk:"ip_sets"` + Name types.String `tfsdk:"name"` + Tags types.Map `tfsdk:"tags"` } diff --git a/internal/service/globalaccelerator/accelerator_data_source_test.go b/internal/service/globalaccelerator/accelerator_data_source_test.go index 79dcc2ead448..3829658d1f02 100644 --- a/internal/service/globalaccelerator/accelerator_data_source_test.go +++ b/internal/service/globalaccelerator/accelerator_data_source_test.go @@ -30,6 +30,7 @@ func TestAccGlobalAcceleratorAcceleratorDataSource_basic(t *testing.T) { resource.TestCheckResourceAttrPair(dataSource1Name, "attributes.0.flow_logs_s3_bucket", resourceName, "attributes.0.flow_logs_s3_bucket"), resource.TestCheckResourceAttrPair(dataSource1Name, "attributes.0.flow_logs_s3_prefix", resourceName, "attributes.0.flow_logs_s3_prefix"), resource.TestCheckResourceAttrPair(dataSource1Name, "dns_name", resourceName, "dns_name"), + resource.TestCheckResourceAttrPair(dataSource1Name, "dual_stack_dns_name", resourceName, "dual_stack_dns_name"), resource.TestCheckResourceAttrPair(dataSource1Name, "enabled", resourceName, "enabled"), resource.TestCheckResourceAttrPair(dataSource1Name, "hosted_zone_id", resourceName, "hosted_zone_id"), resource.TestCheckResourceAttrPair(dataSource1Name, "ip_address_type", resourceName, "ip_address_type"), @@ -46,6 +47,7 @@ func TestAccGlobalAcceleratorAcceleratorDataSource_basic(t *testing.T) { resource.TestCheckResourceAttrPair(dataSource2Name, "attributes.0.flow_logs_s3_bucket", resourceName, "attributes.0.flow_logs_s3_bucket"), resource.TestCheckResourceAttrPair(dataSource2Name, "attributes.0.flow_logs_s3_prefix", resourceName, "attributes.0.flow_logs_s3_prefix"), resource.TestCheckResourceAttrPair(dataSource2Name, "dns_name", resourceName, "dns_name"), + resource.TestCheckResourceAttrPair(dataSource2Name, "dual_stack_dns_name", resourceName, "dual_stack_dns_name"), resource.TestCheckResourceAttrPair(dataSource2Name, "enabled", resourceName, "enabled"), resource.TestCheckResourceAttrPair(dataSource2Name, "hosted_zone_id", resourceName, "hosted_zone_id"), resource.TestCheckResourceAttrPair(dataSource2Name, "ip_address_type", resourceName, "ip_address_type"), diff --git a/internal/service/globalaccelerator/accelerator_test.go b/internal/service/globalaccelerator/accelerator_test.go index a1f4d286dc3d..cf63a3ec1457 100644 --- a/internal/service/globalaccelerator/accelerator_test.go +++ b/internal/service/globalaccelerator/accelerator_test.go @@ -40,6 +40,7 @@ func TestAccGlobalAcceleratorAccelerator_basic(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "attributes.0.flow_logs_s3_bucket", ""), resource.TestCheckResourceAttr(resourceName, "attributes.0.flow_logs_s3_prefix", ""), resource.TestMatchResourceAttr(resourceName, "dns_name", dnsNameRegex), + resource.TestCheckResourceAttr(resourceName, "dual_stack_dns_name", ""), resource.TestCheckResourceAttr(resourceName, "enabled", "true"), resource.TestCheckResourceAttr(resourceName, "hosted_zone_id", "Z2BJ6XQ5FK7U4H"), resource.TestCheckResourceAttr(resourceName, "ip_address_type", "IPV4"), @@ -65,6 +66,7 @@ func TestAccGlobalAcceleratorAccelerator_ipAddressType_dualStack(t *testing.T) { ctx := acctest.Context(t) resourceName := "aws_globalaccelerator_accelerator.test" rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + dualStackDNSNameRegex := regexp.MustCompile(`^a[a-f0-9]{16}\.dualstack\.awsglobalaccelerator\.com$`) resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) }, @@ -76,6 +78,7 @@ func TestAccGlobalAcceleratorAccelerator_ipAddressType_dualStack(t *testing.T) { Config: testAccAcceleratorConfig_ipAddressTypeDualStack(rName), Check: resource.ComposeTestCheckFunc( testAccCheckAcceleratorExists(ctx, resourceName), + resource.TestMatchResourceAttr(resourceName, "dual_stack_dns_name", dualStackDNSNameRegex), resource.TestCheckResourceAttr(resourceName, "enabled", "true"), resource.TestCheckResourceAttr(resourceName, "ip_address_type", "DUAL_STACK"), resource.TestCheckResourceAttr(resourceName, "ip_sets.#", "2"), diff --git a/website/docs/r/globalaccelerator_accelerator.html.markdown b/website/docs/r/globalaccelerator_accelerator.html.markdown index ece9cc30c0c1..ec68eb0cd8e2 100644 --- a/website/docs/r/globalaccelerator_accelerator.html.markdown +++ b/website/docs/r/globalaccelerator_accelerator.html.markdown @@ -50,6 +50,7 @@ In addition to all arguments above, the following attributes are exported: * `id` - The Amazon Resource Name (ARN) of the accelerator. * `dns_name` - The DNS name of the accelerator. For example, `a5d53ff5ee6bca4ce.awsglobalaccelerator.com`. +* `dual_stack_dns_name` - The Domain Name System (DNS) name that Global Accelerator creates that points to a dual-stack accelerator's four static IP addresses: two IPv4 addresses and two IPv6 addresses. For example, `a1234567890abcdef.dualstack.awsglobalaccelerator.com`. * `hosted_zone_id` -- The Global Accelerator Route 53 zone ID that can be used to route an [Alias Resource Record Set][1] to the Global Accelerator. This attribute is simply an alias for the zone ID `Z2BJ6XQ5FK7U4H`. From 99c8edeef8737e0da58aaf859607e28c82afc7ca Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 08:29:31 -0400 Subject: [PATCH 21/38] d/aws_globalaccelerator_custom_routing_accelerator: Add CHANGELOG entry. --- .changelog/28922.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.changelog/28922.txt b/.changelog/28922.txt index cdfbc9d7a266..6693278a3c20 100644 --- a/.changelog/28922.txt +++ b/.changelog/28922.txt @@ -2,6 +2,10 @@ aws_globalaccelerator_custom_routing_accelerator ``` +```release-note:new-data-source +aws_globalaccelerator_custom_routing_accelerator +``` + ```release-note:new-resource aws_globalaccelerator_custom_routing_listener ``` From 466cfd31423d7fba508778cbb73314d9263f7162 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 08:32:05 -0400 Subject: [PATCH 22/38] Fix compilation error. --- internal/service/globalaccelerator/custom_routing_listener.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/service/globalaccelerator/custom_routing_listener.go b/internal/service/globalaccelerator/custom_routing_listener.go index 1f47f11141a4..28cc33b74b7f 100644 --- a/internal/service/globalaccelerator/custom_routing_listener.go +++ b/internal/service/globalaccelerator/custom_routing_listener.go @@ -86,7 +86,7 @@ func resourceCustomRoutingListenerCreate(ctx context.Context, d *schema.Resource // Creating a listener triggers the accelerator to change status to InPending. if _, err := waitCustomRoutingAcceleratorDeployed(ctx, conn, acceleratorARN, d.Timeout(schema.TimeoutCreate)); err != nil { - return sdkdiag.AppendErrorf(diags, "waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %w", acceleratorARN, err) + return sdkdiag.AppendErrorf(diags, "waiting for Global Accelerator Custom Routing Accelerator (%s) deployment: %s", acceleratorARN, err) } return append(diags, resourceCustomRoutingListenerRead(ctx, d, meta)...) From f7b886fae9037a8d3624a471ca4f2934200d9020 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 10:31:30 -0400 Subject: [PATCH 23/38] Fix 'AccessControlListNotSupported: The bucket does not allow ACLs' error in acceptance test configuration. --- internal/service/globalaccelerator/accelerator_test.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/internal/service/globalaccelerator/accelerator_test.go b/internal/service/globalaccelerator/accelerator_test.go index cf63a3ec1457..9d04005ae71c 100644 --- a/internal/service/globalaccelerator/accelerator_test.go +++ b/internal/service/globalaccelerator/accelerator_test.go @@ -476,11 +476,6 @@ resource "aws_s3_bucket" "test" { force_destroy = true } -resource "aws_s3_bucket_acl" "test" { - bucket = aws_s3_bucket.test.id - acl = "private" -} - resource "aws_globalaccelerator_accelerator" "test" { name = %[1]q ip_address_type = "IPV4" From 787e72f0a6c2feee5dba1ddd4b006a9c29b93e2d Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 11:04:12 -0400 Subject: [PATCH 24/38] r/aws_globalaccelerator_custom_routing_accelerator: Additional acceptance tests. Acceptance test output: % make testacc TESTARGS='-run=TestAccGlobalAcceleratorCustomRoutingAccelerator' PKG=globalaccelerator ACCTEST_PARALLELISM=2 ==> Checking that code complies with gofmt requirements... TF_ACC=1 go test ./internal/service/globalaccelerator/... -v -count 1 -parallel 2 -run=TestAccGlobalAcceleratorCustomRoutingAccelerator -timeout 180m === RUN TestAccGlobalAcceleratorCustomRoutingAcceleratorDataSource_basic === PAUSE TestAccGlobalAcceleratorCustomRoutingAcceleratorDataSource_basic === RUN TestAccGlobalAcceleratorCustomRoutingAccelerator_basic === PAUSE TestAccGlobalAcceleratorCustomRoutingAccelerator_basic === RUN TestAccGlobalAcceleratorCustomRoutingAccelerator_disappears === PAUSE TestAccGlobalAcceleratorCustomRoutingAccelerator_disappears === RUN TestAccGlobalAcceleratorCustomRoutingAccelerator_tags === PAUSE TestAccGlobalAcceleratorCustomRoutingAccelerator_tags === RUN TestAccGlobalAcceleratorCustomRoutingAccelerator_update === PAUSE TestAccGlobalAcceleratorCustomRoutingAccelerator_update === CONT TestAccGlobalAcceleratorCustomRoutingAcceleratorDataSource_basic === CONT TestAccGlobalAcceleratorCustomRoutingAccelerator_tags --- PASS: TestAccGlobalAcceleratorCustomRoutingAcceleratorDataSource_basic (87.67s) === CONT TestAccGlobalAcceleratorCustomRoutingAccelerator_update --- PASS: TestAccGlobalAcceleratorCustomRoutingAccelerator_update (113.49s) === CONT TestAccGlobalAcceleratorCustomRoutingAccelerator_disappears --- PASS: TestAccGlobalAcceleratorCustomRoutingAccelerator_tags (116.03s) === CONT TestAccGlobalAcceleratorCustomRoutingAccelerator_basic --- PASS: TestAccGlobalAcceleratorCustomRoutingAccelerator_disappears (71.98s) --- PASS: TestAccGlobalAcceleratorCustomRoutingAccelerator_basic (76.38s) PASS ok github.com/hashicorp/terraform-provider-aws/internal/service/globalaccelerator 197.668s --- ...om_routing_accelerator_data_source_test.go | 25 ++-- .../custom_routing_accelerator_test.go | 139 +++++++++++++++++- 2 files changed, 148 insertions(+), 16 deletions(-) diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go b/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go index b27034c231eb..b739e457faf3 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/aws/aws-sdk-go/service/globalaccelerator" + sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-provider-aws/internal/acctest" ) @@ -12,8 +13,9 @@ import ( func TestAccGlobalAcceleratorCustomRoutingAcceleratorDataSource_basic(t *testing.T) { ctx := acctest.Context(t) resourceName := "aws_globalaccelerator_custom_routing_accelerator.test" - dataSourceName := "data.aws_globalaccelerator_custom_routing_accelerator.test_by_arn" + dataSource1Name := "data.aws_globalaccelerator_custom_routing_accelerator.test_by_arn" dataSourceName2 := "data.aws_globalaccelerator_custom_routing_accelerator.test_by_name" + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) }, @@ -21,17 +23,18 @@ func TestAccGlobalAcceleratorCustomRoutingAcceleratorDataSource_basic(t *testing ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, Steps: []resource.TestStep{ { - Config: testAccCustomRoutingAcceleratorDataSourceConfig_basic(resourceName), + Config: testAccCustomRoutingAcceleratorDataSourceConfig_basic(rName), Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttrPair(dataSourceName, "name", resourceName, "name"), - resource.TestCheckResourceAttrPair(dataSourceName, "enabled", resourceName, "enabled"), - resource.TestCheckResourceAttrPair(dataSourceName, "dns_name", resourceName, "dns_name"), - resource.TestCheckResourceAttrPair(dataSourceName, "hosted_zone_id", resourceName, "hosted_zone_id"), - resource.TestCheckResourceAttrPair(dataSourceName, "ip_sets.#", resourceName, "ip_sets.#"), - resource.TestCheckResourceAttrPair(dataSourceName, "ip_sets.0.ip_addresses.#", resourceName, "ip_sets.0.ip_addresses.#"), - resource.TestCheckResourceAttrPair(dataSourceName, "ip_sets.0.ip_addresses.0", resourceName, "ip_sets.0.ip_addresses.0"), - resource.TestCheckResourceAttrPair(dataSourceName, "ip_sets.0.ip_addresses.1", resourceName, "ip_sets.0.ip_addresses.1"), - resource.TestCheckResourceAttrPair(dataSourceName, "ip_sets.0.ip_family", resourceName, "ip_sets.0.ip_family"), + resource.TestCheckResourceAttrPair(dataSource1Name, "name", resourceName, "name"), + resource.TestCheckResourceAttrPair(dataSource1Name, "enabled", resourceName, "enabled"), + resource.TestCheckResourceAttrPair(dataSource1Name, "dns_name", resourceName, "dns_name"), + resource.TestCheckResourceAttrPair(dataSource1Name, "hosted_zone_id", resourceName, "hosted_zone_id"), + resource.TestCheckResourceAttrPair(dataSource1Name, "ip_sets.#", resourceName, "ip_sets.#"), + resource.TestCheckResourceAttrPair(dataSource1Name, "ip_sets.0.ip_addresses.#", resourceName, "ip_sets.0.ip_addresses.#"), + resource.TestCheckResourceAttrPair(dataSource1Name, "ip_sets.0.ip_addresses.0", resourceName, "ip_sets.0.ip_addresses.0"), + resource.TestCheckResourceAttrPair(dataSource1Name, "ip_sets.0.ip_addresses.1", resourceName, "ip_sets.0.ip_addresses.1"), + resource.TestCheckResourceAttrPair(dataSource1Name, "ip_sets.0.ip_family", resourceName, "ip_sets.0.ip_family"), + resource.TestCheckResourceAttrPair(dataSourceName2, "name", resourceName, "name"), resource.TestCheckResourceAttrPair(dataSourceName2, "enabled", resourceName, "enabled"), resource.TestCheckResourceAttrPair(dataSourceName2, "dns_name", resourceName, "dns_name"), diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_test.go b/internal/service/globalaccelerator/custom_routing_accelerator_test.go index 8f50c8ba9a67..80bac913716a 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_test.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_test.go @@ -59,12 +59,108 @@ func TestAccGlobalAcceleratorCustomRoutingAccelerator_basic(t *testing.T) { }) } -func testAccCustomRoutingAcceleratorConfig_basic(rName string) string { - return fmt.Sprintf(` -resource "aws_globalaccelerator_custom_routing_accelerator" "test" { - name = %[1]q +func TestAccGlobalAcceleratorCustomRoutingAccelerator_disappears(t *testing.T) { + ctx := acctest.Context(t) + resourceName := "aws_globalaccelerator_custom_routing_accelerator.test" + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) }, + ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckCustomRoutingAcceleratorDestroy(ctx), + Steps: []resource.TestStep{ + { + Config: testAccCustomRoutingAcceleratorConfig_basic(rName), + Check: resource.ComposeTestCheckFunc( + testAccCheckCustomRoutingAcceleratorExists(ctx, resourceName), + acctest.CheckResourceDisappears(ctx, acctest.Provider, tfglobalaccelerator.ResourceCustomRoutingAccelerator(), resourceName), + ), + ExpectNonEmptyPlan: true, + }, + }, + }) } -`, rName) + +func TestAccGlobalAcceleratorCustomRoutingAccelerator_tags(t *testing.T) { + ctx := acctest.Context(t) + resourceName := "aws_globalaccelerator_custom_routing_accelerator.test" + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) }, + ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckCustomRoutingAcceleratorDestroy(ctx), + Steps: []resource.TestStep{ + { + Config: testAccCustomRoutingAcceleratorConfig_tags1(rName, "key1", "value1"), + Check: resource.ComposeTestCheckFunc( + testAccCheckCustomRoutingAcceleratorExists(ctx, resourceName), + resource.TestCheckResourceAttr(resourceName, "name", rName), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + resource.TestCheckResourceAttr(resourceName, "tags.key1", "value1"), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + { + Config: testAccCustomRoutingAcceleratorConfig_tags2(rName, "key1", "value1updated", "key2", "value2"), + Check: resource.ComposeTestCheckFunc( + testAccCheckCustomRoutingAcceleratorExists(ctx, resourceName), + resource.TestCheckResourceAttr(resourceName, "tags.%", "2"), + resource.TestCheckResourceAttr(resourceName, "tags.key1", "value1updated"), + resource.TestCheckResourceAttr(resourceName, "tags.key2", "value2"), + ), + }, + { + Config: testAccCustomRoutingAcceleratorConfig_tags1(rName, "key2", "value2"), + Check: resource.ComposeTestCheckFunc( + testAccCheckCustomRoutingAcceleratorExists(ctx, resourceName), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + resource.TestCheckResourceAttr(resourceName, "tags.key2", "value2"), + ), + }, + }, + }) +} + +func TestAccGlobalAcceleratorCustomRoutingAccelerator_update(t *testing.T) { + ctx := acctest.Context(t) + resourceName := "aws_globalaccelerator_custom_routing_accelerator.test" + rName1 := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + rName2 := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) }, + ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckCustomRoutingAcceleratorDestroy(ctx), + Steps: []resource.TestStep{ + { + Config: testAccCustomRoutingAcceleratorConfig_basic(rName1), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckCustomRoutingAcceleratorExists(ctx, resourceName), + resource.TestCheckResourceAttr(resourceName, "name", rName1), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + { + Config: testAccCustomRoutingAcceleratorConfig_basic(rName2), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckCustomRoutingAcceleratorExists(ctx, resourceName), + resource.TestCheckResourceAttr(resourceName, "name", rName2), + ), + }, + }, + }) } func testAccCheckCustomRoutingAcceleratorExists(ctx context.Context, n string) resource.TestCheckFunc { @@ -114,3 +210,36 @@ func testAccCheckCustomRoutingAcceleratorDestroy(ctx context.Context) resource.T return nil } } + +func testAccCustomRoutingAcceleratorConfig_basic(rName string) string { + return fmt.Sprintf(` +resource "aws_globalaccelerator_custom_routing_accelerator" "test" { + name = %[1]q +} +`, rName) +} + +func testAccCustomRoutingAcceleratorConfig_tags1(rName, tagKey1, tagValue1 string) string { + return fmt.Sprintf(` +resource "aws_globalaccelerator_custom_routing_accelerator" "test" { + name = %[1]q + + tags = { + %[2]q = %[3]q + } +} +`, rName, tagKey1, tagValue1) +} + +func testAccCustomRoutingAcceleratorConfig_tags2(rName, tagKey1, tagValue1, tagKey2, tagValue2 string) string { + return fmt.Sprintf(` +resource "aws_globalaccelerator_custom_routing_accelerator" "test" { + name = %[1]q + + tags = { + %[2]q = %[3]q + %[4]q = %[5]q + } +} +`, rName, tagKey1, tagValue1, tagKey2, tagValue2) +} From 45d0ad4440d43f8d9cf64d7ff8be2268ca7f1c3b Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 11:29:37 -0400 Subject: [PATCH 25/38] Add 'testAccCheckCustomRoutingEndpointGroupDestroy'. --- .../custom_routing_endpoint_group_test.go | 96 +++++++++++++++---- 1 file changed, 75 insertions(+), 21 deletions(-) diff --git a/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go b/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go index 7639c92b65fd..63dcb29cfb4a 100644 --- a/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go +++ b/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-provider-aws/internal/acctest" "github.com/hashicorp/terraform-provider-aws/internal/conns" tfglobalaccelerator "github.com/hashicorp/terraform-provider-aws/internal/service/globalaccelerator" + "github.com/hashicorp/terraform-provider-aws/internal/tfresource" ) func TestAccGlobalAcceleratorCustomRoutingEndpointGroup_basic(t *testing.T) { @@ -24,38 +25,45 @@ func TestAccGlobalAcceleratorCustomRoutingEndpointGroup_basic(t *testing.T) { PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) }, ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, - CheckDestroy: testAccCheckCustomRoutingAcceleratorDestroy(ctx), + CheckDestroy: testAccCheckCustomRoutingEndpointGroupDestroy(ctx), Steps: []resource.TestStep{ { Config: testAccCustomRoutingEndpointGroupConfig_basic(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckCustomRoutingEndpointGroupExists(ctx, resourceName, &v), ), }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, }, }) - -} - -func testAccCustomRoutingEndpointGroupConfig_basic(rName string) string { - return fmt.Sprintf(` -resource "aws_globalaccelerator_custom_routing_accelerator" "test" { - name = %[1]q } -resource "aws_globalaccelerator_custom_routing_listener" "test" { - accelerator_arn = aws_globalaccelerator_custom_routing_accelerator.test.id - - port_range = { - from_port = 443 - to_port = 443 - } -} +func TestAccGlobalAcceleratorCustomRoutingEndpointGroup_disappears(t *testing.T) { + ctx := acctest.Context(t) + var v globalaccelerator.CustomRoutingEndpointGroup + resourceName := "aws_globalaccelerator_custom_routing_endpoint_group.test" + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) -resource "aws_globalaccelerator_custom_routing_endpoint_group" "test" { - listener_arn = aws_globalaccelerator_custom_routing_listener.test.id -} -`, rName) + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) }, + ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckCustomRoutingEndpointGroupDestroy(ctx), + Steps: []resource.TestStep{ + { + Config: testAccCustomRoutingEndpointGroupConfig_basic(rName), + Check: resource.ComposeTestCheckFunc( + testAccCheckCustomRoutingEndpointGroupExists(ctx, resourceName, &v), + acctest.CheckResourceDisappears(ctx, acctest.Provider, tfglobalaccelerator.ResourceCustomRoutingEndpointGroup(), resourceName), + ), + ExpectNonEmptyPlan: true, + }, + }, + }) } func testAccCheckCustomRoutingEndpointGroupExists(ctx context.Context, n string, v *globalaccelerator.CustomRoutingEndpointGroup) resource.TestCheckFunc { @@ -82,3 +90,49 @@ func testAccCheckCustomRoutingEndpointGroupExists(ctx context.Context, n string, return nil } } + +func testAccCheckCustomRoutingEndpointGroupDestroy(ctx context.Context) resource.TestCheckFunc { + return func(s *terraform.State) error { + conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn() + + for _, rs := range s.RootModule().Resources { + if rs.Type != "aws_globalaccelerator_custom_routing_endpoint_group" { + continue + } + + _, err := tfglobalaccelerator.FindCustomRoutingEndpointGroupByARN(ctx, conn, rs.Primary.ID) + + if tfresource.NotFound(err) { + continue + } + + if err != nil { + return err + } + + return fmt.Errorf("Global Accelerator Custom Routing Endpoint Group %s still exists", rs.Primary.ID) + } + return nil + } +} + +func testAccCustomRoutingEndpointGroupConfig_basic(rName string) string { + return fmt.Sprintf(` +resource "aws_globalaccelerator_custom_routing_accelerator" "test" { + name = %[1]q +} + +resource "aws_globalaccelerator_custom_routing_listener" "test" { + accelerator_arn = aws_globalaccelerator_custom_routing_accelerator.test.id + + port_range = { + from_port = 443 + to_port = 443 + } +} + +resource "aws_globalaccelerator_custom_routing_endpoint_group" "test" { + listener_arn = aws_globalaccelerator_custom_routing_listener.test.id +} +`, rName) +} From 7c8f16569e7770d1d65608bc7d062264c451909e Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 11:40:39 -0400 Subject: [PATCH 26/38] Add 'testAccCheckCustomRoutingListenerExists' and 'testAccCheckCustomRoutingListenerDestroy'. --- .../custom_routing_listener_test.go | 91 ++++++++++++++++++- 1 file changed, 88 insertions(+), 3 deletions(-) diff --git a/internal/service/globalaccelerator/custom_routing_listener_test.go b/internal/service/globalaccelerator/custom_routing_listener_test.go index e36d241491c5..a2be5987c787 100644 --- a/internal/service/globalaccelerator/custom_routing_listener_test.go +++ b/internal/service/globalaccelerator/custom_routing_listener_test.go @@ -1,17 +1,23 @@ package globalaccelerator_test import ( + "context" "fmt" "testing" "github.com/aws/aws-sdk-go/service/globalaccelerator" sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/hashicorp/terraform-provider-aws/internal/acctest" + "github.com/hashicorp/terraform-provider-aws/internal/conns" + tfglobalaccelerator "github.com/hashicorp/terraform-provider-aws/internal/service/globalaccelerator" + "github.com/hashicorp/terraform-provider-aws/internal/tfresource" ) func TestAccGlobalAcceleratorCustomRoutingListener_basic(t *testing.T) { ctx := acctest.Context(t) + var v globalaccelerator.CustomRoutingListener resourceName := "aws_globalaccelerator_custom_routing_listener.test" rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) @@ -19,12 +25,12 @@ func TestAccGlobalAcceleratorCustomRoutingListener_basic(t *testing.T) { PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) }, ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, - CheckDestroy: testAccCheckCustomRoutingAcceleratorDestroy(ctx), + CheckDestroy: testAccCheckCustomRoutingListenerDestroy(ctx), Steps: []resource.TestStep{ { Config: testAccCustomRoutingListenerConfig_basic(rName), - Check: resource.ComposeTestCheckFunc( - testAccCheckCustomRoutingAcceleratorExists(ctx, rName), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckCustomRoutingListenerExists(ctx, rName, &v), resource.TestCheckResourceAttr(resourceName, "port_range.#", "2"), resource.TestCheckResourceAttr(resourceName, "port_range.0.from_port", "443"), resource.TestCheckResourceAttr(resourceName, "port_range.0.to_port", "443"), @@ -32,10 +38,89 @@ func TestAccGlobalAcceleratorCustomRoutingListener_basic(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "port_range.1.to_port", "30000"), ), }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func TestAccGlobalAcceleratorCustomRoutingListener_disappears(t *testing.T) { + ctx := acctest.Context(t) + var v globalaccelerator.CustomRoutingListener + resourceName := "aws_globalaccelerator_custom_routing_listener.test" + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) }, + ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckCustomRoutingListenerDestroy(ctx), + Steps: []resource.TestStep{ + { + Config: testAccCustomRoutingListenerConfig_basic(rName), + Check: resource.ComposeTestCheckFunc( + testAccCheckCustomRoutingListenerExists(ctx, rName, &v), + acctest.CheckResourceDisappears(ctx, acctest.Provider, tfglobalaccelerator.ResourceCustomRoutingListener(), resourceName), + ), + ExpectNonEmptyPlan: true, + }, }, }) } +func testAccCheckCustomRoutingListenerExists(ctx context.Context, n string, v *globalaccelerator.CustomRoutingListener) resource.TestCheckFunc { + return func(s *terraform.State) error { + conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn() + + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found: %s", n) + } + + if rs.Primary.ID == "" { + return fmt.Errorf("No Global Accelerator Custom Routing Listener ID is set") + } + + output, err := tfglobalaccelerator.FindCustomRoutingListenerByARN(ctx, conn, rs.Primary.ID) + + if err != nil { + return err + } + + *v = *output + + return nil + } +} + +func testAccCheckCustomRoutingListenerDestroy(ctx context.Context) resource.TestCheckFunc { + return func(s *terraform.State) error { + conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn() + + for _, rs := range s.RootModule().Resources { + if rs.Type != "aws_globalaccelerator_custom_routing_listener" { + continue + } + + _, err := tfglobalaccelerator.FindCustomRoutingListenerByARN(ctx, conn, rs.Primary.ID) + + if tfresource.NotFound(err) { + continue + } + + if err != nil { + return err + } + + return fmt.Errorf("Global Accelerator Custom Routing Listener %s still exists", rs.Primary.ID) + } + return nil + } +} + func testAccCustomRoutingListenerConfig_basic(rName string) string { return fmt.Sprintf(` resource "aws_globalaccelerator_custom_routing_accelerator" "test" { From 7ed48f227d0c6cf71f833ab3d2ce662e81f7a4bb Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 12:05:46 -0400 Subject: [PATCH 27/38] r/aws_globalaccelerator_custom_routing_listener: Tidy up acceptance tests. Acceptance test output: % make testacc TESTARGS='-run=TestAccGlobalAcceleratorCustomRoutingListener_' PKG=globalaccelerator ACCTEST_PARALLELISM=2 ==> Checking that code complies with gofmt requirements... TF_ACC=1 go test ./internal/service/globalaccelerator/... -v -count 1 -parallel 2 -run=TestAccGlobalAcceleratorCustomRoutingListener_ -timeout 180m === RUN TestAccGlobalAcceleratorCustomRoutingListener_basic === PAUSE TestAccGlobalAcceleratorCustomRoutingListener_basic === RUN TestAccGlobalAcceleratorCustomRoutingListener_disappears === PAUSE TestAccGlobalAcceleratorCustomRoutingListener_disappears === CONT TestAccGlobalAcceleratorCustomRoutingListener_basic === CONT TestAccGlobalAcceleratorCustomRoutingListener_disappears --- PASS: TestAccGlobalAcceleratorCustomRoutingListener_disappears (127.17s) --- PASS: TestAccGlobalAcceleratorCustomRoutingListener_basic (161.18s) PASS ok github.com/hashicorp/terraform-provider-aws/internal/service/globalaccelerator 169.708s --- .../custom_routing_listener_test.go | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/internal/service/globalaccelerator/custom_routing_listener_test.go b/internal/service/globalaccelerator/custom_routing_listener_test.go index a2be5987c787..6efd6e2f1f0b 100644 --- a/internal/service/globalaccelerator/custom_routing_listener_test.go +++ b/internal/service/globalaccelerator/custom_routing_listener_test.go @@ -30,12 +30,16 @@ func TestAccGlobalAcceleratorCustomRoutingListener_basic(t *testing.T) { { Config: testAccCustomRoutingListenerConfig_basic(rName), Check: resource.ComposeAggregateTestCheckFunc( - testAccCheckCustomRoutingListenerExists(ctx, rName, &v), + testAccCheckCustomRoutingListenerExists(ctx, resourceName, &v), resource.TestCheckResourceAttr(resourceName, "port_range.#", "2"), - resource.TestCheckResourceAttr(resourceName, "port_range.0.from_port", "443"), - resource.TestCheckResourceAttr(resourceName, "port_range.0.to_port", "443"), - resource.TestCheckResourceAttr(resourceName, "port_range.1.from_port", "10000"), - resource.TestCheckResourceAttr(resourceName, "port_range.1.to_port", "30000"), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "port_range.*", map[string]string{ + "from_port": "443", + "to_port": "443", + }), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "port_range.*", map[string]string{ + "from_port": "10000", + "to_port": "30000", + }), ), }, { @@ -62,7 +66,7 @@ func TestAccGlobalAcceleratorCustomRoutingListener_disappears(t *testing.T) { { Config: testAccCustomRoutingListenerConfig_basic(rName), Check: resource.ComposeTestCheckFunc( - testAccCheckCustomRoutingListenerExists(ctx, rName, &v), + testAccCheckCustomRoutingListenerExists(ctx, resourceName, &v), acctest.CheckResourceDisappears(ctx, acctest.Provider, tfglobalaccelerator.ResourceCustomRoutingListener(), resourceName), ), ExpectNonEmptyPlan: true, @@ -130,12 +134,12 @@ resource "aws_globalaccelerator_custom_routing_accelerator" "test" { resource "aws_globalaccelerator_custom_routing_listener" "test" { accelerator_arn = aws_globalaccelerator_custom_routing_accelerator.test.id - port_range = { + port_range { from_port = 443 to_port = 443 } - port_range = { + port_range { from_port = 10000 to_port = 30000 } From 12e9379d4b91cbd1fd18add69100b000301176ab Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 13:06:25 -0400 Subject: [PATCH 28/38] r/aws_globalaccelerator_custom_routing_accelerator: Add documentation. --- ...r_custom_routing_accelerator.html.markdown | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 website/docs/r/globalaccelerator_custom_routing_accelerator.html.markdown diff --git a/website/docs/r/globalaccelerator_custom_routing_accelerator.html.markdown b/website/docs/r/globalaccelerator_custom_routing_accelerator.html.markdown new file mode 100644 index 000000000000..b58b5e75213d --- /dev/null +++ b/website/docs/r/globalaccelerator_custom_routing_accelerator.html.markdown @@ -0,0 +1,79 @@ +--- +subcategory: "Global Accelerator" +layout: "aws" +page_title: "AWS: aws_globalaccelerator_custom_routing_accelerator" +description: |- + Provides a Global Accelerator custom routing accelerator. +--- + +# Resource: aws_globalaccelerator_custom_routing_accelerator + +Creates a Global Accelerator custom routing accelerator. + +## Example Usage + +```terraform +resource "aws_globalaccelerator_custom_routing_accelerator" "example" { + name = "Example" + ip_address_type = "IPV4" + ip_addresses = ["1.2.3.4"] + enabled = true + + attributes { + flow_logs_enabled = true + flow_logs_s3_bucket = "example-bucket" + flow_logs_s3_prefix = "flow-logs/" + } +} +``` + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) The name of a custom routing accelerator. +* `ip_address_type` - (Optional) The IP address type that an accelerator supports. For a custom routing accelerator, the value must be `"IPV4"`. +* `ip_addresses` - (Optional) The IP addresses to use for BYOIP accelerators. If not specified, the service assigns IP addresses. Valid values: 1 or 2 IPv4 addresses. +* `enabled` - (Optional) Indicates whether the accelerator is enabled. Defaults to `true`. Valid values: `true`, `false`. +* `attributes` - (Optional) The attributes of the accelerator. Fields documented below. +* `tags` - (Optional) A map of tags to assign to the resource. If configured with a provider [`default_tags` configuration block](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#default_tags-configuration-block) present, tags with matching keys will overwrite those defined at the provider-level. + +**attributes** supports the following attributes: + +* `flow_logs_enabled` - (Optional) Indicates whether flow logs are enabled. Defaults to `false`. Valid values: `true`, `false`. +* `flow_logs_s3_bucket` - (Optional) The name of the Amazon S3 bucket for the flow logs. Required if `flow_logs_enabled` is `true`. +* `flow_logs_s3_prefix` - (Optional) The prefix for the location in the Amazon S3 bucket for the flow logs. Required if `flow_logs_enabled` is `true`. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - The Amazon Resource Name (ARN) of the custom accelerator. +* `dns_name` - The DNS name of the accelerator. For example, `a5d53ff5ee6bca4ce.awsglobalaccelerator.com`. +* `hosted_zone_id` -- The Global Accelerator Route 53 zone ID that can be used to + route an [Alias Resource Record Set][1] to the Global Accelerator. This attribute + is simply an alias for the zone ID `Z2BJ6XQ5FK7U4H`. +* `ip_sets` - IP address set associated with the accelerator. +* `tags_all` - A map of tags assigned to the resource, including those inherited from the provider [`default_tags` configuration block](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#default_tags-configuration-block). + +**ip_sets** exports the following attributes: + +* `ip_addresses` - A list of IP addresses in the IP address set. +* `ip_family` - The type of IP addresses included in this IP set. + +[1]: https://docs.aws.amazon.com/Route53/latest/APIReference/API_AliasTarget.html + +## Timeouts + +[Configuration options](https://developer.hashicorp.com/terraform/language/resources/syntax#operation-timeouts): + +* `create` - (Default `30m`) +* `update` - (Default `30m`) + +## Import + +Global Accelerator custom routing accelerators can be imported using the `arn`, e.g., + +``` +$ terraform import aws_globalaccelerator_custom_routing_accelerator.example arn:aws:globalaccelerator::111111111111:accelerator/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +``` From d5313f9027a6e1d410719db175d9206308e1aabc Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 13:08:31 -0400 Subject: [PATCH 29/38] d/aws_globalaccelerator_custom_routing_accelerator: Add documentation. --- ...r_custom_routing_accelerator.html.markdown | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 website/docs/d/globalaccelerator_custom_routing_accelerator.html.markdown diff --git a/website/docs/d/globalaccelerator_custom_routing_accelerator.html.markdown b/website/docs/d/globalaccelerator_custom_routing_accelerator.html.markdown new file mode 100644 index 000000000000..ca118d94f812 --- /dev/null +++ b/website/docs/d/globalaccelerator_custom_routing_accelerator.html.markdown @@ -0,0 +1,44 @@ +--- +subcategory: "Global Accelerator" +layout: "aws" +page_title: "AWS: aws_globalaccelerator_custom_routing_accelerator" +description: |- + Provides a Global Accelerator custom routing accelerator data source. +--- + +# Data Source: aws_globalaccelerator_custom_routing_accelerator + +Provides information about a Global Accelerator custom routing accelerator. + +## Example Usage + +```terraform +variable "accelerator_arn" { + type = string + default = "" +} + +variable "accelerator_name" { + type = string + default = "" +} + +data "aws_globalaccelerator_custom_routing_accelerator" "example" { + arn = var.accelerator_arn + name = var.accelerator_name +} +``` + +## Argument Reference + +The following arguments are supported: + +* `arn` - (Optional) Full ARN of the custom routing accelerator. +* `name` - (Optional) Unique name of the custom routing accelerator. + +~> **NOTE:** When both `arn` and `name` are specified, `arn` takes precedence. + +## Attributes Reference + +See the [`aws_globalaccelerator_custom_routing_accelerator` resource](/docs/providers/aws/r/globalaccelerator_custom_routing_accelerator.html) for details on the +returned attributes - they are identical. From 8da69c53ef334c49628177dc032241a0bbc4e9bb Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 13:23:49 -0400 Subject: [PATCH 30/38] r/aws_globalaccelerator_custom_routing_listener: Add documentation. --- ...ator_custom_routing_listener.html.markdown | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 website/docs/r/globalaccelerator_custom_routing_listener.html.markdown diff --git a/website/docs/r/globalaccelerator_custom_routing_listener.html.markdown b/website/docs/r/globalaccelerator_custom_routing_listener.html.markdown new file mode 100644 index 000000000000..9da500402a00 --- /dev/null +++ b/website/docs/r/globalaccelerator_custom_routing_listener.html.markdown @@ -0,0 +1,70 @@ +--- +subcategory: "Global Accelerator" +layout: "aws" +page_title: "AWS: aws_globalaccelerator_custom_routing_listener" +description: |- + Provides a Global Accelerator custom routing listener. +--- + +# Resource: aws_globalaccelerator_custom_routing_listener + +Provides a Global Accelerator custom routing listener. + +## Example Usage + +```terraform +resource "aws_globalaccelerator_custom_routing_accelerator" "example" { + name = "Example" + ip_address_type = "IPV4" + enabled = true + + attributes { + flow_logs_enabled = true + flow_logs_s3_bucket = "example-bucket" + flow_logs_s3_prefix = "flow-logs/" + } +} + +resource "aws_globalaccelerator_custom_routing_listener" "example" { + accelerator_arn = aws_globalaccelerator_custom_routing_accelerator.example.id + + port_range { + from_port = 80 + to_port = 80 + } +} +``` + +## Argument Reference + +The following arguments are supported: + +* `accelerator_arn` - (Required) The Amazon Resource Name (ARN) of a custom routing accelerator. +* `port_range` - (Optional) The list of port ranges for the connections from clients to the accelerator. Fields documented below. + +**port_range** supports the following attributes: + +* `from_port` - (Optional) The first port in the range of ports, inclusive. +* `to_port` - (Optional) The last port in the range of ports, inclusive. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - The Amazon Resource Name (ARN) of the custom routing listener. + +## Timeouts + +[Configuration options](https://developer.hashicorp.com/terraform/language/resources/syntax#operation-timeouts): + +* `create` - (Default `30m`) +* `update` - (Default `30m`) +* `delete` - (Default `30m`) + +## Import + +Global Accelerator custom routing listeners can be imported using the `id`, e.g., + +``` +$ terraform import aws_globalaccelerator_custom_routing_listener.example arn:aws:globalaccelerator::111111111111:accelerator/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/listener/xxxxxxxx +``` From eef3b423d5f0dab01580b2ed73b3e3cda7220f37 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 13:39:37 -0400 Subject: [PATCH 31/38] r/aws_globalaccelerator_custom_routing_endpoint_group: Add documentation. --- ...ustom_routing_endpoint_group.html.markdown | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 website/docs/r/globalaccelerator_custom_routing_endpoint_group.html.markdown diff --git a/website/docs/r/globalaccelerator_custom_routing_endpoint_group.html.markdown b/website/docs/r/globalaccelerator_custom_routing_endpoint_group.html.markdown new file mode 100644 index 000000000000..583578df5acc --- /dev/null +++ b/website/docs/r/globalaccelerator_custom_routing_endpoint_group.html.markdown @@ -0,0 +1,71 @@ +--- +subcategory: "Global Accelerator" +layout: "aws" +page_title: "AWS: aws_globalaccelerator_custom_routing_endpoint_group" +description: |- + Provides a Global Accelerator custom routing endpoint group. +--- + +# Resource: aws_globalaccelerator_custom_routing_endpoint_group + +Provides a Global Accelerator custom routing endpoint group. + +## Example Usage + +```terraform +resource "aws_globalaccelerator_custom_routing_endpoint_group" "example" { + listener_arn = aws_globalaccelerator_custom_routing_listener.example.id + + destination_configuration { + from_port = 80 + to_port = 8080 + protocols = ["TCP"] + } + + endpoint_configuration { + endpoint_id = aws_subnet.example.id + } +} +``` + +## Argument Reference + +The following arguments are supported: + +* `listener_arn` - (Required) The Amazon Resource Name (ARN) of the custom routing listener. +* `destination_configuration` - (Required) The port ranges and protocols for all endpoints in a custom routing endpoint group to accept client traffic on. Fields documented below. +* `endpoint_configuration` - (Optional) The list of endpoint objects. Fields documented below. +* `endpoint_group_region` (Optional) - The name of the AWS Region where the custom routing endpoint group is located. + +**destination_configuration** supports the following attributes: + +* `from_port` - (Required) The first port, inclusive, in the range of ports for the endpoint group that is associated with a custom routing accelerator. +* `protocols` - (Required) The protocol for the endpoint group that is associated with a custom routing accelerator. The protocol can be either `"TCP"` or `"UDP"`. +* `to_port` - (Required) The last port, inclusive, in the range of ports for the endpoint group that is associated with a custom routing accelerator. + +**endpoint_configuration** supports the following attributes: + +* `endpoint_id` - (Optional) An ID for the endpoint. For custom routing accelerators, this is the virtual private cloud (VPC) subnet ID. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - The Amazon Resource Name (ARN) of the custom routing endpoint group. +* `arn` - The Amazon Resource Name (ARN) of the custom routing endpoint group. + +## Timeouts + +[Configuration options](https://developer.hashicorp.com/terraform/language/resources/syntax#operation-timeouts): + +* `create` - (Default `30m`) +* `update` - (Default `30m`) +* `delete` - (Default `30m`) + +## Import + +Global Accelerator custom routing endpoint groups can be imported using the `id`, e.g., + +``` +$ terraform import aws_globalaccelerator_custom_routing_endpoint_group.example arn:aws:globalaccelerator::111111111111:accelerator/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/listener/xxxxxxx/endpoint-group/xxxxxxxx +``` From 48aa92b002d42499388fac80471b51efecede08d Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 14:35:52 -0400 Subject: [PATCH 32/38] r/aws_globalaccelerator_custom_routing_endpoint_group: Tidy up acceptance tests. Acceptance test output: % make testacc TESTARGS='-run=TestAccGlobalAcceleratorCustomRoutingEndpointGroup_' PKG=globalaccelerator ACCTEST_PARALLELISM=2 ==> Checking that code complies with gofmt requirements... TF_ACC=1 go test ./internal/service/globalaccelerator/... -v -count 1 -parallel 2 -run=TestAccGlobalAcceleratorCustomRoutingEndpointGroup_ -timeout 180m === RUN TestAccGlobalAcceleratorCustomRoutingEndpointGroup_basic === PAUSE TestAccGlobalAcceleratorCustomRoutingEndpointGroup_basic === RUN TestAccGlobalAcceleratorCustomRoutingEndpointGroup_disappears === PAUSE TestAccGlobalAcceleratorCustomRoutingEndpointGroup_disappears === CONT TestAccGlobalAcceleratorCustomRoutingEndpointGroup_basic === CONT TestAccGlobalAcceleratorCustomRoutingEndpointGroup_disappears --- PASS: TestAccGlobalAcceleratorCustomRoutingEndpointGroup_disappears (170.89s) --- PASS: TestAccGlobalAcceleratorCustomRoutingEndpointGroup_basic (184.21s) PASS ok github.com/hashicorp/terraform-provider-aws/internal/service/globalaccelerator 190.387s --- .../custom_routing_endpoint_group.go | 154 +++++++++++++----- .../custom_routing_endpoint_group_test.go | 16 +- 2 files changed, 124 insertions(+), 46 deletions(-) diff --git a/internal/service/globalaccelerator/custom_routing_endpoint_group.go b/internal/service/globalaccelerator/custom_routing_endpoint_group.go index ec23c198c219..ce135e1cd2c2 100644 --- a/internal/service/globalaccelerator/custom_routing_endpoint_group.go +++ b/internal/service/globalaccelerator/custom_routing_endpoint_group.go @@ -42,7 +42,7 @@ func ResourceCustomRoutingEndpointGroup() *schema.Resource { }, "destination_configuration": { Type: schema.TypeSet, - Optional: true, + Required: true, ForceNew: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ @@ -53,7 +53,7 @@ func ResourceCustomRoutingEndpointGroup() *schema.Resource { }, "protocols": { Type: schema.TypeSet, - Optional: true, + Required: true, Elem: &schema.Schema{ Type: schema.TypeString, ValidateFunc: validation.StringInSlice(globalaccelerator.CustomRoutingProtocol_Values(), false), @@ -104,13 +104,10 @@ func resourceCustomRoutingEndpointGroupCreate(ctx context.Context, d *schema.Res region := meta.(*conns.AWSClient).Region input := &globalaccelerator.CreateCustomRoutingEndpointGroupInput{ - EndpointGroupRegion: aws.String(region), - IdempotencyToken: aws.String(resource.UniqueId()), - ListenerArn: aws.String(d.Get("listener_arn").(string)), - } - - if v, ok := d.GetOk("destination_configuration"); ok { - input.DestinationConfigurations = expandCustomRoutingDestinationConfigurations(v.(*schema.Set).List()) + DestinationConfigurations: expandCustomRoutingDestinationConfigurations(d.Get("destination_configuration").(*schema.Set).List()), + EndpointGroupRegion: aws.String(region), + IdempotencyToken: aws.String(resource.UniqueId()), + ListenerArn: aws.String(d.Get("listener_arn").(string)), } output, err := conn.CreateCustomRoutingEndpointGroupWithContext(ctx, input) @@ -245,14 +242,36 @@ func findCustomRoutingEndpointGroup(ctx context.Context, conn *globalaccelerator return output.EndpointGroup, nil } -func expandCustomRoutingDestinationConfigurations(configurations []interface{}) []*globalaccelerator.CustomRoutingDestinationConfiguration { - if len(configurations) == 0 { +func expandCustomRoutingEndpointDestinationConfiguration(tfMap map[string]interface{}) *globalaccelerator.CustomRoutingDestinationConfiguration { + if tfMap == nil { + return nil + } + + apiObject := &globalaccelerator.CustomRoutingDestinationConfiguration{} + + if v, ok := tfMap["from_port"].(int); ok && v != 0 { + apiObject.FromPort = aws.Int64(int64(v)) + } + + if v, ok := tfMap["protocols"].(*schema.Set); ok { + apiObject.Protocols = flex.ExpandStringSet(v) + } + + if v, ok := tfMap["to_port"].(int); ok && v != 0 { + apiObject.ToPort = aws.Int64(int64(v)) + } + + return apiObject +} + +func expandCustomRoutingDestinationConfigurations(tfList []interface{}) []*globalaccelerator.CustomRoutingDestinationConfiguration { + if len(tfList) == 0 { return nil } var apiObjects []*globalaccelerator.CustomRoutingDestinationConfiguration - for _, tfMapRaw := range configurations { + for _, tfMapRaw := range tfList { tfMap, ok := tfMapRaw.(map[string]interface{}) if !ok { @@ -271,69 +290,114 @@ func expandCustomRoutingDestinationConfigurations(configurations []interface{}) return apiObjects } -func expandCustomRoutingEndpointDestinationConfiguration(tfMap map[string]interface{}) *globalaccelerator.CustomRoutingDestinationConfiguration { +func expandCustomRoutingEndpointConfiguration(tfMap map[string]interface{}) *globalaccelerator.CustomRoutingEndpointConfiguration { if tfMap == nil { return nil } - apiObject := &globalaccelerator.CustomRoutingDestinationConfiguration{} + apiObject := &globalaccelerator.CustomRoutingEndpointConfiguration{} - if v, ok := tfMap["from_port"].(int64); ok { - apiObject.FromPort = aws.Int64(v) + if v, ok := tfMap["endpoint_id"].(string); ok && v != "" { + apiObject.EndpointId = aws.String(v) } - if v, ok := tfMap["to_port"].(int64); ok { - apiObject.ToPort = aws.Int64(v) + return apiObject +} + +func expandCustomRoutingEndpointConfigurations(tfList []interface{}) []*globalaccelerator.CustomRoutingEndpointConfiguration { + if len(tfList) == 0 { + return nil } - if v, ok := tfMap["protocols"].(*schema.Set); ok { - apiObject.Protocols = flex.ExpandStringSet(v) + var apiObjects []*globalaccelerator.CustomRoutingEndpointConfiguration + + for _, tfMapRaw := range tfList { + tfMap, ok := tfMapRaw.(map[string]interface{}) + + if !ok { + continue + } + + apiObject := expandCustomRoutingEndpointConfiguration(tfMap) + + if apiObject == nil { + continue + } + + apiObjects = append(apiObjects, apiObject) } - return apiObject + return apiObjects } -func expandCustomRoutingEndpointConfigurations(configurations []interface{}) []*globalaccelerator.CustomRoutingEndpointConfiguration { - out := make([]*globalaccelerator.CustomRoutingEndpointConfiguration, len(configurations)) +func flattenCustomRoutingDestinationDescription(apiObject *globalaccelerator.CustomRoutingDestinationDescription) map[string]interface{} { + if apiObject == nil { + return nil + } + + tfMap := map[string]interface{}{} - for i, raw := range configurations { - configuration := raw.(map[string]interface{}) - m := globalaccelerator.CustomRoutingEndpointConfiguration{} + if v := apiObject.FromPort; v != nil { + tfMap["from_port"] = aws.Int64Value(v) + } - m.EndpointId = aws.String(configuration["endpoint_id"].(string)) + if v := apiObject.Protocols; v != nil { + tfMap["protocols"] = aws.StringValueSlice(v) + } - out[i] = &m + if v := apiObject.ToPort; v != nil { + tfMap["to_port"] = aws.Int64Value(v) } - return out + return tfMap } -func flattenCustomRoutingEndpointDescriptions(configurations []*globalaccelerator.CustomRoutingEndpointDescription) []interface{} { - out := make([]interface{}, len(configurations)) +func flattenCustomRoutingDestinationDescriptions(apiObjects []*globalaccelerator.CustomRoutingDestinationDescription) []interface{} { + if len(apiObjects) == 0 { + return nil + } - for i, configuration := range configurations { - m := make(map[string]interface{}) + var tfList []interface{} - m["endpoint_id"] = aws.StringValue(configuration.EndpointId) + for _, apiObject := range apiObjects { + if apiObject == nil { + continue + } + + tfList = append(tfList, flattenCustomRoutingDestinationDescription(apiObject)) + } + + return tfList +} + +func flattenCustomRoutingEndpointDescription(apiObject *globalaccelerator.CustomRoutingEndpointDescription) map[string]interface{} { + if apiObject == nil { + return nil + } - out[i] = m + tfMap := map[string]interface{}{} + + if v := apiObject.EndpointId; v != nil { + tfMap["endpoint_id"] = aws.StringValue(v) } - return out + return tfMap } -func flattenCustomRoutingDestinationDescriptions(configurations []*globalaccelerator.CustomRoutingDestinationDescription) []interface{} { - out := make([]interface{}, len(configurations)) +func flattenCustomRoutingEndpointDescriptions(apiObjects []*globalaccelerator.CustomRoutingEndpointDescription) []interface{} { + if len(apiObjects) == 0 { + return nil + } - for i, configuration := range configurations { - m := make(map[string]interface{}) + var tfList []interface{} - m["from_port"] = int(aws.Int64Value(configuration.FromPort)) - m["to_port"] = int(aws.Int64Value(configuration.ToPort)) - m["protocols"] = aws.StringValueSlice(configuration.Protocols) + for _, apiObject := range apiObjects { + if apiObject == nil { + continue + } - out[i] = m + tfList = append(tfList, flattenCustomRoutingEndpointDescription(apiObject)) } - return out + return tfList } diff --git a/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go b/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go index 63dcb29cfb4a..74913ccbf3af 100644 --- a/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go +++ b/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go @@ -31,6 +31,14 @@ func TestAccGlobalAcceleratorCustomRoutingEndpointGroup_basic(t *testing.T) { Config: testAccCustomRoutingEndpointGroupConfig_basic(rName), Check: resource.ComposeAggregateTestCheckFunc( testAccCheckCustomRoutingEndpointGroupExists(ctx, resourceName, &v), + resource.TestCheckResourceAttrSet(resourceName, "arn"), + resource.TestCheckResourceAttr(resourceName, "destination_configuration.#", "1"), + resource.TestCheckResourceAttr(resourceName, "destination_configuration.0.from_port", "443"), + resource.TestCheckResourceAttr(resourceName, "destination_configuration.0.protocols.#", "1"), + resource.TestCheckTypeSetElemAttr(resourceName, "destination_configuration.0.protocols.*", "TCP"), + resource.TestCheckResourceAttr(resourceName, "destination_configuration.0.to_port", "8443"), + resource.TestCheckResourceAttr(resourceName, "endpoint_configuration.#", "0"), + resource.TestCheckResourceAttrSet(resourceName, "endpoint_group_region"), ), }, { @@ -125,7 +133,7 @@ resource "aws_globalaccelerator_custom_routing_accelerator" "test" { resource "aws_globalaccelerator_custom_routing_listener" "test" { accelerator_arn = aws_globalaccelerator_custom_routing_accelerator.test.id - port_range = { + port_range { from_port = 443 to_port = 443 } @@ -133,6 +141,12 @@ resource "aws_globalaccelerator_custom_routing_listener" "test" { resource "aws_globalaccelerator_custom_routing_endpoint_group" "test" { listener_arn = aws_globalaccelerator_custom_routing_listener.test.id + + destination_configuration { + from_port = 443 + to_port = 8443 + protocols = ["TCP"] + } } `, rName) } From b80414a9ae60b66a4cf8df89b15f53c9f07e0dcd Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 15:41:38 -0400 Subject: [PATCH 33/38] r/aws_globalaccelerator_custom_routing_endpoint_group: Add 'TestAccGlobalAcceleratorCustomRoutingEndpointGroup_endpointConfiguration'. Acceptance test output: % make testacc TESTARGS='-run=TestAccGlobalAcceleratorCustomRoutingEndpointGroup_endpointConfiguration' PKG=globalaccelerator ACCTEST_PARALLELISM=2 ==> Checking that code complies with gofmt requirements... TF_ACC=1 go test ./internal/service/globalaccelerator/... -v -count 1 -parallel 2 -run=TestAccGlobalAcceleratorCustomRoutingEndpointGroup_endpointConfiguration -timeout 180m === RUN TestAccGlobalAcceleratorCustomRoutingEndpointGroup_endpointConfiguration === PAUSE TestAccGlobalAcceleratorCustomRoutingEndpointGroup_endpointConfiguration === CONT TestAccGlobalAcceleratorCustomRoutingEndpointGroup_endpointConfiguration --- PASS: TestAccGlobalAcceleratorCustomRoutingEndpointGroup_endpointConfiguration (649.93s) PASS ok github.com/hashicorp/terraform-provider-aws/internal/service/globalaccelerator 655.144s --- .../custom_routing_endpoint_group_test.go | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go b/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go index 74913ccbf3af..ace72e0a3e63 100644 --- a/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go +++ b/internal/service/globalaccelerator/custom_routing_endpoint_group_test.go @@ -74,6 +74,42 @@ func TestAccGlobalAcceleratorCustomRoutingEndpointGroup_disappears(t *testing.T) }) } +func TestAccGlobalAcceleratorCustomRoutingEndpointGroup_endpointConfiguration(t *testing.T) { + ctx := acctest.Context(t) + var v globalaccelerator.CustomRoutingEndpointGroup + resourceName := "aws_globalaccelerator_custom_routing_endpoint_group.test" + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) }, + ErrorCheck: acctest.ErrorCheck(t, globalaccelerator.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckCustomRoutingEndpointGroupDestroy(ctx), + Steps: []resource.TestStep{ + { + Config: testAccCustomRoutingEndpointGroupConfig_endpointConfiguration(rName), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckCustomRoutingEndpointGroupExists(ctx, resourceName, &v), + resource.TestCheckResourceAttrSet(resourceName, "arn"), + resource.TestCheckResourceAttr(resourceName, "destination_configuration.#", "1"), + resource.TestCheckResourceAttr(resourceName, "destination_configuration.0.from_port", "8080"), + resource.TestCheckResourceAttr(resourceName, "destination_configuration.0.protocols.#", "1"), + resource.TestCheckTypeSetElemAttr(resourceName, "destination_configuration.0.protocols.*", "TCP"), + resource.TestCheckResourceAttr(resourceName, "destination_configuration.0.to_port", "8081"), + resource.TestCheckResourceAttr(resourceName, "endpoint_configuration.#", "1"), + resource.TestCheckResourceAttrSet(resourceName, "endpoint_configuration.0.endpoint_id"), + resource.TestCheckResourceAttrSet(resourceName, "endpoint_group_region"), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + func testAccCheckCustomRoutingEndpointGroupExists(ctx context.Context, n string, v *globalaccelerator.CustomRoutingEndpointGroup) resource.TestCheckFunc { return func(s *terraform.State) error { conn := acctest.Provider.Meta().(*conns.AWSClient).GlobalAcceleratorConn() @@ -150,3 +186,62 @@ resource "aws_globalaccelerator_custom_routing_endpoint_group" "test" { } `, rName) } + +func testAccCustomRoutingEndpointGroupConfig_endpointConfiguration(rName string) string { + return acctest.ConfigCompose(acctest.ConfigAvailableAZsNoOptInDefaultExclude(), fmt.Sprintf(` +resource "aws_globalaccelerator_custom_routing_accelerator" "test" { + name = %[1]q +} + +resource "aws_globalaccelerator_custom_routing_listener" "test" { + accelerator_arn = aws_globalaccelerator_custom_routing_accelerator.test.id + + port_range { + from_port = 1 + to_port = 65534 + } +} + +resource "aws_globalaccelerator_custom_routing_endpoint_group" "test" { + listener_arn = aws_globalaccelerator_custom_routing_listener.test.id + + destination_configuration { + from_port = 8080 + to_port = 8081 + protocols = ["TCP"] + } + + endpoint_configuration { + endpoint_id = aws_subnet.test.id + } + + depends_on = [aws_internet_gateway.test] +} + +resource "aws_vpc" "test" { + cidr_block = "10.0.0.0/16" + + tags = { + Name = %[1]q + } +} + +resource "aws_subnet" "test" { + vpc_id = aws_vpc.test.id + availability_zone = data.aws_availability_zones.available.names[0] + cidr_block = "10.0.0.0/28" + + tags = { + Name = %[1]q + } +} + +resource "aws_internet_gateway" "test" { + vpc_id = aws_vpc.test.id + + tags = { + Name = %[1]q + } +} +`, rName)) +} From 2e9259c1d6d45fee97332e6d48ba1d5e29e9785d Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 17:16:28 -0400 Subject: [PATCH 34/38] Fix terrafmt error. --- .../custom_routing_accelerator_data_source_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go b/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go index b739e457faf3..e207f7110621 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go @@ -60,7 +60,7 @@ resource "aws_globalaccelerator_custom_routing_accelerator" "test" { data "aws_globalaccelerator_custom_routing_accelerator" "test_by_arn" { arn = aws_globalaccelerator_custom_routing_accelerator.test.id } - + data "aws_globalaccelerator_custom_routing_accelerator" "test_by_name" { name = aws_globalaccelerator_custom_routing_accelerator.test.name } From ff5ae45c48daf87932a5d273b964e833e9654d3d Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 17:17:49 -0400 Subject: [PATCH 35/38] Fix golangci-lint 'contextcheck'. --- .../service/globalaccelerator/custom_routing_accelerator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/service/globalaccelerator/custom_routing_accelerator.go b/internal/service/globalaccelerator/custom_routing_accelerator.go index 61296c041c22..2cd02b51ce21 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator.go @@ -128,7 +128,7 @@ func resourceCustomRoutingAcceleratorCreate(ctx context.Context, d *schema.Resou var diags diag.Diagnostics conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig - tags := defaultTagsConfig.MergeTags(tftags.New(context.TODO(), d.Get("tags").(map[string]interface{}))) + tags := defaultTagsConfig.MergeTags(tftags.New(ctx, d.Get("tags").(map[string]interface{}))) name := d.Get("name").(string) input := &globalaccelerator.CreateCustomRoutingAcceleratorInput{ From 5ad799bd516d5bdbb3a6c15f9ea5a5d3be997b8c Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 17:19:37 -0400 Subject: [PATCH 36/38] Fix semgrep 'dgryski.semgrep-go.errnilcheck.err-nil-check'. --- .../globalaccelerator/custom_routing_accelerator_test.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_test.go b/internal/service/globalaccelerator/custom_routing_accelerator_test.go index 80bac913716a..ce7b494a7279 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_test.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_test.go @@ -178,11 +178,7 @@ func testAccCheckCustomRoutingAcceleratorExists(ctx context.Context, n string) r _, err := tfglobalaccelerator.FindCustomRoutingAcceleratorByARN(ctx, conn, rs.Primary.ID) - if err != nil { - return err - } - - return nil + return err } } From de4d2c823b0121d8363bc2eda3351ca08c7581bf Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 17:21:18 -0400 Subject: [PATCH 37/38] Fix semgrep 'ci.semgrep.migrate.aws-api-context'. --- .../custom_routing_accelerator_data_source.go | 2 +- .../globalaccelerator/custom_routing_endpoint_group.go | 6 +++--- .../service/globalaccelerator/custom_routing_listener.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go b/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go index 33d306621cea..89daabf4b105 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_data_source.go @@ -93,7 +93,7 @@ func dataSourceCustomRoutingAcceleratorRead(ctx context.Context, d *schema.Resou var results []*globalaccelerator.CustomRoutingAccelerator - err := conn.ListCustomRoutingAcceleratorsPages(&globalaccelerator.ListCustomRoutingAcceleratorsInput{}, func(page *globalaccelerator.ListCustomRoutingAcceleratorsOutput, lastPage bool) bool { + err := conn.ListCustomRoutingAcceleratorsPagesWithContext(ctx, &globalaccelerator.ListCustomRoutingAcceleratorsInput{}, func(page *globalaccelerator.ListCustomRoutingAcceleratorsOutput, lastPage bool) bool { if page == nil { return !lastPage } diff --git a/internal/service/globalaccelerator/custom_routing_endpoint_group.go b/internal/service/globalaccelerator/custom_routing_endpoint_group.go index ce135e1cd2c2..867e1a39355c 100644 --- a/internal/service/globalaccelerator/custom_routing_endpoint_group.go +++ b/internal/service/globalaccelerator/custom_routing_endpoint_group.go @@ -129,12 +129,12 @@ func resourceCustomRoutingEndpointGroupCreate(ctx context.Context, d *schema.Res } if v, ok := d.GetOk("endpoint_configuration"); ok { - optsEndpoints := &globalaccelerator.AddCustomRoutingEndpointsInput{ + input := &globalaccelerator.AddCustomRoutingEndpointsInput{ EndpointGroupArn: aws.String(d.Id()), EndpointConfigurations: expandCustomRoutingEndpointConfigurations(v.(*schema.Set).List()), } - _, err := conn.AddCustomRoutingEndpoints(optsEndpoints) + _, err := conn.AddCustomRoutingEndpointsWithContext(ctx, input) if err != nil { return sdkdiag.AppendErrorf(diags, "adding Global Accelerator Custom Routing Endpoint Group (%s) endpoints: %s", d.Id(), err) @@ -188,7 +188,7 @@ func resourceCustomRoutingEndpointGroupDelete(ctx context.Context, d *schema.Res conn := meta.(*conns.AWSClient).GlobalAcceleratorConn() log.Printf("[DEBUG] Deleting Global Accelerator Custom Routing Endpoint Group (%s)", d.Id()) - _, err := conn.DeleteCustomRoutingEndpointGroup(&globalaccelerator.DeleteCustomRoutingEndpointGroupInput{ + _, err := conn.DeleteCustomRoutingEndpointGroupWithContext(ctx, &globalaccelerator.DeleteCustomRoutingEndpointGroupInput{ EndpointGroupArn: aws.String(d.Id()), }) diff --git a/internal/service/globalaccelerator/custom_routing_listener.go b/internal/service/globalaccelerator/custom_routing_listener.go index 28cc33b74b7f..d5cf3f5a511d 100644 --- a/internal/service/globalaccelerator/custom_routing_listener.go +++ b/internal/service/globalaccelerator/custom_routing_listener.go @@ -153,7 +153,7 @@ func resourceCustomRoutingListenerDelete(ctx context.Context, d *schema.Resource acceleratorARN := d.Get("accelerator_arn").(string) log.Printf("[DEBUG] Deleting Global Accelerator Custom Routing Listener (%s)", d.Id()) - _, err := conn.DeleteCustomRoutingListener(&globalaccelerator.DeleteCustomRoutingListenerInput{ + _, err := conn.DeleteCustomRoutingListenerWithContext(ctx, &globalaccelerator.DeleteCustomRoutingListenerInput{ ListenerArn: aws.String(d.Id()), }) From dcaf607575315f135041962a71e108d57fe55a7b Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 29 Mar 2023 17:27:01 -0400 Subject: [PATCH 38/38] Fix golangci-lint 'whitespace'. --- .../custom_routing_accelerator_data_source_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go b/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go index e207f7110621..14496af150ed 100644 --- a/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go +++ b/internal/service/globalaccelerator/custom_routing_accelerator_data_source_test.go @@ -48,7 +48,6 @@ func TestAccGlobalAcceleratorCustomRoutingAcceleratorDataSource_basic(t *testing }, }, }) - } func testAccCustomRoutingAcceleratorDataSourceConfig_basic(rName string) string {