Skip to content

Commit c3817ef

Browse files
fix: [dns] fix hash function for network_url in ManagedZone and Policy resources (#8716) (#15728)
* fix: [dns] fix hash function for network_url in ManagedZone and Policy resources * add tests for multiproject with same network names * Update mmv1/products/dns/ManagedZone.yaml * Update mmv1/products/dns/Policy.yaml * add project creation * Update mmv1/products/dns/ManagedZone.yaml * Update mmv1/products/dns/Policy.yaml * Update dns_managed_zone_private_multiproject.tf.erb * add missing project services * fix project references * add depends_on * improve tests * fix special characters * fix billing_account * add depends_on on project_service * fixed dependencies * fix depends_on * remove var of dns_name and add depends_on * fix deterministic order --------- Signed-off-by: Modular Magician <[email protected]> Co-authored-by: Stephen Lewis (Burrows) <[email protected]>
1 parent 7b5b298 commit c3817ef

5 files changed

+301
-4
lines changed

.changelog/8716.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
dns: fix hash function for network_url in ManagedZone and Policy resources
3+
```

google/services/dns/resource_dns_managed_zone.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ blocks in an update and then apply another update adding all of them back simult
266266
}
267267
raw := v.(map[string]interface{})
268268
if url, ok := raw["network_url"]; ok {
269-
return tpgresource.SelfLinkNameHash(url)
269+
return tpgresource.SelfLinkRelativePathHash(url)
270270
}
271271
var buf bytes.Buffer
272272
schema.SerializeResourceForHash(&buf, raw, dnsManagedZonePrivateVisibilityConfigNetworksSchema())
@@ -992,7 +992,7 @@ func flattenDNSManagedZonePrivateVisibilityConfigNetworks(v interface{}, d *sche
992992
}
993993
raw := v.(map[string]interface{})
994994
if url, ok := raw["network_url"]; ok {
995-
return tpgresource.SelfLinkNameHash(url)
995+
return tpgresource.SelfLinkRelativePathHash(url)
996996
}
997997
var buf bytes.Buffer
998998
schema.SerializeResourceForHash(&buf, raw, dnsManagedZonePrivateVisibilityConfigNetworksSchema())

google/services/dns/resource_dns_managed_zone_generated_test.go

+150
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
2727

2828
"github.com/hashicorp/terraform-provider-google/google/acctest"
29+
"github.com/hashicorp/terraform-provider-google/google/envvar"
2930
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
3031
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
3132
)
@@ -260,6 +261,155 @@ resource "google_compute_network" "network-2" {
260261
`, context)
261262
}
262263

