github.com/leeprovoost/terraform@v0.6.10-0.20160119085442-96f3f76118e7/builtin/providers/aws/resource_aws_vpc_endpoint.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/aws/aws-sdk-go/aws"
     8  	"github.com/aws/aws-sdk-go/aws/awserr"
     9  	"github.com/aws/aws-sdk-go/service/ec2"
    10  	"github.com/hashicorp/terraform/helper/hashcode"
    11  	"github.com/hashicorp/terraform/helper/schema"
    12  )
    13  
    14  func resourceAwsVpcEndpoint() *schema.Resource {
    15  	return &schema.Resource{
    16  		Create: resourceAwsVPCEndpointCreate,
    17  		Read:   resourceAwsVPCEndpointRead,
    18  		Update: resourceAwsVPCEndpointUpdate,
    19  		Delete: resourceAwsVPCEndpointDelete,
    20  		Schema: map[string]*schema.Schema{
    21  			"policy": &schema.Schema{
    22  				Type:      schema.TypeString,
    23  				Optional:  true,
    24  				Computed:  true,
    25  				StateFunc: normalizeJson,
    26  			},
    27  			"vpc_id": &schema.Schema{
    28  				Type:     schema.TypeString,
    29  				Required: true,
    30  				ForceNew: true,
    31  			},
    32  			"service_name": &schema.Schema{
    33  				Type:     schema.TypeString,
    34  				Required: true,
    35  				ForceNew: true,
    36  			},
    37  			"route_table_ids": &schema.Schema{
    38  				Type:     schema.TypeSet,
    39  				Optional: true,
    40  				Elem:     &schema.Schema{Type: schema.TypeString},
    41  				Set: func(v interface{}) int {
    42  					return hashcode.String(v.(string))
    43  				},
    44  			},
    45  		},
    46  	}
    47  }
    48  
    49  func resourceAwsVPCEndpointCreate(d *schema.ResourceData, meta interface{}) error {
    50  	conn := meta.(*AWSClient).ec2conn
    51  	input := &ec2.CreateVpcEndpointInput{
    52  		VpcId:         aws.String(d.Get("vpc_id").(string)),
    53  		RouteTableIds: expandStringList(d.Get("route_table_ids").(*schema.Set).List()),
    54  		ServiceName:   aws.String(d.Get("service_name").(string)),
    55  	}
    56  
    57  	if v, ok := d.GetOk("policy"); ok {
    58  		policy := normalizeJson(v)
    59  		input.PolicyDocument = aws.String(policy)
    60  	}
    61  
    62  	log.Printf("[DEBUG] Creating VPC Endpoint: %#v", input)
    63  	output, err := conn.CreateVpcEndpoint(input)
    64  	if err != nil {
    65  		return fmt.Errorf("Error creating VPC Endpoint: %s", err)
    66  	}
    67  	log.Printf("[DEBUG] VPC Endpoint %q created.", *output.VpcEndpoint.VpcEndpointId)
    68  
    69  	d.SetId(*output.VpcEndpoint.VpcEndpointId)
    70  
    71  	return resourceAwsVPCEndpointRead(d, meta)
    72  }
    73  
    74  func resourceAwsVPCEndpointRead(d *schema.ResourceData, meta interface{}) error {
    75  	conn := meta.(*AWSClient).ec2conn
    76  	input := &ec2.DescribeVpcEndpointsInput{
    77  		VpcEndpointIds: []*string{aws.String(d.Id())},
    78  	}
    79  
    80  	log.Printf("[DEBUG] Reading VPC Endpoint: %q", d.Id())
    81  	output, err := conn.DescribeVpcEndpoints(input)
    82  
    83  	if err != nil {
    84  		ec2err, ok := err.(awserr.Error)
    85  		if !ok {
    86  			return fmt.Errorf("Error reading VPC Endpoint: %s", err.Error())
    87  		}
    88  
    89  		if ec2err.Code() == "InvalidVpcEndpointId.NotFound" {
    90  			return nil
    91  		}
    92  
    93  		return fmt.Errorf("Error reading VPC Endpoint: %s", err.Error())
    94  	}
    95  
    96  	if len(output.VpcEndpoints) != 1 {
    97  		return fmt.Errorf("There's no unique VPC Endpoint, but %d endpoints: %#v",
    98  			len(output.VpcEndpoints), output.VpcEndpoints)
    99  	}
   100  
   101  	vpce := output.VpcEndpoints[0]
   102  
   103  	d.Set("vpc_id", vpce.VpcId)
   104  	d.Set("policy", normalizeJson(*vpce.PolicyDocument))
   105  	d.Set("service_name", vpce.ServiceName)
   106  	if err := d.Set("route_table_ids", aws.StringValueSlice(vpce.RouteTableIds)); err != nil {
   107  		return err
   108  	}
   109  
   110  	return nil
   111  }
   112  
   113  func resourceAwsVPCEndpointUpdate(d *schema.ResourceData, meta interface{}) error {
   114  	conn := meta.(*AWSClient).ec2conn
   115  	input := &ec2.ModifyVpcEndpointInput{
   116  		VpcEndpointId: aws.String(d.Id()),
   117  	}
   118  
   119  	if d.HasChange("route_table_ids") {
   120  		o, n := d.GetChange("route_table_ids")
   121  		os := o.(*schema.Set)
   122  		ns := n.(*schema.Set)
   123  
   124  		add := expandStringList(ns.Difference(os).List())
   125  		if len(add) > 0 {
   126  			input.AddRouteTableIds = add
   127  		}
   128  
   129  		remove := expandStringList(os.Difference(ns).List())
   130  		if len(remove) > 0 {
   131  			input.RemoveRouteTableIds = remove
   132  		}
   133  	}
   134  
   135  	if d.HasChange("policy") {
   136  		policy := normalizeJson(d.Get("policy"))
   137  		input.PolicyDocument = aws.String(policy)
   138  	}
   139  
   140  	log.Printf("[DEBUG] Updating VPC Endpoint: %#v", input)
   141  	_, err := conn.ModifyVpcEndpoint(input)
   142  	if err != nil {
   143  		return fmt.Errorf("Error updating VPC Endpoint: %s", err)
   144  	}
   145  	log.Printf("[DEBUG] VPC Endpoint %q updated", input.VpcEndpointId)
   146  
   147  	return resourceAwsVPCEndpointRead(d, meta)
   148  }
   149  
   150  func resourceAwsVPCEndpointDelete(d *schema.ResourceData, meta interface{}) error {
   151  	conn := meta.(*AWSClient).ec2conn
   152  	input := &ec2.DeleteVpcEndpointsInput{
   153  		VpcEndpointIds: []*string{aws.String(d.Id())},
   154  	}
   155  
   156  	log.Printf("[DEBUG] Deleting VPC Endpoint: %#v", input)
   157  	_, err := conn.DeleteVpcEndpoints(input)
   158  
   159  	if err != nil {
   160  		ec2err, ok := err.(awserr.Error)
   161  		if !ok {
   162  			return fmt.Errorf("Error deleting VPC Endpoint: %s", err.Error())
   163  		}
   164  
   165  		if ec2err.Code() == "InvalidVpcEndpointId.NotFound" {
   166  			log.Printf("[DEBUG] VPC Endpoint %q is already gone", d.Id())
   167  		} else {
   168  			return fmt.Errorf("Error deleting VPC Endpoint: %s", err.Error())
   169  		}
   170  	}
   171  
   172  	log.Printf("[DEBUG] VPC Endpoint %q deleted", d.Id())
   173  	d.SetId("")
   174  
   175  	return nil
   176  }