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

Commit 4616e40

Browse files
psalaberria002DeviaVir
authored andcommitted
Implement import functionality for group_members (#10)
* Implement import functionality for group_members * Use retries * Rename to group_email and use that as the id There is some confusion when using the Google group id. Using the email is the easiest option. I renamed the field so it is obvious.
1 parent 2e482b8 commit 4616e40

File tree

2 files changed

+53
-27
lines changed

2 files changed

+53
-27
lines changed

examples/group-members/team.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ resource "gsuite_group" "testing_team" {
55
}
66

77
resource "gsuite_group_members" "testing_team_members" {
8-
group = "${gsuite_group.testing_team.id}"
8+
group_email = "${gsuite_group.testing_team.email}"
99

1010
member {
1111
email = "a@xxx.com",

gsuite/resource_group_members.go

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,19 @@ import (
1111

1212
func resourceGroupMembers() *schema.Resource {
1313
return &schema.Resource{
14-
Create: resourceGroupMembersCreate,
15-
Read: resourceGroupMembersRead,
16-
Update: resourceGroupMembersUpdate,
17-
Delete: resourceGroupMembersDelete,
14+
Create: resourceGroupMembersCreate,
15+
Read: resourceGroupMembersRead,
16+
Update: resourceGroupMembersUpdate,
17+
Delete: resourceGroupMembersDelete,
18+
Importer: &schema.ResourceImporter{
19+
State: resourceGroupMembersImporter,
20+
},
1821

1922
Schema: map[string]*schema.Schema{
20-
"group": {
23+
"group_email": {
2124
Type: schema.TypeString,
2225
Required: true,
26+
ForceNew: true,
2327
},
2428
"member": {
2529
Type: schema.TypeSet,
@@ -35,13 +39,15 @@ func resourceGroupMembers() *schema.Resource {
3539
func resourceGroupMembersRead(d *schema.ResourceData, meta interface{}) error {
3640
config := meta.(*Config)
3741

38-
members, err := getApiMembers(d.Id(), config)
42+
groupEmail := d.Id()
43+
44+
members, err := getApiMembers(groupEmail, config)
3945

4046
if err != nil {
4147
return err
4248
}
4349

44-
d.Set("group", d.Id())
50+
d.Set("group_email", groupEmail)
4551
d.Set("member", membersToCfg(members))
4652
return nil
4753
}
@@ -112,24 +118,24 @@ func resourceMembers(d *schema.ResourceData) (members []map[string]interface{})
112118

113119
func createOrUpdateGroupMembers(d *schema.ResourceData, meta interface{}) (string, error) {
114120
config := meta.(*Config)
115-
gid := d.Get("group").(string)
121+
groupEmail := d.Get("group_email").(string)
116122

117123
// Get members from config
118124
cfgMembers := resourceMembers(d)
119125

120126
// Get members from API
121-
apiMembers, err := getApiMembers(gid, config)
127+
apiMembers, err := getApiMembers(groupEmail, config)
122128
if err != nil {
123-
return gid, fmt.Errorf("Error updating memberships: %v", err)
129+
return groupEmail, fmt.Errorf("Error updating memberships: %v", err)
124130
}
125131
// This call removes any members that aren't defined in cfgMembers,
126132
// and adds all of those that are
127-
err = reconcileMembers(d, cfgMembers, membersToCfg(apiMembers), config, gid)
133+
err = reconcileMembers(d, cfgMembers, membersToCfg(apiMembers), config, groupEmail)
128134
if err != nil {
129-
return gid, fmt.Errorf("Error updating memberships: %v", err)
135+
return groupEmail, fmt.Errorf("Error updating memberships: %v", err)
130136
}
131137

132-
return gid, nil
138+
return groupEmail, nil
133139
}
134140

135141
// This function ensures that the members of a group exactly match that
@@ -177,7 +183,7 @@ func reconcileMembers(d *schema.ResourceData, cfgMembers, apiMembers []map[strin
177183
var err error
178184
err = retry(func() error {
179185
updatedGroupMember, err = config.directory.Members.Patch(
180-
d.Get("group").(string),
186+
d.Get("group_email").(string),
181187
cfgMember["email"].(string),
182188
groupMember).Do()
183189
return err
@@ -206,7 +212,7 @@ func reconcileMembers(d *schema.ResourceData, cfgMembers, apiMembers []map[strin
206212
}
207213

208214
// Retrieve a group's members from the API
209-
func getApiMembers(gid string, config *Config) ([]*directory.Member, error) {
215+
func getApiMembers(groupEmail string, config *Config) ([]*directory.Member, error) {
210216
// Get members from the API
211217
groupMembers := make([]*directory.Member, 0)
212218
token := ""
@@ -215,7 +221,7 @@ func getApiMembers(gid string, config *Config) ([]*directory.Member, error) {
215221
for paginate := true; paginate; {
216222

217223
err = retry(func() error {
218-
membersResponse, err = config.directory.Members.List(gid).PageToken(token).Do()
224+
membersResponse, err = config.directory.Members.List(groupEmail).PageToken(token).Do()
219225
return err
220226
})
221227

@@ -231,7 +237,7 @@ func getApiMembers(gid string, config *Config) ([]*directory.Member, error) {
231237
return groupMembers, nil
232238
}
233239

234-
func upsertMember(email, gid, role string, config *Config) error {
240+
func upsertMember(email, groupEmail, role string, config *Config) error {
235241
groupMember := &directory.Member{
236242
Role: role,
237243
Email: email,
@@ -260,15 +266,15 @@ func upsertMember(email, gid, role string, config *Config) error {
260266
var currentMember *directory.Member
261267
var err error
262268
err = retry(func() error {
263-
currentMember, err = config.directory.Members.Get(gid, email).Do()
269+
currentMember, err = config.directory.Members.Get(groupEmail, email).Do()
264270
return err
265271
})
266272

267273
// Based on the err return, either add as a new member, or update
268274
if err != nil {
269275
var createdGroupMember *directory.Member
270276
err = retry(func() error {
271-
createdGroupMember, err = config.directory.Members.Insert(gid, groupMember).Do()
277+
createdGroupMember, err = config.directory.Members.Insert(groupEmail, groupMember).Do()
272278
return err
273279
})
274280
if err != nil {
@@ -278,7 +284,7 @@ func upsertMember(email, gid, role string, config *Config) error {
278284
} else {
279285
var updatedGroupMember *directory.Member
280286
err = retry(func() error {
281-
updatedGroupMember, err = config.directory.Members.Update(gid, email, groupMember).Do()
287+
updatedGroupMember, err = config.directory.Members.Update(groupEmail, email, groupMember).Do()
282288
return err
283289
})
284290
if err != nil {
@@ -294,15 +300,15 @@ func upsertMember(email, gid, role string, config *Config) error {
294300
var hasMemberResponse *directory.MembersHasMember
295301
var err error
296302
err = retry(func() error {
297-
hasMemberResponse, err = config.directory.Members.HasMember(gid, email).Do()
303+
hasMemberResponse, err = config.directory.Members.HasMember(groupEmail, email).Do()
298304
if err == nil {
299305
return err
300306
}
301307

302308
// When a user does not exist, the API returns a 400 "memberKey, required"
303309
// Returning a friendly message
304310
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)
311+
return fmt.Errorf("Error adding groupMember %s. Please make sure the user exists beforehand.", email)
306312
}
307313
return err
308314
})
@@ -313,7 +319,7 @@ func upsertMember(email, gid, role string, config *Config) error {
313319
if hasMemberResponse.IsMember == true {
314320
var updatedGroupMember *directory.Member
315321
err = retry(func() error {
316-
updatedGroupMember, err = config.directory.Members.Update(gid, email, groupMember).Do()
322+
updatedGroupMember, err = config.directory.Members.Update(groupEmail, email, groupMember).Do()
317323
return err
318324
})
319325
if err != nil {
@@ -323,7 +329,7 @@ func upsertMember(email, gid, role string, config *Config) error {
323329
} else {
324330
var createdGroupMember *directory.Member
325331
err = retry(func() error {
326-
createdGroupMember, err = config.directory.Members.Insert(gid, groupMember).Do()
332+
createdGroupMember, err = config.directory.Members.Insert(groupEmail, groupMember).Do()
327333
return err
328334
})
329335
if err != nil {
@@ -336,9 +342,9 @@ func upsertMember(email, gid, role string, config *Config) error {
336342
return nil
337343
}
338344

339-
func deleteMember(email, gid string, config *Config) (err error) {
345+
func deleteMember(email, groupEmail string, config *Config) (err error) {
340346
err = retry(func() error {
341-
err = config.directory.Members.Delete(gid, email).Do()
347+
err = config.directory.Members.Delete(groupEmail, email).Do()
342348
return err
343349
})
344350

@@ -347,3 +353,23 @@ func deleteMember(email, gid string, config *Config) (err error) {
347353
}
348354
return nil
349355
}
356+
357+
// Allow importing using any groupKey (id, email, alias)
358+
func resourceGroupMembersImporter(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
359+
config := meta.(*Config)
360+
361+
var group *directory.Group
362+
var err error
363+
err = retry(func() error {
364+
group, err = config.directory.Groups.Get(d.Id()).Do()
365+
return err
366+
})
367+
368+
if err != nil {
369+
return nil, fmt.Errorf("Error fetching group. Make sure the group exists: %s ", err)
370+
}
371+
372+
d.SetId(group.Email)
373+
374+
return []*schema.ResourceData{d}, nil
375+
}

0 commit comments

Comments
 (0)