github.com/ndarilek/terraform@v0.3.8-0.20150320140257-d3135c1b2bac/builtin/providers/aws/resource_aws_vpc_peering_connection.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "log" 6 "time" 7 8 "github.com/hashicorp/aws-sdk-go/aws" 9 "github.com/hashicorp/aws-sdk-go/gen/ec2" 10 "github.com/hashicorp/terraform/helper/resource" 11 "github.com/hashicorp/terraform/helper/schema" 12 ) 13 14 func resourceAwsVpcPeeringConnection() *schema.Resource { 15 return &schema.Resource{ 16 Create: resourceAwsVpcPeeringCreate, 17 Read: resourceAwsVpcPeeringRead, 18 Update: resourceAwsVpcPeeringUpdate, 19 Delete: resourceAwsVpcPeeringDelete, 20 21 Schema: map[string]*schema.Schema{ 22 "peer_owner_id": &schema.Schema{ 23 Type: schema.TypeString, 24 Required: true, 25 ForceNew: true, 26 DefaultFunc: schema.EnvDefaultFunc("AWS_ACCOUNT_ID", nil), 27 }, 28 "peer_vpc_id": &schema.Schema{ 29 Type: schema.TypeString, 30 Required: true, 31 ForceNew: true, 32 }, 33 "vpc_id": &schema.Schema{ 34 Type: schema.TypeString, 35 Required: true, 36 ForceNew: true, 37 }, 38 "tags": tagsSchema(), 39 }, 40 } 41 } 42 43 func resourceAwsVpcPeeringCreate(d *schema.ResourceData, meta interface{}) error { 44 ec2conn := meta.(*AWSClient).ec2conn 45 46 // Create the vpc peering connection 47 createOpts := &ec2.CreateVPCPeeringConnectionRequest{ 48 PeerOwnerID: aws.String(d.Get("peer_owner_id").(string)), 49 PeerVPCID: aws.String(d.Get("peer_vpc_id").(string)), 50 VPCID: aws.String(d.Get("vpc_id").(string)), 51 } 52 log.Printf("[DEBUG] VpcPeeringCreate create config: %#v", createOpts) 53 resp, err := ec2conn.CreateVPCPeeringConnection(createOpts) 54 if err != nil { 55 return fmt.Errorf("Error creating vpc peering connection: %s", err) 56 } 57 58 // Get the ID and store it 59 rt := resp.VPCPeeringConnection 60 d.SetId(*rt.VPCPeeringConnectionID) 61 log.Printf("[INFO] Vpc Peering Connection ID: %s", d.Id()) 62 63 // Wait for the vpc peering connection to become available 64 log.Printf( 65 "[DEBUG] Waiting for vpc peering connection (%s) to become available", 66 d.Id()) 67 stateConf := &resource.StateChangeConf{ 68 Pending: []string{"pending"}, 69 Target: "ready", 70 Refresh: resourceAwsVpcPeeringConnectionStateRefreshFunc(ec2conn, d.Id()), 71 Timeout: 1 * time.Minute, 72 } 73 if _, err := stateConf.WaitForState(); err != nil { 74 return fmt.Errorf( 75 "Error waiting for vpc peering (%s) to become available: %s", 76 d.Id(), err) 77 } 78 79 return nil 80 } 81 82 func resourceAwsVpcPeeringRead(d *schema.ResourceData, meta interface{}) error { 83 ec2conn := meta.(*AWSClient).ec2conn 84 pcRaw, _, err := resourceAwsVpcPeeringConnectionStateRefreshFunc(ec2conn, d.Id())() 85 if err != nil { 86 return err 87 } 88 if pcRaw == nil { 89 d.SetId("") 90 return nil 91 } 92 93 pc := pcRaw.(*ec2.VPCPeeringConnection) 94 95 d.Set("peer_owner_id", pc.AccepterVPCInfo.OwnerID) 96 d.Set("peer_vpc_id", pc.AccepterVPCInfo.VPCID) 97 d.Set("vpc_id", pc.RequesterVPCInfo.VPCID) 98 d.Set("tags", tagsToMap(pc.Tags)) 99 100 return nil 101 } 102 103 func resourceAwsVpcPeeringUpdate(d *schema.ResourceData, meta interface{}) error { 104 ec2conn := meta.(*AWSClient).ec2conn 105 106 if err := setTags(ec2conn, d); err != nil { 107 return err 108 } else { 109 d.SetPartial("tags") 110 } 111 112 return resourceAwsRouteTableRead(d, meta) 113 } 114 115 func resourceAwsVpcPeeringDelete(d *schema.ResourceData, meta interface{}) error { 116 ec2conn := meta.(*AWSClient).ec2conn 117 118 _, err := ec2conn.DeleteVPCPeeringConnection( 119 &ec2.DeleteVPCPeeringConnectionRequest{ 120 VPCPeeringConnectionID: aws.String(d.Id()), 121 }) 122 return err 123 } 124 125 // resourceAwsVpcPeeringConnectionStateRefreshFunc returns a resource.StateRefreshFunc that is used to watch 126 // a VpcPeeringConnection. 127 func resourceAwsVpcPeeringConnectionStateRefreshFunc(conn *ec2.EC2, id string) resource.StateRefreshFunc { 128 return func() (interface{}, string, error) { 129 130 resp, err := conn.DescribeVPCPeeringConnections(&ec2.DescribeVPCPeeringConnectionsRequest{ 131 VPCPeeringConnectionIDs: []string{id}, 132 }) 133 if err != nil { 134 if ec2err, ok := err.(aws.APIError); ok && ec2err.Code == "InvalidVpcPeeringConnectionID.NotFound" { 135 resp = nil 136 } else { 137 log.Printf("Error on VpcPeeringConnectionStateRefresh: %s", err) 138 return nil, "", err 139 } 140 } 141 142 if resp == nil { 143 // Sometimes AWS just has consistency issues and doesn't see 144 // our instance yet. Return an empty state. 145 return nil, "", nil 146 } 147 148 pc := &resp.VPCPeeringConnections[0] 149 150 return pc, "ready", nil 151 } 152 }