Skip to content

Commit 2861ad7

Browse files
authored
feat(rdb): add support for data source rdb instance (#569)
1 parent f2eda02 commit 2861ad7

6 files changed

+2017
-0
lines changed

scaleway/data_source_rdb_instance.go

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package scaleway
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
"github.com/scaleway/scaleway-sdk-go/api/rdb/v1"
10+
"github.com/scaleway/scaleway-sdk-go/scw"
11+
)
12+
13+
func dataSourceScalewayRDBInstance() *schema.Resource {
14+
// Generate datasource schema from resource
15+
dsSchema := datasourceSchemaFromResourceSchema(resourceScalewayRdbInstanceBeta().Schema)
16+
// Set 'Optional' schema elements
17+
addOptionalFieldsToSchema(dsSchema, "name")
18+
19+
dsSchema["name"].ConflictsWith = []string{"instance_id"}
20+
dsSchema["instance_id"] = &schema.Schema{
21+
Type: schema.TypeString,
22+
Optional: true,
23+
Description: "The ID of the RDB instance",
24+
ConflictsWith: []string{"name"},
25+
ValidateFunc: validationUUIDorUUIDWithLocality(),
26+
}
27+
28+
return &schema.Resource{
29+
ReadContext: dataSourceScalewayRDBInstanceRead,
30+
Schema: dsSchema,
31+
}
32+
}
33+
34+
func dataSourceScalewayRDBInstanceRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
35+
api, region, err := rdbAPIWithRegion(d, m)
36+
if err != nil {
37+
return diag.FromErr(err)
38+
}
39+
40+
instanceID, ok := d.GetOk("instance_id")
41+
if !ok { // Get instance by region and name.
42+
res, err := api.ListInstances(&rdb.ListInstancesRequest{
43+
Region: region,
44+
Name: scw.StringPtr(d.Get("name").(string)),
45+
}, scw.WithContext(ctx))
46+
if err != nil {
47+
return diag.FromErr(err)
48+
}
49+
if len(res.Instances) == 0 {
50+
return diag.FromErr(fmt.Errorf("no instances found with the name %s", d.Get("name")))
51+
}
52+
if len(res.Instances) > 1 {
53+
return diag.FromErr(fmt.Errorf("%d instances found with the same name %s", len(res.Instances), d.Get("name")))
54+
}
55+
instanceID = res.Instances[0].ID
56+
}
57+
58+
regionalID := datasourceNewRegionalizedID(instanceID, region)
59+
d.SetId(regionalID)
60+
err = d.Set("instance_id", regionalID)
61+
if err != nil {
62+
return diag.FromErr(err)
63+
}
64+
return resourceScalewayRdbInstanceBetaRead(ctx, d, m)
65+
}
+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package scaleway
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccScalewayDataSourceRDBInstance_Basic(t *testing.T) {
10+
tt := NewTestTools(t)
11+
defer tt.Cleanup()
12+
resource.ParallelTest(t, resource.TestCase{
13+
PreCheck: func() { testAccPreCheck(t) },
14+
ProviderFactories: tt.ProviderFactories,
15+
CheckDestroy: testAccCheckScalewayRdbInstanceBetaDestroy(tt),
16+
Steps: []resource.TestStep{
17+
{
18+
Config: `
19+
resource "scaleway_rdb_instance_beta" "test" {
20+
name = "test-terraform"
21+
engine = "PostgreSQL-11"
22+
node_type = "db-dev-s"
23+
}`,
24+
},
25+
{
26+
Config: `
27+
resource "scaleway_rdb_instance_beta" "test" {
28+
name = "test-terraform"
29+
engine = "PostgreSQL-11"
30+
node_type = "db-dev-s"
31+
}
32+
33+
data "scaleway_rdb_instance" "test" {
34+
name = scaleway_rdb_instance_beta.test.name
35+
}
36+
37+
data "scaleway_rdb_instance" "test2" {
38+
instance_id = scaleway_rdb_instance_beta.test.id
39+
}
40+
`,
41+
Check: resource.ComposeTestCheckFunc(
42+
testAccCheckScalewayRdbBetaExists(tt, "scaleway_rdb_instance_beta.test"),
43+
44+
resource.TestCheckResourceAttr("scaleway_rdb_instance_beta.test", "name", "test-terraform"),
45+
resource.TestCheckResourceAttrSet("data.scaleway_rdb_instance.test", "id"),
46+
47+
resource.TestCheckResourceAttr("data.scaleway_rdb_instance.test2", "name", "test-terraform"),
48+
resource.TestCheckResourceAttrSet("data.scaleway_rdb_instance.test2", "id"),
49+
),
50+
},
51+
},
52+
})
53+
}

scaleway/provider.go

+1
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
9696
"scaleway_instance_volume": dataSourceScalewayInstanceVolume(),
9797
"scaleway_baremetal_offer": dataSourceScalewayBaremetalOffer(),
9898
"scaleway_lb_ip_beta": dataSourceScalewayLbIPBeta(),
99+
"scaleway_rdb_instance": dataSourceScalewayRDBInstance(),
99100
"scaleway_marketplace_image_beta": dataSourceScalewayMarketplaceImageBeta(),
100101
"scaleway_registry_namespace_beta": dataSourceScalewayRegistryNamespaceBeta(),
101102
"scaleway_registry_image_beta": dataSourceScalewayRegistryImageBeta(),

0 commit comments

Comments
 (0)