Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ require (
github.com/hashicorp/hcl/v2 v2.24.0
github.com/hashicorp/terraform-json v0.27.2
github.com/hashicorp/terraform-plugin-sdk/v2 v2.40.1
github.com/hashicorp/terraform-provider-google-beta v1.20.1-0.20260724005318-d2d4e6be437e
github.com/hashicorp/terraform-provider-google-beta v1.20.1-0.20260724172529-d04cccc8eafe
github.com/mitchellh/go-homedir v1.1.0
github.com/pkg/errors v0.9.1
github.com/stretchr/testify v1.11.1
Expand All @@ -27,6 +27,7 @@ require (
github.com/gammazero/workerpool v1.1.3
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0
github.com/hashicorp/go-cleanhttp v0.5.2
github.com/hashicorp/go-version v1.9.0
github.com/hashicorp/terraform-plugin-framework v1.19.0
github.com/hashicorp/terraform-plugin-framework-validators v0.19.0
github.com/sethvargo/go-retry v0.3.0
Expand Down Expand Up @@ -72,7 +73,6 @@ require (
github.com/googleapis/gax-go/v2 v2.22.0 // indirect
github.com/hashicorp/go-hclog v1.6.3 // indirect
github.com/hashicorp/go-uuid v1.0.3 // indirect
github.com/hashicorp/go-version v1.9.0 // indirect
github.com/hashicorp/logutils v1.0.0 // indirect
github.com/hashicorp/terraform-plugin-framework-timeouts v0.5.0 // indirect
github.com/hashicorp/terraform-plugin-go v0.31.0 // indirect
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,8 @@ github.com/hashicorp/terraform-plugin-sdk/v2 v2.40.1 h1:2yPUd7esMOpuTaG3y1iEla1i
github.com/hashicorp/terraform-plugin-sdk/v2 v2.40.1/go.mod h1:sq8qsxh+PwdvTQFcd17kfCoBgQo46ADNMvCpKE7t/gY=
github.com/hashicorp/terraform-plugin-testing v1.15.0 h1:/fimKyl0YgD7aAtJkuuAZjwBASXhCIwWqMbDLnKLMe4=
github.com/hashicorp/terraform-plugin-testing v1.15.0/go.mod h1:bGXMw7bE95EiZhSBV3rM2W8TiffaPTDuLS+HFI/lIYs=
github.com/hashicorp/terraform-provider-google-beta v1.20.1-0.20260724005318-d2d4e6be437e h1:7mt518z/EIWi3Y15HGFT4SZsC4IbSYlj/SIACIDB9tw=
github.com/hashicorp/terraform-provider-google-beta v1.20.1-0.20260724005318-d2d4e6be437e/go.mod h1:2tXyGr+pX+Tjj6rpi3JfT+mjqRWkvgsEzcvrfV1/XUk=
github.com/hashicorp/terraform-provider-google-beta v1.20.1-0.20260724172529-d04cccc8eafe h1:MDJHjlqi7x51cC7mjqUHxmjpBaUkMKvzaRd8nIhL/hQ=
github.com/hashicorp/terraform-provider-google-beta v1.20.1-0.20260724172529-d04cccc8eafe/go.mod h1:2tXyGr+pX+Tjj6rpi3JfT+mjqRWkvgsEzcvrfV1/XUk=
github.com/hashicorp/terraform-registry-address v0.4.0 h1:S1yCGomj30Sao4l5BMPjTGZmCNzuv7/GDTDX99E9gTk=
github.com/hashicorp/terraform-registry-address v0.4.0/go.mod h1:LRS1Ay0+mAiRkUyltGT+UHWkIqTFvigGn/LbMshfflE=
github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S52uzrw4x0jKQ=
Expand Down
28 changes: 28 additions & 0 deletions pkg/services/compute/compute_backend_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -957,6 +957,34 @@ For example: orca_load_report, tls.protocol`,
Supported values: INCLUDE_ALL_OPTIONAL, EXCLUDE_ALL_OPTIONAL, CUSTOM. Possible values: ["INCLUDE_ALL_OPTIONAL", "EXCLUDE_ALL_OPTIONAL", "CUSTOM"]`,
AtLeastOneOf: []string{"log_config.0.enable", "log_config.0.optional_mode", "log_config.0.sample_rate"},
},
"request_headers": {
Type: schema.TypeList,
Optional: true,
Description: `This field can only be specified if logging is enabled for this backend service and if the BackendService protocol is one of HTTP, HTTPS, HTTP2 and GRPC. Contains a list of request headers to be logged.`,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"header_name": {
Type: schema.TypeString,
Required: true,
Description: `The header name to match on for logging.`,
},
},
},
},
"response_headers": {
Type: schema.TypeList,
Optional: true,
Description: `This field can only be specified if logging is enabled for this backend service and if the BackendService protocol is one of HTTP, HTTPS, HTTP2 and GRPC. Contains a list of response headers to be logged.`,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"header_name": {
Type: schema.TypeString,
Required: true,
Description: `The header name to match on for logging.`,
},
},
},
},
"sample_rate": {
Type: schema.TypeFloat,
Optional: true,
Expand Down
64 changes: 64 additions & 0 deletions pkg/services/compute/compute_backend_service_cai2hcl.go
Original file line number Diff line number Diff line change
Expand Up @@ -1704,6 +1704,10 @@ func flattenComputeBackendServiceLogConfig(v interface{}, d *schema.ResourceData
flattenComputeBackendServiceLogConfigOptionalMode(original["optionalMode"], d, config)
transformed["optional_fields"] =
flattenComputeBackendServiceLogConfigOptionalFields(original["optionalFields"], d, config)
transformed["request_headers"] =
flattenComputeBackendServiceLogConfigRequestHeaders(original["loggingHttpRequestHeaders"], d, config)
transformed["response_headers"] =
flattenComputeBackendServiceLogConfigResponseHeaders(original["loggingHttpResponseHeaders"], d, config)
if tgcresource.AllValuesAreNil(transformed) {
return nil
}
Expand All @@ -1726,6 +1730,66 @@ func flattenComputeBackendServiceLogConfigOptionalFields(v interface{}, d *schem
return v
}

func flattenComputeBackendServiceLogConfigRequestHeaders(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return v
}
l := v.([]interface{})
transformed := make([]interface{}, 0, len(l))
for _, raw := range l {
original := raw.(map[string]interface{})
if len(original) < 1 {
// Do not include empty json objects coming back from the api
continue
}
transformed = append(transformed, map[string]interface{}{
"header_name": flattenComputeBackendServiceLogConfigRequestHeadersHeaderName(original["headerName"], d, config),
})
}
return transformed
}

func flattenComputeBackendServiceLogConfigRequestHeadersHeaderName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return "unknown"
}
transformed := v.(string)
if transformed == "" {
return "unknown"
}
return v
}

