Skip to content

Commit 8c26e95

Browse files
committed
NSOF-5754 roles: don't add privs that were not requested by the config to make roles consistent
1 parent 975ea0c commit 8c26e95

6 files changed

Lines changed: 30 additions & 31 deletions

File tree

docs/data-sources/role.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ output "role_by_name" {
4545
- **all_write_privileges** (Boolean)
4646
- **apply_to_orgs** (List of String) indicates which orgs this role applies to. By default, it is applied to current org.
4747
- **description** (String)
48-
- **privileges** (List of String) Privileges to be assigned to the new role. It has the following structure - `resource:read/write` For example, metaports:read etc.
48+
- **privileges** (Set of String) Privileges to be assigned to the new role. It has the following structure - `resource:read/write` For example, metaports:read etc.
4949
- **suborgs_expression** (String) Allows grouping of entities according to their tags. Filtering by tag value is also supported, if provided. Supported operations: AND, OR, XOR, parenthesis.
5050

5151

docs/resources/role.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ resource "pfptmeta_role" "with_privileges" {
4747
- **all_write_privileges** (Boolean)
4848
- **apply_to_orgs** (List of String) indicates which orgs this role applies to. By default, it is applied to current org.
4949
- **description** (String)
50-
- **privileges** (List of String) Privileges to be assigned to the new role. It has the following structure - `resource:read/write` For example, metaports:read etc.
50+
- **privileges** (Set of String) Privileges to be assigned to the new role. It has the following structure - `resource:read/write` For example, metaports:read etc.
5151
- **suborgs_expression** (String) Allows grouping of entities according to their tags. Filtering by tag value is also supported, if provided. Supported operations: AND, OR, XOR, parenthesis.
5252

5353
### Read-Only

internal/client/role.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,8 @@ func NewRole(d *schema.ResourceData) *Role {
3434
s := d.Get("suborgs_expression").(string)
3535
res.SubOrgsExpression = s
3636

37-
p := d.Get("privileges").([]interface{})
38-
privs := make([]string, len(p))
39-
for i, priv := range p {
40-
privs[i] = priv.(string)
41-
}
42-
res.Privileges = privs
37+
p := d.Get("privileges").(*schema.Set)
38+
res.Privileges = ResourceTypeSetToStringSlice(p)
4339

4440
o := d.Get("apply_to_orgs").([]interface{})
4541
orgs := make([]string, len(o))

internal/provider/role/common.go

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,35 @@ const (
1515
subOrgsExpressionDesc = "Allows grouping of entities according to their tags. Filtering by tag value is also supported, if provided. Supported operations: AND, OR, XOR, parenthesis."
1616
)
1717

18-
var excludedKeys = []string{"id", "roles"}
18+
var excludedKeys = []string{"id", "privileges"}
19+
20+
func roleToResource(r *client.Role, d *schema.ResourceData) (diags diag.Diagnostics) {
21+
d.SetId(r.ID)
22+
err := client.MapResponseToResource(r, d, excludedKeys)
23+
if err != nil {
24+
return diag.FromErr(err)
25+
}
26+
origPrivs := schema.NewSet(schema.HashString, d.Get("privileges").(*schema.Set).List())
27+
newPrivs := &schema.Set{F: schema.HashString}
28+
for _, i := range r.Privileges {
29+
newPrivs.Add(i)
30+
}
31+
err = d.Set("privileges", origPrivs.Intersection(newPrivs))
32+
if err != nil {
33+
return diag.FromErr(err)
34+
}
35+
return
36+
}
1937

2038
func roleCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
21-
var diags diag.Diagnostics
2239
c := meta.(*client.Client)
2340

2441
body := client.NewRole(d)
2542
r, err := client.CreateRole(ctx, c, body)
2643
if err != nil {
2744
return diag.FromErr(err)
2845
}
29-
d.SetId(r.ID)
30-
err = client.MapResponseToResource(r, d, excludedKeys)
31-
if err != nil {
32-
return diag.FromErr(err)
33-
}
34-
return diags
46+
return roleToResource(r, d)
3547
}
3648
func roleRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
3749
var diags diag.Diagnostics
@@ -58,30 +70,21 @@ func roleRead(ctx context.Context, d *schema.ResourceData, meta interface{}) dia
5870
d.SetId("")
5971
return diags
6072
}
61-
err = client.MapResponseToResource(r, d, excludedKeys)
62-
if err != nil {
63-
return diag.FromErr(err)
64-
}
65-
d.SetId(r.ID)
66-
return diags
73+
return roleToResource(r, d)
6774
}
6875

6976
func roleUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
70-
var diags diag.Diagnostics
7177
c := meta.(*client.Client)
78+
7279
id := d.Id()
7380
body := client.NewRole(d)
7481
r, err := client.UpdateRole(ctx, c, id, body)
7582
if err != nil {
7683
return diag.FromErr(err)
7784
}
78-
d.SetId(r.ID)
79-
err = client.MapResponseToResource(r, d, excludedKeys)
80-
if err != nil {
81-
return diag.FromErr(err)
82-
}
83-
return diags
85+
return roleToResource(r, d)
8486
}
87+
8588
func roleDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
8689
var diags diag.Diagnostics
8790
c := meta.(*client.Client)

internal/provider/role/data_source.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func DataSource() *schema.Resource {
2727
},
2828
"privileges": {
2929
Description: privilegesDesc,
30-
Type: schema.TypeList,
30+
Type: schema.TypeSet,
3131
Elem: &schema.Schema{Type: schema.TypeString},
3232
Computed: true,
3333
},

internal/provider/role/resource.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func Resource() *schema.Resource {
3333
},
3434
"privileges": {
3535
Description: privilegesDesc,
36-
Type: schema.TypeList,
36+
Type: schema.TypeSet,
3737
Elem: &schema.Schema{
3838
Type: schema.TypeString,
3939
ValidateDiagFunc: common.ValidatePattern(common.PrivilegesPattern)},

0 commit comments

Comments
 (0)