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