diff --git a/google/resource_compute_region_backend_service.go b/google/resource_compute_region_backend_service.go index 682cd0fabb9..d81e870d275 100644 --- a/google/resource_compute_region_backend_service.go +++ b/google/resource_compute_region_backend_service.go @@ -103,6 +103,12 @@ func resourceComputeRegionBackendService() *schema.Resource { Optional: true, Computed: true, }, + + "connection_draining_timeout_sec": &schema.Schema{ + Type: schema.TypeInt, + Optional: true, + Default: 0, + }, }, } } @@ -142,6 +148,14 @@ func resourceComputeRegionBackendServiceCreate(d *schema.ResourceData, meta inte service.TimeoutSec = int64(v.(int)) } + if v, ok := d.GetOk("connection_draining_timeout_sec"); ok { + connectionDraining := &compute.ConnectionDraining{ + DrainingTimeoutSec: int64(v.(int)), + } + + service.ConnectionDraining = connectionDraining + } + project, err := getProject(d, config) if err != nil { return err @@ -195,9 +209,9 @@ func resourceComputeRegionBackendServiceRead(d *schema.ResourceData, meta interf d.Set("protocol", service.Protocol) d.Set("session_affinity", service.SessionAffinity) d.Set("timeout_sec", service.TimeoutSec) + d.Set("connection_draining_timeout_sec", service.ConnectionDraining.DrainingTimeoutSec) d.Set("fingerprint", service.Fingerprint) d.Set("self_link", service.SelfLink) - d.Set("backend", flattenBackends(service.Backends)) d.Set("health_checks", service.HealthChecks) @@ -247,6 +261,14 @@ func resourceComputeRegionBackendServiceUpdate(d *schema.ResourceData, meta inte service.TimeoutSec = int64(v.(int)) } + if d.HasChange("connection_draining_timeout_sec") { + connectionDraining := &compute.ConnectionDraining{ + DrainingTimeoutSec: int64(d.Get("connection_draining_timeout_sec").(int)), + } + + service.ConnectionDraining = connectionDraining + } + log.Printf("[DEBUG] Updating existing Backend Service %q: %#v", d.Id(), service) op, err := config.clientCompute.RegionBackendServices.Update( project, region, d.Id(), &service).Do() diff --git a/google/resource_compute_region_backend_service_test.go b/google/resource_compute_region_backend_service_test.go index 2abd764732e..f53266dd44b 100644 --- a/google/resource_compute_region_backend_service_test.go +++ b/google/resource_compute_region_backend_service_test.go @@ -114,6 +114,63 @@ func TestAccComputeRegionBackendService_withBackendAndUpdate(t *testing.T) { } } +func TestAccComputeRegionBackendService_withConnectionDraining(t *testing.T) { + serviceName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) + checkName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) + var svc compute.BackendService + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckComputeRegionBackendServiceDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccComputeRegionBackendService_withConnectionDraining(serviceName, checkName, 10), + Check: resource.ComposeTestCheckFunc( + testAccCheckComputeRegionBackendServiceExists( + "google_compute_region_backend_service.foobar", &svc), + ), + }, + }, + }) + + if svc.ConnectionDraining.DrainingTimeoutSec != 10 { + t.Errorf("Expected ConnectionDraining.DrainingTimeoutSec == 10, got %d", svc.ConnectionDraining.DrainingTimeoutSec) + } +} + +func TestAccComputeRegionBackendService_withConnectionDrainingAndUpdate(t *testing.T) { + serviceName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) + checkName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) + var svc compute.BackendService + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckComputeRegionBackendServiceDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccComputeRegionBackendService_withConnectionDraining(serviceName, checkName, 10), + Check: resource.ComposeTestCheckFunc( + testAccCheckComputeRegionBackendServiceExists( + "google_compute_region_backend_service.foobar", &svc), + ), + }, + resource.TestStep{ + Config: testAccComputeRegionBackendService_basic(serviceName, checkName), + Check: resource.ComposeTestCheckFunc( + testAccCheckComputeRegionBackendServiceExists( + "google_compute_region_backend_service.foobar", &svc), + ), + }, + }, + }) + + if svc.ConnectionDraining.DrainingTimeoutSec != 0 { + t.Errorf("Expected ConnectionDraining.DrainingTimeoutSec == 0, got %d", svc.ConnectionDraining.DrainingTimeoutSec) + } +} + func TestAccComputeRegionBackendService_withSessionAffinity(t *testing.T) { serviceName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) checkName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) @@ -308,3 +365,24 @@ resource "google_compute_health_check" "zero" { } `, serviceName, checkName) } + +func testAccComputeRegionBackendService_withConnectionDraining(serviceName, checkName string, drainingTimeout int64) string { + return fmt.Sprintf(` +resource "google_compute_region_backend_service" "foobar" { + name = "%s" + health_checks = ["${google_compute_health_check.zero.self_link}"] + region = "us-central1" + connection_draining_timeout_sec = %v +} + +resource "google_compute_health_check" "zero" { + name = "%s" + check_interval_sec = 1 + timeout_sec = 1 + + tcp_health_check { + port = "80" + } +} +`, serviceName, drainingTimeout, checkName) +} diff --git a/website/docs/r/compute_region_backend_service.html.markdown b/website/docs/r/compute_region_backend_service.html.markdown index a54ee2b7b74..d7437000965 100644 --- a/website/docs/r/compute_region_backend_service.html.markdown +++ b/website/docs/r/compute_region_backend_service.html.markdown @@ -14,7 +14,7 @@ and [API](https://cloud.google.com/compute/docs/reference/latest/backendServices ## Example Usage -```tf +```hcl resource "google_compute_region_backend_service" "foobar" { name = "blablah" description = "Hello World 1234" @@ -95,6 +95,8 @@ The following arguments are supported: * `timeout_sec` - (Optional) The number of secs to wait for a backend to respond to a request before considering the request failed. Defaults to `30`. +* `connection_draining_timeout_sec` - (Optional) Time for which instance will be drained +(not accept new connections, but still work to finish started ones). Defaults to `0`. The `backend` block supports: