aws/r53: Refactoring - decouple waiters into functions

This commit is contained in:
Radek Simko 2016-08-16 19:34:45 +01:00
parent 945de8e57f
commit cc239439fc
No known key found for this signature in database
GPG Key ID: 4DECCD28668ED457

View File

@ -269,13 +269,38 @@ func resourceAwsRoute53RecordCreate(d *schema.ResourceData, meta interface{}) er
log.Printf("[DEBUG] Creating resource records for zone: %s, name: %s\n\n%s", log.Printf("[DEBUG] Creating resource records for zone: %s, name: %s\n\n%s",
zone, *rec.Name, req) zone, *rec.Name, req)
respRaw, err := changeRoute53RecordSet(conn, req)
changeInfo := respRaw.(*route53.ChangeResourceRecordSetsOutput).ChangeInfo
// Generate an ID
vars := []string{
zone,
strings.ToLower(d.Get("name").(string)),
d.Get("type").(string),
}
if v, ok := d.GetOk("set_identifier"); ok {
vars = append(vars, v.(string))
}
d.SetId(strings.Join(vars, "_"))
err = waitForRoute53RecordSetToSync(conn, cleanChangeID(*changeInfo.Id))
if err != nil {
return err
}
return resourceAwsRoute53RecordRead(d, meta)
}
func changeRoute53RecordSet(conn *route53.Route53, input *route53.ChangeResourceRecordSetsInput) (interface{}, error) {
wait := resource.StateChangeConf{ wait := resource.StateChangeConf{
Pending: []string{"rejected"}, Pending: []string{"rejected"},
Target: []string{"accepted"}, Target: []string{"accepted"},
Timeout: 5 * time.Minute, Timeout: 5 * time.Minute,
MinTimeout: 1 * time.Second, MinTimeout: 1 * time.Second,
Refresh: func() (interface{}, string, error) { Refresh: func() (interface{}, string, error) {
resp, err := conn.ChangeResourceRecordSets(req) resp, err := conn.ChangeResourceRecordSets(input)
if err != nil { if err != nil {
if r53err, ok := err.(awserr.Error); ok { if r53err, ok := err.(awserr.Error); ok {
if r53err.Code() == "PriorRequestNotComplete" { if r53err.Code() == "PriorRequestNotComplete" {
@ -292,26 +317,11 @@ func resourceAwsRoute53RecordCreate(d *schema.ResourceData, meta interface{}) er
}, },
} }
respRaw, err := wait.WaitForState() return wait.WaitForState()
if err != nil { }
return err
}
changeInfo := respRaw.(*route53.ChangeResourceRecordSetsOutput).ChangeInfo
// Generate an ID func waitForRoute53RecordSetToSync(conn *route53.Route53, requestId string) error {
vars := []string{ wait := resource.StateChangeConf{
zone,
strings.ToLower(d.Get("name").(string)),
d.Get("type").(string),
}
if v, ok := d.GetOk("set_identifier"); ok {
vars = append(vars, v.(string))
}
d.SetId(strings.Join(vars, "_"))
// Wait until we are done
wait = resource.StateChangeConf{
Delay: 30 * time.Second, Delay: 30 * time.Second,
Pending: []string{"PENDING"}, Pending: []string{"PENDING"},
Target: []string{"INSYNC"}, Target: []string{"INSYNC"},
@ -319,17 +329,13 @@ func resourceAwsRoute53RecordCreate(d *schema.ResourceData, meta interface{}) er
MinTimeout: 5 * time.Second, MinTimeout: 5 * time.Second,
Refresh: func() (result interface{}, state string, err error) { Refresh: func() (result interface{}, state string, err error) {
changeRequest := &route53.GetChangeInput{ changeRequest := &route53.GetChangeInput{
Id: aws.String(cleanChangeID(*changeInfo.Id)), Id: aws.String(requestId),
} }
return resourceAwsGoRoute53Wait(conn, changeRequest) return resourceAwsGoRoute53Wait(conn, changeRequest)
}, },
} }
_, err = wait.WaitForState() _, err := wait.WaitForState()
if err != nil { return err
return err
}
return resourceAwsRoute53RecordRead(d, meta)
} }
func resourceAwsRoute53RecordRead(d *schema.ResourceData, meta interface{}) error { func resourceAwsRoute53RecordRead(d *schema.ResourceData, meta interface{}) error {
@ -518,13 +524,18 @@ func resourceAwsRoute53RecordDelete(d *schema.ResourceData, meta interface{}) er
ChangeBatch: changeBatch, ChangeBatch: changeBatch,
} }
_, err = deleteRoute53RecordSet(conn, req)
return err
}
func deleteRoute53RecordSet(conn *route53.Route53, input *route53.ChangeResourceRecordSetsInput) (interface{}, error) {
wait := resource.StateChangeConf{ wait := resource.StateChangeConf{
Pending: []string{"rejected"}, Pending: []string{"rejected"},
Target: []string{"accepted"}, Target: []string{"accepted"},
Timeout: 5 * time.Minute, Timeout: 5 * time.Minute,
MinTimeout: 1 * time.Second, MinTimeout: 1 * time.Second,
Refresh: func() (interface{}, string, error) { Refresh: func() (interface{}, string, error) {
_, err := conn.ChangeResourceRecordSets(req) resp, err := conn.ChangeResourceRecordSets(input)
if err != nil { if err != nil {
if r53err, ok := err.(awserr.Error); ok { if r53err, ok := err.(awserr.Error); ok {
if r53err.Code() == "PriorRequestNotComplete" { if r53err.Code() == "PriorRequestNotComplete" {
@ -535,22 +546,18 @@ func resourceAwsRoute53RecordDelete(d *schema.ResourceData, meta interface{}) er
if r53err.Code() == "InvalidChangeBatch" { if r53err.Code() == "InvalidChangeBatch" {
// This means that the record is already gone. // This means that the record is already gone.
return 42, "accepted", nil return resp, "accepted", nil
} }
} }
return 42, "failure", err return 42, "failure", err
} }
return 42, "accepted", nil return resp, "accepted", nil
}, },
} }
if _, err := wait.WaitForState(); err != nil { return wait.WaitForState()
return err
}
return nil
} }
func resourceAwsRoute53RecordBuildSet(d *schema.ResourceData, zoneName string) (*route53.ResourceRecordSet, error) { func resourceAwsRoute53RecordBuildSet(d *schema.ResourceData, zoneName string) (*route53.ResourceRecordSet, error) {