Skip to content

Commit 661e80d

Browse files
remyleonejeansebastienhjerome-quere
authored
feat(rdb): add support for database (#782)
Co-authored-by: Jean-Sébastien Hedde <[email protected]> Co-authored-by: Jerome Quere <[email protected]>
1 parent 9148f0a commit 661e80d

17 files changed

+4174
-1425
lines changed

docs/data-sources/rdb_database.md

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
---
2+
layout: "scaleway"
3+
page_title: "Scaleway: scaleway_rdb_database"
4+
description: |-
5+
Gets information about an RDB database.
6+
---
7+
8+
# scaleway_rdb_database
9+
10+
Gets information about a RDB database.
11+
12+
## Example Usage
13+
14+
```hcl
15+
# Get the database foobar hosted on instance id 11111111-1111-1111-1111-111111111111
16+
data "scaleway_rdb_database" "my_db" {
17+
instance_id = "11111111-1111-1111-1111-111111111111"
18+
name = "foobar"
19+
}
20+
```
21+
22+
## Argument Reference
23+
24+
- `instance_id` - (Required) The RDB instance ID.
25+
26+
- `name` - (Required) The name of the RDB instance.
27+
28+
## Attributes Reference
29+
30+
In addition to all arguments above, the following attributes are exported:
31+
32+
- `owner` - The name of the owner of the database.
33+
- `managed` - Whether or not the database is managed or not.
34+
- `size` - Size of the database (in bytes).

docs/data-sources/rdb_instance.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ Gets information about a RDB instance.
1212
## Example Usage
1313

1414
```hcl
15-
# Get info by IP address
15+
# Get info by name
1616
data "scaleway_rdb_instance" "my_instance" {
1717
name = "foobar"
1818
}
1919
20-
# Get info by IP ID
20+
# Get info by instance ID
2121
data "scaleway_rdb_instance" "my_instance" {
2222
instance_id = "11111111-1111-1111-1111-111111111111"
2323
}

docs/resources/rdb_database.md

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
---
2+
page_title: "Scaleway: scaleway_rdb_database"
3+
description: |-
4+
Manages Scaleway RDB Database.
5+
---
6+
7+
# scaleway_rdb_database
8+
9+
Creates and manages Scaleway RDB database.
10+
For more information, see [the documentation](https://developers.scaleway.com/en/products/rdb/api).
11+
12+
## Examples
13+
14+
### Basic
15+
16+
```hcl
17+
resource "scaleway_rdb_database" "main" {
18+
instance_id = scaleway_rdb_instance.main.id
19+
name = "my-new-database"
20+
}
21+
```
22+
23+
## Arguments Reference
24+
25+
The following arguments are supported:
26+
27+
- `instance_id` - (Required) UUID of the instance where to create the database.
28+
29+
~> **Important:** Updates to `instance_id` will recreate the Database.
30+
31+
- `name` - (Required) Name of the database (e.g. `my-new-database`).
32+
33+
## Attributes Reference
34+
35+
In addition to all arguments above, the following attributes are exported:
36+
37+
- `owner` - The name of the owner of the database.
38+
- `managed` - Whether or not the database is managed or not.
39+
- `size` - Size of the database (in bytes).
40+
41+
## Import
42+
43+
RDB Database can be imported using the `{region}/{id}/{DBNAME}`, e.g.
44+
45+
```bash
46+
$ terraform import scaleway_rdb_database.rdb01_mydb fr-par/11111111-1111-1111-1111-111111111111/mydb
47+
```

scaleway/data_source_rdb_database.go

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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+
)
10+
11+
func dataSourceScalewayRDBDatabase() *schema.Resource {
12+
// Generate datasource schema from resource
13+
dsSchema := datasourceSchemaFromResourceSchema(resourceScalewayRdbDatabase().Schema)
14+
15+
fixDatasourceSchemaFlags(dsSchema, true, "instance_id", "name")
16+
17+
return &schema.Resource{
18+
ReadContext: dataSourceScalewayRDBDatabaseRead,
19+
Schema: dsSchema,
20+
}
21+
}
22+
23+
func dataSourceScalewayRDBDatabaseRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
24+
_, region, err := rdbAPIWithRegion(d, meta)
25+
if err != nil {
26+
return diag.FromErr(err)
27+
}
28+
instanceID, _ := d.GetOk("instance_id")
29+
dbName, _ := d.GetOk("name")
30+
31+
_, _, err = parseLocalizedID(instanceID.(string))
32+
regionalID := instanceID
33+
if err != nil {
34+
regionalID = datasourceNewRegionalizedID(instanceID, region)
35+
}
36+
37+
d.SetId(fmt.Sprintf("%s/%s", regionalID, dbName.(string)))
38+
err = d.Set("instance_id", regionalID)
39+
if err != nil {
40+
return diag.FromErr(err)
41+
}
42+
return resourceScalewayRdbDatabaseRead(ctx, d, meta)
43+
}
+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package scaleway
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccScalewayDataSourceRdbDatabase_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: testAccCheckScalewayRdbInstanceDestroy(tt),
16+
Steps: []resource.TestStep{
17+
{
18+
Config: `
19+
resource "scaleway_rdb_instance" "server" {
20+
name = "test-terraform"
21+
node_type = "db-dev-s"
22+
engine = "PostgreSQL-11"
23+
}
24+
resource "scaleway_rdb_database" "database" {
25+
name = "test-terraform"
26+
instance_id = scaleway_rdb_instance.server.id
27+
}`,
28+
},
29+
{
30+
Config: `
31+
resource "scaleway_rdb_instance" "server" {
32+
name = "test-terraform"
33+
node_type = "db-dev-s"
34+
engine = "PostgreSQL-11"
35+
}
36+
resource "scaleway_rdb_database" "database" {
37+
name = "test-terraform"
38+
instance_id = scaleway_rdb_instance.server.id
39+
}
40+
data "scaleway_rdb_database" "find_by_name_and_instance" {
41+
name = scaleway_rdb_database.database.name
42+
instance_id = scaleway_rdb_instance.server.id
43+
}
44+
`,
45+
Check: resource.ComposeTestCheckFunc(
46+
testAccCheckRdbDatabaseExists(tt, "scaleway_rdb_instance.server", "scaleway_rdb_database.database"),
47+
48+
resource.TestCheckResourceAttr("data.scaleway_rdb_database.find_by_name_and_instance", "name", "test-terraform"),
49+
resource.TestCheckResourceAttr("data.scaleway_rdb_database.find_by_name_and_instance", "managed", "true"),
50+
resource.TestCheckResourceAttrSet("data.scaleway_rdb_database.find_by_name_and_instance", "owner"),
51+
resource.TestCheckResourceAttrSet("data.scaleway_rdb_database.find_by_name_and_instance", "size"),
52+
),
53+
},
54+
},
55+
})
56+
}

scaleway/helpers_rdb.go

+8-6
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,30 @@ const (
1212
defaultRdbInstanceTimeout = 15 * time.Minute
1313
)
1414

15+
// newRdbAPI returns a new RDB API
16+
func newRdbAPI(m interface{}) *rdb.API {
17+
meta := m.(*Meta)
18+
return rdb.NewAPI(meta.scwClient)
19+
}
20+
1521
// rdbAPIWithRegion returns a new lb API and the region for a Create request
1622
func rdbAPIWithRegion(d *schema.ResourceData, m interface{}) (*rdb.API, scw.Region, error) {
1723
meta := m.(*Meta)
18-
rdbAPI := rdb.NewAPI(meta.scwClient)
1924

2025
region, err := extractRegion(d, meta)
2126
if err != nil {
2227
return nil, "", err
2328
}
24-
return rdbAPI, region, nil
29+
return newRdbAPI(m), region, nil
2530
}
2631

2732
// rdbAPIWithRegionAndID returns an lb API with region and ID extracted from the state
2833
func rdbAPIWithRegionAndID(m interface{}, id string) (*rdb.API, scw.Region, string, error) {
29-
meta := m.(*Meta)
30-
rdbAPI := rdb.NewAPI(meta.scwClient)
31-
3234
region, ID, err := parseRegionalID(id)
3335
if err != nil {
3436
return nil, "", "", err
3537
}
36-
return rdbAPI, region, ID, nil
38+
return newRdbAPI(m), region, ID, nil
3739
}
3840

3941
func flattenRdbInstanceReadReplicas(readReplicas []*rdb.Endpoint) interface{} {

scaleway/provider.go

+2
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
7979
"scaleway_lb_certificate": resourceScalewayLbCertificate(),
8080
"scaleway_lb_frontend": resourceScalewayLbFrontend(),
8181
"scaleway_registry_namespace": resourceScalewayRegistryNamespace(),
82+
"scaleway_rdb_database": resourceScalewayRdbDatabase(),
8283
"scaleway_rdb_instance": resourceScalewayRdbInstance(),
8384
"scaleway_rdb_user": resourceScalewayRdbUser(),
8485
"scaleway_object_bucket": resourceScalewayObjectBucket(),
@@ -93,6 +94,7 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
9394
"scaleway_instance_volume": dataSourceScalewayInstanceVolume(),
9495
"scaleway_baremetal_offer": dataSourceScalewayBaremetalOffer(),
9596
"scaleway_rdb_instance": dataSourceScalewayRDBInstance(),
97+
"scaleway_rdb_database": dataSourceScalewayRDBDatabase(),
9698
"scaleway_k8s_cluster": dataSourceScalewayK8SCluster(),
9799
"scaleway_k8s_pool": dataSourceScalewayK8SPool(),
98100
"scaleway_lb_ip": dataSourceScalewayLbIP(),

0 commit comments

Comments
 (0)