264+
func TestAccDNSManagedZone_dnsManagedZonePrivateMultiprojectExample(t *testing.T) {
265+
t.Parallel()
266+
267+
context := map[string]interface{}{
268+
"org_id": envvar.GetTestOrgFromEnv(t),
269+
"billing_account": envvar.GetTestBillingAccountFromEnv(t),
270+
"random_suffix": acctest.RandString(t, 10),
271+
}
272+
273+
acctest.VcrTest(t, resource.TestCase{
274+
PreCheck: func() { acctest.AccTestPreCheck(t) },
275+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
276+
CheckDestroy: testAccCheckDNSManagedZoneDestroyProducer(t),
277+
Steps: []resource.TestStep{
278+
{
279+
Config: testAccDNSManagedZone_dnsManagedZonePrivateMultiprojectExample(context),
280+
},
281+
{
282+
ResourceName: "google_dns_managed_zone.private-zone",
283+
ImportState: true,
284+
ImportStateVerify: true,
285+
},
286+
},
287+
})
288+
}
289+
290+
func testAccDNSManagedZone_dnsManagedZonePrivateMultiprojectExample(context map[string]interface{}) string {
291+
return acctest.Nprintf(`
292+
resource "google_dns_managed_zone" "private-zone" {
293+
name = "tf-test-private-zone%{random_suffix}"
294+
dns_name = "multiproject.private.example.com."
295+
description = "Example private DNS zone"
296+
labels = {
297+
foo = "bar"
298+
}
299+
300+
visibility = "private"
301+
302+
private_visibility_config {
303+
networks {
304+
network_url = google_compute_network.network_1_project_1.id
305+
}
306+
networks {
307+
network_url = google_compute_network.network_2_project_1.id
308+
}
309+
networks {
310+
network_url = google_compute_network.network_1_project_2.id
311+
}
312+
networks {
313+
network_url = google_compute_network.network_2_project_2.id
314+
}
315+
}
316+
317+
depends_on = [
318+
google_project_service.compute_project_1,
319+
google_project_service.dns_project_1,
320+
google_project_service.compute_project_2,
321+
google_project_service.dns_project_2,
322+
]
323+
}
324+
325+
resource "google_project" "project_1" {
326+
name = "tf-test-project-1%{random_suffix}"
327+
project_id = "tf-test-project-1%{random_suffix}"
328+
org_id = "%{org_id}"
329+
billing_account = "%{billing_account}"
330+
}
331+
332+
resource "google_project" "project_2" {
333+
name = "tf-test-project-2%{random_suffix}"
334+
project_id = "tf-test-project-2%{random_suffix}"
335+
org_id = "%{org_id}"
336+
billing_account = "%{billing_account}"
337+
}
338+
339+
resource "google_compute_network" "network_1_project_1" {
340+
name = "tf-test-network-1%{random_suffix}"
341+
project = google_project.project_1.project_id
342+
auto_create_subnetworks = false
343+
depends_on = [
344+
google_project_service.compute_project_1,
345+
google_project_service.dns_project_1,
346+
]
347+
}
348+
349+
resource "google_compute_network" "network_2_project_1" {
350+
name = "tf-test-network-2%{random_suffix}"
351+
project = google_project.project_1.project_id
352+
auto_create_subnetworks = false
353+
depends_on = [
354+
google_project_service.compute_project_1,
355+
google_project_service.dns_project_1,
356+
]
357+
}
358+
359+
resource "google_compute_network" "network_1_project_2" {
360+
name = "tf-test-network-1%{random_suffix}"
361+
project = google_project.project_2.project_id
362+
auto_create_subnetworks = false
363+
depends_on = [
364+
google_project_service.compute_project_2,
365+
google_project_service.dns_project_2,
366+
]
367+
}
368+
369+
resource "google_compute_network" "network_2_project_2" {
370+
name = "tf-test-network-2%{random_suffix}"
371+
project = google_project.project_2.project_id
372+
auto_create_subnetworks = false
373+
depends_on = [
374+
google_project_service.compute_project_2,
375+
google_project_service.dns_project_2,
376+
]
377+
}
378+
379+
resource "google_project_service" "compute_project_1" {
380+
project = google_project.project_1.project_id
381+
service = "compute.googleapis.com"
382+
depends_on = [
383+
google_project.project_1,
384+
]
385+
}
386+
387+
resource "google_project_service" "compute_project_2" {
388+
project = google_project.project_2.project_id
389+
service = "compute.googleapis.com"
390+
depends_on = [
391+
google_project_service.dns_project_1
392+
]
393+
}
394+
395+
resource "google_project_service" "dns_project_1" {
396+
project = google_project.project_1.project_id
397+
service = "dns.googleapis.com"
398+
depends_on = [
399+
google_project_service.compute_project_1
400+
]
401+
}
402+
403+
resource "google_project_service" "dns_project_2" {
404+
project = google_project.project_2.project_id
405+
service = "dns.googleapis.com"
406+
depends_on = [
407+
google_project_service.compute_project_2,
408+
]
409+
}
410+
`, context)
411+
}
412+
263413
func TestAccDNSManagedZone_dnsManagedZonePrivateGkeExample(t *testing.T) {
264414
t.Parallel()
265415

google/services/dns/resource_dns_policy.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ Defaults to no logging if not set.`,
113113
Set: func(v interface{}) int {
114114
raw := v.(map[string]interface{})
115115
if url, ok := raw["network_url"]; ok {
116-
return tpgresource.SelfLinkNameHash(url)
116+
return tpgresource.SelfLinkRelativePathHash(url)
117117
}
118118
var buf bytes.Buffer
119119
schema.SerializeResourceForHash(&buf, raw, dnsPolicyNetworksSchema())
@@ -560,7 +560,7 @@ func flattenDNSPolicyNetworks(v interface{}, d *schema.ResourceData, config *tra
560560
transformed := schema.NewSet(func(v interface{}) int {
561561
raw := v.(map[string]interface{})
562562
if url, ok := raw["network_url"]; ok {
563-
return tpgresource.SelfLinkNameHash(url)
563+
return tpgresource.SelfLinkRelativePathHash(url)
564564
}
565565
var buf bytes.Buffer
566566
schema.SerializeResourceForHash(&buf, raw, dnsPolicyNetworksSchema())

google/services/dns/resource_dns_policy_generated_test.go

+144
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
2727

2828
"github.com/hashicorp/terraform-provider-google/google/acctest"
29+
"github.com/hashicorp/terraform-provider-google/google/envvar"
2930
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
3031
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
3132
)
@@ -92,6 +93,149 @@ resource "google_compute_network" "network-2" {
9293
`, context)
9394
}
9495

