From 2794a1c5abbe9f1963e91c0618132354c04ababa Mon Sep 17 00:00:00 2001 From: Christopher Tiwald Date: Tue, 28 Apr 2015 10:28:52 -0400 Subject: [PATCH] aws: Add support for aws_customer_gateway --- builtin/providers/aws/provider.go | 1 + .../aws/resource_aws_customer_gateway.go | 185 ++++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100644 builtin/providers/aws/resource_aws_customer_gateway.go diff --git a/builtin/providers/aws/provider.go b/builtin/providers/aws/provider.go index c3e07d559..9efc95a04 100644 --- a/builtin/providers/aws/provider.go +++ b/builtin/providers/aws/provider.go @@ -77,6 +77,7 @@ func Provider() terraform.ResourceProvider { ResourcesMap: map[string]*schema.Resource{ "aws_autoscaling_group": resourceAwsAutoscalingGroup(), "aws_app_cookie_stickiness_policy": resourceAwsAppCookieStickinessPolicy(), + "aws_customer_gateway": resourceAwsCustomerGateway(), "aws_db_instance": resourceAwsDbInstance(), "aws_db_parameter_group": resourceAwsDbParameterGroup(), "aws_db_security_group": resourceAwsDbSecurityGroup(), diff --git a/builtin/providers/aws/resource_aws_customer_gateway.go b/builtin/providers/aws/resource_aws_customer_gateway.go new file mode 100644 index 000000000..9c18a53d9 --- /dev/null +++ b/builtin/providers/aws/resource_aws_customer_gateway.go @@ -0,0 +1,185 @@ +package aws + +import ( + "fmt" + "log" + "time" + + "github.com/awslabs/aws-sdk-go/aws" + "github.com/awslabs/aws-sdk-go/service/ec2" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/helper/schema" +) + +func resourceAwsCustomerGateway() *schema.Resource { + return &schema.Resource{ + Create: resourceAwsCustomerGatewayCreate, + Read: resourceAwsCustomerGatewayRead, + Update: resourceAwsCustomerGatewayUpdate, + Delete: resourceAwsCustomerGatewayDelete, + + Schema: map[string]*schema.Schema{ + "bgp_asn": &schema.Schema{ + Type: schema.TypeInt, + Required: true, + ForceNew: true, + }, + + "ip_address": &schema.Schema{ + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + + "type": &schema.Schema{ + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + + "tags": tagsSchema(), + }, + } +} + +func resourceAwsCustomerGatewayCreate(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*AWSClient).ec2conn + + createOpts := &ec2.CreateCustomerGatewayInput{ + BGPASN: aws.Long(int64(d.Get("bgp_asn").(int))), + PublicIP: aws.String(d.Get("ip_address").(string)), + Type: aws.String(d.Get("type").(string)), + } + + // Create the Customer Gateway. + log.Printf("[DEBUG] Creating customer gateway") + resp, err := conn.CreateCustomerGateway(createOpts) + if err != nil { + return fmt.Errorf("Error creating customer gateway: %s", err) + } + + // Store the ID + customerGateway := resp.CustomerGateway + d.SetId(*customerGateway.CustomerGatewayID) + log.Printf("[INFO] Customer gateway ID: %s", *customerGateway.CustomerGatewayID) + + // Wait for the CustomerGateway to be available. + stateConf := &resource.StateChangeConf{ + Pending: []string{"pending"}, + Target: "available", + Refresh: customerGatewayRefreshFunc(conn, *customerGateway.CustomerGatewayID), + Timeout: 10 * time.Minute, + Delay: 10 * time.Second, + MinTimeout: 3 * time.Second, + } + + _, stateErr := stateConf.WaitForState() + if stateErr != nil { + return fmt.Errorf( + "Error waiting for customer gateway (%s) to become ready: %s", + *customerGateway.CustomerGatewayID, err) + } + + // Create tags. + if err := setTagsSDK(conn, d); err != nil { + return err + } + + return nil +} + +func customerGatewayRefreshFunc(conn *ec2.EC2, gatewayId string) resource.StateRefreshFunc { + return func() (interface{}, string, error) { + gatewayFilter := &ec2.Filter{ + Name: aws.String("customer-gateway-id"), + Values: []*string{aws.String(gatewayId)}, + } + + resp, err := conn.DescribeCustomerGateways(&ec2.DescribeCustomerGatewaysInput{ + Filters: []*ec2.Filter{gatewayFilter}, + }) + if err != nil { + if ec2err, ok := err.(aws.APIError); ok && ec2err.Code == "InvalidCustomerGatewayID.NotFound" { + resp = nil + } else { + log.Printf("Error on CustomerGatewayRefresh: %s", err) + return nil, "", err + } + } + + if resp == nil || len(resp.CustomerGateways) == 0 { + // handle consistency issues + return nil, "", nil + } + + gateway := resp.CustomerGateways[0] + return gateway, *gateway.State, nil + } +} + +func resourceAwsCustomerGatewayRead(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*AWSClient).ec2conn + + gatewayFilter := &ec2.Filter{ + Name: aws.String("customer-gateway-id"), + Values: []*string{aws.String(d.Id())}, + } + + resp, err := conn.DescribeCustomerGateways(&ec2.DescribeCustomerGatewaysInput{ + Filters: []*ec2.Filter{gatewayFilter}, + }) + if err != nil { + if ec2err, ok := err.(aws.APIError); ok && ec2err.Code == "InvalidCustomerGatewayID.NotFound" { + d.SetId("") + return nil + } else { + log.Printf("[ERROR] Error finding CustomerGateway: %s", err) + return err + } + } + + if len(resp.CustomerGateways) != 1 { + return fmt.Errorf("[ERROR] Error finding CustomerGateway: %s", d.Id()) + } + + customerGateway := resp.CustomerGateways[0] + d.Set("bgp_asn", customerGateway.BGPASN) + d.Set("ip_address", customerGateway.IPAddress) + d.Set("type", customerGateway.Type) + d.Set("tags", tagsToMapSDK(customerGateway.Tags)) + + return nil +} + +func resourceAwsCustomerGatewayUpdate(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*AWSClient).ec2conn + + // Update tags if required. + if err := setTagsSDK(conn, d); err != nil { + return err + } + + d.SetPartial("tags") + + return resourceAwsCustomerGatewayRead(d, meta) +} + +func resourceAwsCustomerGatewayDelete(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*AWSClient).ec2conn + + _, err := conn.DeleteCustomerGateway(&ec2.DeleteCustomerGatewayInput{ + CustomerGatewayID: aws.String(d.Id()), + }) + if err != nil { + if ec2err, ok := err.(aws.APIError); ok && ec2err.Code == "InvalidCustomerGatewayID.NotFound" { + d.SetId("") + return nil + } else { + log.Printf("[ERROR] Error deleting CustomerGateway: %s", err) + return err + } + } + + return nil +}