From d3802a1ffdb7eb52b682c4af9fe08d2c96c81dfb Mon Sep 17 00:00:00 2001 From: Sam Levenick Date: Wed, 25 Sep 2019 21:48:24 +0000 Subject: [PATCH] Custom hash function for router_nat.subnetwork Signed-off-by: Modular Magician --- google-beta/resource_compute_router_nat.go | 30 +++++++++++++++++-- .../resource_compute_router_nat_test.go | 2 +- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/google-beta/resource_compute_router_nat.go b/google-beta/resource_compute_router_nat.go index 6223277490..cea5394154 100644 --- a/google-beta/resource_compute_router_nat.go +++ b/google-beta/resource_compute_router_nat.go @@ -78,6 +78,32 @@ func resourceComputeRouterNatDrainNatIpsCustomDiff(diff *schema.ResourceDiff, me return nil } +func computeRouterNatSubnetworkHash(v interface{}) int { + obj := v.(map[string]interface{}) + name := obj["name"] + sourceIpRanges := obj["source_ip_ranges_to_nat"] + sourceIpRangesHash := 0 + if sourceIpRanges != nil { + sourceIpSet := sourceIpRanges.(*schema.Set) + + for _, ipRange := range sourceIpSet.List() { + sourceIpRangesHash += schema.HashString(ipRange.(string)) + } + } + + secondaryIpRangeNames := obj["secondary_ip_range_names"] + secondaryIpRangeHash := 0 + if secondaryIpRangeNames != nil { + secondaryIpRangeSet := secondaryIpRangeNames.(*schema.Set) + + for _, secondaryIp := range secondaryIpRangeSet.List() { + secondaryIpRangeHash += schema.HashString(secondaryIp.(string)) + } + } + + return schema.HashString(NameFromSelfLinkStateFunc(name)) + sourceIpRangesHash + secondaryIpRangeHash +} + func resourceComputeRouterNat() *schema.Resource { return &schema.Resource{ Create: resourceComputeRouterNatCreate, @@ -176,7 +202,7 @@ func resourceComputeRouterNat() *schema.Resource { Type: schema.TypeSet, Optional: true, Elem: computeRouterNatSubnetworkSchema(), - // Default schema.HashSchema is used. + Set: computeRouterNatSubnetworkHash, }, "tcp_established_idle_timeout_sec": { Type: schema.TypeInt, @@ -657,7 +683,7 @@ func flattenComputeRouterNatSubnetwork(v interface{}, d *schema.ResourceData) in return v } l := v.([]interface{}) - transformed := schema.NewSet(schema.HashResource(computeRouterNatSubnetworkSchema()), []interface{}{}) + transformed := schema.NewSet(computeRouterNatSubnetworkHash, []interface{}{}) for _, raw := range l { original := raw.(map[string]interface{}) if len(original) < 1 { diff --git a/google-beta/resource_compute_router_nat_test.go b/google-beta/resource_compute_router_nat_test.go index 47eed28a8f..696dae6386 100644 --- a/google-beta/resource_compute_router_nat_test.go +++ b/google-beta/resource_compute_router_nat_test.go @@ -391,7 +391,7 @@ resource "google_compute_router_nat" "foobar" { nat_ips = ["${google_compute_address.foobar.self_link}"] source_subnetwork_ip_ranges_to_nat = "LIST_OF_SUBNETWORKS" subnetwork { - name = "${google_compute_subnetwork.foobar.self_link}" + name = "${google_compute_subnetwork.foobar.name}" source_ip_ranges_to_nat = ["ALL_IP_RANGES"] } }`, testId, testId, testId, testId, testId)