Skip to content

Commit 48e8205

Browse files
authored
Fix regions update (#322)
1 parent d379ba4 commit 48e8205

4 files changed

Lines changed: 173 additions & 29 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.3.1 (June 28, 2024)
2+
BUGFIX
3+
* Fix issue with updating regions in record resource
4+
15
## 2.3.0 (June 18, 2024)
26
ENHANCEMENTS
37
* Adds support for redirect endpoints

ns1/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
)
2020

2121
var (
22-
clientVersion = "2.3.0"
22+
clientVersion = "2.3.1"
2323
providerUserAgent = "tf-ns1" + "/" + clientVersion
2424
defaultRetryMax = 3
2525
)

ns1/resource_record.go

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -449,9 +449,15 @@ func resourceDataToRecord(r *dns.Record, d *schema.ResourceData) error {
449449
}
450450
r.Filters = filters
451451
}
452-
if regions := d.Get("regions").(*schema.Set); regions.Len() > 0 {
452+
if regions := d.Get("regions").(*schema.Set); regions != nil {
453+
r.Regions = data.Regions{}
453454
for _, regionRaw := range regions.List() {
454455
region := regionRaw.(map[string]interface{})
456+
name := region["name"].(string)
457+
if name == "" {
458+
// silently ignore - the name is required but TF can append empty entries in the set
459+
continue
460+
}
455461
ns1R := data.Region{
456462
Meta: data.Meta{},
457463
}
@@ -465,21 +471,7 @@ func resourceDataToRecord(r *dns.Record, d *schema.ResourceData) error {
465471

466472
ns1R.Meta = *meta
467473
}
468-
r.Regions[region["name"].(string)] = ns1R
469-
}
470-
}
471-
472-
// Even though blocked_tags are not evaluated on GET, dual update logic is currently enforced on POST
473-
if _, tagsExist := d.GetOk("tags"); tagsExist == true {
474-
if _, blockedTagsExist := d.GetOk("blocked_tags"); blockedTagsExist == false {
475-
r.BlockedTags = []string{}
476-
log.Println("empty 'blocked tags' key added")
477-
}
478-
}
479-
if _, blockedTagsExist := d.GetOk("blocked_tags"); blockedTagsExist == true {
480-
if _, tagsExist := d.GetOk("tags"); tagsExist == false {
481-
r.Tags = map[string]string{}
482-
log.Println("empty 'tags' key added")
474+
r.Regions[name] = ns1R
483475
}
484476
}
485477
return nil

ns1/resource_record_test.go

Lines changed: 160 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,79 @@ func TestAccRecord_updatedWithTags(t *testing.T) {
502502
})
503503
}
504504

