Skip to content

Commit 2e8e88f

Browse files
google_dns_managed_zone labels patching (#6062) (#4372)
* Switch to PATCH for google_dns_managed_zone Signed-off-by: Trung <[email protected]> * Limit changes to update_encoder Signed-off-by: Trung <[email protected]> * Fix dns managed zone labels test Signed-off-by: Trung <[email protected]> * Rename to managedZoneID Signed-off-by: Trung <[email protected]> * Documentation and ignore managed_zone_id and creation_time Signed-off-by: Trung <[email protected]> * Fix linter and comment format Signed-off-by: Trung <[email protected]> Signed-off-by: Modular Magician <[email protected]>
1 parent 3405efe commit 2e8e88f

File tree

5 files changed

+110
-9
lines changed

5 files changed

+110
-9
lines changed

.changelog/6062.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
dns: fixed perma-diff for updated labels in `google_dns_managed_zone`
3+
```

google-beta/data_source_dns_managed_zone_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ func TestAccDataSourceDnsManagedZone_basic(t *testing.T) {
2626
"peering_config.#": {},
2727
"forwarding_config.#": {},
2828
"force_destroy": {},
29+
"labels.#": {},
30+
"managed_zone_id": {},
31+
"creation_time": {},
2932
"reverse_lookup": {},
3033
},
3134
),

google-beta/resource_dns_managed_zone.go

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,17 @@ Ignored for 'public' visibility zones.`,
283283
while private zones are visible only to Virtual Private Cloud resources. Default value: "public" Possible values: ["private", "public"]`,
284284
Default: "public",
285285
},
286+
"creation_time": {
287+
Type: schema.TypeString,
288+
Computed: true,
289+
Description: `The time that this resource was created on the server.
290+
This is in RFC3339 text format.`,
291+
},
292+
"managed_zone_id": {
293+
Type: schema.TypeInt,
294+
Computed: true,
295+
Description: `Unique identifier for the resource; defined by the server.`,
296+
},
286297
"name_servers": {
287298
Type: schema.TypeList,
288299
Computed: true,
@@ -503,12 +514,18 @@ func resourceDNSManagedZoneRead(d *schema.ResourceData, meta interface{}) error
503514
if err := d.Set("dnssec_config", flattenDNSManagedZoneDnssecConfig(res["dnssecConfig"], d, config)); err != nil {
504515
return fmt.Errorf("Error reading ManagedZone: %s", err)
505516
}
517+
if err := d.Set("managed_zone_id", flattenDNSManagedZoneManagedZoneID(res["id"], d, config)); err != nil {
518+
return fmt.Errorf("Error reading ManagedZone: %s", err)
519+
}
506520
if err := d.Set("name", flattenDNSManagedZoneName(res["name"], d, config)); err != nil {
507521
return fmt.Errorf("Error reading ManagedZone: %s", err)
508522
}
509523
if err := d.Set("name_servers", flattenDNSManagedZoneNameServers(res["nameServers"], d, config)); err != nil {
510524
return fmt.Errorf("Error reading ManagedZone: %s", err)
511525
}
526+
if err := d.Set("creation_time", flattenDNSManagedZoneCreationTime(res["creationTime"], d, config)); err != nil {
527+
return fmt.Errorf("Error reading ManagedZone: %s", err)
528+
}
512529
if err := d.Set("labels", flattenDNSManagedZoneLabels(res["labels"], d, config)); err != nil {
513530
return fmt.Errorf("Error reading ManagedZone: %s", err)
514531
}
@@ -556,18 +573,36 @@ func resourceDNSManagedZoneUpdate(d *schema.ResourceData, meta interface{}) erro
556573
} else if v, ok := d.GetOkExists("description"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, descriptionProp)) {
557574
obj["description"] = descriptionProp
558575
}
576+
dnsNameProp, err := expandDNSManagedZoneDnsName(d.Get("dns_name"), d, config)
577+
if err != nil {
578+
return err
579+
} else if v, ok := d.GetOkExists("dns_name"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, dnsNameProp)) {
580+
obj["dnsName"] = dnsNameProp
581+
}
559582
dnssecConfigProp, err := expandDNSManagedZoneDnssecConfig(d.Get("dnssec_config"), d, config)
560583
if err != nil {
561584
return err
562585
} else if v, ok := d.GetOkExists("dnssec_config"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, dnssecConfigProp)) {
563586
obj["dnssecConfig"] = dnssecConfigProp
564587
}
588+
nameProp, err := expandDNSManagedZoneName(d.Get("name"), d, config)
589+
if err != nil {
590+
return err
591+
} else if v, ok := d.GetOkExists("name"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, nameProp)) {
592+
obj["name"] = nameProp
593+
}
565594
labelsProp, err := expandDNSManagedZoneLabels(d.Get("labels"), d, config)
566595
if err != nil {
567596
return err
568597
} else if v, ok := d.GetOkExists("labels"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelsProp)) {
569598
obj["labels"] = labelsProp
570599
}
600+
visibilityProp, err := expandDNSManagedZoneVisibility(d.Get("visibility"), d, config)
601+
if err != nil {
602+
return err
603+
} else if v, ok := d.GetOkExists("visibility"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, visibilityProp)) {
604+
obj["visibility"] = visibilityProp
605+
}
571606
privateVisibilityConfigProp, err := expandDNSManagedZonePrivateVisibilityConfig(d.Get("private_visibility_config"), d, config)
572607
if err != nil {
573608
return err
@@ -586,6 +621,23 @@ func resourceDNSManagedZoneUpdate(d *schema.ResourceData, meta interface{}) erro
586621
} else if v, ok := d.GetOkExists("peering_config"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, peeringConfigProp)) {
587622
obj["peeringConfig"] = peeringConfigProp
588623
}
624+
reverseLookupConfigProp, err := expandDNSManagedZoneReverseLookup(d.Get("reverse_lookup"), d, config)
625+
if err != nil {
626+
return err
627+
} else if v, ok := d.GetOkExists("reverse_lookup"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, reverseLookupConfigProp)) {
628+
obj["reverseLookupConfig"] = reverseLookupConfigProp
629+
}
630+
serviceDirectoryConfigProp, err := expandDNSManagedZoneServiceDirectoryConfig(d.Get("service_directory_config"), d, config)
631+
if err != nil {
632+
return err
633+
} else if v, ok := d.GetOkExists("service_directory_config"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, serviceDirectoryConfigProp)) {
634+
obj["serviceDirectoryConfig"] = serviceDirectoryConfigProp
635+
}
636+
637+
obj, err = resourceDNSManagedZoneUpdateEncoder(d, meta, obj)
638+
if err != nil {
639+
return err
640+
}
589641

590642
url, err := replaceVars(d, config, "{{DNSBasePath}}projects/{{project}}/managedZones/{{name}}")
591643
if err != nil {
@@ -599,7 +651,7 @@ func resourceDNSManagedZoneUpdate(d *schema.ResourceData, meta interface{}) erro
599651
billingProject = bp
600652
}
601653

602-
res, err := sendRequestWithTimeout(config, "PATCH", billingProject, url, userAgent, obj, d.Timeout(schema.TimeoutUpdate))
654+
res, err := sendRequestWithTimeout(config, "PUT", billingProject, url, userAgent, obj, d.Timeout(schema.TimeoutUpdate))
603655

604656
if err != nil {
605657
return fmt.Errorf("Error updating ManagedZone %q: %s", d.Id(), err)
@@ -831,6 +883,23 @@ func flattenDNSManagedZoneDnssecConfigDefaultKeySpecsKind(v interface{}, d *sche
831883
return v
832884
}
833885

886+
func flattenDNSManagedZoneManagedZoneID(v interface{}, d *schema.ResourceData, config *Config) interface{} {
887+
// Handles the string fixed64 format
888+
if strVal, ok := v.(string); ok {
889+
if intVal, err := stringToFixed64(strVal); err == nil {
890+
return intVal
891+
}
892+
}
893+
894+
// number values are represented as float64
895+
if floatVal, ok := v.(float64); ok {
896+
intVal := int(floatVal)
897+
return intVal
898+
}
899+
900+
return v // let terraform core handle it otherwise
901+
}
902+
834903
func flattenDNSManagedZoneName(v interface{}, d *schema.ResourceData, config *Config) interface{} {
835904
return v
836905
}
@@ -839,6 +908,10 @@ func flattenDNSManagedZoneNameServers(v interface{}, d *schema.ResourceData, con
839908
return v
840909
}
841910

911+
func flattenDNSManagedZoneCreationTime(v interface{}, d *schema.ResourceData, config *Config) interface{} {
912+
return v
913+
}
914+
842915
func flattenDNSManagedZoneLabels(v interface{}, d *schema.ResourceData, config *Config) interface{} {
843916
return v
844917
}
@@ -1379,3 +1452,17 @@ func expandDNSManagedZoneServiceDirectoryConfigNamespaceNamespaceUrl(v interface
13791452
}
13801453
return url, nil
13811454
}
1455+
1456+
func resourceDNSManagedZoneUpdateEncoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) {
1457+
// The upstream update method (https://cloud.google.com/dns/docs/reference/v1/managedZones/update)
1458+
// requires the full ManagedZones object, therefore, we need to keep some input only values in the struct
1459+
// and then reuse it in the update
1460+
nameServers, ok := d.GetOkExists("name_servers")
1461+
if !ok {
1462+
nameServers = []string{}
1463+
}
1464+
obj["nameServers"] = nameServers
1465+
obj["id"] = d.Get("managed_zone_id")
1466+
obj["creationTime"] = d.Get("creation_time")
1467+
return obj, nil
1468+
}

google-beta/resource_dns_managed_zone_test.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ func TestAccDNSManagedZone_update(t *testing.T) {
2020
CheckDestroy: testAccCheckDNSManagedZoneDestroyProducer(t),
2121
Steps: []resource.TestStep{
2222
{
23-
Config: testAccDnsManagedZone_basic(zoneSuffix, "description1"),
23+
Config: testAccDnsManagedZone_basic(zoneSuffix, "description1", map[string]string{"foo": "bar", "ping": "pong"}),
2424
},
2525
{
2626
ResourceName: "google_dns_managed_zone.foobar",
2727
ImportState: true,
2828
ImportStateVerify: true,
2929
},
3030
{
31-
Config: testAccDnsManagedZone_basic(zoneSuffix, "description2"),
31+
Config: testAccDnsManagedZone_basic(zoneSuffix, "description2", map[string]string{"foo": "bar"}),
3232
},
3333
{
3434
ResourceName: "google_dns_managed_zone.foobar",
@@ -256,19 +256,20 @@ resource "google_dns_managed_zone" "foobar" {
256256
`, suffix, suffix)
257257
}
258258

