Skip to content

Commit bd70e73

Browse files
committed
feat/add log policy in rdb instance
1 parent aa53415 commit bd70e73

File tree

4 files changed

+1625
-9
lines changed

4 files changed

+1625
-9
lines changed

internal/services/rdb/helpers.go

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ import (
1818
)
1919

2020
const (
21-
defaultInstanceTimeout = 15 * time.Minute
22-
defaultWaitRetryInterval = 30 * time.Second
21+
defaultInstanceTimeout = 15 * time.Minute
22+
defaultWaitRetryInterval = 30 * time.Second
23+
defaultMaxAgeRetention uint32 = 30
24+
defaultTotalDiskRetention = scw.Size(0)
2325
)
2426

2527
// newAPI returns a new RDB API
@@ -145,3 +147,45 @@ func getIPAMConfigRead(resource interface{}, m interface{}) (bool, error) {
145147
}
146148
return false, nil
147149
}
150+
151+
func flattenSizePtr(i *scw.Size) interface{} {
152+
if i == nil {
153+
return 0
154+
}
155+
return *i
156+
}
157+
158+
func expandSizePtr(data interface{}) *scw.Size {
159+
if data == nil || data == "" {
160+
return nil
161+
}
162+
163+
size := scw.Size(data.(int))
164+
return &size
165+
}
166+
167+
func expandInstanceLogsPolicy(i interface{}) *rdb.LogsPolicy {
168+
policyConfigRaw := i.([]interface{})
169+
for _, policyRaw := range policyConfigRaw {
170+
policy := policyRaw.(map[string]interface{})
171+
return &rdb.LogsPolicy{
172+
MaxAgeRetention: types.ExpandUint32Ptr(policy["max_age_retention"]),
173+
TotalDiskRetention: expandSizePtr(policy["total_disk_retention"]),
174+
}
175+
}
176+
177+
return nil
178+
}
179+
180+
func flattenInstanceLogsPolicy(policy *rdb.LogsPolicy) interface{} {
181+
p := []map[string]interface{}{}
182+
if policy != nil {
183+
p = append(p, map[string]interface{}{
184+
"max_age_retention": types.FlattenUint32Ptr(policy.MaxAgeRetention),
185+
"total_disk_retention": flattenSizePtr(policy.TotalDiskRetention),
186+
})
187+
} else {
188+
return nil
189+
}
190+
return p
191+
}

