DNS | Fix zone updates failing (#6)

* Fix API returning error on updates

* Add DNS zone update test

* Fix primaires not used to update

* Add primaries to model

---------

Co-authored-by: Henrique Santos <henrique.santos@freiheit.com>
This commit is contained in:
Henrique Santos 2023-09-08 11:06:07 +01:00 committed by GitHub
parent 6800f7a421
commit 2c93e4a6f0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 35 deletions

View file

@ -18,23 +18,24 @@ import (
// Zone resource data // Zone resource data
var zoneResource = map[string]string{ var zoneResource = map[string]string{
"project_id": testutil.ProjectId, "project_id": testutil.ProjectId,
"name": testutil.ResourceNameWithDateTime("zone"), "name": testutil.ResourceNameWithDateTime("zone"),
"dns_name": fmt.Sprintf("www.%s.com", acctest.RandStringFromCharSet(20, acctest.CharSetAlpha)), "dns_name": fmt.Sprintf("www.%s.com", acctest.RandStringFromCharSet(20, acctest.CharSetAlpha)),
"dns_name_min": fmt.Sprintf("www.%s.com", acctest.RandStringFromCharSet(20, acctest.CharSetAlpha)), "dns_name_min": fmt.Sprintf("www.%s.com", acctest.RandStringFromCharSet(20, acctest.CharSetAlpha)),
"description": "my description", "description": "my description",
"acl": "192.168.0.0/24", "description_updated": "my description updated",
"active": "true", "acl": "192.168.0.0/24",
"contact_email": "aa@bb.cc", "active": "true",
"ttl": "12", "contact_email": "aa@bb.cc",
"ttl_updated": "4440", "ttl": "120",
"expire_time": "123456", "ttl_updated": "4440",
"is_reverse_zone": "false", "expire_time": "123456",
"negative_cache": "60", "is_reverse_zone": "false",
"primaries": "1.2.3.4", "negative_cache": "60",
"refresh_time": "500", "primaries": "1.2.3.4",
"retry_time": "700", "refresh_time": "500",
"type": "primary", "retry_time": "700",
"type": "primary",
} }
// Record set resource data // Record set resource data
@ -49,7 +50,7 @@ var recordSetResource = map[string]string{
"comment": "a comment", "comment": "a comment",
} }
func inputConfig(zoneName, ttl, records string) string { func inputConfig(zoneName, description, ttl, records string) string {
return fmt.Sprintf(` return fmt.Sprintf(`
%s %s
@ -87,7 +88,7 @@ func inputConfig(zoneName, ttl, records string) string {
zoneResource["project_id"], zoneResource["project_id"],
zoneName, zoneName,
zoneResource["dns_name"], zoneResource["dns_name"],
zoneResource["description"], description,
zoneResource["acl"], zoneResource["acl"],
zoneResource["active"], zoneResource["active"],
zoneResource["contact_email"], zoneResource["contact_email"],
@ -115,7 +116,7 @@ func TestAccDnsResource(t *testing.T) {
Steps: []resource.TestStep{ Steps: []resource.TestStep{
// Creation // Creation
{ {
Config: inputConfig(zoneResource["name"], zoneResource["ttl"], recordSetResource["records"]), Config: inputConfig(zoneResource["name"], zoneResource["description"], zoneResource["ttl"], recordSetResource["records"]),
Check: resource.ComposeAggregateTestCheckFunc( Check: resource.ComposeAggregateTestCheckFunc(
// Zone data // Zone data
resource.TestCheckResourceAttr("stackit_dns_zone.zone", "project_id", zoneResource["project_id"]), resource.TestCheckResourceAttr("stackit_dns_zone.zone", "project_id", zoneResource["project_id"]),
@ -174,7 +175,7 @@ func TestAccDnsResource(t *testing.T) {
zone_id = stackit_dns_zone.zone.zone_id zone_id = stackit_dns_zone.zone.zone_id
record_set_id = stackit_dns_record_set.record_set.record_set_id record_set_id = stackit_dns_record_set.record_set.record_set_id
}`, }`,
inputConfig(zoneResource["name"], zoneResource["ttl"], recordSetResource["records"]), inputConfig(zoneResource["name"], zoneResource["description"], zoneResource["ttl"], recordSetResource["records"]),
), ),
Check: resource.ComposeAggregateTestCheckFunc( Check: resource.ComposeAggregateTestCheckFunc(
// Zone data // Zone data
@ -268,14 +269,14 @@ func TestAccDnsResource(t *testing.T) {
}, },
// Update. The zone ttl should not be updated according to the DNS API. // Update. The zone ttl should not be updated according to the DNS API.
{ {
Config: inputConfig(zoneResource["name"], zoneResource["ttl"], recordSetResource["records_updated"]), Config: inputConfig(zoneResource["name"], zoneResource["description_updated"], zoneResource["ttl"], recordSetResource["records_updated"]),
Check: resource.ComposeAggregateTestCheckFunc( Check: resource.ComposeAggregateTestCheckFunc(
// Zone data // Zone data
resource.TestCheckResourceAttr("stackit_dns_zone.zone", "project_id", zoneResource["project_id"]), resource.TestCheckResourceAttr("stackit_dns_zone.zone", "project_id", zoneResource["project_id"]),
resource.TestCheckResourceAttrSet("stackit_dns_zone.zone", "zone_id"), resource.TestCheckResourceAttrSet("stackit_dns_zone.zone", "zone_id"),
resource.TestCheckResourceAttr("stackit_dns_zone.zone", "name", zoneResource["name"]), resource.TestCheckResourceAttr("stackit_dns_zone.zone", "name", zoneResource["name"]),
resource.TestCheckResourceAttr("stackit_dns_zone.zone", "dns_name", zoneResource["dns_name"]), resource.TestCheckResourceAttr("stackit_dns_zone.zone", "dns_name", zoneResource["dns_name"]),
resource.TestCheckResourceAttr("stackit_dns_zone.zone", "description", zoneResource["description"]), resource.TestCheckResourceAttr("stackit_dns_zone.zone", "description", zoneResource["description_updated"]),
resource.TestCheckResourceAttr("stackit_dns_zone.zone", "acl", zoneResource["acl"]), resource.TestCheckResourceAttr("stackit_dns_zone.zone", "acl", zoneResource["acl"]),
resource.TestCheckResourceAttr("stackit_dns_zone.zone", "active", zoneResource["active"]), resource.TestCheckResourceAttr("stackit_dns_zone.zone", "active", zoneResource["active"]),
resource.TestCheckResourceAttr("stackit_dns_zone.zone", "contact_email", zoneResource["contact_email"]), resource.TestCheckResourceAttr("stackit_dns_zone.zone", "contact_email", zoneResource["contact_email"]),

View file

@ -15,6 +15,7 @@ import (
"github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource"
"github.com/hashicorp/terraform-plugin-framework/resource/schema" "github.com/hashicorp/terraform-plugin-framework/resource/schema"
"github.com/hashicorp/terraform-plugin-framework/resource/schema/booldefault" "github.com/hashicorp/terraform-plugin-framework/resource/schema/booldefault"
"github.com/hashicorp/terraform-plugin-framework/resource/schema/listplanmodifier"
"github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier"
"github.com/hashicorp/terraform-plugin-framework/resource/schema/stringdefault" "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringdefault"
"github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier" "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier"
@ -228,6 +229,9 @@ func (r *zoneResource) Schema(_ context.Context, _ resource.SchemaRequest, resp
Optional: true, Optional: true,
Computed: true, Computed: true,
ElementType: types.StringType, ElementType: types.StringType,
PlanModifiers: []planmodifier.List{
listplanmodifier.RequiresReplace(),
},
Validators: []validator.List{ Validators: []validator.List{
listvalidator.SizeAtMost(10), listvalidator.SizeAtMost(10),
}, },
@ -585,14 +589,6 @@ func toUpdatePayload(model *Model) (*dns.UpdateZonePayload, error) {
return nil, fmt.Errorf("nil model") return nil, fmt.Errorf("nil model")
} }
modelPrimaries := []string{}
for _, primary := range model.Primaries.Elements() {
primaryString, ok := primary.(types.String)
if !ok {
return nil, fmt.Errorf("type assertion failed")
}
modelPrimaries = append(modelPrimaries, primaryString.ValueString())
}
return &dns.UpdateZonePayload{ return &dns.UpdateZonePayload{
Name: model.Name.ValueStringPointer(), Name: model.Name.ValueStringPointer(),
ContactEmail: model.ContactEmail.ValueStringPointer(), ContactEmail: model.ContactEmail.ValueStringPointer(),
@ -603,6 +599,6 @@ func toUpdatePayload(model *Model) (*dns.UpdateZonePayload, error) {
RefreshTime: conversion.ToPtrInt32(model.RefreshTime), RefreshTime: conversion.ToPtrInt32(model.RefreshTime),
RetryTime: conversion.ToPtrInt32(model.RetryTime), RetryTime: conversion.ToPtrInt32(model.RetryTime),
NegativeCache: conversion.ToPtrInt32(model.NegativeCache), NegativeCache: conversion.ToPtrInt32(model.NegativeCache),
Primaries: &modelPrimaries, Primaries: nil, // API returns error if this field is set, even if nothing changes
}, nil }, nil
} }

View file

@ -290,8 +290,7 @@ func TestToPayloadUpdate(t *testing.T) {
Name: types.StringValue("Name"), Name: types.StringValue("Name"),
}, },
&dns.UpdateZonePayload{ &dns.UpdateZonePayload{
Name: utils.Ptr("Name"), Name: utils.Ptr("Name"),
Primaries: &[]string{},
}, },
true, true,
}, },
@ -321,7 +320,6 @@ func TestToPayloadUpdate(t *testing.T) {
Acl: utils.Ptr("Acl"), Acl: utils.Ptr("Acl"),
Description: utils.Ptr("Description"), Description: utils.Ptr("Description"),
ContactEmail: utils.Ptr("ContactEmail"), ContactEmail: utils.Ptr("ContactEmail"),
Primaries: &[]string{"Primary"},
RetryTime: utils.Ptr(int32(3)), RetryTime: utils.Ptr(int32(3)),
RefreshTime: utils.Ptr(int32(4)), RefreshTime: utils.Ptr(int32(4)),
ExpireTime: utils.Ptr(int32(5)), ExpireTime: utils.Ptr(int32(5)),