diff --git a/.changelog/5324.txt b/.changelog/5324.txt new file mode 100644 index 0000000000..ad09d9ea5e --- /dev/null +++ b/.changelog/5324.txt @@ -0,0 +1,3 @@ +```release-note:bug +compute: fixed perma-diff bug on `log_config.enable` of both `google_compute_backend_service` and `google_compute_region_backend_service` +``` diff --git a/google-beta/resource_compute_backend_service.go b/google-beta/resource_compute_backend_service.go index 3f191aabce..57523ece29 100644 --- a/google-beta/resource_compute_backend_service.go +++ b/google-beta/resource_compute_backend_service.go @@ -30,6 +30,15 @@ import ( "google.golang.org/api/googleapi" ) +// suppress changes on sample_rate if log_config is set to disabled. +func suppressWhenDisabled(k, old, new string, d *schema.ResourceData) bool { + _, n := d.GetChange("log_config.0.enable") + if isEmptyValue(reflect.ValueOf(n)) { + return true + } + return false +} + // Whether the backend is a global or regional NEG func isNegBackend(backend map[string]interface{}) bool { backendGroup, ok := backend["group"] @@ -677,8 +686,9 @@ If logging is enabled, logs will be exported to Stackdriver.`, AtLeastOneOf: []string{"log_config.0.enable", "log_config.0.sample_rate"}, }, "sample_rate": { - Type: schema.TypeFloat, - Optional: true, + Type: schema.TypeFloat, + Optional: true, + DiffSuppressFunc: suppressWhenDisabled, Description: `This field can only be specified if logging is enabled for this backend service. The value of the field must be in [0, 1]. This configures the sampling rate of requests to the load balancer where 1.0 means all logged requests are reported and 0.0 means no logged requests are reported. @@ -3752,7 +3762,7 @@ func expandComputeBackendServiceLogConfig(v interface{}, d TerraformResourceData transformedEnable, err := expandComputeBackendServiceLogConfigEnable(original["enable"], d, config) if err != nil { return nil, err - } else if val := reflect.ValueOf(transformedEnable); val.IsValid() && !isEmptyValue(val) { + } else { transformed["enable"] = transformedEnable } diff --git a/google-beta/resource_compute_backend_service_test.go b/google-beta/resource_compute_backend_service_test.go index 6be4713cda..01d3126ebc 100644 --- a/google-beta/resource_compute_backend_service_test.go +++ b/google-beta/resource_compute_backend_service_test.go @@ -614,7 +614,7 @@ func TestAccComputeBackendService_withLogConfig(t *testing.T) { CheckDestroy: testAccCheckComputeBackendServiceDestroyProducer(t), Steps: []resource.TestStep{ { - Config: testAccComputeBackendService_withLogConfig(serviceName, checkName, 0.7), + Config: testAccComputeBackendService_withLogConfig(serviceName, checkName, 0.7, true), }, { ResourceName: "google_compute_backend_service.foobar", @@ -622,7 +622,31 @@ func TestAccComputeBackendService_withLogConfig(t *testing.T) { ImportStateVerify: true, }, { - Config: testAccComputeBackendService_withLogConfig(serviceName, checkName, 0.4), + Config: testAccComputeBackendService_withLogConfig(serviceName, checkName, 0.4, true), + }, + { + ResourceName: "google_compute_backend_service.foobar", + ImportState: true, + ImportStateVerify: true, + }, + { + Config: testAccComputeBackendService_withLogConfig(serviceName, checkName, 0.4, false), + }, + { + ResourceName: "google_compute_backend_service.foobar", + ImportState: true, + ImportStateVerify: true, + }, + { + Config: testAccComputeBackendService_withLogConfig2(serviceName, checkName, false), + }, + { + ResourceName: "google_compute_backend_service.foobar", + ImportState: true, + ImportStateVerify: true, + }, + { + Config: testAccComputeBackendService_withLogConfig(serviceName, checkName, 0.7, false), }, { ResourceName: "google_compute_backend_service.foobar", @@ -1633,14 +1657,14 @@ resource "google_compute_instance_template" "foobar" { `, fr, proxy, backend, hc, urlmap) } -func testAccComputeBackendService_withLogConfig(serviceName, checkName string, sampleRate float64) string { +func testAccComputeBackendService_withLogConfig(serviceName, checkName string, sampleRate float64, enabled bool) string { return fmt.Sprintf(` resource "google_compute_backend_service" "foobar" { name = "%s" health_checks = [google_compute_http_health_check.zero.self_link] log_config { - enable = true + enable = %t sample_rate = %v } } @@ -1651,7 +1675,27 @@ resource "google_compute_http_health_check" "zero" { check_interval_sec = 1 timeout_sec = 1 } -`, serviceName, sampleRate, checkName) +`, serviceName, enabled, sampleRate, checkName) +} + +func testAccComputeBackendService_withLogConfig2(serviceName, checkName string, enabled bool) string { + return fmt.Sprintf(` +resource "google_compute_backend_service" "foobar" { + name = "%s" + health_checks = [google_compute_http_health_check.zero.self_link] + + log_config { + enable = %t + } +} + +resource "google_compute_http_health_check" "zero" { + name = "%s" + request_path = "/" + check_interval_sec = 1 + timeout_sec = 1 +} +`, serviceName, enabled, checkName) } func testAccComputeBackendService_regionNegBackend(suffix string) string { diff --git a/google-beta/resource_compute_region_backend_service.go b/google-beta/resource_compute_region_backend_service.go index 9ae11fddc9..d226262e41 100644 --- a/google-beta/resource_compute_region_backend_service.go +++ b/google-beta/resource_compute_region_backend_service.go @@ -708,8 +708,9 @@ If logging is enabled, logs will be exported to Stackdriver.`, AtLeastOneOf: []string{"log_config.0.enable", "log_config.0.sample_rate"}, }, "sample_rate": { - Type: schema.TypeFloat, - Optional: true, + Type: schema.TypeFloat, + Optional: true, + DiffSuppressFunc: suppressWhenDisabled, Description: `This field can only be specified if logging is enabled for this backend service. The value of the field must be in [0, 1]. This configures the sampling rate of requests to the load balancer where 1.0 means all logged requests are reported and 0.0 means no logged requests are reported. @@ -3830,7 +3831,7 @@ func expandComputeRegionBackendServiceLogConfig(v interface{}, d TerraformResour transformedEnable, err := expandComputeRegionBackendServiceLogConfigEnable(original["enable"], d, config) if err != nil { return nil, err - } else if val := reflect.ValueOf(transformedEnable); val.IsValid() && !isEmptyValue(val) { + } else { transformed["enable"] = transformedEnable }