Skip to content

Commit 59a5902

Browse files
authored
feat(rdb): allow read replicas in a different zone (#2177)
1 parent d6150ef commit 59a5902

7 files changed

+2878
-1159
lines changed

scaleway/resource_rdb_read_replica.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ func resourceScalewayRdbReadReplica() *schema.Resource {
3535
Required: true,
3636
Description: "Id of the rdb instance to replicate",
3737
},
38+
"same_zone": {
39+
Type: schema.TypeBool,
40+
Optional: true,
41+
Default: true,
42+
ForceNew: true,
43+
Description: "Defines whether to create the replica in the same availability zone as the main instance nodes or not.",
44+
},
3845
"direct_access": {
3946
Type: schema.TypeList,
4047
Optional: true,
@@ -155,6 +162,7 @@ func resourceScalewayRdbReadReplicaCreate(ctx context.Context, d *schema.Resourc
155162
Region: region,
156163
InstanceID: expandID(d.Get("instance_id")),
157164
EndpointSpec: endpointSpecs,
165+
SameZone: expandBoolPtr(d.Get("same_zone")),
158166
}, scw.WithContext(ctx))
159167
if err != nil {
160168
return diag.FromErr(fmt.Errorf("failed to create read-replica: %w", err))
@@ -189,6 +197,7 @@ func resourceScalewayRdbReadReplicaRead(ctx context.Context, d *schema.ResourceD
189197
_ = d.Set("direct_access", directAccess)
190198
_ = d.Set("private_network", privateNetwork)
191199

200+
_ = d.Set("same_zone", rr.SameZone)
192201
_ = d.Set("region", string(region))
193202

194203
return nil

scaleway/resource_rdb_read_replica_test.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,90 @@ func TestAccScalewayRdbReadReplica_MultipleEndpoints(t *testing.T) {
214214
})
215215
}
216216

217+
func TestAccScalewayRdbReadReplica_DifferentZone(t *testing.T) {
218+
tt := NewTestTools(t)
219+
defer tt.Cleanup()
220+
221+
readReplicaID := ""
222+
223+
resource.ParallelTest(t, resource.TestCase{
224+
PreCheck: func() { testAccPreCheck(t) },
225+
ProviderFactories: tt.ProviderFactories,
226+
CheckDestroy: resource.ComposeTestCheckFunc(
227+
testAccCheckScalewayRdbInstanceDestroy(tt),
228+
testAccCheckScalewayRdbReadReplicaDestroy(tt),
229+
),
230+
Steps: []resource.TestStep{
231+
{
232+
Config: `
233+
resource "scaleway_vpc_private_network" "different_zone" {
234+
name = "test-rdb-rr-different-zone"
235+
}
236+
237+
resource "scaleway_rdb_instance" "different_zone" {
238+
name = "test-rdb-rr-different-zone"
239+
node_type = "db-dev-s"
240+
engine = "PostgreSQL-14"
241+
is_ha_cluster = false
242+
disable_backup = true
243+
user_name = "my_initial_user"
244+
password = "thiZ_is_v&ry_s3cret"
245+
tags = [ "terraform-test", "scaleway_rdb_read_replica", "different-zone" ]
246+
}
247+
248+
resource "scaleway_rdb_read_replica" "different_zone" {
249+
instance_id = scaleway_rdb_instance.different_zone.id
250+
region = scaleway_rdb_instance.different_zone.region
251+
same_zone = false
252+
private_network {
253+
private_network_id = scaleway_vpc_private_network.different_zone.id
254+
}
255+
}`,
256+
Check: resource.ComposeTestCheckFunc(
257+
testAccCheckRdbReadReplicaExists(tt, "scaleway_rdb_read_replica.different_zone"),
258+
testAccCheckScalewayVPCPrivateNetworkExists(tt, "scaleway_vpc_private_network.different_zone"),
259+
resource.TestCheckResourceAttrPair("scaleway_rdb_read_replica.different_zone", "instance_id", "scaleway_rdb_instance.different_zone", "id"),
260+
resource.TestCheckResourceAttr("scaleway_rdb_read_replica.different_zone", "same_zone", "false"),
261+
testAccCheckScalewayResourceIDPersisted("scaleway_rdb_read_replica.different_zone", &readReplicaID),
262+
),
263+
},
264+
{
265+
Config: `
266+
resource "scaleway_vpc_private_network" "different_zone" {
267+
name = "test-rdb-rr-different-zone"
268+
}
269+
270+
resource "scaleway_rdb_instance" "different_zone" {
271+
name = "test-rdb-rr-different-zone"
272+
node_type = "db-dev-s"
273+
engine = "PostgreSQL-14"
274+
is_ha_cluster = false
275+
disable_backup = true
276+
user_name = "my_initial_user"
277+
password = "thiZ_is_v&ry_s3cret"
278+
tags = [ "terraform-test", "scaleway_rdb_read_replica", "different-zone" ]
279+
}
280+
281+
resource "scaleway_rdb_read_replica" "different_zone" {
282+
instance_id = scaleway_rdb_instance.different_zone.id
283+
region = scaleway_rdb_instance.different_zone.region
284+
same_zone = true
285+
private_network {
286+
private_network_id = scaleway_vpc_private_network.different_zone.id
287+
}
288+
}`,
289+
Check: resource.ComposeTestCheckFunc(
290+
testAccCheckRdbReadReplicaExists(tt, "scaleway_rdb_read_replica.different_zone"),
291+
testAccCheckScalewayVPCPrivateNetworkExists(tt, "scaleway_vpc_private_network.different_zone"),
292+
resource.TestCheckResourceAttrPair("scaleway_rdb_read_replica.different_zone", "instance_id", "scaleway_rdb_instance.different_zone", "id"),
293+
resource.TestCheckResourceAttr("scaleway_rdb_read_replica.different_zone", "same_zone", "true"),
294+
testAccCheckScalewayResourceIDChanged("scaleway_rdb_read_replica.different_zone", &readReplicaID),
295+
),
296+
},
297+
},
298+
})
299+
}
300+
217301
func testAccCheckRdbReadReplicaExists(tt *TestTools, readReplica string) resource.TestCheckFunc {
218302
return func(state *terraform.State) error {
219303
readReplicaResource, ok := state.RootModule().Resources[readReplica]

0 commit comments

Comments
 (0)