github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/aws/resource_aws_route_table_association.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "log" 6 "time" 7 8 "github.com/aws/aws-sdk-go/aws" 9 "github.com/aws/aws-sdk-go/aws/awserr" 10 "github.com/aws/aws-sdk-go/service/ec2" 11 "github.com/hashicorp/terraform/helper/resource" 12 "github.com/hashicorp/terraform/helper/schema" 13 ) 14 15 func resourceAwsRouteTableAssociation() *schema.Resource { 16 return &schema.Resource{ 17 Create: resourceAwsRouteTableAssociationCreate, 18 Read: resourceAwsRouteTableAssociationRead, 19 Update: resourceAwsRouteTableAssociationUpdate, 20 Delete: resourceAwsRouteTableAssociationDelete, 21 22 Schema: map[string]*schema.Schema{ 23 "subnet_id": &schema.Schema{ 24 Type: schema.TypeString, 25 Required: true, 26 ForceNew: true, 27 }, 28 29 "route_table_id": &schema.Schema{ 30 Type: schema.TypeString, 31 Required: true, 32 }, 33 }, 34 } 35 } 36 37 func resourceAwsRouteTableAssociationCreate(d *schema.ResourceData, meta interface{}) error { 38 conn := meta.(*AWSClient).ec2conn 39 40 log.Printf( 41 "[INFO] Creating route table association: %s => %s", 42 d.Get("subnet_id").(string), 43 d.Get("route_table_id").(string)) 44 45 associationOpts := ec2.AssociateRouteTableInput{ 46 RouteTableId: aws.String(d.Get("route_table_id").(string)), 47 SubnetId: aws.String(d.Get("subnet_id").(string)), 48 } 49 50 var resp *ec2.AssociateRouteTableOutput 51 var err error 52 err = resource.Retry(2*time.Minute, func() *resource.RetryError { 53 resp, err = conn.AssociateRouteTable(&associationOpts) 54 if err != nil { 55 if awsErr, ok := err.(awserr.Error); ok { 56 if awsErr.Code() == "InvalidRouteTableID.NotFound" { 57 return resource.RetryableError(awsErr) 58 } 59 } 60 return resource.NonRetryableError(err) 61 } 62 return nil 63 }) 64 if err != nil { 65 return err 66 } 67 68 // Set the ID and return 69 d.SetId(*resp.AssociationId) 70 log.Printf("[INFO] Association ID: %s", d.Id()) 71 72 return nil 73 } 74 75 func resourceAwsRouteTableAssociationRead(d *schema.ResourceData, meta interface{}) error { 76 conn := meta.(*AWSClient).ec2conn 77 78 // Get the routing table that this association belongs to 79 rtRaw, _, err := resourceAwsRouteTableStateRefreshFunc( 80 conn, d.Get("route_table_id").(string))() 81 if err != nil { 82 return err 83 } 84 if rtRaw == nil { 85 return nil 86 } 87 rt := rtRaw.(*ec2.RouteTable) 88 89 // Inspect that the association exists 90 found := false 91 for _, a := range rt.Associations { 92 if *a.RouteTableAssociationId == d.Id() { 93 found = true 94 d.Set("subnet_id", *a.SubnetId) 95 break 96 } 97 } 98 99 if !found { 100 // It seems it doesn't exist anymore, so clear the ID 101 d.SetId("") 102 } 103 104 return nil 105 } 106 107 func resourceAwsRouteTableAssociationUpdate(d *schema.ResourceData, meta interface{}) error { 108 conn := meta.(*AWSClient).ec2conn 109 110 log.Printf( 111 "[INFO] Creating route table association: %s => %s", 112 d.Get("subnet_id").(string), 113 d.Get("route_table_id").(string)) 114 115 req := &ec2.ReplaceRouteTableAssociationInput{ 116 AssociationId: aws.String(d.Id()), 117 RouteTableId: aws.String(d.Get("route_table_id").(string)), 118 } 119 resp, err := conn.ReplaceRouteTableAssociation(req) 120 121 if err != nil { 122 ec2err, ok := err.(awserr.Error) 123 if ok && ec2err.Code() == "InvalidAssociationID.NotFound" { 124 // Not found, so just create a new one 125 return resourceAwsRouteTableAssociationCreate(d, meta) 126 } 127 128 return err 129 } 130 131 // Update the ID 132 d.SetId(*resp.NewAssociationId) 133 log.Printf("[INFO] Association ID: %s", d.Id()) 134 135 return nil 136 } 137 138 func resourceAwsRouteTableAssociationDelete(d *schema.ResourceData, meta interface{}) error { 139 conn := meta.(*AWSClient).ec2conn 140 141 log.Printf("[INFO] Deleting route table association: %s", d.Id()) 142 _, err := conn.DisassociateRouteTable(&ec2.DisassociateRouteTableInput{ 143 AssociationId: aws.String(d.Id()), 144 }) 145 if err != nil { 146 ec2err, ok := err.(awserr.Error) 147 if ok && ec2err.Code() == "InvalidAssociationID.NotFound" { 148 return nil 149 } 150 151 return fmt.Errorf("Error deleting route table association: %s", err) 152 } 153 154 return nil 155 }