diff --git a/.changelog/3468.txt b/.changelog/3468.txt new file mode 100644 index 0000000000..e54e4ea94f --- /dev/null +++ b/.changelog/3468.txt @@ -0,0 +1,3 @@ +```release-note:bug +compute: Remove permadiff or errors on update for `google_compute_backend_service` and `google_compute_region_backend_service` when `consistent_hash` values were previously set on backend service but are not supported by updated value of `locality_lb_policy` +``` diff --git a/google-beta/resource_compute_backend_service.go b/google-beta/resource_compute_backend_service.go index 5f59a85eca..d53de3651f 100644 --- a/google-beta/resource_compute_backend_service.go +++ b/google-beta/resource_compute_backend_service.go @@ -3261,5 +3261,18 @@ func resourceComputeBackendServiceDecoder(d *schema.ResourceData, meta interface delete(res, "iap") } + // Requests with consistentHash will error for specific values of + // localityLbPolicy. However, the API will not remove it if the backend + // service is updated to from supporting to non-supporting localityLbPolicy + // (e.g. RING_HASH to RANDOM), which causes an error on subsequent update. + // In order to prevent errors, we ignore any consistentHash returned + // from the API when the localityLbPolicy doesn't support it. + if v, ok := res["localityLbPolicy"]; ok { + lbPolicy := v.(string) + if lbPolicy != "MAGLEV" && lbPolicy != "RING_HASH" { + delete(res, "consistentHash") + } + } + return res, nil } diff --git a/google-beta/resource_compute_region_backend_service.go b/google-beta/resource_compute_region_backend_service.go index bcab9555b6..82455aa633 100644 --- a/google-beta/resource_compute_region_backend_service.go +++ b/google-beta/resource_compute_region_backend_service.go @@ -1000,6 +1000,18 @@ func resourceComputeRegionBackendServiceRead(d *schema.ResourceData, meta interf return handleNotFoundError(err, d, fmt.Sprintf("ComputeRegionBackendService %q", d.Id())) } + res, err = resourceComputeRegionBackendServiceDecoder(d, meta, res) + if err != nil { + return err + } + + if res == nil { + // Decoding the object has resulted in it being gone. It may be marked deleted + log.Printf("[DEBUG] Removing ComputeRegionBackendService because it no longer exists.") + d.SetId("") + return nil + } + if err := d.Set("project", project); err != nil { return fmt.Errorf("Error reading RegionBackendService: %s", err) } @@ -2895,3 +2907,20 @@ func resourceComputeRegionBackendServiceEncoder(d *schema.ResourceData, meta int obj["backends"] = backends return obj, nil } + +func resourceComputeRegionBackendServiceDecoder(d *schema.ResourceData, meta interface{}, res map[string]interface{}) (map[string]interface{}, error) { + // Requests with consistentHash will error for specific values of + // localityLbPolicy. However, the API will not remove it if the backend + // service is updated to from supporting to non-supporting localityLbPolicy + // (e.g. RING_HASH to RANDOM), which causes an error on subsequent update. + // In order to prevent errors, we ignore any consistentHash returned + // from the API when the localityLbPolicy doesn't support it. + if v, ok := res["localityLbPolicy"]; ok { + lbPolicy := v.(string) + if lbPolicy != "MAGLEV" && lbPolicy != "RING_HASH" { + delete(res, "consistentHash") + } + } + + return res, nil +}