Skip to content

Commit ef11dac

Browse files
feat(rdb): Adding privileges support (#844)
Co-authored-by: Rémy Léone <[email protected]>
1 parent 268c3cc commit ef11dac

9 files changed

+4034
-0
lines changed

docs/data-sources/rdb_privilege.md

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
---
2+
layout: "scaleway"
3+
page_title: "Scaleway: scaleway_rdb_privilege"
4+
description: |-
5+
Gets information about the privilege on a RDB database.
6+
---
7+
8+
# scaleway_rdb_privilege
9+
10+
Gets information about the privilege on a RDB database.
11+
12+
## Example Usage
13+
14+
```hcl
15+
# Get the database privilege for the user "my-user" on the database "my-database" hosted on instance id fr-par/11111111-1111-1111-1111-111111111111
16+
data "scaleway_rdb_privilege" "find_priv" {
17+
instance_id = "fr-par/11111111-1111-111111111111"
18+
user_name = "my-user"
19+
database_name = "my-database"
20+
}
21+
```
22+
23+
## Argument Reference
24+
25+
- `instance_id` - (Required) The RDB instance ID.
26+
27+
- `user_name` - (Required) The user name.
28+
29+
- `database_name` - (Required) The database name.
30+
31+
## Attributes Reference
32+
33+
In addition to all arguments above, the following attributes are exported:
34+
35+
- `permission` - The permission for this user on the database. Possible values are `readonly`, `readwrite`, `all`, `custom` and `none`.

docs/resources/rdb_privilege.md

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
---
2+
page_title: "Scaleway: scaleway_rdb_privilege"
3+
description: |-
4+
Manages Scaleway RDB Database Privilege.
5+
---
6+
7+
# scaleway_rdb_privilege
8+
9+
Create and manage Scaleway RDB database privilege.
10+
For more information, see [the documentation](https://developers.scaleway.com/en/products/rdb/api).
11+
12+
## Example usage
13+
14+
15+
```hcl
16+
resource "scaleway_rdb_privilege" "priv" {
17+
instance_id = scaleway_rdb_instance.rdb.id
18+
user_name = "my-db-user"
19+
database_name = "my-db-name"
20+
permission = "all"
21+
}
22+
```
23+
24+
## Argument Reference
25+
26+
The following arguments are supported:
27+
28+
- `instance_id` - (Required) UUID of the instance where to create the database.
29+
30+
- `user_name` - (Required) Name of the user (e.g. `my-db-user`).
31+
32+
- `database_name` - (Required) Name of the database (e.g. `my-db-name`).
33+
34+
- `permission` - (Required) Permission to set. Valid values are `readonly`, `readwrite`, `all`, `custom` and `none`.
35+
36+
## Attributes Reference
37+
38+
- `instance_id` - See Argument Reference above.
39+
40+
- `user_name` - See Argument Reference above.
41+
42+
- `database_name` - See Argument Reference above.
43+
44+
- `permission` - See Argument Reference above.

scaleway/data_source_rdb_privilege.go

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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 dataSourceScalewayRDBPrivilege() *schema.Resource {
11+
// Generate datasource schema from resource
12+
dsSchema := datasourceSchemaFromResourceSchema(resourceScalewayRdbPrivilege().Schema)
13+
14+
fixDatasourceSchemaFlags(dsSchema, true, "instance_id", "user_name", "database_name")
15+
16+
return &schema.Resource{
17+
ReadContext: dataSourceScalewayRDBPrivilegeRead,
18+
Schema: dsSchema,
19+
}
20+
}
21+
22+
func dataSourceScalewayRDBPrivilegeRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
23+
instanceID, _ := d.Get("instance_id").(string)
24+
25+
d.SetId(instanceID)
26+
return resourceScalewayRdbPrivilegeRead(ctx, d, meta)
27+
}
+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package scaleway
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccScalewayDataSourceRdbPrivilege_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" "instance" {
20+
name = "test-privilege"
21+
node_type = "db-dev-s"
22+
engine = "PostgreSQL-12"
23+
is_ha_cluster = false
24+
tags = [ "terraform-test", "scaleway_rdb_user", "minimal" ]
25+
}
26+
27+
resource "scaleway_rdb_database" "db" {
28+
instance_id = scaleway_rdb_instance.instance.id
29+
name = "foo"
30+
}
31+
32+
resource "scaleway_rdb_user" "foo" {
33+
instance_id = scaleway_rdb_instance.instance.id
34+
name = "foo"
35+
password = "R34lP4sSw#Rd"
36+
}
37+
38+
resource "scaleway_rdb_privilege" "priv" {
39+
instance_id = scaleway_rdb_instance.instance.id
40+
user_name = scaleway_rdb_user.foo.name
41+
database_name = scaleway_rdb_database.db.name
42+
permission = "all"
43+
}`,
44+
},
45+
{
46+
Config: `
47+
resource "scaleway_rdb_instance" "instance" {
48+
name = "test-privilege"
49+
node_type = "db-dev-s"
50+
engine = "PostgreSQL-12"
51+
is_ha_cluster = false
52+
tags = [ "terraform-test", "scaleway_rdb_user", "minimal" ]
53+
}
54+
55+
resource "scaleway_rdb_database" "db" {
56+
instance_id = scaleway_rdb_instance.instance.id
57+
name = "foo"
58+
}
59+
60+
resource "scaleway_rdb_user" "foo" {
61+
instance_id = scaleway_rdb_instance.instance.id
62+
name = "foo"
63+
password = "R34lP4sSw#Rd"
64+
}
65+
66+
resource "scaleway_rdb_privilege" "priv" {
67+
instance_id = scaleway_rdb_instance.instance.id
68+
user_name = scaleway_rdb_user.foo.name
69+
database_name = scaleway_rdb_database.db.name
70+
permission = "all"
71+
}
72+
73+
data "scaleway_rdb_privilege" "find_priv" {
74+
instance_id = scaleway_rdb_instance.instance.id
75+
user_name = scaleway_rdb_user.foo.name
76+
database_name = scaleway_rdb_database.db.name
77+
}
78+
`,
79+
Check: resource.ComposeTestCheckFunc(
80+
testAccCheckRdbDatabaseExists(tt, "scaleway_rdb_instance.instance", "scaleway_rdb_database.db"),
81+
82+
resource.TestCheckResourceAttr("data.scaleway_rdb_privilege.find_priv", "permission", "all"),
83+
),
84+
},
85+
},
86+
})
87+
}

scaleway/provider.go

+2
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
8282
"scaleway_rdb_acl": resourceScalewayRdbACL(),
8383
"scaleway_rdb_database": resourceScalewayRdbDatabase(),
8484
"scaleway_rdb_instance": resourceScalewayRdbInstance(),
85+
"scaleway_rdb_privilege": resourceScalewayRdbPrivilege(),
8586
"scaleway_rdb_user": resourceScalewayRdbUser(),
8687
"scaleway_object_bucket": resourceScalewayObjectBucket(),
8788
"scaleway_vpc_private_network": resourceScalewayVPCPrivateNetwork(),
@@ -97,6 +98,7 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
9798
"scaleway_rdb_acl": dataSourceScalewayRDBACL(),
9899
"scaleway_rdb_instance": dataSourceScalewayRDBInstance(),
99100
"scaleway_rdb_database": dataSourceScalewayRDBDatabase(),
101+
"scaleway_rdb_privilege": dataSourceScalewayRDBPrivilege(),
100102
"scaleway_k8s_cluster": dataSourceScalewayK8SCluster(),
101103
"scaleway_k8s_pool": dataSourceScalewayK8SPool(),
102104
"scaleway_lb_ip": dataSourceScalewayLbIP(),

scaleway/resource_rdb_privilege.go

+144
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
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+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
9+
"github.com/scaleway/scaleway-sdk-go/api/rdb/v1"
10+
"github.com/scaleway/scaleway-sdk-go/scw"
11+
)
12+
13+
func resourceScalewayRdbPrivilege() *schema.Resource {
14+
return &schema.Resource{
15+
CreateContext: resourceScalewayRdbPrivilegeCreate,
16+
ReadContext: resourceScalewayRdbPrivilegeRead,
17+
DeleteContext: resourceScalewayRdbPrivilegeDelete,
18+
UpdateContext: resourceScalewayRdbPrivilegeUpdate,
19+
Importer: &schema.ResourceImporter{
20+
StateContext: schema.ImportStatePassthroughContext,
21+
},
22+
Timeouts: &schema.ResourceTimeout{
23+
Default: schema.DefaultTimeout(defaultRdbInstanceTimeout),
24+
},
25+
SchemaVersion: 0,
26+
Schema: map[string]*schema.Schema{
27+
"instance_id": {
28+
Type: schema.TypeString,
29+
Required: true,
30+
ForceNew: true,
31+
ValidateFunc: validationUUIDorUUIDWithLocality(),
32+
Description: "Instance on which the database is created",
33+
},
34+
"user_name": {
35+
Type: schema.TypeString,
36+
Description: "User name",
37+
Required: true,
38+
},
39+
"database_name": {
40+
Type: schema.TypeString,
41+
Description: "Database name",
42+
Required: true,
43+
},
44+
"permission": {
45+
Type: schema.TypeString,
46+
Description: "Privilege",
47+
ValidateFunc: validation.StringInSlice([]string{
48+
rdb.PermissionReadonly.String(),
49+
rdb.PermissionReadwrite.String(),
50+
rdb.PermissionAll.String(),
51+
rdb.PermissionCustom.String(),
52+
rdb.PermissionNone.String(),
53+
}, false),
54+
Required: true,
55+
},
56+
},
57+
}
58+
}
59+
60+
func resourceScalewayRdbPrivilegeCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
61+
rdbAPI := newRdbAPI(meta)
62+
63+
region, instanceID, err := parseRegionalID(d.Get("instance_id").(string))
64+
if err != nil {
65+
return diag.FromErr(err)
66+
}
67+
68+
createReq := &rdb.SetPrivilegeRequest{
69+
Region: region,
70+
InstanceID: instanceID,
71+
DatabaseName: d.Get("database_name").(string),
72+
UserName: d.Get("user_name").(string),
73+
Permission: rdb.Permission(d.Get("permission").(string)),
74+
}
75+
76+
_, err = rdbAPI.SetPrivilege(createReq, scw.WithContext(ctx))
77+
if err != nil {
78+
return diag.FromErr(err)
79+
}
80+
81+
d.SetId(newRegionalIDString(region, instanceID))
82+
return resourceScalewayRdbPrivilegeRead(ctx, d, meta)
83+
}
84+
85+
func resourceScalewayRdbPrivilegeRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
86+
rdbAPI := newRdbAPI(meta)
87+
region, instanceID, err := parseRegionalID(d.Get("instance_id").(string))
88+
if err != nil {
89+
return diag.FromErr(err)
90+
}
91+
92+
dbName, _ := d.Get("database_name").(string)
93+
userName, _ := d.Get("user_name").(string)
94+
95+
res, err := rdbAPI.ListPrivileges(&rdb.ListPrivilegesRequest{
96+
Region: region,
97+
InstanceID: instanceID,
98+
DatabaseName: &dbName,
99+
UserName: &userName,
100+
}, scw.WithContext(ctx))
101+
102+
if err != nil {
103+
if is404Error(err) {
104+
d.SetId("")
105+
return nil
106+
}
107+
return diag.FromErr(err)
108+
}
109+
110+
var privilege = res.Privileges[0]
111+
_ = d.Set("database_name", privilege.DatabaseName)
112+
_ = d.Set("user_name", privilege.UserName)
113+
_ = d.Set("permission", privilege.Permission)
114+
_ = d.Set("instance_id", newRegionalIDString(region, instanceID))
115+
116+
return nil
117+
}
118+
119+
func resourceScalewayRdbPrivilegeUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
120+
rdbAPI := newRdbAPI(meta)
121+
region, instanceID, err := parseRegionalID(d.Get("instance_id").(string))
122+
if err != nil {
123+
return diag.FromErr(err)
124+
}
125+
126+
updateReq := &rdb.SetPrivilegeRequest{
127+
Region: region,
128+
InstanceID: instanceID,
129+
DatabaseName: d.Get("database_name").(string),
130+
UserName: d.Get("user_name").(string),
131+
Permission: rdb.Permission(d.Get("permission").(string)),
132+
}
133+
_, err = rdbAPI.SetPrivilege(updateReq, scw.WithContext(ctx))
134+
if err != nil && !is404Error(err) {
135+
return diag.FromErr(err)
136+
}
137+
138+
return nil
139+
}
140+
141+
func resourceScalewayRdbPrivilegeDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
142+
_ = d.Set("permission", rdb.PermissionNone)
143+
return resourceScalewayRdbPrivilegeUpdate(ctx, d, meta)
144+
}

0 commit comments

Comments
 (0)