Skip to content

Commit 9997939

Browse files
authored
feat(lb): add support for configuring backend servers max connections (#2024)
* feat(lb): add support for configuring backend servers max connections * add validator
1 parent 9e163af commit 9997939

File tree

6 files changed

+337
-292
lines changed

6 files changed

+337
-292
lines changed

docs/resources/lb_backend.md

+2
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ The following arguments are supported:
6262
e.g. 'failover-website.s3-website.fr-par.scw.cloud' if your bucket website URL is 'https://failover-website.s3-website.fr-par.scw.cloud/'.
6363
- `ssl_bridging` - (Default: `false`) Enables SSL between load balancer and backend servers.
6464
- `ignore_ssl_server_verify` - (Default: `false`) Specifies whether the Load Balancer should check the backend server’s certificate before initiating a connection.
65+
- `max_connections` - (Optional) Maximum number of connections allowed per backend server.
66+
- `timeout_queue` - (Optional) Maximum time for a request to be left pending in queue when `max_connections` is reached. (e.g.: `1s`)
6567

6668
### Health Check arguments
6769

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ require (
1616
github.com/nats-io/jwt/v2 v2.4.1
1717
github.com/nats-io/nats.go v1.26.0
1818
github.com/robfig/cron/v3 v3.0.1
19-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.17.0.20230619154501-6a12f2ddaa47
19+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.17.0.20230626132518-b0dfa1defaaf
2020
github.com/stretchr/testify v1.8.4
2121
)
2222

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -253,8 +253,8 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
253253
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
254254
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
255255
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
256-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.17.0.20230619154501-6a12f2ddaa47 h1:eGARFgFhRDgxFF6QwimHe+MV21xhuPKLPNhJyML3JkA=
257-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.17.0.20230619154501-6a12f2ddaa47/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg=
256+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.17.0.20230626132518-b0dfa1defaaf h1:df06kcC2caUTghLW6aTSyL3GUeM79BPvbtMyng187aE=
257+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.17.0.20230626132518-b0dfa1defaaf/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg=
258258
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
259259
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
260260
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=

scaleway/resource_lb_backend.go

+39
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package scaleway
22

33
import (
44
"context"
5+
"math"
6+
"time"
57

68
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
79
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -274,6 +276,18 @@ E.g. 'failover-website.s3-website.fr-par.scw.cloud' if your bucket website URL i
274276
Optional: true,
275277
Default: false,
276278
},
279+
"max_connections": {
280+
Type: schema.TypeInt,
281+
Optional: true,
282+
ValidateFunc: validation.IntBetween(0, math.MaxInt32),
283+
Description: "Maximum number of connections allowed per backend server",
284+
},
285+
"timeout_queue": {
286+
Type: schema.TypeString,
287+
Optional: true,
288+
ValidateFunc: validateDuration(),
289+
Description: "Maximum time (in seconds) for a request to be left pending in queue when `max_connections` is reached",
290+
},
277291
},
278292
}
279293
}
@@ -352,6 +366,17 @@ func resourceScalewayLbBackendCreate(ctx context.Context, d *schema.ResourceData
352366
IgnoreSslServerVerify: expandBoolPtr(getBool(d, "ignore_ssl_server_verify")),
353367
}
354368

369+
if maxConn, ok := d.GetOk("max_connections"); ok {
370+
createReq.MaxConnections = expandInt32Ptr(maxConn)
371+
}
372+
if timeoutQueue, ok := d.GetOk("timeout_queue"); ok {
373+
timeout, err := time.ParseDuration(timeoutQueue.(string))
374+
if err != nil {
375+
return diag.FromErr(err)
376+
}
377+
createReq.TimeoutQueue = &scw.Duration{Seconds: int64(timeout.Seconds())}
378+
}
379+
355380
// deprecated attribute
356381
createReq.SendProxyV2 = expandBoolPtr(getBool(d, "send_proxy_v2"))
357382

@@ -416,6 +441,11 @@ func resourceScalewayLbBackendRead(ctx context.Context, d *schema.ResourceData,
416441
_ = d.Set("failover_host", backend.FailoverHost)
417442
_ = d.Set("ssl_bridging", flattenBoolPtr(backend.SslBridging))
418443
_ = d.Set("ignore_ssl_server_verify", flattenBoolPtr(backend.IgnoreSslServerVerify))
444+
_ = d.Set("max_connections", flattenInt32Ptr(backend.MaxConnections))
445+
446+
if backend.TimeoutQueue != nil {
447+
_ = d.Set("timeout_queue", flattenDuration(backend.TimeoutQueue.ToTimeDuration()))
448+
}
419449

420450
_, err = waitForLB(ctx, lbAPI, zone, backend.LB.ID, d.Timeout(schema.TimeoutRead))
421451
if err != nil {
@@ -480,6 +510,15 @@ func resourceScalewayLbBackendUpdate(ctx context.Context, d *schema.ResourceData
480510
FailoverHost: expandStringPtr(d.Get("failover_host")),
481511
SslBridging: expandBoolPtr(getBool(d, "ssl_bridging")),
482512
IgnoreSslServerVerify: expandBoolPtr(getBool(d, "ignore_ssl_server_verify")),
513+
MaxConnections: expandInt32Ptr(d.Get("max_connections")),
514+
}
515+
516+
if timeoutQueue, ok := d.GetOk("timeout_queue"); ok {
517+
timeoutQueueParsed, err := time.ParseDuration(timeoutQueue.(string))
518+
if err != nil {
519+
return diag.FromErr(err)
520+
}
521+
req.TimeoutQueue = &scw.Duration{Seconds: int64(timeoutQueueParsed.Seconds())}
483522
}
484523

485524
// deprecated

scaleway/resource_lb_backend_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ func TestAccScalewayLbBackend_Basic(t *testing.T) {
8686
on_marked_down_action = "shutdown_sessions"
8787
ssl_bridging = "true"
8888
ignore_ssl_server_verify = "true"
89+
max_connections = 42
90+
timeout_queue = "4s"
8991
}
9092
`,
9193
Check: resource.ComposeTestCheckFunc(
@@ -99,6 +101,8 @@ func TestAccScalewayLbBackend_Basic(t *testing.T) {
99101
resource.TestCheckResourceAttr("scaleway_lb_backend.bkd01", "on_marked_down_action", "shutdown_sessions"),
100102
resource.TestCheckResourceAttr("scaleway_lb_backend.bkd01", "ssl_bridging", "true"),
101103
resource.TestCheckResourceAttr("scaleway_lb_backend.bkd01", "ignore_ssl_server_verify", "true"),
104+
resource.TestCheckResourceAttr("scaleway_lb_backend.bkd01", "max_connections", "42"),
105+
resource.TestCheckResourceAttr("scaleway_lb_backend.bkd01", "timeout_queue", "4s"),
102106
),
103107
},
104108
},

0 commit comments

Comments
 (0)