func flattenComputeBackendServiceLogConfigResponseHeaders(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return v
}
l := v.([]interface{})
transformed := make([]interface{}, 0, len(l))
for _, raw := range l {
original := raw.(map[string]interface{})
if len(original) < 1 {
// Do not include empty json objects coming back from the api
continue
}
transformed = append(transformed, map[string]interface{}{
"header_name": flattenComputeBackendServiceLogConfigResponseHeadersHeaderName(original["headerName"], d, config),
})
}
return transformed
}

func flattenComputeBackendServiceLogConfigResponseHeadersHeaderName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return "unknown"
}
transformed := v.(string)
if transformed == "" {
return "unknown"
}
return v
}

func flattenComputeBackendServiceServiceLbPolicy(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
Expand Down
72 changes: 72 additions & 0 deletions pkg/services/compute/compute_backend_service_tfplan2cai.go
Original file line number Diff line number Diff line change
Expand Up @@ -1799,6 +1799,20 @@ func expandComputeBackendServiceLogConfig(v interface{}, d tpgresource.Terraform
transformed["optionalFields"] = transformedOptionalFields
}

transformedRequestHeaders, err := expandComputeBackendServiceLogConfigRequestHeaders(original["request_headers"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedRequestHeaders); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["loggingHttpRequestHeaders"] = transformedRequestHeaders
}

transformedResponseHeaders, err := expandComputeBackendServiceLogConfigResponseHeaders(original["response_headers"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedResponseHeaders); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["loggingHttpResponseHeaders"] = transformedResponseHeaders
}

return transformed, nil
}

