From c60a963908dcd5445783fd126da1ad454479a418 Mon Sep 17 00:00:00 2001 From: clint shryock Date: Thu, 12 Nov 2015 15:15:47 -0600 Subject: [PATCH 1/2] providers/aws: Retry deleting IAM Server Cert on dependency violation This will retry deleting a server cert if it throws an error about being in use with an ELB (that we've likely just deleted) Includes test for ELB+IAM SSL cert bug dependency violation --- builtin/providers/aws/resource_aws_elb.go | 20 ++- .../providers/aws/resource_aws_elb_test.go | 121 ++++++++++++++++++ .../resource_aws_iam_server_certificate.go | 22 +++- builtin/providers/aws/structure.go | 36 +++--- builtin/providers/aws/structure_test.go | 56 ++++---- 5 files changed, 202 insertions(+), 53 deletions(-) diff --git a/builtin/providers/aws/resource_aws_elb.go b/builtin/providers/aws/resource_aws_elb.go index 5ff3b3b28a22..63794fd2ece6 100644 --- a/builtin/providers/aws/resource_aws_elb.go +++ b/builtin/providers/aws/resource_aws_elb.go @@ -6,6 +6,7 @@ import ( "log" "regexp" "strings" + "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" @@ -256,8 +257,23 @@ func resourceAwsElbCreate(d *schema.ResourceData, meta interface{}) error { } log.Printf("[DEBUG] ELB create configuration: %#v", elbOpts) - if _, err := elbconn.CreateLoadBalancer(elbOpts); err != nil { - return fmt.Errorf("Error creating ELB: %s", err) + err = resource.Retry(1*time.Minute, func() error { + _, err := elbconn.CreateLoadBalancer(elbOpts) + + if err != nil { + if awsErr, ok := err.(awserr.Error); ok { + // Check for IAM SSL Cert error, eventual consistancy issue + if awsErr.Code() == "CertificateNotFound" { + return fmt.Errorf("[WARN] Error creating ELB Listener with SSL Cert, retrying: %s", err) + } + } + return resource.RetryError{Err: err} + } + return nil + }) + + if err != nil { + return err } // Assign the elb's unique identifier for use later diff --git a/builtin/providers/aws/resource_aws_elb_test.go b/builtin/providers/aws/resource_aws_elb_test.go index 6dad03e568e2..6ccc5cd66f8e 100644 --- a/builtin/providers/aws/resource_aws_elb_test.go +++ b/builtin/providers/aws/resource_aws_elb_test.go @@ -179,6 +179,33 @@ func TestAccAWSELB_tags(t *testing.T) { }) } +func TestAccAWSELB_iam_server_cert(t *testing.T) { + var conf elb.LoadBalancerDescription + // var td elb.TagDescription + testCheck := func(*terraform.State) error { + if len(conf.ListenerDescriptions) != 1 { + return fmt.Errorf( + "TestAccAWSELB_iam_server_cert expected 1 listener, got %d", + len(conf.ListenerDescriptions)) + } + return nil + } + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSELBDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccELBIAMServerCertConfig, + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSELBExists("aws_elb.bar", &conf), + testCheck, + ), + }, + }, + }) +} + func testAccLoadTags(conf *elb.LoadBalancerDescription, td *elb.TagDescription) resource.TestCheckFunc { return func(s *terraform.State) error { conn := testAccProvider.Meta().(*AWSClient).elbconn @@ -1001,3 +1028,97 @@ resource "aws_security_group" "bar" { } } ` + +// This IAM Server config is lifted from +// builtin/providers/aws/resource_aws_iam_server_certificate_test.go +var testAccELBIAMServerCertConfig = ` +resource "aws_iam_server_certificate" "test_cert" { + name = "terraform-test-cert" + certificate_body = < Date: Thu, 12 Nov 2015 16:20:54 -0600 Subject: [PATCH 2/2] add debugging statements to add/remove listeners --- builtin/providers/aws/resource_aws_elb.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/builtin/providers/aws/resource_aws_elb.go b/builtin/providers/aws/resource_aws_elb.go index 63794fd2ece6..faf0b8addb74 100644 --- a/builtin/providers/aws/resource_aws_elb.go +++ b/builtin/providers/aws/resource_aws_elb.go @@ -410,6 +410,7 @@ func resourceAwsElbUpdate(d *schema.ResourceData, meta interface{}) error { LoadBalancerPorts: ports, } + log.Printf("[DEBUG] ELB Delete Listeners opts: %s", deleteListenersOpts) _, err := elbconn.DeleteLoadBalancerListeners(deleteListenersOpts) if err != nil { return fmt.Errorf("Failure removing outdated ELB listeners: %s", err) @@ -422,6 +423,7 @@ func resourceAwsElbUpdate(d *schema.ResourceData, meta interface{}) error { Listeners: add, } + log.Printf("[DEBUG] ELB Create Listeners opts: %s", createListenersOpts) _, err := elbconn.CreateLoadBalancerListeners(createListenersOpts) if err != nil { return fmt.Errorf("Failure adding new or updated ELB listeners: %s", err)