6 "github.com/hashicorp/terraform/helper/resource"
7 "github.com/hashicorp/terraform/terraform"
8 "github.com/mailgun/mailgun-go/v3"
15 type fullDomain struct {
16 domainResponse mailgun.DomainResponse
17 domainConnection mailgun.DomainConnection
18 domainTracking mailgun.DomainTracking
20 credentials []mailgun.Credential
23 func getFullDomain(mg *mailgun.MailgunImpl, domainName string) (*fullDomain, error) {
24 ctx, cancel := context.WithTimeout(context.Background(), time.Second*30)
26 mg = mailgun.NewMailgun(domainName, mg.APIKey())
30 domain.domainResponse, err = mg.GetDomain(ctx, domainName)
32 return nil, fmt.Errorf("Error Getting mailgun domain Details for %s: Error: %s", domainName, err)
35 domain.domainConnection, err = mg.GetDomainConnection(ctx, domainName)
37 return nil, fmt.Errorf("Error Getting mailgun domain connection Details for %s: Error: %s", domainName, err)
40 domain.domainTracking, err = mg.GetDomainTracking(ctx, domainName)
42 return nil, fmt.Errorf("Error Getting mailgun domain tracking Details for %s: Error: %s", domainName, err)
45 ipAddress, err := mg.ListDomainIPS(ctx)
47 return nil, fmt.Errorf("Error Getting mailgun domain ips2 for %s: Error: %s", domainName, err)
49 ips := make([]string, len(ipAddress))
50 for i, r := range ipAddress {
54 domain.ipAddress = ips
55 domain.credentials, err = ListCredentials(domainName, mg.APIKey())
57 return nil, fmt.Errorf("Error Getting mailgun credentials for %s: Error: %s", domainName, err)
62 func TestAccMailgunDomain_basic(t *testing.T) {
65 resource.Test(t, resource.TestCase{
66 PreCheck: func() { testAccPreCheck(t) },
67 Providers: testAccProviders,
68 CheckDestroy: testAccDomainCheckDestroy(&domain),
69 Steps: []resource.TestStep{
71 Config: interpolateTerraformTemplateDomain(testAccDomainConfig_basic),
72 Check: resource.ComposeTestCheckFunc(
73 testAccDomainCheckExists("mailgun_domain.exemple", &domain),
74 testAccDomainCheckAttributes("mailgun_domain.exemple", &domain),
81 func TestAccMailgunDomain_withUpdate(t *testing.T) {
84 resource.Test(t, resource.TestCase{
85 PreCheck: func() { testAccPreCheck(t) },
86 Providers: testAccProviders,
87 CheckDestroy: testAccDomainCheckDestroy(&domain),
88 Steps: []resource.TestStep{
90 Config: interpolateTerraformTemplateDomain(testAccDomainConfig_basic),
91 Check: resource.ComposeTestCheckFunc(
92 testAccDomainCheckExists("mailgun_domain.exemple", &domain),
93 testAccDomainCheckAttributes("mailgun_domain.exemple", &domain),
98 Config: interpolateTerraformTemplateDomain(testAccDomainConfig_update),
99 Check: resource.ComposeTestCheckFunc(
100 testAccDomainCheckExists("mailgun_domain.exemple", &domain),
101 testAccDomainCheckAttributes("mailgun_domain.exemple", &domain),
109 func TestDomain_importBasic(t *testing.T) {
110 var domain fullDomain
112 resource.Test(t, resource.TestCase{
113 PreCheck: func() { testAccPreCheck(t) },
114 Providers: testAccProviders,
115 CheckDestroy: testAccDomainCheckDestroy(&domain),
116 Steps: []resource.TestStep{
118 Config: interpolateTerraformTemplateDomain(testAccDomainConfig_import),
119 Check: resource.ComposeTestCheckFunc(
120 testAccDomainCheckExists("mailgun_domain.exemple",&domain),
124 ResourceName: "mailgun_domain.exemple",
126 ImportStateVerify: true,
132 func testAccDomainCheckExists(rn string, domain *fullDomain) resource.TestCheckFunc {
133 return func(s *terraform.State) error {
134 rs, ok := s.RootModule().Resources[rn]
136 return fmt.Errorf("resource not found: %s", rn)
139 if rs.Primary.ID == "" {
140 return fmt.Errorf("domainID not set")
143 mg := testAccProvider.Meta().(*mailgun.MailgunImpl)
145 domainId := rs.Primary.ID
147 gotDomain, err := getFullDomain(mg, domainId)
149 return fmt.Errorf("error getting domain: %s", err)
158 func testAccDomainCheckAttributes(rn string, domain *fullDomain) resource.TestCheckFunc {
159 return func(s *terraform.State) error {
160 attrs := s.RootModule().Resources[rn].Primary.Attributes
162 check := func(key, stateValue, domainValue string) error {
163 if domainValue != stateValue {
164 return fmt.Errorf("different values for %s in state (%s) and in mailgun (%s)",
165 key, stateValue, domainValue)
170 for key, value := range attrs {
175 err = check(key, value, domain.domainResponse.Domain.Name)
176 case "smtp_password":
177 err = check(key, value, domain.domainResponse.Domain.SMTPPassword)
179 err = check(key, value, domain.domainResponse.Domain.SMTPLogin)
181 err = check(key, value, strconv.FormatBool(domain.domainResponse.Domain.Wildcard))
183 err = check(key, value, domain.domainResponse.Domain.State)
184 case "open_tracking_settings_active":
185 err = check(key, value, strconv.FormatBool(domain.domainTracking.Open.Active))
186 case "click_tracking_settings_active":
187 err = check(key, value, strconv.FormatBool(domain.domainTracking.Click.Active))
188 case "unsubscribe_tracking_settings_active":
189 err = check(key, value, strconv.FormatBool(domain.domainTracking.Unsubscribe.Active))
190 case "unsubscribe_tracking_settings_html_footer":
191 err = check(key, value, domain.domainTracking.Unsubscribe.HTMLFooter)
192 case "unsubscribe_tracking_settings_text_footer":
193 err = check(key, value, domain.domainTracking.Unsubscribe.TextFooter)
194 case "skip_verification":
195 err = check(key, value, strconv.FormatBool(domain.domainConnection.SkipVerification))
197 err = check(key, value, strconv.FormatBool(domain.domainConnection.RequireTLS))
207 func testAccDomainCheckDestroy(domain *fullDomain) resource.TestCheckFunc {
208 return func(s *terraform.State) error {
209 mg := testAccProvider.Meta().(*mailgun.MailgunImpl)
210 ctx, cancel := context.WithTimeout(context.Background(), time.Second*30)
213 _, err := mg.GetDomain(ctx, domain.domainResponse.Domain.Name)
215 return fmt.Errorf("domain still exists")
222 func interpolateTerraformTemplateDomain(template string) string {
225 if v := os.Getenv("MAILGUN_DOMAIN"); v != "" {
229 return fmt.Sprintf(template, domainName)
232 const testAccDomainConfig_basic = `
233 resource "mailgun_domain" "exemple" {
238 password="adfshfjqdskjhgfksdgfkqgfk"
243 const testAccDomainConfig_update = `
244 resource "mailgun_domain" "exemple" {
248 password="adfshfjqdskjhgfksdgfkqgfk"
253 const testAccDomainConfig_import = `
254 resource "mailgun_domain" "exemple" {