Skip to content

Commit 5dd538a

Browse files
Feature gap: Add backends.preference, maxStreamDuration and cdnPolicy.requestCoalescing to BackendService (#13561) (#22391)
[upstream:5063ef377573e2e28e93e7959797bd7b8bd2fd12] Signed-off-by: Modular Magician <[email protected]>
1 parent f1c2580 commit 5dd538a

File tree

5 files changed

+533
-0
lines changed

5 files changed

+533
-0
lines changed

.changelog/13561.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 `log_config.optional_mode`, `log_config.optional_fields`, `backend.preference`, `max_stream_duration` and `cdn_policy.request_coalescing` fields to `google_compute_backend_service` resource
3+
```

google/services/compute/resource_compute_backend_service.go

Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,13 @@ can be specified as values, and you cannot specify a status code more than once.
400400
},
401401
},
402402
},
403+
"request_coalescing": {
404+
Type: schema.TypeBool,
405+
Computed: true,
406+
Optional: true,
407+
Description: `If true then Cloud CDN will combine multiple concurrent cache fill requests into a small number of requests
408+
to the origin.`,
409+
},
403410
"serve_while_stale": {
404411
Type: schema.TypeInt,
405412
Computed: true,
@@ -890,6 +897,25 @@ If logging is enabled, logs will be exported to Stackdriver.`,
890897
Description: `Whether to enable logging for the load balancer traffic served by this backend service.`,
891898
AtLeastOneOf: []string{"log_config.0.enable", "log_config.0.sample_rate"},
892899
},
900+
"optional_fields": {
901+
Type: schema.TypeList,
902+
Optional: true,
903+
Description: `This field can only be specified if logging is enabled for this backend service and "logConfig.optionalMode"
904+
was set to CUSTOM. Contains a list of optional fields you want to include in the logs.
905+
For example: serverInstance, serverGkeDetails.cluster, serverGkeDetails.pod.podNamespace`,
906+
Elem: &schema.Schema{
907+
Type: schema.TypeString,
908+
},
909+
},
910+
"optional_mode": {
911+
Type: schema.TypeString,
912+
Computed: true,
913+
Optional: true,
914+
ValidateFunc: verify.ValidateEnum([]string{"INCLUDE_ALL_OPTIONAL", "EXCLUDE_ALL_OPTIONAL", "CUSTOM", ""}),
915+
Description: `Specifies the optional logging mode for the load balancer traffic.
916+
Supported values: INCLUDE_ALL_OPTIONAL, EXCLUDE_ALL_OPTIONAL, CUSTOM. Possible values: ["INCLUDE_ALL_OPTIONAL", "EXCLUDE_ALL_OPTIONAL", "CUSTOM"]`,
917+
AtLeastOneOf: []string{"log_config.0.enable", "log_config.0.sample_rate", "log_config.0.optional_mode"},
918+
},
893919
"sample_rate": {
894920
Type: schema.TypeFloat,
895921
Optional: true,
@@ -904,6 +930,33 @@ The default value is 1.0.`,
904930
},
905931
},
906932
},
933+
"max_stream_duration": {
934+
Type: schema.TypeList,
935+
Optional: true,
936+
Description: `Specifies the default maximum duration (timeout) for streams to this service. Duration is computed from the
937+
beginning of the stream until the response has been completely processed, including all retries. A stream that
938+
does not complete in this duration is closed.
939+
If not specified, there will be no timeout limit, i.e. the maximum duration is infinite.
940+
This value can be overridden in the PathMatcher configuration of the UrlMap that references this backend service.
941+
This field is only allowed when the loadBalancingScheme of the backend service is INTERNAL_SELF_MANAGED.`,
942+
MaxItems: 1,
943+
Elem: &schema.Resource{
944+
Schema: map[string]*schema.Schema{
945+
"seconds": {
946+
Type: schema.TypeString,
947+
Required: true,
948+
Description: `Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive. (int64 format)`,
949+
},
950+
"nanos": {
951+
Type: schema.TypeInt,
952+
Optional: true,
953+
Description: `Span of time that's a fraction of a second at nanosecond resolution.
954+
Durations less than one second are represented with a 0 seconds field and a positive nanos field.
955+
Must be from 0 to 999,999,999 inclusive.`,
956+
},
957+
},
958+
},
959+
},
907960
"outlier_detection": {
908961
Type: schema.TypeList,
909962
Optional: true,
@@ -1398,6 +1451,17 @@ either maxRate or maxRatePerInstance must be set.`,
13981451
Description: `Used when balancingMode is UTILIZATION. This ratio defines the
13991452
CPU utilization target for the group. Valid range is [0.0, 1.0].`,
14001453
},
1454+
"preference": {
1455+
Type: schema.TypeString,
1456+
Optional: true,
1457+
ValidateFunc: verify.ValidateEnum([]string{"PREFERRED", "DEFAULT", ""}),
1458+
Description: `This field indicates whether this backend should be fully utilized before sending traffic to backends
1459+
with default preference. This field cannot be set when loadBalancingScheme is set to 'EXTERNAL'. The possible values are:
1460+
- PREFERRED: Backends with this preference level will be filled up to their capacity limits first,
1461+
based on RTT.
1462+
- DEFAULT: If preferred backends don't have enough capacity, backends in this layer would be used and
1463+
traffic would be assigned based on the load balancing algorithm you use. This is the default Possible values: ["PREFERRED", "DEFAULT"]`,
1464+
},
14011465
},
14021466
}
14031467
}
@@ -1596,6 +1660,12 @@ func resourceComputeBackendServiceCreate(d *schema.ResourceData, meta interface{
15961660
} else if v, ok := d.GetOkExists("service_lb_policy"); !tpgresource.IsEmptyValue(reflect.ValueOf(serviceLbPolicyProp)) && (ok || !reflect.DeepEqual(v, serviceLbPolicyProp)) {
15971661
obj["serviceLbPolicy"] = serviceLbPolicyProp
15981662
}
1663+
maxStreamDurationProp, err := expandComputeBackendServiceMaxStreamDuration(d.Get("max_stream_duration"), d, config)
1664+
if err != nil {
1665+
return err
1666+
} else if v, ok := d.GetOkExists("max_stream_duration"); !tpgresource.IsEmptyValue(reflect.ValueOf(maxStreamDurationProp)) && (ok || !reflect.DeepEqual(v, maxStreamDurationProp)) {
1667+
obj["maxStreamDuration"] = maxStreamDurationProp
1668+
}
15991669

16001670
obj, err = resourceComputeBackendServiceEncoder(d, meta, obj)
16011671
if err != nil {
@@ -1862,6 +1932,9 @@ func resourceComputeBackendServiceRead(d *schema.ResourceData, meta interface{})
18621932
if err := d.Set("service_lb_policy", flattenComputeBackendServiceServiceLbPolicy(res["serviceLbPolicy"], d, config)); err != nil {
18631933
return fmt.Errorf("Error reading BackendService: %s", err)
18641934
}
1935+
if err := d.Set("max_stream_duration", flattenComputeBackendServiceMaxStreamDuration(res["maxStreamDuration"], d, config)); err != nil {
1936+
return fmt.Errorf("Error reading BackendService: %s", err)
1937+
}
18651938
if err := d.Set("self_link", tpgresource.ConvertSelfLinkToV1(res["selfLink"].(string))); err != nil {
18661939
return fmt.Errorf("Error reading BackendService: %s", err)
18671940
}
@@ -2071,6 +2144,12 @@ func resourceComputeBackendServiceUpdate(d *schema.ResourceData, meta interface{
20712144
} else if v, ok := d.GetOkExists("service_lb_policy"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, serviceLbPolicyProp)) {
20722145
obj["serviceLbPolicy"] = serviceLbPolicyProp
20732146
}
2147+
maxStreamDurationProp, err := expandComputeBackendServiceMaxStreamDuration(d.Get("max_stream_duration"), d, config)
2148+
if err != nil {
2149+
return err
2150+
} else if v, ok := d.GetOkExists("max_stream_duration"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, maxStreamDurationProp)) {
2151+
obj["maxStreamDuration"] = maxStreamDurationProp
2152+
}
20742153

20752154
obj, err = resourceComputeBackendServiceEncoder(d, meta, obj)
20762155
if err != nil {
@@ -2264,6 +2343,7 @@ func flattenComputeBackendServiceBackend(v interface{}, d *schema.ResourceData,
22642343
transformed.Add(map[string]interface{}{
22652344
"balancing_mode": flattenComputeBackendServiceBackendBalancingMode(original["balancingMode"], d, config),
22662345
"capacity_scaler": flattenComputeBackendServiceBackendCapacityScaler(original["capacityScaler"], d, config),
2346+
"preference": flattenComputeBackendServiceBackendPreference(original["preference"], d, config),
22672347
"description": flattenComputeBackendServiceBackendDescription(original["description"], d, config),
22682348
"group": flattenComputeBackendServiceBackendGroup(original["group"], d, config),
22692349
"max_connections": flattenComputeBackendServiceBackendMaxConnections(original["maxConnections"], d, config),
@@ -2286,6 +2366,10 @@ func flattenComputeBackendServiceBackendCapacityScaler(v interface{}, d *schema.
22862366
return v
22872367
}
22882368

2369+
func flattenComputeBackendServiceBackendPreference(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
2370+
return v
2371+
}
2372+
22892373
func flattenComputeBackendServiceBackendDescription(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
22902374
return v
22912375
}
@@ -2640,6 +2724,8 @@ func flattenComputeBackendServiceCdnPolicy(v interface{}, d *schema.ResourceData
26402724
return nil
26412725
}
26422726
transformed := make(map[string]interface{})
2727+
transformed["request_coalescing"] =
2728+
flattenComputeBackendServiceCdnPolicyRequestCoalescing(original["requestCoalescing"], d, config)
26432729
transformed["cache_key_policy"] =
26442730
flattenComputeBackendServiceCdnPolicyCacheKeyPolicy(original["cacheKeyPolicy"], d, config)
26452731
transformed["signed_url_cache_max_age_sec"] =
@@ -2662,6 +2748,10 @@ func flattenComputeBackendServiceCdnPolicy(v interface{}, d *schema.ResourceData
26622748
flattenComputeBackendServiceCdnPolicyBypassCacheOnRequestHeaders(original["bypassCacheOnRequestHeaders"], d, config)
26632749
return []interface{}{transformed}
26642750
}
2751+
func flattenComputeBackendServiceCdnPolicyRequestCoalescing(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
2752+
return v
2753+
}
2754+
26652755
func flattenComputeBackendServiceCdnPolicyCacheKeyPolicy(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
26662756
if v == nil {
26672757
return nil
@@ -3581,6 +3671,10 @@ func flattenComputeBackendServiceLogConfig(v interface{}, d *schema.ResourceData
35813671
flattenComputeBackendServiceLogConfigEnable(original["enable"], d, config)
35823672
transformed["sample_rate"] =
35833673
flattenComputeBackendServiceLogConfigSampleRate(original["sampleRate"], d, config)
3674+
transformed["optional_mode"] =
3675+
flattenComputeBackendServiceLogConfigOptionalMode(original["optionalMode"], d, config)
3676+
transformed["optional_fields"] =
3677+
flattenComputeBackendServiceLogConfigOptionalFields(original["optionalFields"], d, config)
35843678
return []interface{}{transformed}
35853679
}
35863680
func flattenComputeBackendServiceLogConfigEnable(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
@@ -3591,10 +3685,54 @@ func flattenComputeBackendServiceLogConfigSampleRate(v interface{}, d *schema.Re
35913685
return v
35923686
}
35933687

3688+
func flattenComputeBackendServiceLogConfigOptionalMode(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
3689+
return v
3690+
}
3691+
3692+
func flattenComputeBackendServiceLogConfigOptionalFields(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
3693+
return v
3694+
}
3695+
35943696
func flattenComputeBackendServiceServiceLbPolicy(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
35953697
return v
35963698
}
35973699

3700+
func flattenComputeBackendServiceMaxStreamDuration(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
3701+
if v == nil {
3702+
return nil
3703+
}
3704+
original := v.(map[string]interface{})
3705+
if len(original) == 0 {
3706+
return nil
3707+
}
3708+
transformed := make(map[string]interface{})
3709+
transformed["seconds"] =
3710+
flattenComputeBackendServiceMaxStreamDurationSeconds(original["seconds"], d, config)
3711+
transformed["nanos"] =
3712+
flattenComputeBackendServiceMaxStreamDurationNanos(original["nanos"], d, config)
3713+
return []interface{}{transformed}
3714+
}
3715+
func flattenComputeBackendServiceMaxStreamDurationSeconds(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
3716+
return v
3717+
}
3718+
3719+
func flattenComputeBackendServiceMaxStreamDurationNanos(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
3720+
// Handles the string fixed64 format
3721+
if strVal, ok := v.(string); ok {
3722+
if intVal, err := tpgresource.StringToFixed64(strVal); err == nil {
3723+
return intVal
3724+
}
3725+
}
3726+
3727+
// number values are represented as float64
3728+
if floatVal, ok := v.(float64); ok {
3729+
intVal := int(floatVal)
3730+
return intVal
3731+
}
3732+
3733+
return v // let terraform core handle it otherwise
3734+
}
3735+
35983736
func expandComputeBackendServiceAffinityCookieTtlSec(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
35993737
return v, nil
36003738
}
@@ -3624,6 +3762,13 @@ func expandComputeBackendServiceBackend(v interface{}, d tpgresource.TerraformRe
36243762
transformed["capacityScaler"] = transformedCapacityScaler
36253763
}
36263764

3765+
transformedPreference, err := expandComputeBackendServiceBackendPreference(original["preference"], d, config)
3766+
if err != nil {
3767+
return nil, err
3768+
} else if val := reflect.ValueOf(transformedPreference); val.IsValid() && !tpgresource.IsEmptyValue(val) {
3769+
transformed["preference"] = transformedPreference
3770+
}
3771+
36273772
transformedDescription, err := expandComputeBackendServiceBackendDescription(original["description"], d, config)
36283773
if err != nil {
36293774
return nil, err
@@ -3707,6 +3852,10 @@ func expandComputeBackendServiceBackendCapacityScaler(v interface{}, d tpgresour
37073852
return v, nil
37083853
}
37093854

3855+
func expandComputeBackendServiceBackendPreference(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
3856+
return v, nil
3857+
}
3858+
37103859
func expandComputeBackendServiceBackendDescription(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
37113860
return v, nil
37123861
}
@@ -3987,6 +4136,13 @@ func expandComputeBackendServiceCdnPolicy(v interface{}, d tpgresource.Terraform
39874136
original := raw.(map[string]interface{})
39884137
transformed := make(map[string]interface{})
39894138

4139+
transformedRequestCoalescing, err := expandComputeBackendServiceCdnPolicyRequestCoalescing(original["request_coalescing"], d, config)
4140+
if err != nil {
4141+
return nil, err
4142+
} else {
4143+
transformed["requestCoalescing"] = transformedRequestCoalescing
4144+
}
4145+
39904146
transformedCacheKeyPolicy, err := expandComputeBackendServiceCdnPolicyCacheKeyPolicy(original["cache_key_policy"], d, config)
39914147
if err != nil {
39924148
return nil, err
@@ -4060,6 +4216,10 @@ func expandComputeBackendServiceCdnPolicy(v interface{}, d tpgresource.Terraform
40604216
return transformed, nil
40614217
}
40624218

4219+
func expandComputeBackendServiceCdnPolicyRequestCoalescing(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
4220+
return v, nil
4221+
}
4222+
40634223
func expandComputeBackendServiceCdnPolicyCacheKeyPolicy(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
40644224
l := v.([]interface{})
40654225
if len(l) == 0 || l[0] == nil {
@@ -4892,6 +5052,20 @@ func expandComputeBackendServiceLogConfig(v interface{}, d tpgresource.Terraform
48925052
transformed["sampleRate"] = transformedSampleRate
48935053
}
48945054

5055+
transformedOptionalMode, err := expandComputeBackendServiceLogConfigOptionalMode(original["optional_mode"], d, config)
5056+
if err != nil {
5057+
return nil, err
5058+
} else if val := reflect.ValueOf(transformedOptionalMode); val.IsValid() && !tpgresource.IsEmptyValue(val) {
5059+
transformed["optionalMode"] = transformedOptionalMode
5060+
}
5061+
5062+
transformedOptionalFields, err := expandComputeBackendServiceLogConfigOptionalFields(original["optional_fields"], d, config)
5063+
if err != nil {
5064+
return nil, err
5065+
} else if val := reflect.ValueOf(transformedOptionalFields); val.IsValid() && !tpgresource.IsEmptyValue(val) {
5066+
transformed["optionalFields"] = transformedOptionalFields
5067+
}
5068+
48955069
return transformed, nil
48965070
}
48975071

@@ -4903,10 +5077,52 @@ func expandComputeBackendServiceLogConfigSampleRate(v interface{}, d tpgresource
49035077
return v, nil
49045078
}
49055079

5080+
func expandComputeBackendServiceLogConfigOptionalMode(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
5081+
return v, nil
5082+
}
5083+
5084+
func expandComputeBackendServiceLogConfigOptionalFields(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
5085+
return v, nil
5086+
}
5087+
49065088
func expandComputeBackendServiceServiceLbPolicy(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
49075089
return v, nil
49085090
}
49095091

5092+
func expandComputeBackendServiceMaxStreamDuration(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
5093+
l := v.([]interface{})
5094+
if len(l) == 0 || l[0] == nil {
5095+
return nil, nil
5096+
}
5097+
raw := l[0]
5098+
original := raw.(map[string]interface{})
5099+
transformed := make(map[string]interface{})
5100+
5101+
transformedSeconds, err := expandComputeBackendServiceMaxStreamDurationSeconds(original["seconds"], d, config)
5102+
if err != nil {
5103+
return nil, err
5104+
} else if val := reflect.ValueOf(transformedSeconds); val.IsValid() && !tpgresource.IsEmptyValue(val) {
5105+
transformed["seconds"] = transformedSeconds
5106+
}
5107+
5108+
transformedNanos, err := expandComputeBackendServiceMaxStreamDurationNanos(original["nanos"], d, config)
5109+
if err != nil {
5110+
return nil, err
5111+
} else if val := reflect.ValueOf(transformedNanos); val.IsValid() && !tpgresource.IsEmptyValue(val) {
5112+
transformed["nanos"] = transformedNanos
5113+
}
5114+
5115+
return transformed, nil
5116+
}
5117+
5118+
func expandComputeBackendServiceMaxStreamDurationSeconds(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
5119+
return v, nil
5120+
}
5121+
5122+
func expandComputeBackendServiceMaxStreamDurationNanos(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
5123+
return v, nil
5124+
}
5125+
49105126
func resourceComputeBackendServiceEncoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) {
49115127
backendsRaw, ok := obj["backends"]
49125128
if !ok {

google/services/compute/resource_compute_backend_service_generated_meta.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ fields:
3434
api_field: 'backends.max_rate_per_instance'
3535
- field: 'backend.max_utilization'
3636
api_field: 'backends.max_utilization'
37+
- field: 'backend.preference'
38+
api_field: 'backends.preference'
3739
- field: 'cdn_policy.bypass_cache_on_request_headers.header_name'
3840
- field: 'cdn_policy.cache_key_policy.include_host'
3941
- field: 'cdn_policy.cache_key_policy.include_http_headers'
@@ -49,6 +51,7 @@ fields:
4951
- field: 'cdn_policy.negative_caching'
5052
- field: 'cdn_policy.negative_caching_policy.code'
5153
- field: 'cdn_policy.negative_caching_policy.ttl'
54+
- field: 'cdn_policy.request_coalescing'
5255
- field: 'cdn_policy.serve_while_stale'
5356
- field: 'cdn_policy.signed_url_cache_max_age_sec'
5457
- field: 'circuit_breakers.max_connections'
@@ -88,7 +91,11 @@ fields:
8891
- field: 'locality_lb_policies.policy.name'
8992
- field: 'locality_lb_policy'
9093
- field: 'log_config.enable'
94+
- field: 'log_config.optional_fields'
95+
- field: 'log_config.optional_mode'
9196
- field: 'log_config.sample_rate'
97+
- field: 'max_stream_duration.nanos'
98+
- field: 'max_stream_duration.seconds'
9299
- field: 'name'
93100
- field: 'outlier_detection.base_ejection_time.nanos'
94101
- field: 'outlier_detection.base_ejection_time.seconds'

0 commit comments

Comments
 (0)