Skip to content

Commit 229636c

Browse files
authored
fix(iam/policy): change rule from list to set (#1361)
1 parent bd1d718 commit 229636c

8 files changed

+412
-372
lines changed

scaleway/helpers_iam.go

+43-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package scaleway
22

33
import (
4+
"bytes"
5+
"fmt"
6+
47
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
58
iam "github.com/scaleway/scaleway-sdk-go/api/iam/v1alpha1"
69
"github.com/scaleway/scaleway-sdk-go/scw"
@@ -21,10 +24,20 @@ func expandPermissionSetNames(rawPermissions interface{}) *[]string {
2124
return &permissions
2225
}
2326

27+
func flattenPermissionSetNames(permissions []string) *schema.Set {
28+
rawPermissions := []interface{}(nil)
29+
for _, perm := range permissions {
30+
rawPermissions = append(rawPermissions, perm)
31+
}
32+
return schema.NewSet(func(i interface{}) int {
33+
return StringHashcode(i.(string))
34+
}, rawPermissions)
35+
}
36+
2437
func expandPolicyRuleSpecs(d interface{}) []*iam.RuleSpecs {
2538
rules := []*iam.RuleSpecs(nil)
26-
rawRules := d.([]interface{})
27-
for _, rawRule := range rawRules {
39+
rawRules := d.(*schema.Set)
40+
for _, rawRule := range rawRules.List() {
2841
mapRule := rawRule.(map[string]interface{})
2942
rule := &iam.RuleSpecs{
3043
PermissionSetNames: expandPermissionSetNames(mapRule["permission_set_names"]),
@@ -40,6 +53,32 @@ func expandPolicyRuleSpecs(d interface{}) []*iam.RuleSpecs {
4053
return rules
4154
}
4255

56+
func iamPolicyRuleHash(v interface{}) int {
57+
var buf bytes.Buffer
58+
m, ok := v.(map[string]interface{})
59+
60+
if !ok {
61+
return 0
62+
}
63+
64+
if orgID, hasOrgID := m["organization_id"]; hasOrgID && orgID != nil {
65+
buf.WriteString(fmt.Sprintf("%s-", orgID.(string)))
66+
}
67+
if projIDs, hasProjIDs := m["project_ids"]; hasProjIDs && projIDs != nil {
68+
projIDList := projIDs.([]interface{})
69+
for _, projID := range projIDList {
70+
buf.WriteString(fmt.Sprintf("%s-", projID.(string)))
71+
}
72+
}
73+
if permSet, hasPermSet := m["permission_set_names"]; hasPermSet {
74+
permSetNames := permSet.(*schema.Set)
75+
for _, permName := range permSetNames.List() {
76+
buf.WriteString(fmt.Sprintf("%s-", permName.(string)))
77+
}
78+
}
79+
return StringHashcode(buf.String())
80+
}
81+
4382
func flattenPolicyRules(rules []*iam.Rule) interface{} {
4483
rawRules := []interface{}(nil)
4584
for _, rule := range rules {
@@ -53,9 +92,9 @@ func flattenPolicyRules(rules []*iam.Rule) interface{} {
5392
rawRule["project_ids"] = flattenSliceString(*rule.ProjectIDs)
5493
}
5594
if rule.PermissionSetNames != nil {
56-
rawRule["permission_set_names"] = flattenSliceString(*rule.PermissionSetNames)
95+
rawRule["permission_set_names"] = flattenPermissionSetNames(*rule.PermissionSetNames)
5796
}
5897
rawRules = append(rawRules, rawRule)
5998
}
60-
return rawRules
99+
return schema.NewSet(iamPolicyRuleHash, rawRules)
61100
}

scaleway/resource_iam_policy.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,10 @@ func resourceScalewayIamPolicy() *schema.Resource {
7373
ExactlyOneOf: []string{"user_id", "group_id", "application_id"},
7474
},
7575
"rule": {
76-
Type: schema.TypeList,
76+
Type: schema.TypeSet,
7777
Required: true,
7878
Description: "Rules of the policy to create",
79+
Set: iamPolicyRuleHash,
7980
Elem: &schema.Resource{
8081
Schema: map[string]*schema.Schema{
8182
"organization_id": {

scaleway/resource_iam_policy_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func TestAccScalewayIamPolicy_Basic(t *testing.T) {
6868
}
6969
rule {
7070
organization_id = "%[1]s"
71-
permission_set_names = ["AllProductsFullAccess"]
71+
permission_set_names = ["ContainerRegistryReadOnly"]
7272
}
7373
}
7474
`, orgID),
@@ -80,7 +80,7 @@ func TestAccScalewayIamPolicy_Basic(t *testing.T) {
8080
resource.TestCheckResourceAttr("scaleway_iam_policy.main", "rule.0.organization_id", orgID),
8181
resource.TestCheckResourceAttr("scaleway_iam_policy.main", "rule.0.permission_set_names.0", "AllProductsFullAccess"),
8282
resource.TestCheckResourceAttr("scaleway_iam_policy.main", "rule.1.organization_id", orgID),
83-
resource.TestCheckResourceAttr("scaleway_iam_policy.main", "rule.1.permission_set_names.0", "AllProductsFullAccess"),
83+
resource.TestCheckResourceAttr("scaleway_iam_policy.main", "rule.1.permission_set_names.0", "ContainerRegistryReadOnly"),
8484
),
8585
},
8686
{
@@ -100,7 +100,7 @@ func TestAccScalewayIamPolicy_Basic(t *testing.T) {
100100
resource.TestCheckResourceAttr("scaleway_iam_policy.main", "name", "tf_tests_policy_basic"),
101101
resource.TestCheckResourceAttr("scaleway_iam_policy.main", "description", "a description"),
102102
resource.TestCheckResourceAttr("scaleway_iam_policy.main", "no_principal", "true"),
103-
resource.TestCheckResourceAttr("scaleway_iam_policy.main", "rule.0.organization_id", orgID),
103+
resource.TestCheckTypeSetElemNestedAttrs("scaleway_iam_policy.main", "rule.*", map[string]string{"organization_id": orgID}),
104104
resource.TestCheckResourceAttr("scaleway_iam_policy.main", "rule.0.permission_set_names.0", "AllProductsFullAccess"),
105105
),
106106
},

0 commit comments

Comments
 (0)