internal/services/rdb/instance.go

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,27 @@ func ResourceInstance() *schema.Resource {
282282
},
283283
},
284284
},
285+
"logs_policy": {
286+
Type: schema.TypeList,
287+
Optional: true,
288+
Description: "Logs policy configuration",
289+
MaxItems: 1,
290+
Elem: &schema.Resource{
291+
Schema: map[string]*schema.Schema{
292+
// Computed
293+
"max_age_retention": {
294+
Type: schema.TypeInt,
295+
Optional: true,
296+
Description: "The max age (in days) of remote logs to keep on the Database Instance",
297+
},
298+
"total_disk_retention": {
299+
Type: schema.TypeInt,
300+
Optional: true,
301+
Description: "The max disk size of remote logs to keep on the Database Instance.",
302+
},
303+
},
304+
},
305+
},
285306
// Common
286307
"region": regional.Schema(),
287308
"organization_id": account.OrganizationIDSchema(),
@@ -349,29 +370,37 @@ func ResourceRdbInstanceCreate(ctx context.Context, d *schema.ResourceData, m in
349370

350371
d.SetId(regional.NewIDString(region, res.ID))
351372

373+
mustUpdate := false
374+
updateReq := &rdb.UpdateInstanceRequest{
375+
Region: region,
376+
InstanceID: res.ID,
377+
}
352378
// Configure Schedule Backup
353379
// BackupScheduleFrequency and BackupScheduleRetention can only configure after instance creation
354380
if !d.Get("disable_backup").(bool) {
355-
updateReq := &rdb.UpdateInstanceRequest{
356-
Region: region,
357-
InstanceID: res.ID,
358-
}
359381

360382
updateReq.BackupSameRegion = types.ExpandBoolPtr(d.Get("backup_same_region"))
361-
362383
updateReq.IsBackupScheduleDisabled = scw.BoolPtr(d.Get("disable_backup").(bool))
363384
if backupScheduleFrequency, okFrequency := d.GetOk("backup_schedule_frequency"); okFrequency {
364385
updateReq.BackupScheduleFrequency = scw.Uint32Ptr(uint32(backupScheduleFrequency.(int)))
365386
}
366387
if backupScheduleRetention, okRetention := d.GetOk("backup_schedule_retention"); okRetention {
367388
updateReq.BackupScheduleRetention = scw.Uint32Ptr(uint32(backupScheduleRetention.(int)))
368389
}
390+
mustUpdate = true
391+
}
369392

393+
policyRaw, exist := d.GetOk("logs_policy")
394+
if exist {
395+
updateReq.LogsPolicy = expandInstanceLogsPolicy(policyRaw)
396+
mustUpdate = true
397+
}
398+
399+
if mustUpdate {
370400
_, err = waitForRDBInstance(ctx, rdbAPI, region, res.ID, d.Timeout(schema.TimeoutCreate))
371401
if err != nil {
372402
return diag.FromErr(err)
373403
}
374-
375404
_, err = rdbAPI.UpdateInstance(updateReq, scw.WithContext(ctx))
376405
if err != nil {
377406
return diag.FromErr(err)
@@ -412,7 +441,6 @@ func ResourceRdbInstanceRead(ctx context.Context, d *schema.ResourceData, m inte
412441
}
413442
return diag.FromErr(err)
414443
}
415-
416444
_ = d.Set("name", res.Name)
417445
_ = d.Set("node_type", res.NodeType)
418446
_ = d.Set("engine", res.Engine)
@@ -476,6 +504,9 @@ func ResourceRdbInstanceRead(ctx context.Context, d *schema.ResourceData, m inte
476504
_ = d.Set("settings", flattenInstanceSettings(res.Settings))
477505
_ = d.Set("init_settings", flattenInstanceSettings(res.InitSettings))
478506

507+
// set logs policy
508+
_ = d.Set("logs_policy", flattenInstanceLogsPolicy(res.LogsPolicy))
509+
479510
// set endpoints
480511
enableIpam, err := getIPAMConfigRead(res, m)
481512
if err != nil {
@@ -651,6 +682,10 @@ func ResourceRdbInstanceUpdate(ctx context.Context, d *schema.ResourceData, m in
651682
req.Tags = types.ExpandUpdatedStringsPtr(d.Get("tags"))
652683
}
653684

685+
if d.HasChange("logs_policy") {
686+
req.LogsPolicy = expandInstanceLogsPolicy(d.Get("logs_policy"))
687+
}
688+
654689
_, err = waitForRDBInstance(ctx, rdbAPI, region, ID, d.Timeout(schema.TimeoutUpdate))
655690
if err != nil {
656691
return diag.FromErr(err)

internal/services/rdb/instance_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ func TestAccInstance_Basic(t *testing.T) {
6060
resource.TestCheckResourceAttrSet("scaleway_rdb_instance.main", "load_balancer.0.ip"),
6161
resource.TestCheckResourceAttrSet("scaleway_rdb_instance.main", "load_balancer.0.endpoint_id"),
6262
resource.TestCheckResourceAttrSet("scaleway_rdb_instance.main", "load_balancer.0.port"),
63+
resource.TestCheckResourceAttrSet("scaleway_rdb_instance.main", "logs_policy.0.max_age_retention"),
64+
resource.TestCheckResourceAttrSet("scaleway_rdb_instance.main", "logs_policy.0.total_disk_retention"),
6365
),
6466
},
6567
{
@@ -139,6 +141,66 @@ func TestAccInstance_WithCluster(t *testing.T) {
139141
})
140142
}
141143

144+
func TestAccInstance_LogsPolicy(t *testing.T) {
145+
tt := acctest.NewTestTools(t)
146+
defer tt.Cleanup()
147+
latestEngineVersion := rdbchecks.GetLatestEngineVersion(tt, postgreSQLEngineName)
148+
149+
resource.ParallelTest(t, resource.TestCase{
150+
PreCheck: func() { acctest.PreCheck(t) },
151+
ProviderFactories: tt.ProviderFactories,
152+
CheckDestroy: rdbchecks.IsInstanceDestroyed(tt),
153+
Steps: []resource.TestStep{
154+
{
155+
Config: fmt.Sprintf(`
156+
resource scaleway_rdb_instance main {
157+
name = "test-rdb-log-policy"
158+
node_type = "db-dev-s"
159+
engine = %q
160+
is_ha_cluster = true
161+
disable_backup = false
162+
user_name = "my_initial_user"
163+
password = "thiZ_is_v&ry_s8cret"
164+
tags = [ "terraform-test", "scaleway_rdb_instance", "minimal" ]
165+
logs_policy {
166+
max_age_retention = 30
167+
total_disk_retention = 100000000
168+
}
169+
}
170+
`, latestEngineVersion),
171+
Check: resource.ComposeTestCheckFunc(
172+
isInstancePresent(tt, "scaleway_rdb_instance.main"),
173+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "logs_policy.0.max_age_retention", "30"),
174+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "logs_policy.0.total_disk_retention", "100000000"),
175+
),
176+
},
177+
{
178+
Config: fmt.Sprintf(`
179+
resource scaleway_rdb_instance main {
180+
name = "test-rdb-log-policy"
181+
node_type = "db-dev-s"
182+
engine = %q
183+
is_ha_cluster = true
184+
disable_backup = false
185+
user_name = "my_initial_user"
186+
password = "thiZ_is_v&ry_s8cret"
187+
tags = [ "terraform-test", "scaleway_rdb_instance", "minimal" ]
188+
logs_policy {
189+
max_age_retention = 30
190+
total_disk_retention = 100000000
191+
}
192+
}
193+
`, latestEngineVersion),
194+
Check: resource.ComposeTestCheckFunc(
195+
isInstancePresent(tt, "scaleway_rdb_instance.main"),
196+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "logs_policy.0.max_age_retention", "30"),
197+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "logs_policy.0.total_disk_retention", "200000000"),
198+
),
199+
},
200+
},
201+
})
202+
}
203+
142204
func TestAccInstance_Settings(t *testing.T) {
143205
tt := acctest.NewTestTools(t)
144206
defer tt.Cleanup()

internal/services/rdb/testdata/instance-logs-policy.cassette.yaml

Lines changed: 1475 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)