Expand All @@ -1818,6 +1832,64 @@ func expandComputeBackendServiceLogConfigOptionalFields(v interface{}, d tpgreso
return v, nil
}

func expandComputeBackendServiceLogConfigRequestHeaders(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
if v == nil {
return nil, nil
}
l := v.([]interface{})
req := make([]interface{}, 0, len(l))
for _, raw := range l {
if raw == nil {
continue
}
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})

transformedHeaderName, err := expandComputeBackendServiceLogConfigRequestHeadersHeaderName(original["header_name"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedHeaderName); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["headerName"] = transformedHeaderName
}

req = append(req, transformed)
}
return req, nil
}

func expandComputeBackendServiceLogConfigRequestHeadersHeaderName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}

func expandComputeBackendServiceLogConfigResponseHeaders(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
if v == nil {
return nil, nil
}
l := v.([]interface{})
req := make([]interface{}, 0, len(l))
for _, raw := range l {
if raw == nil {
continue
}
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})

transformedHeaderName, err := expandComputeBackendServiceLogConfigResponseHeadersHeaderName(original["header_name"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedHeaderName); val.IsValid() && !tpgresource.IsEmptyValue(val) {
transformed["headerName"] = transformedHeaderName
}

req = append(req, transformed)
}
return req, nil
}

func expandComputeBackendServiceLogConfigResponseHeadersHeaderName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}

func expandComputeBackendServiceServiceLbPolicy(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
Expand Down
20 changes: 16 additions & 4 deletions pkg/services/compute/compute_instance_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,12 @@ func expandScheduling(v interface{}) (map[string]interface{}, error) {
if v, ok := original["provisioning_model"]; ok {
result["provisioningModel"] = v.(string)
}

omitDurations := false
if pm, ok := result["provisioningModel"].(string); ok && pm == "RESERVATION_BOUND" {
omitDurations = true
}

if v, ok := original["instance_termination_action"]; ok {
result["instanceTerminationAction"] = v.(string)
}
Expand All @@ -161,22 +167,28 @@ func expandScheduling(v interface{}) (map[string]interface{}, error) {
if err != nil {
return nil, err
}
result["maxRunDuration"] = transformedMaxRunDuration
if transformedMaxRunDuration != nil || !omitDurations {
result["maxRunDuration"] = transformedMaxRunDuration
}
}

if v, ok := original["on_instance_stop_action"]; ok {
transformedOnInstanceStopAction, err := expandComputeOnInstanceStopAction(v)
if err != nil {
return nil, err
}
result["onInstanceStopAction"] = transformedOnInstanceStopAction
if transformedOnInstanceStopAction != nil || !omitDurations {
result["onInstanceStopAction"] = transformedOnInstanceStopAction
}
}
if v, ok := original["local_ssd_recovery_timeout"]; ok {
transformedLocalSsdRecoveryTimeout, err := expandComputeLocalSsdRecoveryTimeout(v)
if err != nil {
return nil, err
}
result["localSsdRecoveryTimeout"] = transformedLocalSsdRecoveryTimeout
if transformedLocalSsdRecoveryTimeout != nil || !omitDurations {
result["localSsdRecoveryTimeout"] = transformedLocalSsdRecoveryTimeout
}
}
if v, ok := original["termination_time"]; ok && v.(string) != "" {
result["terminationTime"] = v.(string)
Expand Down Expand Up @@ -514,7 +526,7 @@ func flattenNetworkInterfaces(d *schema.ResourceData, config *transport_tpg.Conf
"subnetwork": tpgresource.ConvertSelfLinkToV1(subnetwork),
"subnetwork_project": subnet.Project,
"access_config": ac,
"alias_ip_range": flattenAliasIpRange(d, aliasIpRanges, i),
"alias_ip_range": FlattenAliasIpRangeHTTP(d, aliasIpRanges, i),

"nic_type": nicType,
"stack_type": stackType,
Expand Down
Loading