Skip to content

Commit 4ff6c7f

Browse files
feat(rdb): Implementing rdb privileges
fix: bad uuid management fix: Create was not properly handling regional IDs testing updating resource docs docs: updating format following 'convention' removing test fix: parseRegionalId instead of extract missing other occurence feat(rdb): supporting datasource doc: documenting the rdb priv resources
1 parent dc715cc commit 4ff6c7f

9 files changed

+4069
-0
lines changed

docs/data-sources/rdb_privilege.md

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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+
## Attributes Reference
31+
32+
In addition to all arguments above, the following attributes are exported:
33+
34+
- `permission` - The permission for this user on the database

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

+154
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
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 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: validationPrivilegePermission(),
48+
Required: true,
49+
},
50+
},
51+
}
52+
}
53+
54+
func resourceScalewayRdbPrivilegeCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
55+
rdbAPI := newRdbAPI(meta)
56+
57+
region, instanceID, err := parseRegionalID(d.Get("instance_id").(string))
58+
if err != nil {
59+
return diag.FromErr(err)
60+
}
61+
62+
createReq := &rdb.SetPrivilegeRequest{
63+
Region: region,
64+
InstanceID: instanceID,
65+
DatabaseName: d.Get("database_name").(string),
66+
UserName: d.Get("user_name").(string),
67+
Permission: rdb.Permission(d.Get("permission").(string)),
68+
}
69+
70+
_, err = rdbAPI.SetPrivilege(createReq, scw.WithContext(ctx))
71+
if err != nil {
72+
return diag.FromErr(err)
73+
}
74+
75+
d.SetId(newRegionalIDString(region, instanceID))
76+
return resourceScalewayRdbPrivilegeRead(ctx, d, meta)
77+
}
78+
79+
func resourceScalewayRdbPrivilegeRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
80+
rdbAPI := newRdbAPI(meta)
81+
region, instanceID, err := parseRegionalID(d.Get("instance_id").(string))
82+
if err != nil {
83+
return diag.FromErr(err)
84+
}
85+
86+
dbName, _ := d.Get("database_name").(string)
87+
userName, _ := d.Get("user_name").(string)
88+
89+
res, err := rdbAPI.ListPrivileges(&rdb.ListPrivilegesRequest{
90+
Region: region,
91+
InstanceID: instanceID,
92+
DatabaseName: &dbName,
93+
UserName: &userName,
94+
}, scw.WithContext(ctx))
95+
96+
if err != nil {
97+
if is404Error(err) {
98+
d.SetId("")
99+
return nil
100+
}
101+
return diag.FromErr(err)
102+
}
103+
104+
var privilege = res.Privileges[0]
105+
_ = d.Set("database_name", privilege.DatabaseName)
106+
_ = d.Set("user_name", privilege.UserName)
107+
_ = d.Set("permission", privilege.Permission)
108+
_ = d.Set("instance_id", newRegionalIDString(region, instanceID))
109+
110+
return nil
111+
}
112+
113+
func resourceScalewayRdbPrivilegeUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
114+
rdbAPI := newRdbAPI(meta)
115+
region, instanceID, err := parseRegionalID(d.Get("instance_id").(string))
116+
if err != nil {
117+
return diag.FromErr(err)
118+
}
119+
120+
updateReq := &rdb.SetPrivilegeRequest{
121+
Region: region,
122+
InstanceID: instanceID,
123+
DatabaseName: d.Get("database_name").(string),
124+
UserName: d.Get("user_name").(string),
125+
Permission: rdb.Permission(d.Get("permission").(string)),
126+
}
127+
_, err = rdbAPI.SetPrivilege(updateReq, scw.WithContext(ctx))
128+
if err != nil && !is404Error(err) {
129+
return diag.FromErr(err)
130+
}
131+
132+
return nil
133+
}
134+
135+
func resourceScalewayRdbPrivilegeDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
136+
_ = d.Set("permission", rdb.PermissionNone)
137+
return resourceScalewayRdbPrivilegeUpdate(ctx, d, meta)
138+
}
139+
140+
func validationPrivilegePermission() func(interface{}, string) ([]string, []error) {
141+
return func(v interface{}, key string) (warnings []string, errors []error) {
142+
sV, isString := v.(string)
143+
if isString {
144+
perm := rdb.Permission(sV)
145+
146+
switch perm {
147+
case rdb.PermissionReadonly, rdb.PermissionReadwrite, rdb.PermissionAll, rdb.PermissionCustom, rdb.PermissionNone:
148+
return
149+
}
150+
return nil, []error{fmt.Errorf("'%s' is not a valid permission", key)}
151+
}
152+
return nil, []error{fmt.Errorf("'%s' is not a string", key)}
153+
}
154+
}

0 commit comments

Comments
 (0)