Skip to content

Commit 72a97b7

Browse files
authored
feat(rdb): add encryption at rest for instance (#2676)
* feat: add encryption at rest in rdb * fix ci * add doc * add force new in field encryption at rest
1 parent a8a2236 commit 72a97b7

File tree

5 files changed

+1975
-0
lines changed

5 files changed

+1975
-0
lines changed

docs/resources/rdb_instance.md

+3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ resource "scaleway_rdb_instance" "main" {
2121
disable_backup = true
2222
user_name = "my_initial_user"
2323
password = "thiZ_is_v&ry_s3cret"
24+
encryption_at_rest = true
2425
}
2526
```
2627

@@ -168,6 +169,8 @@ interruption.
168169
- `project_id` - (Defaults to [provider](../index.md#arguments-reference) `project_id`) The ID of the project the Database
169170
Instance is associated with.
170171

172+
- `encryption_at_rest` - (Optional) Enable or disable encryption at rest for the Database Instance.
173+
171174
### Backups
172175

173176
- `disable_backup` - (Optional) Disable automated backup for the Database Instance.

internal/services/rdb/instance.go

+12
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,12 @@ func ResourceInstance() *schema.Resource {
302302
},
303303
},
304304
},
305+
"encryption_at_rest": {
306+
Type: schema.TypeBool,
307+
Optional: true,
308+
ForceNew: true,
309+
Description: "Enable or disable encryption at rest for the database instance",
310+
},
305311
// Common
306312
"region": regional.Schema(),
307313
"organization_id": account.OrganizationIDSchema(),
@@ -328,6 +334,9 @@ func ResourceRdbInstanceCreate(ctx context.Context, d *schema.ResourceData, m in
328334
UserName: d.Get("user_name").(string),
329335
Password: d.Get("password").(string),
330336
VolumeType: rdb.VolumeType(d.Get("volume_type").(string)),
337+
Encryption: &rdb.EncryptionAtRest{
338+
Enabled: d.Get("encryption_at_rest").(bool),
339+
},
331340
}
332341

333342
if initSettings, ok := d.GetOk("init_settings"); ok {
@@ -463,6 +472,9 @@ func ResourceRdbInstanceRead(ctx context.Context, d *schema.ResourceData, m inte
463472
_ = d.Set("region", string(region))
464473
_ = d.Set("organization_id", res.OrganizationID)
465474
_ = d.Set("project_id", res.ProjectID)
475+
if res.Encryption != nil {
476+
_ = d.Set("encryption_at_rest", res.Encryption.Enabled)
477+
}
466478

467479
// set user and password
468480
if user, ok := d.GetOk("user_name"); ok {

internal/services/rdb/instance_test.go

+88
Original file line numberDiff line numberDiff line change
@@ -1216,6 +1216,94 @@ func TestAccInstance_Endpoints(t *testing.T) {
12161216
})
12171217
}
12181218

1219+
func TestAccInstance_EncryptionAtRest(t *testing.T) {
1220+
tt := acctest.NewTestTools(t)
1221+
defer tt.Cleanup()
1222+
1223+
latestEngineVersion := rdbchecks.GetLatestEngineVersion(tt, postgreSQLEngineName)
1224+
1225+
resource.ParallelTest(t, resource.TestCase{
1226+
PreCheck: func() { acctest.PreCheck(t) },
1227+
ProviderFactories: tt.ProviderFactories,
1228+
CheckDestroy: rdbchecks.IsInstanceDestroyed(tt),
1229+
Steps: []resource.TestStep{
1230+
{
1231+
Config: fmt.Sprintf(`
1232+
resource scaleway_rdb_instance main {
1233+
name = "test-rdb-encryption"
1234+
node_type = "db-dev-s"
1235+
engine = %q
1236+
is_ha_cluster = false
1237+
disable_backup = true
1238+
user_name = "my_initial_user"
1239+
password = "thiZ_is_v&ry_s3cret"
1240+
encryption_at_rest = true
1241+
tags = [ "terraform-test", "scaleway_rdb_instance", "encryption" ]
1242+
}
1243+
`, latestEngineVersion),
1244+
Check: resource.ComposeTestCheckFunc(
1245+
isInstancePresent(tt, "scaleway_rdb_instance.main"),
1246+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "name", "test-rdb-encryption"),
1247+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "node_type", "db-dev-s"),
1248+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "engine", latestEngineVersion),
1249+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "is_ha_cluster", "false"),
1250+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "disable_backup", "true"),
1251+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "user_name", "my_initial_user"),
1252+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "password", "thiZ_is_v&ry_s3cret"),
1253+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "encryption_at_rest", "true"),
1254+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "tags.0", "terraform-test"),
1255+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "tags.1", "scaleway_rdb_instance"),
1256+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "tags.2", "encryption"),
1257+
),
1258+
},
1259+
},
1260+
})
1261+
}
1262+
1263+
func TestAccInstance_EncryptionAtRestFalse(t *testing.T) {
1264+
tt := acctest.NewTestTools(t)
1265+
defer tt.Cleanup()
1266+
1267+
latestEngineVersion := rdbchecks.GetLatestEngineVersion(tt, postgreSQLEngineName)
1268+
1269+
resource.ParallelTest(t, resource.TestCase{
1270+
PreCheck: func() { acctest.PreCheck(t) },
1271+
ProviderFactories: tt.ProviderFactories,
1272+
CheckDestroy: rdbchecks.IsInstanceDestroyed(tt),
1273+
Steps: []resource.TestStep{
1274+
{
1275+
Config: fmt.Sprintf(`
1276+
resource scaleway_rdb_instance main {
1277+
name = "test-rdb-no-encryption"
1278+
node_type = "db-dev-s"
1279+
engine = %q
1280+
is_ha_cluster = false
1281+
disable_backup = true
1282+
user_name = "my_initial_user_no_enc"
1283+
password = "thiZ_is_v&ry_s3cret"
1284+
encryption_at_rest = false
1285+
tags = [ "terraform-test", "scaleway_rdb_instance", "no_encryption" ]
1286+
}
1287+
`, latestEngineVersion),
1288+
Check: resource.ComposeTestCheckFunc(
1289+
isInstancePresent(tt, "scaleway_rdb_instance.main"),
1290+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "name", "test-rdb-no-encryption"),
1291+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "node_type", "db-dev-s"),
1292+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "engine", latestEngineVersion),
1293+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "is_ha_cluster", "false"),
1294+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "disable_backup", "true"),
1295+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "user_name", "my_initial_user_no_enc"),
1296+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "password", "thiZ_is_v&ry_s3cret"),
1297+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "encryption_at_rest", "false"),
1298+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "tags.0", "terraform-test"),
1299+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "tags.1", "scaleway_rdb_instance"),
1300+
resource.TestCheckResourceAttr("scaleway_rdb_instance.main", "tags.2", "no_encryption"),
1301+
),
1302+
},
1303+
},
1304+
})
1305+
}
1306+
12191307
func isInstancePresent(tt *acctest.TestTools, n string) resource.TestCheckFunc {
12201308
return func(s *terraform.State) error {
12211309
rs, ok := s.RootModule().Resources[n]

internal/services/rdb/testdata/instance-encryption-at-rest-false.cassette.yaml

+936
Large diffs are not rendered by default.

internal/services/rdb/testdata/instance-encryption-at-rest.cassette.yaml

+936
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)