259-
func testAccDnsManagedZone_basic(suffix, description string) string {
259+
func testAccDnsManagedZone_basic(suffix, description string, labels map[string]string) string {
260+
labelsRep := ""
261+
for k, v := range labels {
262+
labelsRep += fmt.Sprintf("%s = %q, ", k, v)
263+
}
260264
return fmt.Sprintf(`
261265
resource "google_dns_managed_zone" "foobar" {
262266
name = "mzone-test-%s"
263267
dns_name = "tf-acctest-%s.hashicorptest.com."
264268
description = "%s"
265-
labels = {
266-
foo = "bar"
267-
}
268-
269+
labels = {%s}
269270
visibility = "public"
270271
}
271-
`, suffix, suffix, description)
272+
`, suffix, suffix, description, labelsRep)
272273
}
273274

274275
func testAccDnsManagedZone_dnssec_on(suffix string) string {

website/docs/r/dns_managed_zone.html.markdown

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,10 +424,17 @@ In addition to the arguments listed above, the following computed attributes are
424424

425425
* `id` - an identifier for the resource with format `projects/{{project}}/managedZones/{{name}}`
426426

427+
* `managed_zone_id` -
428+
Unique identifier for the resource; defined by the server.
429+
427430
* `name_servers` -
428431
Delegate your managed_zone to these virtual name servers;
429432
defined by the server
430433

434+
* `creation_time` -
435+
The time that this resource was created on the server.
436+
This is in RFC3339 text format.
437+
431438

432439
## Timeouts
433440

0 commit comments

Comments
 (0)