Skip to content

Commit d674b79

Browse files
Add network_pass_through_lb_traffic_policy field to google_compute_region_backend_service resource to support zonal affinity for internal passthrough network load balancer. (#15698) (#11088)
[upstream:93c9a58a1607a913bc767d5bf8f05651b0d528fb] Signed-off-by: Modular Magician <magic-modules@google.com>
1 parent df62859 commit d674b79

File tree

5 files changed

+298
-0
lines changed

5 files changed

+298
-0
lines changed

.changelog/15698.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 `network_pass_through_lb_traffic_policy` field to `google_compute_region_backend_service` resource.
3+
```

google-beta/services/compute/resource_compute_region_backend_service.go

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,6 +1003,42 @@ This field must be set for Internal Passthrough Network Load Balancers when the
10031003
This field can only be specified when the load balancing scheme is set to INTERNAL, or when the load balancing scheme is set to EXTERNAL and haPolicy fastIpMove is enabled.
10041004
Changes to this field force recreation of the resource.`,
10051005
},
1006+
"network_pass_through_lb_traffic_policy": {
1007+
Type: schema.TypeList,
1008+
Optional: true,
1009+
Description: `Configures traffic steering properties of internal passthrough Network Load Balancers.`,
1010+
MaxItems: 1,
1011+
Elem: &schema.Resource{
1012+
Schema: map[string]*schema.Schema{
1013+
"zonal_affinity": {
1014+
Type: schema.TypeList,
1015+
Optional: true,
1016+
Description: `When configured, new connections are load balanced across healthy backend endpoints in the local zone.`,
1017+
MaxItems: 1,
1018+
Elem: &schema.Resource{
1019+
Schema: map[string]*schema.Schema{
1020+
"spillover": {
1021+
Type: schema.TypeString,
1022+
Optional: true,
1023+
ValidateFunc: verify.ValidateEnum([]string{"ZONAL_AFFINITY_DISABLED", "ZONAL_AFFINITY_SPILL_CROSS_ZONE", "ZONAL_AFFINITY_STAY_WITHIN_ZONE", ""}),
1024+
Description: `This field indicates whether zonal affinity is enabled or not. Default value: "ZONAL_AFFINITY_DISABLED" Possible values: ["ZONAL_AFFINITY_DISABLED", "ZONAL_AFFINITY_SPILL_CROSS_ZONE", "ZONAL_AFFINITY_STAY_WITHIN_ZONE"]`,
1025+
Default: "ZONAL_AFFINITY_DISABLED",
1026+
},
1027+
"spillover_ratio": {
1028+
Type: schema.TypeFloat,
1029+
Optional: true,
1030+
Description: `The value of the field must be in [0, 1]. When the ratio of the count of healthy backend endpoints in a zone
1031+
to the count of backend endpoints in that same zone is equal to or above this threshold, the load balancer
1032+
distributes new connections to all healthy endpoints in the local zone only. When the ratio of the count
1033+
of healthy backend endpoints in a zone to the count of backend endpoints in that same zone is below this
1034+
threshold, the load balancer distributes all new connections to all healthy endpoints across all zones.`,
1035+
},
1036+
},
1037+
},
1038+
},
1039+
},
1040+
},
1041+
},
10061042
"outlier_detection": {
10071043
Type: schema.TypeList,
10081044
Optional: true,
@@ -1687,6 +1723,12 @@ func resourceComputeRegionBackendServiceCreate(d *schema.ResourceData, meta inte
16871723
} else if v, ok := d.GetOkExists("custom_metrics"); !tpgresource.IsEmptyValue(reflect.ValueOf(customMetricsProp)) && (ok || !reflect.DeepEqual(v, customMetricsProp)) {
16881724
obj["customMetrics"] = customMetricsProp
16891725
}
1726+
networkPassThroughLbTrafficPolicyProp, err := expandComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicy(d.Get("network_pass_through_lb_traffic_policy"), d, config)
1727+
if err != nil {
1728+
return err
1729+
} else if v, ok := d.GetOkExists("network_pass_through_lb_traffic_policy"); !tpgresource.IsEmptyValue(reflect.ValueOf(networkPassThroughLbTrafficPolicyProp)) && (ok || !reflect.DeepEqual(v, networkPassThroughLbTrafficPolicyProp)) {
1730+
obj["networkPassThroughLbTrafficPolicy"] = networkPassThroughLbTrafficPolicyProp
1731+
}
16901732
outlierDetectionProp, err := expandComputeRegionBackendServiceOutlierDetection(d.Get("outlier_detection"), d, config)
16911733
if err != nil {
16921734
return err
@@ -2006,6 +2048,9 @@ func resourceComputeRegionBackendServiceRead(d *schema.ResourceData, meta interf
20062048
if err := d.Set("custom_metrics", flattenComputeRegionBackendServiceCustomMetrics(res["customMetrics"], d, config)); err != nil {
20072049
return fmt.Errorf("Error reading RegionBackendService: %s", err)
20082050
}
2051+
if err := d.Set("network_pass_through_lb_traffic_policy", flattenComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicy(res["networkPassThroughLbTrafficPolicy"], d, config)); err != nil {
2052+
return fmt.Errorf("Error reading RegionBackendService: %s", err)
2053+
}
20092054
if err := d.Set("outlier_detection", flattenComputeRegionBackendServiceOutlierDetection(res["outlierDetection"], d, config)); err != nil {
20102055
return fmt.Errorf("Error reading RegionBackendService: %s", err)
20112056
}
@@ -2176,6 +2221,12 @@ func resourceComputeRegionBackendServiceUpdate(d *schema.ResourceData, meta inte
21762221
} else if v, ok := d.GetOkExists("custom_metrics"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, customMetricsProp)) {
21772222
obj["customMetrics"] = customMetricsProp
21782223
}
2224+
networkPassThroughLbTrafficPolicyProp, err := expandComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicy(d.Get("network_pass_through_lb_traffic_policy"), d, config)
2225+
if err != nil {
2226+
return err
2227+
} else if v, ok := d.GetOkExists("network_pass_through_lb_traffic_policy"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, networkPassThroughLbTrafficPolicyProp)) {
2228+
obj["networkPassThroughLbTrafficPolicy"] = networkPassThroughLbTrafficPolicyProp
2229+
}
21792230
outlierDetectionProp, err := expandComputeRegionBackendServiceOutlierDetection(d.Get("outlier_detection"), d, config)
21802231
if err != nil {
21812232
return err
@@ -3354,6 +3405,42 @@ func flattenComputeRegionBackendServiceCustomMetricsDryRun(v interface{}, d *sch
33543405
return v
33553406
}
33563407

3408+
func flattenComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicy(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
3409+
if v == nil {
3410+
return nil
3411+
}
3412+
original := v.(map[string]interface{})
3413+
if len(original) == 0 {
3414+
return nil
3415+
}
3416+
transformed := make(map[string]interface{})
3417+
transformed["zonal_affinity"] =
3418+
flattenComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicyZonalAffinity(original["zonalAffinity"], d, config)
3419+
return []interface{}{transformed}
3420+
}
3421+
func flattenComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicyZonalAffinity(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
3422+
if v == nil {
3423+
return nil
3424+
}
3425+
original := v.(map[string]interface{})
3426+
if len(original) == 0 {
3427+
return nil
3428+
}
3429+
transformed := make(map[string]interface{})
3430+
transformed["spillover"] =
3431+
flattenComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicyZonalAffinitySpillover(original["spillover"], d, config)
3432+
transformed["spillover_ratio"] =
3433+
flattenComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicyZonalAffinitySpilloverRatio(original["spilloverRatio"], d, config)
3434+
return []interface{}{transformed}
3435+
}
3436+
func flattenComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicyZonalAffinitySpillover(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
3437+
return v
3438+
}
3439+
3440+
func flattenComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicyZonalAffinitySpilloverRatio(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
3441+
return v
3442+
}
3443+
33573444
func flattenComputeRegionBackendServiceOutlierDetection(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
33583445
if v == nil {
33593446
return nil
@@ -4939,6 +5026,65 @@ func expandComputeRegionBackendServiceCustomMetricsDryRun(v interface{}, d tpgre
49395026
return v, nil
49405027
}
49415028

5029+
func expandComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicy(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
5030+
if v == nil {
5031+
return nil, nil
5032+
}
5033+
l := v.([]interface{})
5034+
if len(l) == 0 || l[0] == nil {
5035+
return nil, nil
5036+
}
5037+
raw := l[0]
5038+
original := raw.(map[string]interface{})
5039+
transformed := make(map[string]interface{})
5040+
5041+
transformedZonalAffinity, err := expandComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicyZonalAffinity(original["zonal_affinity"], d, config)
5042+
if err != nil {
5043+
return nil, err
5044+
} else if val := reflect.ValueOf(transformedZonalAffinity); val.IsValid() && !tpgresource.IsEmptyValue(val) {
5045+
transformed["zonalAffinity"] = transformedZonalAffinity
5046+
}
5047+
5048+
return transformed, nil
5049+
}
5050+
5051+
func expandComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicyZonalAffinity(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
5052+
if v == nil {
5053+
return nil, nil
5054+
}
5055+
l := v.([]interface{})
5056+
if len(l) == 0 || l[0] == nil {
5057+
return nil, nil
5058+
}
5059+
raw := l[0]
5060+
original := raw.(map[string]interface{})
5061+
transformed := make(map[string]interface{})
5062+
5063+
transformedSpillover, err := expandComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicyZonalAffinitySpillover(original["spillover"], d, config)
5064+
if err != nil {
5065+
return nil, err
5066+
} else if val := reflect.ValueOf(transformedSpillover); val.IsValid() && !tpgresource.IsEmptyValue(val) {
5067+
transformed["spillover"] = transformedSpillover
5068+
}
5069+
5070+
transformedSpilloverRatio, err := expandComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicyZonalAffinitySpilloverRatio(original["spillover_ratio"], d, config)
5071+
if err != nil {
5072+
return nil, err
5073+
} else if val := reflect.ValueOf(transformedSpilloverRatio); val.IsValid() && !tpgresource.IsEmptyValue(val) {
5074+
transformed["spilloverRatio"] = transformedSpilloverRatio
5075+
}
5076+
5077+
return transformed, nil
5078+
}
5079+
5080+
func expandComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicyZonalAffinitySpillover(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
5081+
return v, nil
5082+
}
5083+
5084+
func expandComputeRegionBackendServiceNetworkPassThroughLbTrafficPolicyZonalAffinitySpilloverRatio(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
5085+
return v, nil
5086+
}
5087+
49425088
func expandComputeRegionBackendServiceOutlierDetection(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
49435089
if v == nil {
49445090
return nil, nil

google-beta/services/compute/resource_compute_region_backend_service_generated_meta.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ fields:
107107
- api_field: 'logConfig.sampleRate'
108108
- api_field: 'name'
109109
- api_field: 'network'
110+
- api_field: 'networkPassThroughLbTrafficPolicy.zonalAffinity.spillover'
111+
- api_field: 'networkPassThroughLbTrafficPolicy.zonalAffinity.spilloverRatio'
110112
- api_field: 'outlierDetection.baseEjectionTime.nanos'
111113
- api_field: 'outlierDetection.baseEjectionTime.seconds'
112114
- api_field: 'outlierDetection.consecutiveErrors'

google-beta/services/compute/resource_compute_region_backend_service_test.go

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2249,3 +2249,121 @@ resource "google_compute_health_check" "zero" {
22492249
}
22502250
`, serviceName, tagKey, tagValue, checkName)
22512251
}
2252+
2253+
func TestAccComputeRegionBackendService_withNetworkPassThroughLbTrafficPolicy(t *testing.T) {
2254+
t.Parallel()
2255+
2256+
namePrefix := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
2257+
2258+
acctest.VcrTest(t, resource.TestCase{
2259+
PreCheck: func() { acctest.AccTestPreCheck(t) },
2260+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderBetaFactories(t),
2261+
CheckDestroy: testAccCheckComputeRegionBackendServiceDestroyProducer(t),
2262+
Steps: []resource.TestStep{
2263+
{
2264+
Config: testAccComputeRegionBackendService_withNetworkPassThroughLbTrafficPolicy(namePrefix, "ZONAL_AFFINITY_DISABLED", 0.5),
2265+
},
2266+
{
2267+
ResourceName: "google_compute_region_backend_service.nptlbtp",
2268+
ImportState: true,
2269+
ImportStateVerify: true,
2270+
},
2271+
{
2272+
Config: testAccComputeRegionBackendService_withNetworkPassThroughLbTrafficPolicy(namePrefix, "ZONAL_AFFINITY_SPILL_CROSS_ZONE", 0.6),
2273+
},
2274+
{
2275+
ResourceName: "google_compute_region_backend_service.nptlbtp",
2276+
ImportState: true,
2277+
ImportStateVerify: true,
2278+
},
2279+
{
2280+
Config: testAccComputeRegionBackendService_withNetworkPassThroughLbTrafficPolicy(namePrefix, "ZONAL_AFFINITY_STAY_WITHIN_ZONE", 0.2),
2281+
},
2282+
{
2283+
ResourceName: "google_compute_region_backend_service.nptlbtp",
2284+
ImportState: true,
2285+
ImportStateVerify: true,
2286+
},
2287+
{
2288+
Config: testAccComputeRegionBackendService_withNetworkPassThroughLbTrafficPolicy(namePrefix, "ZONAL_AFFINITY_STAY_WITHIN_ZONE", 1.001),
2289+
ExpectError: regexp.MustCompile("Must be less than or equal to 1.0"),
2290+
},
2291+
},
2292+
})
2293+
}
2294+
2295+
func testAccComputeRegionBackendService_withNetworkPassThroughLbTrafficPolicy(namePrefix, spillover string, ratio float64) string {
2296+
return fmt.Sprintf(`
2297+
resource "google_compute_network" "default" {
2298+
provider = google-beta
2299+
name = "%s-network"
2300+
auto_create_subnetworks = false
2301+
}
2302+
2303+
resource "google_compute_subnetwork" "default" {
2304+
provider = google-beta
2305+
name = "%s-subnet"
2306+
ip_cidr_range = "10.10.0.0/16"
2307+
region = "us-central1"
2308+
network = google_compute_network.default.id
2309+
}
2310+
2311+
resource "google_compute_region_health_check" "default" {
2312+
provider = google-beta
2313+
name = "%s-health-check"
2314+
region = "us-central1"
2315+
tcp_health_check {
2316+
port = 80
2317+
}
2318+
}
2319+
2320+
resource "google_compute_instance_template" "default" {
2321+
provider = google-beta
2322+
name_prefix = "%s-instance-template"
2323+
machine_type = "e2-micro"
2324+
2325+
disk {
2326+
source_image = "debian-cloud/debian-11"
2327+
auto_delete = true
2328+
boot = true
2329+
}
2330+
2331+
network_interface {
2332+
network = "default"
2333+
}
2334+
}
2335+
2336+
resource "google_compute_instance_group_manager" "default" {
2337+
provider = google-beta
2338+
name = "%s-igm"
2339+
zone = "us-central1-a"
2340+
version {
2341+
instance_template = google_compute_instance_template.default.id
2342+
name = "primary"
2343+
}
2344+
base_instance_name = "%s-instance"
2345+
target_size = 1
2346+
}
2347+
2348+
resource "google_compute_region_backend_service" "nptlbtp" {
2349+
provider = google-beta
2350+
name = "%s-region-backend-service"
2351+
region = "us-central1"
2352+
load_balancing_scheme = "INTERNAL"
2353+
health_checks = [google_compute_region_health_check.default.id]
2354+
protocol = "TCP"
2355+
2356+
backend {
2357+
group = google_compute_instance_group_manager.default.instance_group
2358+
balancing_mode = "CONNECTION"
2359+
}
2360+
2361+
network_pass_through_lb_traffic_policy {
2362+
zonal_affinity {
2363+
spillover = "%s"
2364+
spillover_ratio = %f
2365+
}
2366+
}
2367+
}
2368+
`, namePrefix, namePrefix, namePrefix, namePrefix, namePrefix, namePrefix, namePrefix, spillover, ratio)
2369+
}

website/docs/r/compute_region_backend_service.html.markdown

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,11 @@ The following arguments are supported:
866866
List of custom metrics that are used for the WEIGHTED_ROUND_ROBIN locality_lb_policy.
867867
Structure is [documented below](#nested_custom_metrics).
868868

869+
* `network_pass_through_lb_traffic_policy` -
870+
(Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
871+
Configures traffic steering properties of internal passthrough Network Load Balancers.
872+
Structure is [documented below](#nested_network_pass_through_lb_traffic_policy).
873+
869874
* `outlier_detection` -
870875
(Optional)
871876
Settings controlling eviction of unhealthy hosts from the load balancing pool.
@@ -1417,6 +1422,30 @@ The following arguments are supported:
14171422
(Required)
14181423
If true, the metric data is not used for load balancing.
14191424

1425+
<a name="nested_network_pass_through_lb_traffic_policy"></a>The `network_pass_through_lb_traffic_policy` block supports:
1426+
1427+
* `zonal_affinity` -
1428+
(Optional)
1429+
When configured, new connections are load balanced across healthy backend endpoints in the local zone.
1430+
Structure is [documented below](#nested_network_pass_through_lb_traffic_policy_zonal_affinity).
1431+
1432+
1433+
<a name="nested_network_pass_through_lb_traffic_policy_zonal_affinity"></a>The `zonal_affinity` block supports:
1434+
1435+
* `spillover` -
1436+
(Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
1437+
This field indicates whether zonal affinity is enabled or not.
1438+
Default value is `ZONAL_AFFINITY_DISABLED`.
1439+
Possible values are: `ZONAL_AFFINITY_DISABLED`, `ZONAL_AFFINITY_SPILL_CROSS_ZONE`, `ZONAL_AFFINITY_STAY_WITHIN_ZONE`.
1440+
1441+
* `spillover_ratio` -
1442+
(Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
1443+
The value of the field must be in [0, 1]. When the ratio of the count of healthy backend endpoints in a zone
1444+
to the count of backend endpoints in that same zone is equal to or above this threshold, the load balancer
1445+
distributes new connections to all healthy endpoints in the local zone only. When the ratio of the count
1446+
of healthy backend endpoints in a zone to the count of backend endpoints in that same zone is below this
1447+
threshold, the load balancer distributes all new connections to all healthy endpoints across all zones.
1448+
14201449
<a name="nested_outlier_detection"></a>The `outlier_detection` block supports:
14211450

14221451
* `base_ejection_time` -

0 commit comments

Comments
 (0)