Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix refresh for resource openstack_dns_recordset_v2 #1581

Merged
merged 2 commits into from
Jun 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
NOTES

* Documentation has been updated with sub-categories for easier browsing
* '[]' stripping for IPv6 addresses removed from `openstack_dns_recordset_v2` resource
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your changes on changelog are not fully following our conventions. That is ok as i will patch them before the release. For future reference, you dont need to update changelog as we do it before a release and updating it triggers a full ci run that is unnecessary.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the feedback. I added an entry for this particular change because I thought it important that this particular behaviour difference be explicitly called out in the release notes. I appreciate you taking on making sure they are edited to fit the project conventions.


IMPROVEMENTS

* Add validators to `openstack_vpnaas_ipsec_policy_v2` ([#1558](https://github.com/terraform-provider-openstack/terraform-provider-openstack/pull/1558))
* Add `user_id` to `data_source_openstack_compute_keypair_v2` ([#1554](https://github.com/terraform-provider-openstack/terraform-provider-openstack/pull/1554))
* Add `project_id` to `data_source_openstack_identity_project_v3` ([#1559](https://github.com/terraform-provider-openstack/terraform-provider-openstack/pull/1559))
* `private_key` on `openstack_compute_keypair_v2` marked as sensitive ([#1548](https://github.com/terraform-provider-openstack/terraform-provider-openstack/pull/1548))
* `openstack_dns_recordset_v2` now refreshes record values and ignores record order for individual record values within the same resource

BUG FIXES

Expand Down
28 changes: 0 additions & 28 deletions openstack/dns_recordset_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package openstack
import (
"fmt"
"log"
"regexp"
"strings"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
Expand Down Expand Up @@ -60,30 +59,3 @@ func dnsRecordSetV2ParseID(id string) (string, string, error) {

return zoneID, recordsetID, nil
}

func expandDNSRecordSetV2Records(v []interface{}) []string {
records := make([]string, len(v))

// Strip out any [ ] characters in the address.
// This is to format IPv6 records in a way that DNSaaS / Designate wants.
re := regexp.MustCompile("[][]")
for i, rawRecord := range v {
record := rawRecord.(string)
record = re.ReplaceAllString(record, "")
records[i] = record
}

return records
}

// dnsRecordSetV2RecordsStateFunc will strip brackets from IPv6 addresses.
func dnsRecordSetV2RecordsStateFunc(v interface{}) string {
if addr, ok := v.(string); ok {
re := regexp.MustCompile("[][]")
addr = re.ReplaceAllString(addr, "")

return addr
}

return ""
}
10 changes: 0 additions & 10 deletions openstack/dns_recordset_v2_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,3 @@ func TestUnitDNSRecordSetV2ParseID(t *testing.T) {
assert.Equal(t, expectedZoneID, actualZoneID)
assert.Equal(t, expectedRecordSetID, actualRecordSetID)
}

func TestUnitDNSRecordSetV2RecordsStateFunc(t *testing.T) {
data := []interface{}{"foo", "[bar]", "baz"}
expected := []string{"foo", "bar", "baz"}

for i, record := range data {
actual := dnsRecordSetV2RecordsStateFunc(record)
assert.Equal(t, expected[i], actual)
}
}
58 changes: 21 additions & 37 deletions openstack/resource_openstack_dns_recordset_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ func resourceDNSRecordSetV2() *schema.Resource {
UpdateContext: resourceDNSRecordSetV2Update,
DeleteContext: resourceDNSRecordSetV2Delete,
Importer: &schema.ResourceImporter{
StateContext: resourceDNSRecordSetV2Import,
StateContext: schema.ImportStatePassthroughContext,
},

Timeouts: &schema.ResourceTimeout{
Expand Down Expand Up @@ -56,13 +56,10 @@ func resourceDNSRecordSetV2() *schema.Resource {
},

"records": {
Type: schema.TypeList,
Optional: true,
Type: schema.TypeSet,
Required: true,
ForceNew: false,
Elem: &schema.Schema{
Type: schema.TypeString,
StateFunc: dnsRecordSetV2RecordsStateFunc,
},
Elem: &schema.Schema{Type: schema.TypeString},
},

"ttl": {
Expand Down Expand Up @@ -112,7 +109,12 @@ func resourceDNSRecordSetV2Create(ctx context.Context, d *schema.ResourceData, m
return diag.Errorf("Error setting dns client auth headers: %s", err)
}

records := expandDNSRecordSetV2Records(d.Get("records").([]interface{}))
records := []string{}
if v, ok := d.GetOk("records"); ok {
for _, vv := range v.(*schema.Set).List() {
records = append(records, vv.(string))
}
}

createOpts := RecordSetCreateOpts{
recordsets.CreateOpts{
Expand Down Expand Up @@ -152,12 +154,6 @@ func resourceDNSRecordSetV2Create(ctx context.Context, d *schema.ResourceData, m
id := fmt.Sprintf("%s/%s", zoneID, n.ID)
d.SetId(id)

// This is a workaround to store the modified IP addresses in the state
// because we don't want to make records computed or change it to TypeSet
// in order to retain backwards compatibility.
// Because of the StateFunc, this will not cause issues.
d.Set("records", records)

log.Printf("[DEBUG] Created openstack_dns_recordset_v2 %s: %#v", n.ID, n)
return resourceDNSRecordSetV2Read(ctx, d, meta)
}
Expand Down Expand Up @@ -188,7 +184,11 @@ func resourceDNSRecordSetV2Read(_ context.Context, d *schema.ResourceData, meta

d.Set("name", n.Name)
d.Set("description", n.Description)
d.Set("records", n.Records)
records := []interface{}{}
for _, c := range n.Records {
records = append(records, c)
}
d.Set("records", schema.NewSet(schema.HashString, records))
d.Set("ttl", n.TTL)
d.Set("type", n.Type)
d.Set("zone_id", zoneID)
Expand Down Expand Up @@ -218,7 +218,12 @@ func resourceDNSRecordSetV2Update(ctx context.Context, d *schema.ResourceData, m
}

if d.HasChange("records") {
records := expandDNSRecordSetV2Records(d.Get("records").([]interface{}))
records := []string{}
if v, ok := d.GetOk("records"); ok {
for _, vv := range v.(*schema.Set).List() {
records = append(records, vv.(string))
}
}
updateOpts.Records = records
changed = true
}
Expand Down Expand Up @@ -308,24 +313,3 @@ func resourceDNSRecordSetV2Delete(ctx context.Context, d *schema.ResourceData, m

return nil
}

func resourceDNSRecordSetV2Import(_ context.Context, d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
config := meta.(*Config)
dnsClient, err := config.DNSV2Client(GetRegion(d, config))
if err != nil {
return nil, fmt.Errorf("Error creating OpenStack DNS client: %s", err)
}

zoneID, recordsetID, err := dnsRecordSetV2ParseID(d.Id())
if err != nil {
return nil, err
}

n, err := recordsets.Get(dnsClient, zoneID, recordsetID).Extract()
if err != nil {
return nil, fmt.Errorf("Error retrieving openstack_dns_recordset_v2 %s: %s", d.Id(), err)
}

d.Set("records", n.Records)
return []*schema.ResourceData{d}, nil
}
32 changes: 18 additions & 14 deletions openstack/resource_openstack_dns_recordset_v2_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ func TestAccDNSV2RecordSet_basic(t *testing.T) {
testAccCheckDNSV2RecordSetExists("openstack_dns_recordset_v2.recordset_1", &recordset),
resource.TestCheckResourceAttr(
"openstack_dns_recordset_v2.recordset_1", "description", "a record set"),
resource.TestCheckResourceAttr(
"openstack_dns_recordset_v2.recordset_1", "records.0", "10.1.0.0"),
resource.TestCheckTypeSetElemAttr(
"openstack_dns_recordset_v2.recordset_1", "records.*", "10.1.0.0"),
),
},
{
Expand All @@ -47,8 +47,10 @@ func TestAccDNSV2RecordSet_basic(t *testing.T) {
resource.TestCheckResourceAttr("openstack_dns_recordset_v2.recordset_1", "type", "A"),
resource.TestCheckResourceAttr(
"openstack_dns_recordset_v2.recordset_1", "description", "an updated record set"),
resource.TestCheckResourceAttr(
"openstack_dns_recordset_v2.recordset_1", "records.0", "10.1.0.1"),
resource.TestCheckTypeSetElemAttr(
"openstack_dns_recordset_v2.recordset_1", "records.*", "10.1.0.1"),
resource.TestCheckTypeSetElemAttr(
"openstack_dns_recordset_v2.recordset_1", "records.*", "10.1.0.2"),
),
},
},
Expand All @@ -74,8 +76,10 @@ func TestAccDNSV2RecordSet_ipv6(t *testing.T) {
testAccCheckDNSV2RecordSetExists("openstack_dns_recordset_v2.recordset_1", &recordset),
resource.TestCheckResourceAttr(
"openstack_dns_recordset_v2.recordset_1", "description", "a record set"),
resource.TestCheckResourceAttr(
"openstack_dns_recordset_v2.recordset_1", "records.0", "fd2b:db7f:6ae:dd8d::2"),
resource.TestCheckTypeSetElemAttr(
"openstack_dns_recordset_v2.recordset_1", "records.*", "fd2b:db7f:6ae:dd8d::1"),
resource.TestCheckTypeSetElemAttr(
"openstack_dns_recordset_v2.recordset_1", "records.*", "fd2b:db7f:6ae:dd8d::2"),
),
},
},
Expand Down Expand Up @@ -124,17 +128,17 @@ func TestAccDNSV2RecordSet_ensureSameTTL(t *testing.T) {
Config: testAccDNSV2RecordSetEnsureSameTTL1(zoneName),
Check: resource.ComposeTestCheckFunc(
testAccCheckDNSV2RecordSetExists("openstack_dns_recordset_v2.recordset_1", &recordset),
resource.TestCheckResourceAttr(
"openstack_dns_recordset_v2.recordset_1", "records.0", "10.1.0.1"),
resource.TestCheckTypeSetElemAttr(
"openstack_dns_recordset_v2.recordset_1", "records.*", "10.1.0.1"),
resource.TestCheckResourceAttr(
"openstack_dns_recordset_v2.recordset_1", "ttl", "3000"),
),
},
{
Config: testAccDNSV2RecordSetEnsureSameTTL2(zoneName),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(
"openstack_dns_recordset_v2.recordset_1", "records.0", "10.1.0.2"),
resource.TestCheckTypeSetElemAttr(
"openstack_dns_recordset_v2.recordset_1", "records.*", "10.1.0.2"),
resource.TestCheckResourceAttr(
"openstack_dns_recordset_v2.recordset_1", "ttl", "3000"),
),
Expand All @@ -160,8 +164,8 @@ func TestAccDNSV2RecordSet_sudoProjectID(t *testing.T) {
Config: testAccDNSV2RecordSetSudoProjectID(zoneName),
Check: resource.ComposeTestCheckFunc(
testAccCheckDNSV2RecordSetExists("openstack_dns_recordset_v2.recordset_1", &recordset),
resource.TestCheckResourceAttr(
"openstack_dns_recordset_v2.recordset_1", "records.0", "10.1.0.1"),
resource.TestCheckTypeSetElemAttr(
"openstack_dns_recordset_v2.recordset_1", "records.*", "10.1.0.1"),
),
},
},
Expand Down Expand Up @@ -297,7 +301,7 @@ func testAccDNSV2RecordSetUpdate(zoneName string) string {
type = "A"
description = "an updated record set"
ttl = 6000
records = ["10.1.0.1"]
records = ["10.1.0.2", "10.1.0.1"]
}
`, zoneName, zoneName)
}
Expand Down Expand Up @@ -337,7 +341,7 @@ func testAccDNSV2RecordSetIPv6(zoneName string) string {
type = "AAAA"
description = "a record set"
ttl = 3000
records = ["fd2b:db7f:6ae:dd8d::2"]
records = ["fd2b:db7f:6ae:dd8d::2", "fd2b:db7f:6ae:dd8d::1"]
}
`, zoneName, zoneName)
}
Expand Down
4 changes: 1 addition & 3 deletions website/docs/r/dns_recordset_v2.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,7 @@ The following arguments are supported:

* `description` - (Optional) A description of the record set.

* `records` - (Optional) An array of DNS records. _Note:_ if an IPv6 address
contains brackets (`[ ]`), the brackets will be stripped and the modified
address will be recorded in the state.
* `records` - (Required) An array of DNS records.

* `value_specs` - (Optional) Map of additional options. Changing this creates a
new record set.
Expand Down
Loading