From 8d67467eb82697e9a601e3ec0a8c192bc8760380 Mon Sep 17 00:00:00 2001 From: Stanislau Petrusiou Date: Mon, 21 Jun 2021 14:45:19 +0200 Subject: [PATCH 1/2] Fixed resources with upper case names not destroyed --- CHANGELOG.md | 3 +- powerdns/client.go | 4 +- powerdns/resource_powerdns_record.go | 6 +++ powerdns/resource_powerdns_record_test.go | 64 +++++++++++++++++++++++ powerdns/resource_powerdns_zone.go | 3 ++ powerdns/resource_powerdns_zone_test.go | 32 +++++++++++- 6 files changed, 108 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 562db828..27ca8f7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ ## 1.5.0 (Unreleased) FEATURES: - * **Added option to cache PowerDNS API response ** ([#81](https://github.com/pan-net/terraform-provider-powerdns/pull/81), @menai34) + * **Added option to cache PowerDNS API response** ([#81](https://github.com/pan-net/terraform-provider-powerdns/pull/81), @menai34) + * **Fixed resources with upper case names not destroyed** ([#88](https://github.com/pan-net/terraform-provider-powerdns/pull/88), @PetrusHahol) ## 1.4.1 (January 21, 2021) diff --git a/powerdns/client.go b/powerdns/client.go index db3b16f5..916b465c 100644 --- a/powerdns/client.go +++ b/powerdns/client.go @@ -522,7 +522,7 @@ func (client *Client) ListRecordsInRRSet(zone string, name string, tpe string) ( records := make([]Record, 0, 10) for _, r := range allRecords { - if r.Name == name && r.Type == tpe { + if r.Name == strings.ToLower(name) && r.Type == tpe { records = append(records, r) } } @@ -547,7 +547,7 @@ func (client *Client) RecordExists(zone string, name string, tpe string) (bool, } for _, record := range allRecords { - if record.Name == name && record.Type == tpe { + if record.Name == strings.ToLower(name) && record.Type == tpe { return true, nil } } diff --git a/powerdns/resource_powerdns_record.go b/powerdns/resource_powerdns_record.go index d2be002c..bb29c1af 100644 --- a/powerdns/resource_powerdns_record.go +++ b/powerdns/resource_powerdns_record.go @@ -24,12 +24,18 @@ func resourcePDNSRecord() *schema.Resource { Type: schema.TypeString, Required: true, ForceNew: true, + DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { + return strings.EqualFold(old, new) + }, }, "name": { Type: schema.TypeString, Required: true, ForceNew: true, + DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { + return strings.EqualFold(old, new) + }, }, "type": { diff --git a/powerdns/resource_powerdns_record_test.go b/powerdns/resource_powerdns_record_test.go index 4641387d..ac2e5a40 100644 --- a/powerdns/resource_powerdns_record_test.go +++ b/powerdns/resource_powerdns_record_test.go @@ -444,6 +444,52 @@ func TestAccPDNSRecord_SOA(t *testing.T) { }) } +func TestAccPDNSRecord_A_ZoneMixedCaps(t *testing.T) { + resourceName := "powerdns_record.test-a" + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckPDNSRecordDestroy, + Steps: []resource.TestStep{ + { + // using mixed caps for zone property to create resource with A type + Config: testPDNSRecordConfigZoneMixedCaps, + }, + { + // using A type record config to confirm plan doesn't generate diff + ResourceName: resourceName, + Config: testPDNSRecordConfigA, + ExpectNonEmptyPlan: false, + PlanOnly: true, + }, + }, + }) +} + +func TestAccPDNSRecord_A_NameMixedCaps(t *testing.T) { + resourceName := "powerdns_record.test-a" + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckPDNSRecordDestroy, + Steps: []resource.TestStep{ + { + // using mixed caps for name property to create resource with A type + Config: testPDNSRecordConfigNameMixedCaps, + }, + { + // using A type record config to confirm plan doesn't generate diff + ResourceName: resourceName, + Config: testPDNSRecordConfigA, + ExpectNonEmptyPlan: false, + PlanOnly: true, + }, + }, + }) +} + func testAccCheckPDNSRecordDestroy(s *terraform.State) error { for _, rs := range s.RootModule().Resources { if rs.Type != "powerdns_record" { @@ -654,3 +700,21 @@ resource "powerdns_record" "test-soa" { ttl = 3600 records = [ "something.something. hostmaster.sysa.xyz. 2019090301 10800 3600 604800 3600" ] }` + +const testPDNSRecordConfigZoneMixedCaps = ` +resource "powerdns_record" "test-a" { + zone = "sySa.xyz." + name = "testpdnsrecordconfiga.sysa.xyz." + type = "A" + ttl = 60 + records = [ "1.1.1.1", "2.2.2.2" ] +}` + +const testPDNSRecordConfigNameMixedCaps = ` +resource "powerdns_record" "test-a" { + zone = "sysa.xyz." + name = "TestPDNSRecordConfigA.sysa.xyz." + type = "A" + ttl = 60 + records = [ "1.1.1.1", "2.2.2.2" ] +}` diff --git a/powerdns/resource_powerdns_zone.go b/powerdns/resource_powerdns_zone.go index 88705c8f..95746ef7 100644 --- a/powerdns/resource_powerdns_zone.go +++ b/powerdns/resource_powerdns_zone.go @@ -27,6 +27,9 @@ func resourcePDNSZone() *schema.Resource { Type: schema.TypeString, Required: true, ForceNew: true, + DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { + return strings.EqualFold(old, new) + }, }, "kind": { diff --git a/powerdns/resource_powerdns_zone_test.go b/powerdns/resource_powerdns_zone_test.go index 0e2b4e95..40c7be12 100644 --- a/powerdns/resource_powerdns_zone_test.go +++ b/powerdns/resource_powerdns_zone_test.go @@ -66,7 +66,7 @@ func TestAccPDNSZoneNativeSmallCaps(t *testing.T) { CheckDestroy: testAccCheckPDNSZoneDestroy, Steps: []resource.TestStep{ { - // using small caps config to create resource with test-native name + // using small caps config to create resource with test-native kind Config: testPDNSZoneConfigNativeSmallCaps, }, { @@ -80,6 +80,29 @@ func TestAccPDNSZoneNativeSmallCaps(t *testing.T) { }) } +func TestAccPDNSZoneNativeNameMixedCaps(t *testing.T) { + resourceName := "powerdns_zone.test-native" + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckPDNSZoneDestroy, + Steps: []resource.TestStep{ + { + // using mixed caps config to create resource with test-native name + Config: testPDNSZoneConfigNativeNameMixedCaps, + }, + { + // using test-native config with Native to confirm plan doesn't generate diff + ResourceName: resourceName, + Config: testPDNSZoneConfigNative, + ExpectNonEmptyPlan: false, + PlanOnly: true, + }, + }, + }) +} + func TestAccPDNSZoneMaster(t *testing.T) { resourceName := "powerdns_zone.test-master" @@ -444,6 +467,13 @@ resource "powerdns_zone" "test-native" { nameservers = ["ns1.sysa.abc.", "ns2.sysa.abc."] }` +const testPDNSZoneConfigNativeNameMixedCaps = ` +resource "powerdns_zone" "test-native" { + name = "sySa.abc." + kind = "native" + nameservers = ["ns1.sysa.abc.", "ns2.sysa.abc."] +}` + const testPDNSZoneConfigMaster = ` resource "powerdns_zone" "test-master" { name = "master.sysa.abc." From bbe79ea5f63f7638e2e16609439805027a91b5d2 Mon Sep 17 00:00:00 2001 From: Stanislau Petrusiou Date: Wed, 23 Jun 2021 13:09:09 +0200 Subject: [PATCH 2/2] Fixed comparator to strings.EqualFold --- powerdns/client.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/powerdns/client.go b/powerdns/client.go index 916b465c..ad25835e 100644 --- a/powerdns/client.go +++ b/powerdns/client.go @@ -522,7 +522,7 @@ func (client *Client) ListRecordsInRRSet(zone string, name string, tpe string) ( records := make([]Record, 0, 10) for _, r := range allRecords { - if r.Name == strings.ToLower(name) && r.Type == tpe { + if strings.EqualFold(r.Name, name) && r.Type == tpe { records = append(records, r) } } @@ -547,7 +547,7 @@ func (client *Client) RecordExists(zone string, name string, tpe string) (bool, } for _, record := range allRecords { - if record.Name == strings.ToLower(name) && record.Type == tpe { + if strings.EqualFold(record.Name, name) && record.Type == tpe { return true, nil } }