Skip to content

Commit 7a04fe0

Browse files
authored
feat(redis): add cluster settings (#1258)
* doc(redis): update redis cluster doc with settings
1 parent 58d0db9 commit 7a04fe0

5 files changed

+1561
-0
lines changed

docs/resources/redis_cluster.md

+19
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,23 @@ resource "scaleway_redis_cluster" "main" {
3131
}
3232
```
3333

34+
### With settings
35+
36+
```hcl
37+
resource "scaleway_redis_cluster" "main" {
38+
name = "test_redis_basic"
39+
version = "6.2.6"
40+
node_type = "MDB-BETA-M"
41+
user_name = "my_initial_user"
42+
password = "thiZ_is_v&ry_s3cret"
43+
44+
settings = {
45+
"maxclients" = "1000"
46+
"tcp-keepalive" = "120"
47+
}
48+
}
49+
```
50+
3451
## Arguments Reference
3552

3653
The following arguments are supported:
@@ -68,6 +85,8 @@ The `acl` block supports:
6885
- `ip` - (Required) The ip range to whitelist in [CIDR notation](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation)
6986
- `description` - (Optional) A text describing this rule. Default description: `Allow IP`
7087

88+
- `settings` - (Optional) Map of settings for redis cluster. Available settings can be found by listing redis versions with scaleway API or CLI
89+
7190
## Attributes Reference
7291

7392
In addition to all arguments above, the following attributes are exported:

scaleway/helpers_redis.go

+20
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,23 @@ func flattenRedisACLs(aclRules []*redis.ACLRule) interface{} {
8686
}
8787
return flat
8888
}
89+
90+
func expandRedisSettings(i interface{}) []*redis.ClusterSetting {
91+
rawSettings := i.(map[string]interface{})
92+
settings := []*redis.ClusterSetting(nil)
93+
for key, value := range rawSettings {
94+
settings = append(settings, &redis.ClusterSetting{
95+
Name: key,
96+
Value: value.(string),
97+
})
98+
}
99+
return settings
100+
}
101+
102+
func flattenRedisSettings(settings []*redis.ClusterSetting) interface{} {
103+
rawSettings := make(map[string]string)
104+
for _, setting := range settings {
105+
rawSettings[setting.Name] = setting.Value
106+
}
107+
return rawSettings
108+
}

scaleway/resource_redis_cluster.go

+34
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,14 @@ func resourceScalewayRedisCluster() *schema.Resource {
106106
},
107107
},
108108
},
109+
"settings": {
110+
Type: schema.TypeMap,
111+
Description: "Map of settings to define for the cluster.",
112+
Optional: true,
113+
Elem: &schema.Schema{
114+
Type: schema.TypeString,
115+
},
116+
},
109117
// Common
110118
"zone": zoneSchema(),
111119
"project_id": projectIDSchema(),
@@ -149,6 +157,10 @@ func resourceScalewayRedisClusterCreate(ctx context.Context, d *schema.ResourceD
149157
}
150158
createReq.ACLRules = rules
151159
}
160+
settings, settingsExist := d.GetOk("settings")
161+
if settingsExist {
162+
createReq.ClusterSettings = expandRedisSettings(settings)
163+
}
152164

153165
res, err := redisAPI.CreateCluster(createReq, scw.WithContext(ctx))
154166
if err != nil {
@@ -195,6 +207,7 @@ func resourceScalewayRedisClusterRead(ctx context.Context, d *schema.ResourceDat
195207
_ = d.Set("created_at", cluster.CreatedAt.Format(time.RFC3339))
196208
_ = d.Set("updated_at", cluster.UpdatedAt.Format(time.RFC3339))
197209
_ = d.Set("acl", flattenRedisACLs(cluster.ACLRules))
210+
_ = d.Set("settings", flattenRedisSettings(cluster.ClusterSettings))
198211

199212
if len(cluster.Tags) > 0 {
200213
_ = d.Set("tags", cluster.Tags)
@@ -232,6 +245,12 @@ func resourceScalewayRedisClusterUpdate(ctx context.Context, d *schema.ResourceD
232245
return diagnostics
233246
}
234247
}
248+
if d.HasChange("settings") {
249+
diagnostics := resourceScalewayRedisClusterUpdateSettings(ctx, d, redisAPI, zone, ID)
250+
if diagnostics != nil {
251+
return diagnostics
252+
}
253+
}
235254

236255
_, err = waitForRedisCluster(ctx, redisAPI, zone, ID, d.Timeout(schema.TimeoutUpdate))
237256
if err != nil {
@@ -307,6 +326,21 @@ func resourceScalewayRedisClusterUpdateACL(ctx context.Context, d *schema.Resour
307326
return nil
308327
}
309328

329+
func resourceScalewayRedisClusterUpdateSettings(ctx context.Context, d *schema.ResourceData, redisAPI *redis.API, zone scw.Zone, clusterID string) diag.Diagnostics {
330+
settings := expandRedisSettings(d.Get("settings"))
331+
332+
_, err := redisAPI.SetClusterSettings(&redis.SetClusterSettingsRequest{
333+
Zone: zone,
334+
ClusterID: clusterID,
335+
Settings: settings,
336+
}, scw.WithContext(ctx))
337+
if err != nil {
338+
return diag.FromErr(err)
339+
}
340+
341+
return nil
342+
}
343+
310344
func resourceScalewayRedisClusterDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
311345
redisAPI, zone, ID, err := redisAPIWithZoneAndID(meta, d.Id())
312346
if err != nil {

scaleway/resource_redis_cluster_test.go

+60
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,66 @@ func TestAccScalewayRedisCluster_ACL(t *testing.T) {
238238
})
239239
}
240240

241+
func TestAccScalewayRedisCluster_Settings(t *testing.T) {
242+
tt := NewTestTools(t)
243+
defer tt.Cleanup()
244+
resource.ParallelTest(t, resource.TestCase{
245+
PreCheck: func() { testAccPreCheck(t) },
246+
ProviderFactories: tt.ProviderFactories,
247+
CheckDestroy: testAccCheckScalewayRedisClusterDestroy(tt),
248+
Steps: []resource.TestStep{
249+
{
250+
Config: `
251+
resource "scaleway_redis_cluster" "main" {
252+
name = "test_redis_settings"
253+
version = "6.2.6"
254+
node_type = "MDB-BETA-M"
255+
user_name = "my_initial_user"
256+
password = "thiZ_is_v&ry_s3cret"
257+
settings = {
258+
"tcp-keepalive" = "150"
259+
"maxclients" = "5000"
260+
}
261+
}
262+
`,
263+
Check: resource.ComposeTestCheckFunc(
264+
testAccCheckScalewayRedisExists(tt, "scaleway_redis_cluster.main"),
265+
resource.TestCheckResourceAttr("scaleway_redis_cluster.main", "name", "test_redis_settings"),
266+
resource.TestCheckResourceAttr("scaleway_redis_cluster.main", "version", "6.2.6"),
267+
resource.TestCheckResourceAttr("scaleway_redis_cluster.main", "node_type", "MDB-BETA-M"),
268+
resource.TestCheckResourceAttr("scaleway_redis_cluster.main", "user_name", "my_initial_user"),
269+
resource.TestCheckResourceAttr("scaleway_redis_cluster.main", "password", "thiZ_is_v&ry_s3cret"),
270+
resource.TestCheckResourceAttr("scaleway_redis_cluster.main", "settings.tcp-keepalive", "150"),
271+
resource.TestCheckResourceAttr("scaleway_redis_cluster.main", "settings.maxclients", "5000"),
272+
),
273+
},
274+
{
275+
Config: `
276+
resource "scaleway_redis_cluster" "main" {
277+
name = "test_redis_settings"
278+
version = "6.2.6"
279+
node_type = "MDB-BETA-M"
280+
user_name = "my_initial_user"
281+
password = "thiZ_is_v&ry_s3cret"
282+
settings = {
283+
"maxclients" = "2000"
284+
}
285+
}
286+
`,
287+
Check: resource.ComposeTestCheckFunc(
288+
testAccCheckScalewayRedisExists(tt, "scaleway_redis_cluster.main"),
289+
resource.TestCheckResourceAttr("scaleway_redis_cluster.main", "name", "test_redis_settings"),
290+
resource.TestCheckResourceAttr("scaleway_redis_cluster.main", "version", "6.2.6"),
291+
resource.TestCheckResourceAttr("scaleway_redis_cluster.main", "node_type", "MDB-BETA-M"),
292+
resource.TestCheckResourceAttr("scaleway_redis_cluster.main", "user_name", "my_initial_user"),
293+
resource.TestCheckResourceAttr("scaleway_redis_cluster.main", "password", "thiZ_is_v&ry_s3cret"),
294+
resource.TestCheckResourceAttr("scaleway_redis_cluster.main", "settings.maxclients", "2000"),
295+
),
296+
},
297+
},
298+
})
299+
}
300+
241301
func testAccCheckScalewayRedisClusterDestroy(tt *TestTools) resource.TestCheckFunc {
242302
return func(state *terraform.State) error {
243303
for _, rs := range state.RootModule().Resources {

0 commit comments

Comments
 (0)