Skip to content

Commit

Permalink
resource/aws_ses_domain_mail_from: Prevent crash with deleted SES Dom…
Browse files Browse the repository at this point in the history
…ain Identity (#7883)

Reference: #7862

Output from acceptance testing before code update:

```
=== CONT  TestAccAWSSESDomainMailFrom_disappears_Identity
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x3e051ac]

goroutine 415 [running]:
github.com/terraform-providers/terraform-provider-aws/aws.resourceAwsSesDomainMailFromRead(0xc0009825b0, 0x4a444a0, 0xc0004cec00, 0xc0009825b0, 0x0)
	/Users/bflad/src/github.com/terraform-providers/terraform-provider-aws/aws/resource_aws_ses_domain_mail_from.go:87 +0x37c
```

Output from acceptance testing:

```
--- PASS: TestAccAWSSESDomainIdentity_disappears (9.03s)
--- PASS: TestAccAWSSESDomainMailFrom_disappears_Identity (10.38s)
--- PASS: TestAccAWSSESDomainMailFrom_disappears (13.55s)
--- PASS: TestAccAWSSESDomainMailFrom_behaviorOnMxFailure (21.04s)
--- PASS: TestAccAWSSESDomainMailFrom_basic (21.11s)
```
  • Loading branch information
bflad authored and nywilken committed Mar 14, 2019
1 parent a4bc72d commit d0eeb39
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 9 deletions.
36 changes: 36 additions & 0 deletions aws/resource_aws_ses_domain_identity_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,28 @@ func TestAccAWSSESDomainIdentity_basic(t *testing.T) {
})
}

func TestAccAWSSESDomainIdentity_disappears(t *testing.T) {
domain := fmt.Sprintf(
"%s.terraformtesting.com",
acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckAwsSESDomainIdentityDestroy,
Steps: []resource.TestStep{
{
Config: testAccAwsSESDomainIdentityConfig(domain),
Check: resource.ComposeTestCheckFunc(
testAccCheckAwsSESDomainIdentityExists("aws_ses_domain_identity.test"),
testAccCheckAwsSESDomainIdentityDisappears(domain),
),
ExpectNonEmptyPlan: true,
},
},
})
}

func TestAccAWSSESDomainIdentity_trailingPeriod(t *testing.T) {
domain := fmt.Sprintf(
"%s.terraformtesting.com.",
Expand Down Expand Up @@ -116,6 +138,20 @@ func testAccCheckAwsSESDomainIdentityExists(n string) resource.TestCheckFunc {
}
}

func testAccCheckAwsSESDomainIdentityDisappears(identity string) resource.TestCheckFunc {
return func(s *terraform.State) error {
conn := testAccProvider.Meta().(*AWSClient).sesConn

input := &ses.DeleteIdentityInput{
Identity: aws.String(identity),
}

_, err := conn.DeleteIdentity(input)

return err
}
}

func testAccCheckAwsSESDomainIdentityArn(n string, domain string) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs := s.RootModule().Resources[n]
Expand Down
24 changes: 15 additions & 9 deletions aws/resource_aws_ses_domain_mail_from.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,21 +73,27 @@ func resourceAwsSesDomainMailFromRead(d *schema.ResourceData, meta interface{})
}

out, err := conn.GetIdentityMailFromDomainAttributes(readOpts)

if err != nil {
log.Printf("error fetching MAIL FROM domain attributes for %s: %s", domainName, err)
return err
return fmt.Errorf("error fetching SES MAIL FROM domain attributes for %s: %s", domainName, err)
}

d.Set("domain", domainName)
if out == nil {
return fmt.Errorf("error fetching SES MAIL FROM domain attributes for %s: empty response", domainName)
}

if v, ok := out.MailFromDomainAttributes[domainName]; ok {
d.Set("behavior_on_mx_failure", v.BehaviorOnMXFailure)
d.Set("mail_from_domain", v.MailFromDomain)
} else {
d.Set("behavior_on_mx_failure", v.BehaviorOnMXFailure)
d.Set("mail_from_domain", "")
attributes, ok := out.MailFromDomainAttributes[domainName]

if !ok {
log.Printf("[WARN] SES Domain Identity (%s) not found, removing from state", domainName)
d.SetId("")
return nil
}

d.Set("behavior_on_mx_failure", attributes.BehaviorOnMXFailure)
d.Set("domain", domainName)
d.Set("mail_from_domain", attributes.MailFromDomain)

return nil
}

Expand Down
63 changes: 63 additions & 0 deletions aws/resource_aws_ses_domain_mail_from_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,54 @@ func TestAccAWSSESDomainMailFrom_basic(t *testing.T) {
})
}

func TestAccAWSSESDomainMailFrom_disappears(t *testing.T) {
domain := fmt.Sprintf(
"%s.terraformtesting.com",
acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
mailFromDomain := fmt.Sprintf("bounce.%s", domain)
resourceName := "aws_ses_domain_mail_from.test"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckSESDomainMailFromDestroy,
Steps: []resource.TestStep{
{
Config: testAccAwsSESDomainMailFromConfig(domain, mailFromDomain),
Check: resource.ComposeTestCheckFunc(
testAccCheckAwsSESDomainMailFromExists(resourceName),
testAccCheckAwsSESDomainMailFromDisappears(domain),
),
ExpectNonEmptyPlan: true,
},
},
})
}

func TestAccAWSSESDomainMailFrom_disappears_Identity(t *testing.T) {
domain := fmt.Sprintf(
"%s.terraformtesting.com",
acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
mailFromDomain := fmt.Sprintf("bounce.%s", domain)
resourceName := "aws_ses_domain_mail_from.test"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckSESDomainMailFromDestroy,
Steps: []resource.TestStep{
{
Config: testAccAwsSESDomainMailFromConfig(domain, mailFromDomain),
Check: resource.ComposeTestCheckFunc(
testAccCheckAwsSESDomainMailFromExists(resourceName),
testAccCheckAwsSESDomainIdentityDisappears(domain),
),
ExpectNonEmptyPlan: true,
},
},
})
}

func TestAccAWSSESDomainMailFrom_behaviorOnMxFailure(t *testing.T) {
domain := fmt.Sprintf(
"%s.terraformtesting.com",
Expand Down Expand Up @@ -142,6 +190,21 @@ func testAccCheckSESDomainMailFromDestroy(s *terraform.State) error {
return nil
}

func testAccCheckAwsSESDomainMailFromDisappears(identity string) resource.TestCheckFunc {
return func(s *terraform.State) error {
conn := testAccProvider.Meta().(*AWSClient).sesConn

input := &ses.SetIdentityMailFromDomainInput{
Identity: aws.String(identity),
MailFromDomain: nil,
}

_, err := conn.SetIdentityMailFromDomain(input)

return err
}
}

func testAccAwsSESDomainMailFromConfig(domain, mailFromDomain string) string {
return fmt.Sprintf(`
resource "aws_ses_domain_identity" "test" {
Expand Down

0 comments on commit d0eeb39

Please sign in to comment.