Skip to content

Commit e9c8e09

Browse files
Adding IP Collection To Forwarding Rule (#12914) (#21188)
[upstream:7a23ebbfcffa06209ce0cb85cbd3988edaa24063] Signed-off-by: Modular Magician <[email protected]>
1 parent 700413d commit e9c8e09

File tree

6 files changed

+196
-0
lines changed

6 files changed

+196
-0
lines changed

.changelog/12914.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
compute: added `ip_collection` field to `google_compute_forwarding_rule ` resource
3+
```

google/acctest/test_utils.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,21 @@ func RandInt(t *testing.T) int {
136136
return rand.New(s.source).Int()
137137
}
138138

139+
func RandIntRange(t *testing.T, minInt int, maxInt int) int {
140+
if !IsVcrEnabled() {
141+
return acctest.RandIntRange(minInt, maxInt)
142+
}
143+
envPath := os.Getenv("VCR_PATH")
144+
vcrMode := os.Getenv("VCR_MODE")
145+
s, err := vcrSource(t, envPath, vcrMode)
146+
if err != nil {
147+
// At this point we haven't created any resources, so fail fast
148+
t.Fatal(err)
149+
}
150+
151+
return rand.New(s.source).Intn(maxInt-minInt) + minInt
152+
}
153+
139154
// ProtoV5ProviderFactories returns a muxed ProviderServer that uses the provider code from this repo (SDK and plugin-framework).
140155
// Used to set ProtoV5ProviderFactories in a resource.TestStep within an acceptance test.
141156
func ProtoV5ProviderFactories(t *testing.T) map[string]func() (tfprotov5.ProviderServer, error) {

google/services/compute/resource_compute_forwarding_rule.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,24 @@ func PortRangeDiffSuppress(k, old, new string, d *schema.ResourceData) bool {
5959
return old == new+"-"+new
6060
}
6161

62+
// Compare only the relative path from 'regions' of two IP collection links
63+
func IpCollectionDiffSuppress(_, old, new string, d *schema.ResourceData) bool {
64+
oldStripped, err := GetRelativePathFromRegions(old)
65+
if err != nil {
66+
return false
67+
}
68+
69+
newStripped, err := GetRelativePathFromRegions(new)
70+
if err != nil {
71+
return false
72+
}
73+
74+
if oldStripped == newStripped {
75+
return true
76+
}
77+
return false
78+
}
79+
6280
// Suppresses diff for IPv4 and IPv6 different formats.
6381
// It also suppresses diffs if an IP is changing to a reference.
6482
func InternalIpDiffSuppress(_, old, new string, _ *schema.ResourceData) bool {
@@ -103,6 +121,15 @@ func InternalIpDiffSuppress(_, old, new string, _ *schema.ResourceData) bool {
103121
return addr_equality && netmask_equality
104122
}
105123

124+
func GetRelativePathFromRegions(resourceLink string) (string, error) {
125+
stringParts := strings.SplitAfterN(resourceLink, "regions/", 2)
126+
if len(stringParts) != 2 {
127+
return "", fmt.Errorf("String is not a valid link: %s", resourceLink)
128+
}
129+
130+
return "regions/" + stringParts[1], nil
131+
}
132+
106133
func ResourceComputeForwardingRule() *schema.Resource {
107134
return &schema.Resource{
108135
Create: resourceComputeForwardingRuleCreate,
@@ -266,6 +293,21 @@ must be omitted for all other load balancer types.`,
266293
ForceNew: true,
267294
Description: `An optional description of this resource. Provide this property when
268295
you create the resource.`,
296+
},
297+
"ip_collection": {
298+
Type: schema.TypeString,
299+
Optional: true,
300+
ForceNew: true,
301+
DiffSuppressFunc: IpCollectionDiffSuppress,
302+
Description: `Resource reference of a PublicDelegatedPrefix. The PDP must be a sub-PDP
303+
in EXTERNAL_IPV6_FORWARDING_RULE_CREATION mode.
304+
Use one of the following formats to specify a sub-PDP when creating an
305+
IPv6 NetLB forwarding rule using BYOIP:
306+
Full resource URL, as in:
307+
* 'https://www.googleapis.com/compute/v1/projects/{{projectId}}/regions/{{region}}/publicDelegatedPrefixes/{{sub-pdp-name}}'
308+
Partial URL, as in:
309+
* 'projects/{{projectId}}/regions/region/publicDelegatedPrefixes/{{sub-pdp-name}}'
310+
* 'regions/{{region}}/publicDelegatedPrefixes/{{sub-pdp-name}}'`,
269311
},
270312
"ip_version": {
271313
Type: schema.TypeString,
@@ -723,6 +765,12 @@ func resourceComputeForwardingRuleCreate(d *schema.ResourceData, meta interface{
723765
} else if v, ok := d.GetOkExists("ip_version"); !tpgresource.IsEmptyValue(reflect.ValueOf(ipVersionProp)) && (ok || !reflect.DeepEqual(v, ipVersionProp)) {
724766
obj["ipVersion"] = ipVersionProp
725767
}
768+
ipCollectionProp, err := expandComputeForwardingRuleIpCollection(d.Get("ip_collection"), d, config)
769+
if err != nil {
770+
return err
771+
} else if v, ok := d.GetOkExists("ip_collection"); !tpgresource.IsEmptyValue(reflect.ValueOf(ipCollectionProp)) && (ok || !reflect.DeepEqual(v, ipCollectionProp)) {
772+
obj["ipCollection"] = ipCollectionProp
773+
}
726774
labelsProp, err := expandComputeForwardingRuleEffectiveLabels(d.Get("effective_labels"), d, config)
727775
if err != nil {
728776
return err
@@ -990,6 +1038,9 @@ func resourceComputeForwardingRuleRead(d *schema.ResourceData, meta interface{})
9901038
if err := d.Set("ip_version", flattenComputeForwardingRuleIpVersion(res["ipVersion"], d, config)); err != nil {
9911039
return fmt.Errorf("Error reading ForwardingRule: %s", err)
9921040
}
1041+
if err := d.Set("ip_collection", flattenComputeForwardingRuleIpCollection(res["ipCollection"], d, config)); err != nil {
1042+
return fmt.Errorf("Error reading ForwardingRule: %s", err)
1043+
}
9931044
if err := d.Set("terraform_labels", flattenComputeForwardingRuleTerraformLabels(res["labels"], d, config)); err != nil {
9941045
return fmt.Errorf("Error reading ForwardingRule: %s", err)
9951046
}
@@ -1491,6 +1542,10 @@ func flattenComputeForwardingRuleIpVersion(v interface{}, d *schema.ResourceData
14911542
return v
14921543
}
14931544

1545+
func flattenComputeForwardingRuleIpCollection(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1546+
return v
1547+
}
1548+
14941549
func flattenComputeForwardingRuleTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
14951550
if v == nil {
14961551
return v
@@ -1704,6 +1759,10 @@ func expandComputeForwardingRuleIpVersion(v interface{}, d tpgresource.Terraform
17041759
return v, nil
17051760
}
17061761

1762+
func expandComputeForwardingRuleIpCollection(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1763+
return v, nil
1764+
}
1765+
17071766
func expandComputeForwardingRuleEffectiveLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
17081767
if v == nil {
17091768
return map[string]string{}, nil

google/services/compute/resource_compute_forwarding_rule_generated_meta.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ fields:
1616
- field: 'forwarding_rule_id'
1717
api_field: 'id'
1818
- field: 'ip_address'
19+
- field: 'ip_collection'
1920
- field: 'ip_protocol'
2021
- field: 'ip_version'
2122
- field: 'is_mirroring_collector'

google/services/compute/resource_compute_forwarding_rule_generated_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,70 @@ import (
3030
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
3131
)
3232

33+
func TestAccComputeForwardingRule_forwardingRuleExternallbByoipv6Example(t *testing.T) {
34+
t.Parallel()
35+
36+
context := map[string]interface{}{
37+
"ip_address": fmt.Sprintf("2600:1901:4457:1:%d:%d::/96", acctest.RandIntRange(t, 0, 9999), acctest.RandIntRange(t, 0, 9999)),
38+
"ip_collection_url": "projects/tf-static-byoip/regions/us-central1/publicDelegatedPrefixes/tf-test-forwarding-rule-mode-pdp",
39+
"random_suffix": acctest.RandString(t, 10),
40+
}
41+
42+
acctest.VcrTest(t, resource.TestCase{
43+
PreCheck: func() { acctest.AccTestPreCheck(t) },
44+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
45+
CheckDestroy: testAccCheckComputeForwardingRuleDestroyProducer(t),
46+
Steps: []resource.TestStep{
47+
{
48+
Config: testAccComputeForwardingRule_forwardingRuleExternallbByoipv6Example(context),
49+
},
50+
{
51+
ResourceName: "google_compute_forwarding_rule.default",
52+
ImportState: true,
53+
ImportStateVerify: true,
54+
ImportStateVerifyIgnore: []string{"backend_service", "labels", "network", "no_automate_dns_zone", "port_range", "region", "subnetwork", "terraform_labels"},
55+
},
56+
},
57+
})
58+
}
59+
60+
func testAccComputeForwardingRule_forwardingRuleExternallbByoipv6Example(context map[string]interface{}) string {
61+
return acctest.Nprintf(`
62+
// Forwarding rule for External Network Load Balancing using Backend Services with IP Collection
63+
64+
resource "google_compute_forwarding_rule" "default" {
65+
name = "tf-test-byoipv6-forwarding-rule%{random_suffix}"
66+
region = "us-central1"
67+
port_range = 80
68+
ip_protocol = "TCP"
69+
ip_version = "IPV6"
70+
load_balancing_scheme = "EXTERNAL"
71+
ip_address = "%{ip_address}"
72+
network_tier = "PREMIUM"
73+
backend_service = google_compute_region_backend_service.backend.id
74+
ip_collection = "%{ip_collection_url}"
75+
}
76+
77+
resource "google_compute_region_backend_service" "backend" {
78+
name = "tf-test-website-backend%{random_suffix}"
79+
region = "us-central1"
80+
load_balancing_scheme = "EXTERNAL"
81+
health_checks = [google_compute_region_health_check.hc.id]
82+
}
83+
84+
resource "google_compute_region_health_check" "hc" {
85+
name = "tf-test-website-backend%{random_suffix}"
86+
check_interval_sec = 1
87+
timeout_sec = 1
88+
region = "us-central1"
89+
90+
tcp_health_check {
91+
port = "80"
92+
}
93+
}
94+
`, context)
95+
}
96+
3397
func TestAccComputeForwardingRule_forwardingRuleGlobalInternallbExample(t *testing.T) {
3498
t.Parallel()
3599

website/docs/r/compute_forwarding_rule.html.markdown

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,48 @@ resource "google_compute_region_health_check" "hc" {
453453
}
454454
}
455455
```
456+
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
457+
<a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md&cloudshell_working_dir=forwarding_rule_externallb_byoipv6&open_in_editor=main.tf" target="_blank">
458+
<img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
459+
</a>
460+
</div>
461+
## Example Usage - Forwarding Rule Externallb Byoipv6
462+
463+
464+
```hcl
465+
// Forwarding rule for External Network Load Balancing using Backend Services with IP Collection
466+
467+
resource "google_compute_forwarding_rule" "default" {
468+
name = "byoipv6-forwarding-rule"
469+
region = "us-central1"
470+
port_range = 80
471+
ip_protocol = "TCP"
472+
ip_version = "IPV6"
473+
load_balancing_scheme = "EXTERNAL"
474+
ip_address = ""2600:1901:4457:1::/96""
475+
network_tier = "PREMIUM"
476+
backend_service = google_compute_region_backend_service.backend.id
477+
ip_collection = ""projects/tf-static-byoip/regions/us-central1/publicDelegatedPrefixes/tf-test-forwarding-rule-mode-pdp""
478+
}
479+
480+
resource "google_compute_region_backend_service" "backend" {
481+
name = "website-backend"
482+
region = "us-central1"
483+
load_balancing_scheme = "EXTERNAL"
484+
health_checks = [google_compute_region_health_check.hc.id]
485+
}
486+
487+
resource "google_compute_region_health_check" "hc" {
488+
name = "website-backend"
489+
check_interval_sec = 1
490+
timeout_sec = 1
491+
region = "us-central1"
492+
493+
tcp_health_check {
494+
port = "80"
495+
}
496+
}
497+
```
456498
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
457499
<a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md&cloudshell_working_dir=forwarding_rule_global_internallb&open_in_editor=main.tf" target="_blank">
458500
<img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
@@ -1565,6 +1607,18 @@ The following arguments are supported:
15651607
If not set, the IPv4 address will be used by default.
15661608
Possible values are: `IPV4`, `IPV6`.
15671609

1610+
* `ip_collection` -
1611+
(Optional)
1612+
Resource reference of a PublicDelegatedPrefix. The PDP must be a sub-PDP
1613+
in EXTERNAL_IPV6_FORWARDING_RULE_CREATION mode.
1614+
Use one of the following formats to specify a sub-PDP when creating an
1615+
IPv6 NetLB forwarding rule using BYOIP:
1616+
Full resource URL, as in:
1617+
* `https://www.googleapis.com/compute/v1/projects/{{projectId}}/regions/{{region}}/publicDelegatedPrefixes/{{sub-pdp-name}}`
1618+
Partial URL, as in:
1619+
* `projects/{{projectId}}/regions/region/publicDelegatedPrefixes/{{sub-pdp-name}}`
1620+
* `regions/{{region}}/publicDelegatedPrefixes/{{sub-pdp-name}}`
1621+
15681622
* `region` -
15691623
(Optional)
15701624
A reference to the region where the regional forwarding rule resides.

0 commit comments

Comments
 (0)