From 2c93e4a6f059eae781c1d0524bbfc32476067ec9 Mon Sep 17 00:00:00 2001 From: Henrique Santos <118177985+hcsa73@users.noreply.github.com> Date: Fri, 8 Sep 2023 11:06:07 +0100 Subject: [PATCH] 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 --- stackit/services/dns/dns_acc_test.go | 47 +++++++++++----------- stackit/services/dns/zone/resource.go | 14 +++---- stackit/services/dns/zone/resource_test.go | 4 +- 3 files changed, 30 insertions(+), 35 deletions(-) diff --git a/stackit/services/dns/dns_acc_test.go b/stackit/services/dns/dns_acc_test.go index 960d3e36..9aa6ada0 100644 --- a/stackit/services/dns/dns_acc_test.go +++ b/stackit/services/dns/dns_acc_test.go @@ -18,23 +18,24 @@ import ( // Zone resource data var zoneResource = map[string]string{ - "project_id": testutil.ProjectId, - "name": testutil.ResourceNameWithDateTime("zone"), - "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)), - "description": "my description", - "acl": "192.168.0.0/24", - "active": "true", - "contact_email": "aa@bb.cc", - "ttl": "12", - "ttl_updated": "4440", - "expire_time": "123456", - "is_reverse_zone": "false", - "negative_cache": "60", - "primaries": "1.2.3.4", - "refresh_time": "500", - "retry_time": "700", - "type": "primary", + "project_id": testutil.ProjectId, + "name": testutil.ResourceNameWithDateTime("zone"), + "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)), + "description": "my description", + "description_updated": "my description updated", + "acl": "192.168.0.0/24", + "active": "true", + "contact_email": "aa@bb.cc", + "ttl": "120", + "ttl_updated": "4440", + "expire_time": "123456", + "is_reverse_zone": "false", + "negative_cache": "60", + "primaries": "1.2.3.4", + "refresh_time": "500", + "retry_time": "700", + "type": "primary", } // Record set resource data @@ -49,7 +50,7 @@ var recordSetResource = map[string]string{ "comment": "a comment", } -func inputConfig(zoneName, ttl, records string) string { +func inputConfig(zoneName, description, ttl, records string) string { return fmt.Sprintf(` %s @@ -87,7 +88,7 @@ func inputConfig(zoneName, ttl, records string) string { zoneResource["project_id"], zoneName, zoneResource["dns_name"], - zoneResource["description"], + description, zoneResource["acl"], zoneResource["active"], zoneResource["contact_email"], @@ -115,7 +116,7 @@ func TestAccDnsResource(t *testing.T) { Steps: []resource.TestStep{ // Creation { - Config: inputConfig(zoneResource["name"], zoneResource["ttl"], recordSetResource["records"]), + Config: inputConfig(zoneResource["name"], zoneResource["description"], zoneResource["ttl"], recordSetResource["records"]), Check: resource.ComposeAggregateTestCheckFunc( // Zone data 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 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( // Zone data @@ -268,14 +269,14 @@ func TestAccDnsResource(t *testing.T) { }, // 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( // Zone data resource.TestCheckResourceAttr("stackit_dns_zone.zone", "project_id", zoneResource["project_id"]), resource.TestCheckResourceAttrSet("stackit_dns_zone.zone", "zone_id"), 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", "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", "active", zoneResource["active"]), resource.TestCheckResourceAttr("stackit_dns_zone.zone", "contact_email", zoneResource["contact_email"]), diff --git a/stackit/services/dns/zone/resource.go b/stackit/services/dns/zone/resource.go index aa40b02e..568f34a3 100644 --- a/stackit/services/dns/zone/resource.go +++ b/stackit/services/dns/zone/resource.go @@ -15,6 +15,7 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource" "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/listplanmodifier" "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/stringplanmodifier" @@ -228,6 +229,9 @@ func (r *zoneResource) Schema(_ context.Context, _ resource.SchemaRequest, resp Optional: true, Computed: true, ElementType: types.StringType, + PlanModifiers: []planmodifier.List{ + listplanmodifier.RequiresReplace(), + }, Validators: []validator.List{ listvalidator.SizeAtMost(10), }, @@ -585,14 +589,6 @@ func toUpdatePayload(model *Model) (*dns.UpdateZonePayload, error) { 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{ Name: model.Name.ValueStringPointer(), ContactEmail: model.ContactEmail.ValueStringPointer(), @@ -603,6 +599,6 @@ func toUpdatePayload(model *Model) (*dns.UpdateZonePayload, error) { RefreshTime: conversion.ToPtrInt32(model.RefreshTime), RetryTime: conversion.ToPtrInt32(model.RetryTime), NegativeCache: conversion.ToPtrInt32(model.NegativeCache), - Primaries: &modelPrimaries, + Primaries: nil, // API returns error if this field is set, even if nothing changes }, nil } diff --git a/stackit/services/dns/zone/resource_test.go b/stackit/services/dns/zone/resource_test.go index 27985891..a19ab160 100644 --- a/stackit/services/dns/zone/resource_test.go +++ b/stackit/services/dns/zone/resource_test.go @@ -290,8 +290,7 @@ func TestToPayloadUpdate(t *testing.T) { Name: types.StringValue("Name"), }, &dns.UpdateZonePayload{ - Name: utils.Ptr("Name"), - Primaries: &[]string{}, + Name: utils.Ptr("Name"), }, true, }, @@ -321,7 +320,6 @@ func TestToPayloadUpdate(t *testing.T) { Acl: utils.Ptr("Acl"), Description: utils.Ptr("Description"), ContactEmail: utils.Ptr("ContactEmail"), - Primaries: &[]string{"Primary"}, RetryTime: utils.Ptr(int32(3)), RefreshTime: utils.Ptr(int32(4)), ExpireTime: utils.Ptr(int32(5)),