Skip to content

Commit f2a3c5d

Browse files
committed
provider/google: allow session affinity for compute_backend_service
Google's Backend Services gives users control over the session affinity modes. Let's allow Terraform users to leverage this option. We don't change the default value ("NONE", as provided by Google).
1 parent a888601 commit f2a3c5d

3 files changed

Lines changed: 70 additions & 0 deletions

File tree

builtin/providers/google/resource_compute_backend_service.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ func resourceComputeBackendService() *schema.Resource {
128128
Computed: true,
129129
},
130130

131+
"session_affinity": &schema.Schema{
132+
Type: schema.TypeString,
133+
Optional: true,
134+
Computed: true,
135+
},
136+
131137
"timeout_sec": &schema.Schema{
132138
Type: schema.TypeInt,
133139
Optional: true,
@@ -167,6 +173,10 @@ func resourceComputeBackendServiceCreate(d *schema.ResourceData, meta interface{
167173
service.Protocol = v.(string)
168174
}
169175

176+
if v, ok := d.GetOk("session_affinity"); ok {
177+
service.SessionAffinity = v.(string)
178+
}
179+
170180
if v, ok := d.GetOk("timeout_sec"); ok {
171181
service.TimeoutSec = int64(v.(int))
172182
}
@@ -225,6 +235,7 @@ func resourceComputeBackendServiceRead(d *schema.ResourceData, meta interface{})
225235
d.Set("enable_cdn", service.EnableCDN)
226236
d.Set("port_name", service.PortName)
227237
d.Set("protocol", service.Protocol)
238+
d.Set("session_affinity", service.SessionAffinity)
228239
d.Set("timeout_sec", service.TimeoutSec)
229240
d.Set("fingerprint", service.Fingerprint)
230241
d.Set("self_link", service.SelfLink)
@@ -272,6 +283,10 @@ func resourceComputeBackendServiceUpdate(d *schema.ResourceData, meta interface{
272283
service.TimeoutSec = int64(v.(int))
273284
}
274285

286+
if d.HasChange("session_affinity") {
287+
service.SessionAffinity = d.Get("session_affinity").(string)
288+
}
289+
275290
if d.HasChange("enable_cdn") {
276291
service.EnableCDN = d.Get("enable_cdn").(bool)
277292
}

builtin/providers/google/resource_compute_backend_service_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,40 @@ func TestAccComputeBackendService_withCDNEnabled(t *testing.T) {
187187
}
188188
}
189189

190+
func TestAccComputeBackendService_withSessionAffinity(t *testing.T) {
191+
serviceName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
192+
checkName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
193+
var svc compute.BackendService
194+
195+
resource.Test(t, resource.TestCase{
196+
PreCheck: func() { testAccPreCheck(t) },
197+
Providers: testAccProviders,
198+
CheckDestroy: testAccCheckComputeBackendServiceDestroy,
199+
Steps: []resource.TestStep{
200+
resource.TestStep{
201+
Config: testAccComputeBackendService_withSessionAffinity(
202+
serviceName, checkName, "CLIENT_IP"),
203+
Check: resource.ComposeTestCheckFunc(
204+
testAccCheckComputeBackendServiceExists(
205+
"google_compute_backend_service.foobar", &svc),
206+
),
207+
},
208+
resource.TestStep{
209+
Config: testAccComputeBackendService_withSessionAffinity(
210+
serviceName, checkName, "GENERATED_COOKIE"),
211+
Check: resource.ComposeTestCheckFunc(
212+
testAccCheckComputeBackendServiceExists(
213+
"google_compute_backend_service.foobar", &svc),
214+
),
215+
},
216+
},
217+
})
218+
219+
if svc.SessionAffinity != "GENERATED_COOKIE" {
220+
t.Errorf("Expected SessionAffinity == \"GENERATED_COOKIE\", got %t", svc.SessionAffinity)
221+
}
222+
}
223+
190224
func testAccComputeBackendService_basic(serviceName, checkName string) string {
191225
return fmt.Sprintf(`
192226
resource "google_compute_backend_service" "foobar" {
@@ -291,3 +325,20 @@ resource "google_compute_http_health_check" "default" {
291325
}
292326
`, serviceName, timeout, igName, itName, checkName)
293327
}
328+
329+
func testAccComputeBackendService_withSessionAffinity(serviceName, checkName, affinityName string) string {
330+
return fmt.Sprintf(`
331+
resource "google_compute_backend_service" "foobar" {
332+
name = "%s"
333+
health_checks = ["${google_compute_http_health_check.zero.self_link}"]
334+
session_affinity = "%s"
335+
}
336+
337+
resource "google_compute_http_health_check" "zero" {
338+
name = "%s"
339+
request_path = "/"
340+
check_interval_sec = 1
341+
timeout_sec = 1
342+
}
343+
`, serviceName, affinityName, checkName)
344+
}

website/source/docs/providers/google/r/compute_backend_service.html.markdown

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ The following arguments are supported:
8989
* `region` - (Optional) The Region in which the created address should reside.
9090
If it is not provided, the provider region is used.
9191

92+
* `session_affinity` - (Optional) How to distribute load. Options are "NONE" (no
93+
affinity), "CLIENT\_IP" (hash of the source/dest addresses / ports), and
94+
"GENERATED\_COOKIE" (distribute load using a generated session cookie).
95+
9296
* `timeout_sec` - (Optional) The number of secs to wait for a backend to respond
9397
to a request before considering the request failed. Defaults to `30`.
9498

0 commit comments

Comments
 (0)