505+
func TestAccRecord_updatedWithRegions(t *testing.T) {
506+
var record dns.Record
507+
rString := acctest.RandStringFromCharSet(15, acctest.CharSetAlphaNum)
508+
zoneName := fmt.Sprintf("terraform-test-%s.io", rString)
509+
domainName := fmt.Sprintf("test.%s", zoneName)
510+
511+
resource.Test(t, resource.TestCase{
512+
PreCheck: func() { testAccPreCheck(t) },
513+
Providers: testAccProviders,
514+
CheckDestroy: testAccCheckRecordDestroy,
515+
Steps: []resource.TestStep{
516+
{
517+
Config: testAccRecordBasic(rString),
518+
Check: resource.ComposeTestCheckFunc(
519+
testAccCheckRecordExists("ns1_record.it", &record),
520+
testAccCheckRecordDomain(&record, domainName),
521+
testAccCheckRecordTTL(&record, 60),
522+
testAccCheckRecordUseClientSubnet(&record, true),
523+
testAccCheckRecordRegionName(&record, []string{"cal"}),
524+
testAccCheckRecordAnswerRdata(
525+
t, &record, 0, []string{fmt.Sprintf("test1.%s", zoneName)},
526+
),
527+
),
528+
},
529+
{
530+
Config: testAccRecordUpdatedWithRegionWeight(rString),
531+
Check: resource.ComposeTestCheckFunc(
532+
testAccCheckRecordExists("ns1_record.it", &record),
533+
testAccCheckRecordDomain(&record, domainName),
534+
testAccCheckRecordTTL(&record, 60),
535+
testAccCheckRecordUseClientSubnet(&record, true),
536+
testAccCheckRecordRegionName(&record, []string{"cal"}),
537+
testAccCheckRecordAnswerRdata(
538+
t, &record, 0, []string{fmt.Sprintf("test1.%s", zoneName)},
539+
),
540+
),
541+
},
542+
{
543+
Config: testAccRecordUpdatedWithRegions(rString),
544+
Check: resource.ComposeTestCheckFunc(
545+
testAccCheckRecordExists("ns1_record.it", &record),
546+
testAccCheckRecordDomain(&record, domainName),
547+
testAccCheckRecordTTL(&record, 60),
548+
testAccCheckRecordUseClientSubnet(&record, true),
549+
testAccCheckRecordRegionName(&record, []string{"ny", "cal"}),
550+
testAccCheckRecordAnswerRdata(
551+
t, &record, 0, []string{fmt.Sprintf("test1.%s", zoneName)},
552+
),
553+
),
554+
},
555+
{
556+
Config: testAccRecordUpdatedWithRegionWeight(rString),
557+
Check: resource.ComposeTestCheckFunc(
558+
testAccCheckRecordExists("ns1_record.it", &record),
559+
testAccCheckRecordDomain(&record, domainName),
560+
testAccCheckRecordTTL(&record, 60),
561+
testAccCheckRecordUseClientSubnet(&record, true),
562+
testAccCheckRecordRegionName(&record, []string{"cal"}),
563+
testAccCheckRecordAnswerRdata(
564+
t, &record, 0, []string{fmt.Sprintf("test1.%s", zoneName)},
565+
),
566+
),
567+
},
568+
{
569+
ResourceName: "ns1_record.it",
570+
ImportState: true,
571+
ImportStateId: fmt.Sprintf("%s/%s/CNAME", zoneName, domainName),
572+
ImportStateVerify: true,
573+
},
574+
},
575+
})
576+
}
577+
505578
func TestAccRecord_validationError(t *testing.T) {
506579
rString := acctest.RandStringFromCharSet(15, acctest.CharSetAlphaNum)
507580

@@ -1038,18 +1111,6 @@ func mapToSlice(m map[string]interface{}) []string {
10381111
return sliceString
10391112
}
10401113

1041-
func testAccCheckRecordAnswerMetaWeight(r *dns.Record, expected float64) resource.TestCheckFunc {
1042-
return func(s *terraform.State) error {
1043-
recordAnswer := r.Answers[0]
1044-
recordMetas := recordAnswer.Meta
1045-
weight := recordMetas.Weight.(float64)
1046-
if weight != expected {
1047-
return fmt.Errorf("r.Answers[0].Meta.Weight: got: %#v want: %#v", weight, expected)
1048-
}
1049-
return nil
1050-
}
1051-
}
1052-
10531114
func testAccCheckRecordAnswerMetaIPPrefixes(r *dns.Record, expected []string) resource.TestCheckFunc {
10541115
return func(s *terraform.State) error {
10551116
recordAnswer := r.Answers[0]
@@ -1637,6 +1698,93 @@ resource "ns1_zone" "test" {
16371698
`, rString)
16381699
}
16391700

1701+
func testAccRecordUpdatedWithRegionWeight(rString string) string {
1702+
return fmt.Sprintf(`
1703+
resource "ns1_record" "it" {
1704+
zone = "${ns1_zone.test.zone}"
1705+
domain = "test.${ns1_zone.test.zone}"
1706+
type = "CNAME"
1707+
ttl = 60
1708+
1709+
answers {
1710+
answer = "test1.${ns1_zone.test.zone}"
1711+
region = "cal"
1712+
}
1713+
1714+
regions {
1715+
name = "cal"
1716+
meta = {
1717+
weight = 100
1718+
}
1719+
}
1720+
1721+
filters {
1722+
filter = "geotarget_country"
1723+
}
1724+
1725+
filters {
1726+
filter = "select_first_n"
1727+
config = {N=1}
1728+
}
1729+
1730+
filters {
1731+
filter = "up"
1732+
}
1733+
}
1734+
1735+
resource "ns1_zone" "test" {
1736+
zone = "terraform-test-%s.io"
1737+
}
1738+
`, rString)
1739+
}
1740+
1741+
func testAccRecordUpdatedWithRegions(rString string) string {
1742+
return fmt.Sprintf(`
1743+
resource "ns1_record" "it" {
1744+
zone = "${ns1_zone.test.zone}"
1745+
domain = "test.${ns1_zone.test.zone}"
1746+
type = "CNAME"
1747+
ttl = 60
1748+
1749+
answers {
1750+
answer = "test1.${ns1_zone.test.zone}"
1751+
region = "cal"
1752+
}
1753+
1754+
regions {
1755+
name = "cal"
1756+
meta = {
1757+
weight = 90
1758+
}
1759+
}
1760+
1761+
regions {
1762+
name = "ny"
1763+
meta = {
1764+
weight = 10
1765+
}
1766+
}
1767+
1768+
filters {
1769+
filter = "geotarget_country"
1770+
}
1771+
1772+
filters {
1773+
filter = "select_first_n"
1774+
config = {N=1}
1775+
}
1776+
1777+
filters {
1778+
filter = "up"
1779+
}
1780+
}
1781+
1782+
resource "ns1_zone" "test" {
1783+
zone = "terraform-test-%s.io"
1784+
}
1785+
`, rString)
1786+
}
1787+
16401788
// zone and domain have leading and trailing dots and should fail validation.
16411789
func testAccRecordInvalid(rString string) string {
16421790
return fmt.Sprintf(`

0 commit comments

Comments
 (0)