Skip to content

Commit 1ada358

Browse files
feat(rdb): add support for acl rules (#784)
Co-authored-by: Jean-Sébastien Hedde <[email protected]>
1 parent 661e80d commit 1ada358

9 files changed

+2846
-0
lines changed

docs/data-sources/rdb_acl.md

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
---
2+
layout: "scaleway"
3+
page_title: "Scaleway: scaleway_rdb_acl"
4+
description: |-
5+
Gets information about the RDB instance network Access Control List.
6+
---
7+
8+
# scaleway_rdb_acl
9+
10+
Gets information about the RDB instance network Access Control List.
11+
12+
## Example Usage
13+
14+
```hcl
15+
# Get the database ACL for the instanceid 11111111-1111-1111-1111-111111111111 located in fr-par
16+
data "scaleway_rdb_acl" "my_acl" {
17+
instance_id = "fr-par/11111111-1111-1111-1111-111111111111"
18+
}
19+
```
20+
21+
## Argument Reference
22+
23+
- `instance_id` - (Required) The RDB instance ID.
24+
25+
## Attribute Reference
26+
27+
In addition to all above arguments, the following attributes are exported:
28+
29+
- `acl_rules` - A list of ACLs (structure is described below)
30+
31+
The `acl_rules` block supports:
32+
33+
- `ip` - The ip range to whitelist in [CIDR notation](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation)
34+
- `description` - A simple text describing this rule

docs/resources/rdb_acl.md

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
---
2+
page_title: "Scaleway: scaleway_rdb_acl"
3+
description: |-
4+
Manages Scaleway Database Instances.
5+
---
6+
7+
# scaleway_rdb_acl
8+
9+
Creates and manages Scaleway Database instance autorized IPs.
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_acl main {
18+
instance_id = scaleway_rdb_instance.main.id
19+
acl_rules {
20+
ip = "1.2.3.4/32"
21+
description = "foo"
22+
}
23+
}
24+
```
25+
26+
## Arguments Reference
27+
28+
The following arguments are supported:
29+
30+
- `instance_id` - (Required) The instance on which to create the ACL.
31+
32+
~> **Important:** Updates to `instance_id` will recreate the Database ACL.
33+
34+
- `acl_rules` - A list of ACLs (structure is described below)
35+
36+
The `acl_rules` block supports:
37+
38+
- `ip` - (Required) The ip range to whitelist in [CIDR notation](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation)
39+
- `description` - (Optional) A simple text describing this rule
40+
41+
42+
## Attributes Reference
43+
44+
All arguments above are exported.
45+
46+
## Import
47+
48+
Database Instance can be imported using the `{region}/{id}`, e.g.
49+
50+
```bash
51+
$ terraform import scaleway_rdb_acl.acl01 fr-par/11111111-1111-1111-1111-111111111111
52+
```
53+

scaleway/data_source_rdb_acl.go

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package scaleway
2+
3+
import (
4+
"context"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
8+
)
9+
10+
func dataSourceScalewayRDBACL() *schema.Resource {
11+
// Generate datasource schema from resource
12+
dsSchema := datasourceSchemaFromResourceSchema(resourceScalewayRdbACL().Schema)
13+
14+
dsSchema["instance_id"].Computed = false
15+
dsSchema["instance_id"].Required = true
16+
17+
return &schema.Resource{
18+
ReadContext: dataSourceScalewayRDBACLRead,
19+
Schema: dsSchema,
20+
}
21+
}
22+
23+
func dataSourceScalewayRDBACLRead(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+
30+
_, _, err = parseLocalizedID(instanceID.(string))
31+
regionalID := instanceID
32+
if err != nil {
33+
regionalID = datasourceNewRegionalizedID(instanceID, region)
34+
}
35+
36+
d.SetId(regionalID.(string))
37+
err = d.Set("instance_id", regionalID)
38+
if err != nil {
39+
return diag.FromErr(err)
40+
}
41+
return resourceScalewayRdbACLRead(ctx, d, meta)
42+
}

scaleway/data_source_rdb_acl_test.go

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package scaleway
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
)
9+
10+
func TestAccScalewayDataSourceRDBAcl_Basic(t *testing.T) {
11+
tt := NewTestTools(t)
12+
defer tt.Cleanup()
13+
instanceName := "TestAccScalewayDataSourceRDBAcl_Basic"
14+
resource.ParallelTest(t, resource.TestCase{
15+
PreCheck: func() { testAccPreCheck(t) },
16+
ProviderFactories: tt.ProviderFactories,
17+
CheckDestroy: testAccCheckScalewayRdbInstanceDestroy(tt),
18+
Steps: []resource.TestStep{
19+
{
20+
Config: fmt.Sprintf(`
21+
resource "scaleway_rdb_instance" "main" {
22+
name = "%s"
23+
node_type = "db-dev-s"
24+
engine = "PostgreSQL-12"
25+
is_ha_cluster = false
26+
}
27+
28+
resource "scaleway_rdb_acl" "main" {
29+
instance_id = scaleway_rdb_instance.main.id
30+
acl_rules {
31+
ip = "1.2.3.4/32"
32+
description = "foo"
33+
}
34+
35+
acl_rules {
36+
ip = "4.5.6.7/32"
37+
description = "bar"
38+
}
39+
}
40+
`, instanceName),
41+
Check: resource.ComposeTestCheckFunc(
42+
resource.TestCheckResourceAttr("scaleway_rdb_acl.main", "acl_rules.0.ip", "1.2.3.4/32"),
43+
),
44+
},
45+
{
46+
Config: fmt.Sprintf(`
47+
resource "scaleway_rdb_instance" "main" {
48+
name = "%s"
49+
node_type = "db-dev-s"
50+
engine = "PostgreSQL-12"
51+
is_ha_cluster = false
52+
}
53+
54+
resource "scaleway_rdb_acl" "main" {
55+
instance_id = scaleway_rdb_instance.main.id
56+
acl_rules {
57+
ip = "1.2.3.4/32"
58+
description = "foo"
59+
}
60+
61+
acl_rules {
62+
ip = "4.5.6.7/32"
63+
description = "bar"
64+
}
65+
}
66+
data "scaleway_rdb_acl" "maindata" {
67+
instance_id = scaleway_rdb_instance.main.id
68+
69+
}`, instanceName),
70+
Check: resource.ComposeTestCheckFunc(
71+
resource.TestCheckResourceAttr("scaleway_rdb_acl.main", "acl_rules.0.ip", "1.2.3.4/32"),
72+
resource.TestCheckResourceAttr("data.scaleway_rdb_acl.maindata", "acl_rules.0.ip", "1.2.3.4/32"),
73+
),
74+
},
75+
},
76+
})
77+
}

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_acl": resourceScalewayRdbACL(),
8283
"scaleway_rdb_database": resourceScalewayRdbDatabase(),
8384
"scaleway_rdb_instance": resourceScalewayRdbInstance(),
8485
"scaleway_rdb_user": resourceScalewayRdbUser(),
@@ -93,6 +94,7 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
9394
"scaleway_instance_image": dataSourceScalewayInstanceImage(),
9495
"scaleway_instance_volume": dataSourceScalewayInstanceVolume(),
9596
"scaleway_baremetal_offer": dataSourceScalewayBaremetalOffer(),
97+
"scaleway_rdb_acl": dataSourceScalewayRDBACL(),
9698
"scaleway_rdb_instance": dataSourceScalewayRDBInstance(),
9799
"scaleway_rdb_database": dataSourceScalewayRDBDatabase(),
98100
"scaleway_k8s_cluster": dataSourceScalewayK8SCluster(),

0 commit comments

Comments
 (0)