@@ -10,6 +10,19 @@ import (
10
10
"google.golang.org/api/googleapi"
11
11
)
12
12
13
+ var schemaGroupMembersEmail = map [string ]* schema.Schema {
14
+ "email" : & schema.Schema {
15
+ Type : schema .TypeString ,
16
+ Required : true ,
17
+ ForceNew : false ,
18
+ StateFunc : func (val interface {}) string {
19
+ return strings .ToLower (val .(string ))
20
+ },
21
+ },
22
+ }
23
+
24
+ var schemaGroupMembers = mergeSchemas (schemaMember , schemaGroupMembersEmail )
25
+
13
26
func resourceGroupMembers () * schema.Resource {
14
27
return & schema.Resource {
15
28
Create : resourceGroupMembersCreate ,
@@ -33,10 +46,7 @@ func resourceGroupMembers() *schema.Resource {
33
46
Type : schema .TypeSet ,
34
47
Required : true ,
35
48
Elem : & schema.Resource {
36
- Schema : schemaMember ,
37
- },
38
- DiffSuppressFunc : func (k , old , new string , d * schema.ResourceData ) bool {
39
- return strings .ToLower (strings .Trim (old , `"` )) == strings .ToLower (strings .Trim (new , `"` ))
49
+ Schema : schemaGroupMembers ,
40
50
},
41
51
},
42
52
},
@@ -163,13 +173,16 @@ func reconcileMembers(d *schema.ResourceData, cfgMembers, apiMembers []map[strin
163
173
}
164
174
165
175
cfgMap := m (cfgMembers )
176
+ log .Println ("[DEBUG] Members in cfg: " , cfgMap )
166
177
apiMap := m (apiMembers )
178
+ log .Println ("[DEBUG] Member in API: " , apiMap )
167
179
168
180
var cfgRole , apiRole string
169
181
170
182
for k , apiMember := range apiMap {
171
183
if cfgMember , ok := cfgMap [k ]; ! ok {
172
184
// The member in the API is not in the config; disable it.
185
+ log .Printf ("[DEBUG] Member in API not in config. Disabling it: %s" , k )
173
186
err := deleteMember (k , gid , config )
174
187
if err != nil {
175
188
return err
@@ -255,29 +268,39 @@ func upsertMember(email, groupEmail, role string, config *Config) error {
255
268
256
269
// Check if the email address belongs to a user, or to a group
257
270
// we need to make sure, because we need to use different logic
258
- var isGroup bool
271
+ var isGroup = true
259
272
err = retry (func () error {
260
273
_ , err := config .directory .Groups .Get (email ).Do ()
274
+ if gerr , ok := err .(* googleapi.Error ); ok && gerr .Code == 404 {
275
+ isGroup = false
276
+ log .Printf ("[DEBUG] Setting isGroup to false for %s after getting a 404" , email )
277
+ return nil
278
+ }
261
279
return err
262
280
})
263
- isGroup = true
264
- if err != nil {
265
- isGroup = false
266
- }
267
281
268
282
if isGroup == true {
269
283
if role != "MEMBER" {
270
284
return fmt .Errorf ("[ERR] Error creating groupMember (%s): nested groups should be role MEMBER" , email )
271
285
}
272
286
287
+ var isGroupMember = true
288
+
273
289
// Grab the group as a directory member of the current group
274
290
err = retry (func () error {
275
291
_ , err := config .directory .Members .Get (groupEmail , email ).Do ()
292
+
293
+ if gerr , ok := err .(* googleapi.Error ); ok && gerr .Code == 404 {
294
+ isGroupMember = false
295
+ log .Printf ("[DEBUG] Setting isGroupMember to false for %s after getting a 404" , email )
296
+ return nil
297
+ }
298
+
276
299
return err
277
300
})
278
301
279
302
// Based on the err return, either add as a new member, or update
280
- if err != nil {
303
+ if isGroupMember == false {
281
304
var createdGroupMember * directory.Member
282
305
err = retry (func () error {
283
306
createdGroupMember , err = config .directory .Members .Insert (groupEmail , groupMember ).Do ()
0 commit comments