Skip to content

Commit 850faa9

Browse files
committed
fix(rdb): enable private_network when restoring from snapshot
1 parent 1b802af commit 850faa9

File tree

4 files changed

+4750
-33
lines changed

4 files changed

+4750
-33
lines changed

internal/services/rdb/instance.go

Lines changed: 85 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,15 @@ func ResourceRdbInstanceCreate(ctx context.Context, d *schema.ResourceData, m an
405405
}
406406
}
407407

408+
// Configure endpoints after instance creation from snapshot
409+
if diags := createPrivateNetworkEndpoints(ctx, rdbAPI, region, res.ID, d); diags.HasError() {
410+
return diags
411+
}
412+
413+
if diags := createLoadBalancerEndpoint(ctx, rdbAPI, region, res.ID, d); diags.HasError() {
414+
return diags
415+
}
416+
408417
d.SetId(regional.NewIDString(region, res.ID))
409418
id = res.ID
410419
} else {
@@ -434,43 +443,16 @@ func ResourceRdbInstanceCreate(ctx context.Context, d *schema.ResourceData, m an
434443
}
435444

436445
// Init Endpoints
437-
if pn, pnExist := d.GetOk("private_network"); pnExist {
438-
ipamConfig, staticConfig := getIPConfigCreate(d, "ip_net")
439-
440-
var diags diag.Diagnostics
441-
442-
createReq.InitEndpoints, diags = expandPrivateNetwork(pn, pnExist, ipamConfig, staticConfig)
443-
if diags.HasError() {
444-
return diags
445-
}
446-
447-
for _, warning := range diags {
448-
tflog.Warn(ctx, warning.Detail)
449-
}
446+
endpoints, diags := collectEndpointSpecs(d)
447+
if diags.HasError() {
448+
return diags
450449
}
451450

452-
if _, lbExists := d.GetOk("load_balancer"); lbExists {
453-
createReq.InitEndpoints = append(createReq.InitEndpoints, expandLoadBalancer())
451+
for _, warning := range diags {
452+
tflog.Warn(ctx, warning.Detail)
454453
}
455-
// Init Endpoints
456-
if pn, pnExist := d.GetOk("private_network"); pnExist {
457-
ipamConfig, staticConfig := getIPConfigCreate(d, "ip_net")
458454

459-
var diags diag.Diagnostics
460-
461-
createReq.InitEndpoints, diags = expandPrivateNetwork(pn, pnExist, ipamConfig, staticConfig)
462-
if diags.HasError() {
463-
return diags
464-
}
465-
466-
for _, warning := range diags {
467-
tflog.Warn(ctx, warning.Detail)
468-
}
469-
}
470-
471-
if _, lbExists := d.GetOk("load_balancer"); lbExists {
472-
createReq.InitEndpoints = append(createReq.InitEndpoints, expandLoadBalancer())
473-
}
455+
createReq.InitEndpoints = endpoints
474456

475457
if size, ok := d.GetOk("volume_size_in_gb"); ok {
476458
if createReq.VolumeType == rdb.VolumeTypeLssd {
@@ -548,6 +530,76 @@ func ResourceRdbInstanceCreate(ctx context.Context, d *schema.ResourceData, m an
548530
return ResourceRdbInstanceRead(ctx, d, m)
549531
}
550532

533+
// createPrivateNetworkEndpoints creates private network endpoints for an instance
534+
func createPrivateNetworkEndpoints(ctx context.Context, rdbAPI *rdb.API, region scw.Region, instanceID string, d *schema.ResourceData) diag.Diagnostics {
535+
if pn, pnExist := d.GetOk("private_network"); pnExist {
536+
ipamConfig, staticConfig := getIPConfigCreate(d, "ip_net")
537+
538+
privateEndpoints, diags := expandPrivateNetwork(pn, pnExist, ipamConfig, staticConfig)
539+
if diags.HasError() {
540+
return diags
541+
}
542+
543+
for _, warning := range diags {
544+
tflog.Warn(ctx, warning.Detail)
545+
}
546+
547+
for _, e := range privateEndpoints {
548+
_, err := rdbAPI.CreateEndpoint(
549+
&rdb.CreateEndpointRequest{Region: region, InstanceID: instanceID, EndpointSpec: e},
550+
scw.WithContext(ctx))
551+
if err != nil {
552+
return diag.FromErr(err)
553+
}
554+
}
555+
}
556+
return nil
557+
}
558+
559+
// createLoadBalancerEndpoint creates load balancer endpoint for an instance
560+
func createLoadBalancerEndpoint(ctx context.Context, rdbAPI *rdb.API, region scw.Region, instanceID string, d *schema.ResourceData) diag.Diagnostics {
561+
if _, lbExists := d.GetOk("load_balancer"); lbExists {
562+
_, err := rdbAPI.CreateEndpoint(&rdb.CreateEndpointRequest{
563+
Region: region,
564+
InstanceID: instanceID,
565+
EndpointSpec: expandLoadBalancer(),
566+
}, scw.WithContext(ctx))
567+
if err != nil {
568+
return diag.FromErr(err)
569+
}
570+
}
571+
return nil
572+
}
573+
574+
// collectEndpointSpecs collects all endpoint specifications for instance creation
575+
func collectEndpointSpecs(d *schema.ResourceData) ([]*rdb.EndpointSpec, diag.Diagnostics) {
576+
var endpoints []*rdb.EndpointSpec
577+
var diags diag.Diagnostics
578+
579+
// Add private network endpoints
580+
if pn, pnExist := d.GetOk("private_network"); pnExist {
581+
ipamConfig, staticConfig := getIPConfigCreate(d, "ip_net")
582+
583+
privateEndpoints, pnDiags := expandPrivateNetwork(pn, pnExist, ipamConfig, staticConfig)
584+
if pnDiags.HasError() {
585+
return nil, pnDiags
586+
}
587+
588+
for _, warning := range pnDiags {
589+
diags = append(diags, warning)
590+
}
591+
592+
endpoints = append(endpoints, privateEndpoints...)
593+
}
594+
595+
// Add load balancer endpoint
596+
if _, lbExists := d.GetOk("load_balancer"); lbExists {
597+
endpoints = append(endpoints, expandLoadBalancer())
598+
}
599+
600+
return endpoints, diags
601+
}
602+
551603
func ResourceRdbInstanceRead(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics {
552604
rdbAPI, region, ID, err := NewAPIWithRegionAndID(m, d.Id())
553605
if err != nil {

internal/services/rdb/instance_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1296,6 +1296,88 @@ func TestAccInstance_CompleteWorkflow(t *testing.T) {
12961296
})
12971297
}
12981298

1299+
func TestAccInstance_FromSnapshotWithPrivateNetwork(t *testing.T) {
1300+
tt := acctest.NewTestTools(t)
1301+
defer tt.Cleanup()
1302+
1303+
latestEngineVersion := rdbchecks.GetLatestEngineVersion(tt, postgreSQLEngineName)
1304+
1305+
resource.ParallelTest(t, resource.TestCase{
1306+
PreCheck: func() { acctest.PreCheck(t) },
1307+
ProviderFactories: tt.ProviderFactories,
1308+
CheckDestroy: IsSnapshotDestroyed(tt),
1309+
Steps: []resource.TestStep{
1310+
// Step 1: Create an instance, private network, and a snapshot
1311+
{
1312+
Config: fmt.Sprintf(`
1313+
resource "scaleway_vpc" "vpc" {
1314+
name = "test-vpc"
1315+
}
1316+
1317+
resource "scaleway_vpc_private_network" "pn" {
1318+
vpc_id = scaleway_vpc.vpc.id
1319+
ipv4_subnet {
1320+
subnet = "192.168.0.0/24"
1321+
}
1322+
depends_on = [scaleway_vpc.vpc]
1323+
}
1324+
1325+
resource "scaleway_rdb_instance" "main" {
1326+
name = "test-rdb-instance"
1327+
node_type = "db-dev-s"
1328+
engine = %q
1329+
is_ha_cluster = false
1330+
disable_backup = true
1331+
user_name = "my_initial_user"
1332+
password = "thiZ_is_v&ry_s3cret"
1333+
tags = ["terraform-test", "scaleway_rdb_instance"]
1334+
volume_type = "sbs_5k"
1335+
volume_size_in_gb = 10
1336+
1337+
private_network {
1338+
pn_id = scaleway_vpc_private_network.pn.id
1339+
enable_ipam = true
1340+
}
1341+
1342+
depends_on = [scaleway_vpc_private_network.pn]
1343+
}
1344+
1345+
resource "scaleway_rdb_snapshot" "test" {
1346+
name = "test-snapshot"
1347+
instance_id = scaleway_rdb_instance.main.id
1348+
depends_on = [scaleway_rdb_instance.main]
1349+
}
1350+
1351+
resource "scaleway_rdb_instance" "from_snapshot" {
1352+
name = "test-instance-from-snapshot"
1353+
node_type = "db-dev-s"
1354+
is_ha_cluster = false
1355+
disable_backup = true
1356+
snapshot_id = scaleway_rdb_snapshot.test.id
1357+
volume_type = "sbs_5k"
1358+
tags = ["terraform-test", "restored_instance"]
1359+
1360+
private_network {
1361+
pn_id = scaleway_vpc_private_network.pn.id
1362+
enable_ipam = true
1363+
}
1364+
1365+
depends_on = [scaleway_rdb_snapshot.test]
1366+
}
1367+
`, latestEngineVersion),
1368+
Check: resource.ComposeTestCheckFunc(
1369+
resource.TestCheckResourceAttr("scaleway_rdb_instance.from_snapshot", "name", "test-instance-from-snapshot"),
1370+
resource.TestCheckResourceAttr("scaleway_rdb_instance.from_snapshot", "user_name", "my_initial_user"),
1371+
resource.TestCheckResourceAttr("scaleway_rdb_instance.from_snapshot", "tags.0", "terraform-test"),
1372+
resource.TestCheckResourceAttr("scaleway_rdb_instance.from_snapshot", "tags.1", "restored_instance"),
1373+
resource.TestCheckResourceAttrSet("scaleway_rdb_instance.from_snapshot", "private_network.0.pn_id"),
1374+
resource.TestCheckResourceAttr("scaleway_rdb_instance.from_snapshot", "private_network.0.enable_ipam", "true"),
1375+
),
1376+
},
1377+
},
1378+
})
1379+
}
1380+
12991381
func isInstancePresent(tt *acctest.TestTools, n string) resource.TestCheckFunc {
13001382
return func(s *terraform.State) error {
13011383
rs, ok := s.RootModule().Resources[n]

internal/services/rdb/testdata/acl-pagination.cassette.yaml

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

internal/services/rdb/testdata/instance-from-snapshot-with-private-network.cassette.yaml

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

0 commit comments

Comments
 (0)