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

[DNS] TXT recordset quotes handling #1829

Merged
merged 3 commits into from Jul 22, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -158,6 +158,38 @@ func TestAccDNSV2RecordSet_shared(t *testing.T) {
})
}

func TestAccDNSV2RecordSet_txt(t *testing.T) {
var recordset recordsets.RecordSet
zoneName := randomZoneName()

resource.Test(t, resource.TestCase{
PreCheck: func() { common.TestAccPreCheck(t) },
ProviderFactories: common.TestAccProviderFactories,
CheckDestroy: testAccCheckDNSV2RecordSetDestroy,
Steps: []resource.TestStep{
{
Config: testAccDNSV2RecordSetTxt(zoneName),
Check: resource.ComposeTestCheckFunc(
testAccCheckDNSV2RecordSetExists(resourceRecordSetName, &recordset),
resource.TestCheckResourceAttr(resourceRecordSetName, "name", zoneName),
resource.TestCheckResourceAttr(resourceRecordSetName, "description", "a record set"),
resource.TestCheckResourceAttr(resourceRecordSetName, "type", "TXT"),
resource.TestCheckResourceAttr(resourceRecordSetName, "ttl", "300"),
resource.TestCheckResourceAttr(resourceRecordSetName, "records.0", "v=spf1 include:spf.protection.outlook.com -all"),
vladimirvshivkov marked this conversation as resolved.
Show resolved Hide resolved
),
},
{
Config: testAccDNSV2RecordSetTxtUpdate(zoneName),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(resourceRecordSetName, "ttl", "3000"),
resource.TestCheckResourceAttr(resourceRecordSetName, "description", "an updated record set"),
resource.TestCheckResourceAttr(resourceRecordSetName, "records.0", "v=spf1 include:spf.protection.outlook.com -none"),
),
},
},
})
}

func testAccCheckDNSV2RecordSetDestroy(s *terraform.State) error {
config := common.TestAccProvider.Meta().(*cfg.Config)
client, err := config.DnsV2Client(env.OS_REGION_NAME)
Expand Down Expand Up @@ -405,3 +437,45 @@ resource "opentelekomcloud_dns_recordset_v2" "recordset_sup" {
}
`, zoneName)
}

func testAccDNSV2RecordSetTxt(zoneName string) string {
return fmt.Sprintf(`
resource "opentelekomcloud_dns_zone_v2" "zone_1" {
name = "%[1]s"
email = "email2@example.com"
description = "a zone"
ttl = 6000
}

resource "opentelekomcloud_dns_recordset_v2" "recordset_1" {
zone_id = opentelekomcloud_dns_zone_v2.zone_1.id
name = "%[1]s"
type = "TXT"
description = "a record set"
ttl = 300
records = ["v=spf1 include:spf.protection.outlook.com -all"]

}
`, zoneName)
}

func testAccDNSV2RecordSetTxtUpdate(zoneName string) string {
return fmt.Sprintf(`
resource "opentelekomcloud_dns_zone_v2" "zone_1" {
name = "%[1]s"
email = "email2@example.com"
description = "a zone"
ttl = 6000
}

resource "opentelekomcloud_dns_recordset_v2" "recordset_1" {
zone_id = opentelekomcloud_dns_zone_v2.zone_1.id
name = "%[1]s"
type = "TXT"
description = "an updated record set"
ttl = 3000
records = ["v=spf1 include:spf.protection.outlook.com -none"]

}
`, zoneName)
}
Expand Up @@ -96,10 +96,17 @@ func ResourceDNSRecordSetV2() *schema.Resource {
}

func getRecordSetCreateOpts(d cfg.SchemaOrDiff) RecordSetCreateOpts {
recordSetType := d.Get("type").(string)
recordsRaw := d.Get("records").(*schema.Set).List()
records := make([]string, len(recordsRaw))
for i, record := range recordsRaw {
records[i] = record.(string)
if recordSetType == "TXT" {
for i, record := range recordsRaw {
records[i] = fmt.Sprintf("\"%s\"", record.(string))
}
} else {
for i, record := range recordsRaw {
records[i] = record.(string)
}
}

return RecordSetCreateOpts{
Expand All @@ -108,12 +115,21 @@ func getRecordSetCreateOpts(d cfg.SchemaOrDiff) RecordSetCreateOpts {
Description: d.Get("description").(string),
Records: records,
TTL: d.Get("ttl").(int),
Type: d.Get("type").(string),
Type: recordSetType,
},
common.MapValueSpecs(d),
}
}

func trimQuotes(s string) string {
if len(s) >= 2 {
if s[0] == '"' && s[len(s)-1] == '"' {
return s[1 : len(s)-1]
}
}
return s
}

func resourceDNSRecordSetV2Create(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
config := meta.(*cfg.Config)
dnsClient, err := config.DnsV2Client(config.GetRegion(d))
Expand Down Expand Up @@ -195,14 +211,25 @@ func resourceDNSRecordSetV2Read(_ context.Context, d *schema.ResourceData, meta
return common.CheckDeletedDiag(d, err, "record_set")
}

records := make([]string, len(n.Records))
if n.Type == "TXT" {
for i, record := range n.Records {
records[i] = trimQuotes(record)
}
} else {
for i, record := range n.Records {
records[i] = record
}
}

log.Printf("[DEBUG] Retrieved record set %s: %#v", recordsetID, n)

mErr := multierror.Append(
d.Set("name", n.Name),
d.Set("description", n.Description),
d.Set("ttl", n.TTL),
d.Set("type", n.Type),
d.Set("records", n.Records),
d.Set("records", records),
d.Set("region", config.GetRegion(d)),
d.Set("zone_id", zoneID),
)
Expand Down Expand Up @@ -244,8 +271,14 @@ func resourceDNSRecordSetV2Update(ctx context.Context, d *schema.ResourceData, m
// `records` is required attribute for update request
recordsRaw := d.Get("records").(*schema.Set).List()
records := make([]string, len(recordsRaw))
for i, recordRaw := range recordsRaw {
records[i] = recordRaw.(string)
if d.Get("type").(string) == "TXT" {
for i, record := range recordsRaw {
records[i] = fmt.Sprintf("\"%s\"", record.(string))
}
} else {
for i, record := range recordsRaw {
records[i] = record.(string)
}
}
updateOpts.Records = records

Expand Down