Skip to content

Commit 06d4a35

Browse files
Add option to recreate PSC FW rule when status changed to closed (#9190) (#16188)
[upstream:85d3f6e001151c63845fd72325ab07e55f558429] Signed-off-by: Modular Magician <[email protected]>
1 parent 1815880 commit 06d4a35

File tree

4 files changed

+186
-0
lines changed

4 files changed

+186
-0
lines changed

.changelog/9190.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
compute: add `recreate_closed_psc` flag to recreate the PSC Consumer forwarding rule if the `psc_connection_status` is closed on `google_compute_forwarding_rule`.
3+
```

google/services/compute/resource_compute_forwarding_rule.go

+36
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package compute
1919

2020
import (
21+
"context"
2122
"fmt"
2223
"log"
2324
"reflect"
@@ -32,6 +33,23 @@ import (
3233
"github.com/hashicorp/terraform-provider-google/google/verify"
3334
)
3435

36+
func forwardingRuleCustomizeDiff(_ context.Context, diff *schema.ResourceDiff, v interface{}) error {
37+
log.Println("[DEBUG] [PSC] Reached forwardingRuleCustomizeDiff function")
38+
39+
// if target is not a string it's not set so no PSC connection
40+
if target, ok := diff.Get("target").(string); ok {
41+
if strings.Contains(target, "/serviceAttachments/") {
42+
recreateClosedPsc, _ := diff.Get("recreate_closed_psc").(bool)
43+
if pscConnectionStatus, ok := diff.Get("psc_connection_status").(string); ok && recreateClosedPsc && pscConnectionStatus == "CLOSED" {
44+
// https://discuss.hashicorp.com/t/force-new-resource-based-on-api-read-difference/29759/6
45+
diff.SetNewComputed("psc_connection_status")
46+
diff.ForceNew("psc_connection_status")
47+
}
48+
}
49+
}
50+
return nil
51+
}
52+
3553
func ResourceComputeForwardingRule() *schema.Resource {
3654
return &schema.Resource{
3755
Create: resourceComputeForwardingRuleCreate,
@@ -50,6 +68,7 @@ func ResourceComputeForwardingRule() *schema.Resource {
5068
},
5169

5270
CustomizeDiff: customdiff.All(
71+
forwardingRuleCustomizeDiff,
5372
tpgresource.SetLabelsDiff,
5473
tpgresource.DefaultProviderProject,
5574
),
@@ -486,6 +505,12 @@ This field is only used for INTERNAL load balancing.`,
486505
and default labels configured on the provider.`,
487506
Elem: &schema.Schema{Type: schema.TypeString},
488507
},
508+
"recreate_closed_psc": {
509+
Type: schema.TypeBool,
510+
Optional: true,
511+
Default: false,
512+
Description: `This is used in PSC consumer ForwardingRule to make terraform recreate the ForwardingRule when the status is closed`,
513+
},
489514
"project": {
490515
Type: schema.TypeString,
491516
Optional: true,
@@ -807,6 +832,12 @@ func resourceComputeForwardingRuleRead(d *schema.ResourceData, meta interface{})
807832
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("ComputeForwardingRule %q", d.Id()))
808833
}
809834

835+
// Explicitly set virtual fields to default values if unset
836+
if _, ok := d.GetOkExists("recreate_closed_psc"); !ok {
837+
if err := d.Set("recreate_closed_psc", false); err != nil {
838+
return fmt.Errorf("Error setting recreate_closed_psc: %s", err)
839+
}
840+
}
810841
if err := d.Set("project", project); err != nil {
811842
return fmt.Errorf("Error reading ForwardingRule: %s", err)
812843
}
@@ -1205,6 +1236,11 @@ func resourceComputeForwardingRuleImport(d *schema.ResourceData, meta interface{
12051236
id = strings.ReplaceAll(id, "projects/projects/", "projects/")
12061237
d.SetId(id)
12071238

1239+
// Explicitly set virtual fields to default values on import
1240+
if err := d.Set("recreate_closed_psc", false); err != nil {
1241+
return nil, fmt.Errorf("Error setting recreate_closed_psc: %s", err)
1242+
}
1243+
12081244
return []*schema.ResourceData{d}, nil
12091245
}
12101246

google/services/compute/resource_compute_forwarding_rule_test.go

+146
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,51 @@ func TestAccComputeForwardingRule_forwardingRuleVpcPscExampleUpdate(t *testing.T
142142
})
143143
}
144144

145+
func TestAccComputeForwardingRule_forwardingRulePscRecreate(t *testing.T) {
146+
t.Parallel()
147+
148+
context := map[string]interface{}{
149+
"random_suffix": acctest.RandString(t, 10),
150+
}
151+
152+
acctest.VcrTest(t, resource.TestCase{
153+
PreCheck: func() { acctest.AccTestPreCheck(t) },
154+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
155+
CheckDestroy: testAccCheckComputeForwardingRuleDestroyProducer(t),
156+
Steps: []resource.TestStep{
157+
{
158+
Config: testAccComputeForwardingRule_forwardingRulePscRecreate(context),
159+
},
160+
{
161+
ResourceName: "google_compute_forwarding_rule.default",
162+
ImportState: true,
163+
ImportStateVerify: true,
164+
ImportStateVerifyIgnore: []string{"recreate_closed_psc"},
165+
},
166+
{
167+
Config: testAccComputeForwardingRule_forwardingRulePscRecreate(context),
168+
},
169+
{
170+
ResourceName: "google_compute_forwarding_rule.default",
171+
ImportState: true,
172+
ImportStateVerify: true,
173+
ExpectNonEmptyPlan: true,
174+
ImportStateVerifyIgnore: []string{"recreate_closed_psc"},
175+
},
176+
{
177+
Config: testAccComputeForwardingRule_forwardingRulePscRecreate(context),
178+
},
179+
{
180+
ResourceName: "google_compute_forwarding_rule.default",
181+
ImportState: true,
182+
ImportStateVerify: true,
183+
ExpectNonEmptyPlan: true,
184+
ImportStateVerifyIgnore: []string{"recreate_closed_psc"},
185+
},
186+
},
187+
})
188+
}
189+
145190
func TestAccComputeForwardingRule_forwardingRuleRegionalSteeringExampleUpdate(t *testing.T) {
146191
t.Parallel()
147192

@@ -330,6 +375,107 @@ resource "google_compute_address" "consumer_address" {
330375
}
331376
332377
378+
// Producer service attachment
379+
380+
resource "google_compute_network" "producer_net" {
381+
name = "tf-test-producer-net%{random_suffix}"
382+
auto_create_subnetworks = false
383+
}
384+
385+
resource "google_compute_subnetwork" "producer_subnet" {
386+
name = "tf-test-producer-net%{random_suffix}"
387+
ip_cidr_range = "10.0.0.0/16"
388+
region = "us-central1"
389+
network = google_compute_network.producer_net.id
390+
}
391+
392+
resource "google_compute_subnetwork" "psc_producer_subnet" {
393+
name = "tf-test-producer-psc-net%{random_suffix}"
394+
ip_cidr_range = "10.1.0.0/16"
395+
region = "us-central1"
396+
397+
purpose = "PRIVATE_SERVICE_CONNECT"
398+
network = google_compute_network.producer_net.id
399+
}
400+
401+
resource "google_compute_service_attachment" "producer_service_attachment" {
402+
name = "tf-test-producer-service%{random_suffix}"
403+
region = "us-central1"
404+
description = "A service attachment configured with Terraform"
405+
406+
enable_proxy_protocol = true
407+
connection_preference = "ACCEPT_AUTOMATIC"
408+
nat_subnets = [google_compute_subnetwork.psc_producer_subnet.name]
409+
target_service = google_compute_forwarding_rule.producer_target_service.id
410+
}
411+
412+
resource "google_compute_forwarding_rule" "producer_target_service" {
413+
name = "tf-test-producer-forwarding-rule%{random_suffix}"
414+
region = "us-central1"
415+
416+
load_balancing_scheme = "INTERNAL"
417+
backend_service = google_compute_region_backend_service.producer_service_backend.id
418+
all_ports = true
419+
network = google_compute_network.producer_net.name
420+
subnetwork = google_compute_subnetwork.producer_subnet.name
421+
}
422+
423+
resource "google_compute_region_backend_service" "producer_service_backend" {
424+
name = "tf-test-producer-service-backend%{random_suffix}"
425+
region = "us-central1"
426+
427+
health_checks = [google_compute_health_check.producer_service_health_check.id]
428+
}
429+
430+
resource "google_compute_health_check" "producer_service_health_check" {
431+
name = "tf-test-producer-service-health-check%{random_suffix}"
432+
433+
check_interval_sec = 1
434+
timeout_sec = 1
435+
tcp_health_check {
436+
port = "80"
437+
}
438+
}
439+
`, context)
440+
}
441+
442+
func testAccComputeForwardingRule_forwardingRulePscRecreate(context map[string]interface{}) string {
443+
444+
return acctest.Nprintf(`
445+
// Forwarding rule for VPC private service connect
446+
resource "google_compute_forwarding_rule" "default" {
447+
name = "tf-test-psc-endpoint%{random_suffix}"
448+
region = "us-central1"
449+
load_balancing_scheme = ""
450+
target = google_compute_service_attachment.producer_service_attachment.id
451+
network = google_compute_network.consumer_net.name
452+
ip_address = google_compute_address.consumer_address.id
453+
allow_psc_global_access = true
454+
recreate_closed_psc = true
455+
}
456+
457+
// Consumer service endpoint
458+
459+
resource "google_compute_network" "consumer_net" {
460+
name = "tf-test-consumer-net%{random_suffix}"
461+
auto_create_subnetworks = false
462+
}
463+
464+
resource "google_compute_subnetwork" "consumer_subnet" {
465+
name = "tf-test-consumer-net%{random_suffix}"
466+
ip_cidr_range = "10.0.0.0/16"
467+
region = "us-central1"
468+
network = google_compute_network.consumer_net.id
469+
}
470+
471+
resource "google_compute_address" "consumer_address" {
472+
name = "tf-test-website-ip%{random_suffix}-1"
473+
region = "us-central1"
474+
subnetwork = google_compute_subnetwork.consumer_subnet.id
475+
address_type = "INTERNAL"
476+
}
477+
478+
333479
// Producer service attachment
334480
335481
resource "google_compute_network" "producer_net" {

website/docs/r/compute_forwarding_rule.html.markdown

+1
Original file line numberDiff line numberDiff line change
@@ -1570,6 +1570,7 @@ The following arguments are supported:
15701570
* `project` - (Optional) The ID of the project in which the resource belongs.
15711571
If it is not provided, the provider project is used.
15721572

1573+
* `recreate_closed_psc` - (Optional) This is used in PSC consumer ForwardingRule to make terraform recreate the ForwardingRule when the status is closed
15731574

15741575
<a name="nested_service_directory_registrations"></a>The `service_directory_registrations` block supports:
15751576

0 commit comments

Comments
 (0)