Skip to content

Commit a9b68b4

Browse files
feat(rdb): add support for settings (#777)
Co-authored-by: Olivier Cano <[email protected]>
1 parent 3d8682b commit a9b68b4

5 files changed

+1207
-0
lines changed

docs/resources/rdb_instance.md

+2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ The following arguments are supported:
5151

5252
- `disable_backup` - (Optional) Disable automated backup for the database instance.
5353

54+
- `settings` - Map of engine settings to be set.
55+
5456
- `tags` - (Optional) The tags associated with the Database Instance.
5557

5658
- `region` - (Defaults to [provider](../index.md#region) `region`) The [region](../guides/regions_and_zones.md#regions) in which the Database Instance should be created.

scaleway/helpers_rdb.go

+22
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,25 @@ func flattenRdbInstanceReadReplicas(readReplicas []*rdb.Endpoint) interface{} {
4747
}
4848
return replicasI
4949
}
50+
51+
func flattenInstanceSettings(settings []*rdb.InstanceSetting) interface{} {
52+
res := make(map[string]string)
53+
for _, value := range settings {
54+
res[value.Name] = value.Value
55+
}
56+
57+
return res
58+
}
59+
60+
func expandInstanceSettings(i interface{}) []*rdb.InstanceSetting {
61+
rawRule := i.(map[string]interface{})
62+
var res []*rdb.InstanceSetting
63+
for key, value := range rawRule {
64+
res = append(res, &rdb.InstanceSetting{
65+
Name: key,
66+
Value: value.(string),
67+
})
68+
}
69+
70+
return res
71+
}

scaleway/resource_rdb_instance.go

+46
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ func resourceScalewayRdbInstance() *schema.Resource {
6666
Optional: true,
6767
Description: "Password for the first user of the database instance",
6868
},
69+
"settings": {
70+
Type: schema.TypeMap,
71+
Elem: &schema.Schema{
72+
Type: schema.TypeString,
73+
},
74+
Description: "Map of engine settings to be set.",
75+
Optional: true,
76+
},
6977
"tags": {
7078
Type: schema.TypeList,
7179
Elem: &schema.Schema{
@@ -159,6 +167,17 @@ func resourceScalewayRdbInstanceCreate(ctx context.Context, d *schema.ResourceDa
159167
return diag.FromErr(err)
160168
}
161169

170+
if settings, ok := d.GetOk("settings"); ok {
171+
_, err := rdbAPI.SetInstanceSettings(&rdb.SetInstanceSettingsRequest{
172+
InstanceID: res.ID,
173+
Region: region,
174+
Settings: expandInstanceSettings(settings),
175+
})
176+
if err != nil {
177+
return diag.FromErr(err)
178+
}
179+
}
180+
162181
return resourceScalewayRdbInstanceRead(ctx, d, m)
163182
}
164183

@@ -214,6 +233,9 @@ func resourceScalewayRdbInstanceRead(ctx context.Context, d *schema.ResourceData
214233
}
215234
_ = d.Set("certificate", string(certContent))
216235

236+
// set settings
237+
_ = d.Set("settings", flattenInstanceSettings(res.Settings))
238+
217239
return nil
218240
}
219241

@@ -243,6 +265,19 @@ func resourceScalewayRdbInstanceUpdate(ctx context.Context, d *schema.ResourceDa
243265
if err != nil {
244266
return diag.FromErr(err)
245267
}
268+
269+
// Change settings
270+
if d.HasChange("settings") {
271+
_, err := rdbAPI.SetInstanceSettings(&rdb.SetInstanceSettingsRequest{
272+
InstanceID: ID,
273+
Region: region,
274+
Settings: expandInstanceSettings(d.Get("settings")),
275+
}, scw.WithContext(ctx))
276+
if err != nil {
277+
return diag.FromErr(err)
278+
}
279+
}
280+
246281
upgradeInstanceRequests := []rdb.UpgradeInstanceRequest(nil)
247282
if d.HasChange("node_type") {
248283
upgradeInstanceRequests = append(upgradeInstanceRequests,
@@ -303,6 +338,17 @@ func resourceScalewayRdbInstanceDelete(ctx context.Context, d *schema.ResourceDa
303338
return diag.FromErr(err)
304339
}
305340

341+
// We first wait in case the instance is in a transient state
342+
_, err = rdbAPI.WaitForInstance(&rdb.WaitForInstanceRequest{
343+
InstanceID: ID,
344+
Region: region,
345+
Timeout: scw.TimeDurationPtr(LbWaitForTimeout),
346+
}, scw.WithContext(ctx))
347+
348+
if err != nil && !is404Error(err) {
349+
return diag.FromErr(err)
350+
}
351+
306352
_, err = rdbAPI.DeleteInstance(&rdb.DeleteInstanceRequest{
307353
Region: region,
308354
InstanceID: ID,

scaleway/resource_rdb_instance_test.go

+41
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,47 @@ func TestAccScalewayRdbInstance_Basic(t *testing.T) {
108108
})
109109
}
110110

111+
func TestAccScalewayRdbInstance_Settings(t *testing.T) {
112+
tt := NewTestTools(t)
113+
defer tt.Cleanup()
114+
resource.ParallelTest(t, resource.TestCase{
115+
PreCheck: func() { testAccPreCheck(t) },
116+
ProviderFactories: tt.ProviderFactories,
117+
CheckDestroy: testAccCheckScalewayRdbInstanceDestroy(tt),
118+
Steps: []resource.TestStep{
119+
{
120+
Config: `
121+
resource scaleway_rdb_instance main {
122+
name = "test-rdb"
123+
node_type = "db-dev-s"
124+
engine = "PostgreSQL-11"
125+
is_ha_cluster = false
126+
disable_backup = true
127+
user_name = "my_initial_user"
128+
password = "thiZ_is_v&ry_s3cret"
129+
settings = {
130+
work_mem = "4"
131+
max_connections = "200"
132+
effective_cache_size = "1300"
133+
maintenance_work_mem = "150"
134+
max_parallel_workers = "2"
135+
max_parallel_workers_per_gather = "2"
136+
}
137+
}
138+
`,
139+
Check: resource.ComposeTestCheckFunc(
140+
testAccCheckScalewayRdbExists(tt, "scaleway_rdb_instance.main"),
141+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "settings.work_mem", "4"),
142+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "settings.max_connections", "200"),
143+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "settings.effective_cache_size", "1300"),
144+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "settings.maintenance_work_mem", "150"),
145+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "settings.max_parallel_workers", "2"),
146+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "settings.max_parallel_workers_per_gather", "2"),
147+
),
148+
},
149+
},
150+
})
151+
}
111152
func testAccCheckScalewayRdbExists(tt *TestTools, n string) resource.TestCheckFunc {
112153
return func(s *terraform.State) error {
113154
rs, ok := s.RootModule().Resources[n]

0 commit comments

Comments
 (0)