96+
func TestAccDNSPolicy_dnsPolicyMultiprojectExample(t *testing.T) {
97+
t.Parallel()
98+
99+
context := map[string]interface{}{
100+
"org_id": envvar.GetTestOrgFromEnv(t),
101+
"billing_account": envvar.GetTestBillingAccountFromEnv(t),
102+
"random_suffix": acctest.RandString(t, 10),
103+
}
104+
105+
acctest.VcrTest(t, resource.TestCase{
106+
PreCheck: func() { acctest.AccTestPreCheck(t) },
107+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
108+
CheckDestroy: testAccCheckDNSPolicyDestroyProducer(t),
109+
Steps: []resource.TestStep{
110+
{
111+
Config: testAccDNSPolicy_dnsPolicyMultiprojectExample(context),
112+
},
113+
{
114+
ResourceName: "google_dns_policy.example-policy-multiproject",
115+
ImportState: true,
116+
ImportStateVerify: true,
117+
},
118+
},
119+
})
120+
}
121+
122+
func testAccDNSPolicy_dnsPolicyMultiprojectExample(context map[string]interface{}) string {
123+
return acctest.Nprintf(`
124+
resource "google_dns_policy" "example-policy-multiproject" {
125+
name = "tf-test-example-policy-multiproject%{random_suffix}"
126+
enable_inbound_forwarding = true
127+
128+
enable_logging = true
129+
130+
networks {
131+
network_url = google_compute_network.network_1_project_1.id
132+
}
133+
networks {
134+
network_url = google_compute_network.network_2_project_1.id
135+
}
136+
networks {
137+
network_url = google_compute_network.network_1_project_2.id
138+
}
139+
networks {
140+
network_url = google_compute_network.network_2_project_2.id
141+
}
142+
143+
depends_on = [
144+
google_project_service.compute_project_1,
145+
google_project_service.dns_project_1,
146+
google_project_service.compute_project_2,
147+
google_project_service.dns_project_2,
148+
]
149+
}
150+
151+
resource "google_project" "project_1" {
152+
name = "tf-test-project-1%{random_suffix}"
153+
project_id = "tf-test-project-1%{random_suffix}"
154+
org_id = "%{org_id}"
155+
billing_account = "%{billing_account}"
156+
}
157+
158+
resource "google_project" "project_2" {
159+
name = "tf-test-project-2%{random_suffix}"
160+
project_id = "tf-test-project-2%{random_suffix}"
161+
org_id = "%{org_id}"
162+
billing_account = "%{billing_account}"
163+
}
164+
165+
resource "google_compute_network" "network_1_project_1" {
166+
name = "tf-test-network-1%{random_suffix}"
167+
project = google_project.project_1.project_id
168+
auto_create_subnetworks = false
169+
depends_on = [
170+
google_project_service.compute_project_1,
171+
google_project_service.dns_project_1,
172+
]
173+
}
174+
175+
resource "google_compute_network" "network_2_project_1" {
176+
name = "tf-test-network-2%{random_suffix}"
177+
project = google_project.project_1.project_id
178+
auto_create_subnetworks = false
179+
depends_on = [
180+
google_project_service.compute_project_1,
181+
google_project_service.dns_project_1,
182+
]
183+
}
184+
185+
resource "google_compute_network" "network_1_project_2" {
186+
name = "tf-test-network-1%{random_suffix}"
187+
project = google_project.project_2.project_id
188+
auto_create_subnetworks = false
189+
depends_on = [
190+
google_project_service.compute_project_2,
191+
google_project_service.dns_project_2,
192+
]
193+
}
194+
195+
resource "google_compute_network" "network_2_project_2" {
196+
name = "tf-test-network-2%{random_suffix}"
197+
project = google_project.project_2.project_id
198+
auto_create_subnetworks = false
199+
depends_on = [
200+
google_project_service.compute_project_2,
201+
google_project_service.dns_project_2,
202+
]
203+
}
204+
205+
resource "google_project_service" "compute_project_1" {
206+
project = google_project.project_1.project_id
207+
service = "compute.googleapis.com"
208+
depends_on = [
209+
google_project.project_1,
210+
]
211+
}
212+
213+
resource "google_project_service" "compute_project_2" {
214+
project = google_project.project_2.project_id
215+
service = "compute.googleapis.com"
216+
depends_on = [
217+
google_project_service.dns_project_1
218+
]
219+
}
220+
221+
resource "google_project_service" "dns_project_1" {
222+
project = google_project.project_1.project_id
223+
service = "dns.googleapis.com"
224+
depends_on = [
225+
google_project_service.compute_project_1
226+
]
227+
}
228+
229+
resource "google_project_service" "dns_project_2" {
230+
project = google_project.project_2.project_id
231+
service = "dns.googleapis.com"
232+
depends_on = [
233+
google_project_service.compute_project_2,
234+
]
235+
}
236+
`, context)
237+
}
238+
95239
func testAccCheckDNSPolicyDestroyProducer(t *testing.T) func(s *terraform.State) error {
96240
return func(s *terraform.State) error {
97241
for name, rs := range s.RootModule().Resources {

0 commit comments

Comments
 (0)