Lokasi ngalangkungan proxy:   [ UP ]  
[Ngawartoskeun bug]   [Panyetelan cookie]                
Skip to content

Commit 8520cd7

Browse files
committed
providers/google: Allow IAM policy removal from project
1 parent 4cdb064 commit 8520cd7

2 files changed

Lines changed: 104 additions & 15 deletions

File tree

builtin/providers/google/resource_google_project.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,12 +130,27 @@ func resourceGoogleProjectUpdate(d *schema.ResourceData, meta interface{}) error
130130
if ok := d.HasChange("policy"); ok {
131131
// The policy string is just a marshaled cloudresourcemanager.Policy.
132132
// Unmarshal it to a struct that contains the old and new policies
133-
oldPString, newPString := d.GetChange("policy")
133+
oldP, newP := d.GetChange("policy")
134+
oldPString := oldP.(string)
135+
newPString := newP.(string)
136+
137+
// JSON Unmarshaling would fail
138+
if oldPString == "" {
139+
oldPString = "{}"
140+
}
141+
if newPString == "" {
142+
newPString = "{}"
143+
}
144+
145+
oldPStringf, _ := json.MarshalIndent(oldPString, " ", " ")
146+
newPStringf, _ := json.MarshalIndent(newPString, " ", " ")
147+
log.Printf("[DEBUG]: Old policy: %v\nNew policy: %v", string(oldPStringf), string(newPStringf))
148+
134149
var oldPolicy, newPolicy cloudresourcemanager.Policy
135-
if err = json.Unmarshal([]byte(newPString.(string)), &newPolicy); err != nil {
150+
if err = json.Unmarshal([]byte(newPString), &newPolicy); err != nil {
136151
return err
137152
}
138-
if err = json.Unmarshal([]byte(oldPString.(string)), &oldPolicy); err != nil {
153+
if err = json.Unmarshal([]byte(oldPString), &oldPolicy); err != nil {
139154
return err
140155
}
141156

builtin/providers/google/resource_google_project_test.go

Lines changed: 86 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"google.golang.org/api/cloudresourcemanager/v1"
99
)
1010

11-
type Binding []cloudresourcemanager.Binding
11+
type Binding []*cloudresourcemanager.Binding
1212

1313
func (b Binding) Len() int {
1414
return len(b)
@@ -22,13 +22,78 @@ func (b Binding) Less(i, j int) bool {
2222
return b[i].Role < b[j].Role
2323
}
2424

25-
func TestIamMapRolesToMembers(t *testing.T) {
25+
func TestIamRolesToMembersBinding(t *testing.T) {
2626
table := []struct {
27-
input []cloudresourcemanager.Binding
27+
expect []*cloudresourcemanager.Binding
28+
input map[string]map[string]bool
29+
}{
30+
{
31+
expect: []*cloudresourcemanager.Binding{
32+
{
33+
Role: "role-1",
34+
Members: []string{
35+
"member-1",
36+
"member-2",
37+
},
38+
},
39+
},
40+
input: map[string]map[string]bool{
41+
"role-1": map[string]bool{
42+
"member-1": true,
43+
"member-2": true,
44+
},
45+
},
46+
},
47+
{
48+
expect: []*cloudresourcemanager.Binding{
49+
{
50+
Role: "role-1",
51+
Members: []string{
52+
"member-1",
53+
"member-2",
54+
},
55+
},
56+
},
57+
input: map[string]map[string]bool{
58+
"role-1": map[string]bool{
59+
"member-1": true,
60+
"member-2": true,
61+
},
62+
},
63+
},
64+
{
65+
expect: []*cloudresourcemanager.Binding{
66+
{
67+
Role: "role-1",
68+
Members: []string{},
69+
},
70+
},
71+
input: map[string]map[string]bool{
72+
"role-1": map[string]bool{},
73+
},
74+
},
75+
}
76+
77+
for _, test := range table {
78+
got := rolesToMembersBinding(test.input)
79+
80+
sort.Sort(Binding(got))
81+
for i, _ := range got {
82+
sort.Strings(got[i].Members)
83+
}
84+
85+
if !reflect.DeepEqual(derefBindings(got), derefBindings(test.expect)) {
86+
t.Errorf("got %+v, expected %+v", derefBindings(got), derefBindings(test.expect))
87+
}
88+
}
89+
}
90+
func TestIamRolesToMembersMap(t *testing.T) {
91+
table := []struct {
92+
input []*cloudresourcemanager.Binding
2893
expect map[string]map[string]bool
2994
}{
3095
{
31-
input: []cloudresourcemanager.Binding{
96+
input: []*cloudresourcemanager.Binding{
3297
{
3398
Role: "role-1",
3499
Members: []string{
@@ -45,7 +110,7 @@ func TestIamMapRolesToMembers(t *testing.T) {
45110
},
46111
},
47112
{
48-
input: []cloudresourcemanager.Binding{
113+
input: []*cloudresourcemanager.Binding{
49114
{
50115
Role: "role-1",
51116
Members: []string{
@@ -64,7 +129,7 @@ func TestIamMapRolesToMembers(t *testing.T) {
64129
},
65130
},
66131
{
67-
input: []cloudresourcemanager.Binding{
132+
input: []*cloudresourcemanager.Binding{
68133
{
69134
Role: "role-1",
70135
},
@@ -76,20 +141,29 @@ func TestIamMapRolesToMembers(t *testing.T) {
76141
}
77142

78143
for _, test := range table {
79-
got := mapRolesToMembers(test.input)
144+
got := rolesToMembersMap(test.input)
80145
if !reflect.DeepEqual(got, test.expect) {
81146
t.Errorf("got %+v, expected %+v", got, test.expect)
82147
}
83148
}
84149
}
85150

151+
func derefBindings(b []*cloudresourcemanager.Binding) []cloudresourcemanager.Binding {
152+
db := make([]cloudresourcemanager.Binding, len(b))
153+
154+
for i, v := range b {
155+
db[i] = *v
156+
}
157+
return db
158+
}
159+
86160
func TestIamMergeBindings(t *testing.T) {
87161
table := []struct {
88-
input []cloudresourcemanager.Binding
162+
input []*cloudresourcemanager.Binding
89163
expect []cloudresourcemanager.Binding
90164
}{
91165
{
92-
input: []cloudresourcemanager.Binding{
166+
input: []*cloudresourcemanager.Binding{
93167
{
94168
Role: "role-1",
95169
Members: []string{
@@ -116,7 +190,7 @@ func TestIamMergeBindings(t *testing.T) {
116190
},
117191
},
118192
{
119-
input: []cloudresourcemanager.Binding{
193+
input: []*cloudresourcemanager.Binding{
120194
{
121195
Role: "role-1",
122196
Members: []string{
@@ -191,8 +265,8 @@ func TestIamMergeBindings(t *testing.T) {
191265
sort.Strings(got[i].Members)
192266
}
193267

194-
if !reflect.DeepEqual(got, test.expect) {
195-
t.Errorf("\ngot %+v\nexpected %+v", got, test.expect)
268+
if !reflect.DeepEqual(derefBindings(got), test.expect) {
269+
t.Errorf("\ngot %+v\nexpected %+v", derefBindings(got), test.expect)
196270
}
197271
}
198272
}

0 commit comments

Comments
 (0)