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