Skip to content
This repository was archived by the owner on Jun 27, 2021. It is now read-only.

Commit 9aec69b

Browse files
authored
Resource group members: allow nesting groups (#8)
* Resource group members: allow nesting groups * fix spacing * Add comments * Add check for group role
1 parent 8584209 commit 9aec69b

File tree

1 file changed

+83
-22
lines changed

1 file changed

+83
-22
lines changed

gsuite/resource_group_members.go

Lines changed: 83 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,11 @@ func reconcileMembers(d *schema.ResourceData, cfgMembers, apiMembers []map[strin
168168
groupMember := &directory.Member{
169169
Role: cfgRole,
170170
}
171+
172+
if cfgRole != "MEMBER" {
173+
return fmt.Errorf("Error updating groupMember (%s): nested groups should be role MEMBER", cfgMember["email"].(string))
174+
}
175+
171176
var updatedGroupMember *directory.Member
172177
var err error
173178
err = retry(func() error {
@@ -231,45 +236,101 @@ func upsertMember(email, gid, role string, config *Config) error {
231236
Role: role,
232237
Email: email,
233238
}
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
235244
var err error
236245
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()
247247
return err
248248
})
249+
isGroup = true
249250
if err != nil {
250-
return fmt.Errorf("Error checking hasmember: %s", err)
251+
isGroup = false
251252
}
252253

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
255262
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()
257264
return err
258265
})
266+
267+
// Based on the err return, either add as a new member, or update
259268
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)
261288
}
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
265296
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+
}
267307
return err
268308
})
269309
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)
271333
}
272-
log.Printf("[INFO] Created groupMember: %s", createdGroupMember.Email)
273334
}
274335

275336
return nil

0 commit comments

Comments
 (0)