@@ -168,6 +168,11 @@ func reconcileMembers(d *schema.ResourceData, cfgMembers, apiMembers []map[strin
168
168
groupMember := & directory.Member {
169
169
Role : cfgRole ,
170
170
}
171
+
172
+ if cfgRole != "MEMBER" {
173
+ return fmt .Errorf ("Error updating groupMember (%s): nested groups should be role MEMBER" , cfgMember ["email" ].(string ))
174
+ }
175
+
171
176
var updatedGroupMember * directory.Member
172
177
var err error
173
178
err = retry (func () error {
@@ -231,45 +236,101 @@ func upsertMember(email, gid, role string, config *Config) error {
231
236
Role : role ,
232
237
Email : email ,
233
238
}
234
- var hasMemberResponse * directory.MembersHasMember
239
+
240
+ // Check if the email address belongs to a user, or to a group
241
+ // we need to make sure, because we need to use different logic
242
+ var isGroup bool
243
+ var group * directory.Group
235
244
var err error
236
245
err = retry (func () error {
237
- hasMemberResponse , err = config .directory .Members .HasMember (gid , email ).Do ()
238
- if err == nil {
239
- return nil
240
- }
241
-
242
- // When a user does not exist, the API returns a 400 "memberKey, required"
243
- // Returning a
244
- if gerr , ok := err .(* googleapi.Error ); ok && (gerr .Errors [0 ].Reason == "required" && gerr .Code == 400 ) {
245
- return fmt .Errorf ("Error adding groupMember %s. Please make sure the user exists beforehand." , email )
246
- }
246
+ group , err = config .directory .Groups .Get (email ).Do ()
247
247
return err
248
248
})
249
+ isGroup = true
249
250
if err != nil {
250
- return fmt . Errorf ( "Error checking hasmember: %s" , err )
251
+ isGroup = false
251
252
}
252
253
253
- if hasMemberResponse .IsMember == true {
254
- var updatedGroupMember * directory.Member
254
+ if isGroup == true {
255
+ if role != "MEMBER" {
256
+ return fmt .Errorf ("Error creating groupMember (%s): nested groups should be role MEMBER" , email )
257
+ }
258
+
259
+ // Grab the group as a directory member of the current group
260
+ var currentMember * directory.Member
261
+ var err error
255
262
err = retry (func () error {
256
- updatedGroupMember , err = config .directory .Members .Update (gid , email , groupMember ).Do ()
263
+ currentMember , err = config .directory .Members .Get (gid , email ).Do ()
257
264
return err
258
265
})
266
+
267
+ // Based on the err return, either add as a new member, or update
259
268
if err != nil {
260
- return fmt .Errorf ("Error updating groupMember: %s" , err )
269
+ var createdGroupMember * directory.Member
270
+ err = retry (func () error {
271
+ createdGroupMember , err = config .directory .Members .Insert (gid , groupMember ).Do ()
272
+ return err
273
+ })
274
+ if err != nil {
275
+ return fmt .Errorf ("Error creating groupMember: %s, %s" , err , email )
276
+ }
277
+ log .Printf ("[INFO] Created groupMember: %s" , createdGroupMember .Email )
278
+ } else {
279
+ var updatedGroupMember * directory.Member
280
+ err = retry (func () error {
281
+ updatedGroupMember , err = config .directory .Members .Update (gid , email , groupMember ).Do ()
282
+ return err
283
+ })
284
+ if err != nil {
285
+ return fmt .Errorf ("Error updating groupMember: %s, %s" , err , email )
286
+ }
287
+ log .Printf ("[INFO] Updated groupMember: %s" , updatedGroupMember .Email )
261
288
}
262
- log .Printf ("[INFO] Updated groupMember: %s" , updatedGroupMember .Email )
263
- } else {
264
- var createdGroupMember * directory.Member
289
+ }
290
+
291
+ if isGroup == false {
292
+ // Basically the same check as group, but using a more apt method "HasMember"
293
+ // specifically meant for users
294
+ var hasMemberResponse * directory.MembersHasMember
295
+ var err error
265
296
err = retry (func () error {
266
- createdGroupMember , err = config .directory .Members .Insert (gid , groupMember ).Do ()
297
+ hasMemberResponse , err = config .directory .Members .HasMember (gid , email ).Do ()
298
+ if err == nil {
299
+ return err
300
+ }
301
+
302
+ // When a user does not exist, the API returns a 400 "memberKey, required"
303
+ // Returning a friendly message
304
+ if gerr , ok := err .(* googleapi.Error ); ok && (gerr .Errors [0 ].Reason == "required" && gerr .Code == 400 ) {
305
+ return fmt .Errorf ("Error adding groupMember %s. Please make sure the user exists beforehand." , email )
306
+ }
267
307
return err
268
308
})
269
309
if err != nil {
270
- return fmt .Errorf ("Error creating groupMember: %s" , err )
310
+ return fmt .Errorf ("Error checking hasmember: %s, %s" , err , email )
311
+ }
312
+
313
+ if hasMemberResponse .IsMember == true {
314
+ var updatedGroupMember * directory.Member
315
+ err = retry (func () error {
316
+ updatedGroupMember , err = config .directory .Members .Update (gid , email , groupMember ).Do ()
317
+ return err
318
+ })
319
+ if err != nil {
320
+ return fmt .Errorf ("Error updating groupMember: %s, %s" , err , email )
321
+ }
322
+ log .Printf ("[INFO] Updated groupMember: %s" , updatedGroupMember .Email )
323
+ } else {
324
+ var createdGroupMember * directory.Member
325
+ err = retry (func () error {
326
+ createdGroupMember , err = config .directory .Members .Insert (gid , groupMember ).Do ()
327
+ return err
328
+ })
329
+ if err != nil {
330
+ return fmt .Errorf ("Error creating groupMember: %s, %s" , err , email )
331
+ }
332
+ log .Printf ("[INFO] Created groupMember: %s" , createdGroupMember .Email )
271
333
}
272
- log .Printf ("[INFO] Created groupMember: %s" , createdGroupMember .Email )
273
334
}
274
335
275
336
return nil
0 commit comments