@@ -11,15 +11,19 @@ import (
11
11
12
12
func resourceGroupMembers () * schema.Resource {
13
13
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
+ },
18
21
19
22
Schema : map [string ]* schema.Schema {
20
- "group " : {
23
+ "group_email " : {
21
24
Type : schema .TypeString ,
22
25
Required : true ,
26
+ ForceNew : true ,
23
27
},
24
28
"member" : {
25
29
Type : schema .TypeSet ,
@@ -35,13 +39,15 @@ func resourceGroupMembers() *schema.Resource {
35
39
func resourceGroupMembersRead (d * schema.ResourceData , meta interface {}) error {
36
40
config := meta .(* Config )
37
41
38
- members , err := getApiMembers (d .Id (), config )
42
+ groupEmail := d .Id ()
43
+
44
+ members , err := getApiMembers (groupEmail , config )
39
45
40
46
if err != nil {
41
47
return err
42
48
}
43
49
44
- d .Set ("group " , d . Id () )
50
+ d .Set ("group_email " , groupEmail )
45
51
d .Set ("member" , membersToCfg (members ))
46
52
return nil
47
53
}
@@ -112,24 +118,24 @@ func resourceMembers(d *schema.ResourceData) (members []map[string]interface{})
112
118
113
119
func createOrUpdateGroupMembers (d * schema.ResourceData , meta interface {}) (string , error ) {
114
120
config := meta .(* Config )
115
- gid := d .Get ("group " ).(string )
121
+ groupEmail := d .Get ("group_email " ).(string )
116
122
117
123
// Get members from config
118
124
cfgMembers := resourceMembers (d )
119
125
120
126
// Get members from API
121
- apiMembers , err := getApiMembers (gid , config )
127
+ apiMembers , err := getApiMembers (groupEmail , config )
122
128
if err != nil {
123
- return gid , fmt .Errorf ("Error updating memberships: %v" , err )
129
+ return groupEmail , fmt .Errorf ("Error updating memberships: %v" , err )
124
130
}
125
131
// This call removes any members that aren't defined in cfgMembers,
126
132
// 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 )
128
134
if err != nil {
129
- return gid , fmt .Errorf ("Error updating memberships: %v" , err )
135
+ return groupEmail , fmt .Errorf ("Error updating memberships: %v" , err )
130
136
}
131
137
132
- return gid , nil
138
+ return groupEmail , nil
133
139
}
134
140
135
141
// 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
177
183
var err error
178
184
err = retry (func () error {
179
185
updatedGroupMember , err = config .directory .Members .Patch (
180
- d .Get ("group " ).(string ),
186
+ d .Get ("group_email " ).(string ),
181
187
cfgMember ["email" ].(string ),
182
188
groupMember ).Do ()
183
189
return err
@@ -206,7 +212,7 @@ func reconcileMembers(d *schema.ResourceData, cfgMembers, apiMembers []map[strin
206
212
}
207
213
208
214
// 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 ) {
210
216
// Get members from the API
211
217
groupMembers := make ([]* directory.Member , 0 )
212
218
token := ""
@@ -215,7 +221,7 @@ func getApiMembers(gid string, config *Config) ([]*directory.Member, error) {
215
221
for paginate := true ; paginate ; {
216
222
217
223
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 ()
219
225
return err
220
226
})
221
227
@@ -231,7 +237,7 @@ func getApiMembers(gid string, config *Config) ([]*directory.Member, error) {
231
237
return groupMembers , nil
232
238
}
233
239
234
- func upsertMember (email , gid , role string , config * Config ) error {
240
+ func upsertMember (email , groupEmail , role string , config * Config ) error {
235
241
groupMember := & directory.Member {
236
242
Role : role ,
237
243
Email : email ,
@@ -260,15 +266,15 @@ func upsertMember(email, gid, role string, config *Config) error {
260
266
var currentMember * directory.Member
261
267
var err error
262
268
err = retry (func () error {
263
- currentMember , err = config .directory .Members .Get (gid , email ).Do ()
269
+ currentMember , err = config .directory .Members .Get (groupEmail , email ).Do ()
264
270
return err
265
271
})
266
272
267
273
// Based on the err return, either add as a new member, or update
268
274
if err != nil {
269
275
var createdGroupMember * directory.Member
270
276
err = retry (func () error {
271
- createdGroupMember , err = config .directory .Members .Insert (gid , groupMember ).Do ()
277
+ createdGroupMember , err = config .directory .Members .Insert (groupEmail , groupMember ).Do ()
272
278
return err
273
279
})
274
280
if err != nil {
@@ -278,7 +284,7 @@ func upsertMember(email, gid, role string, config *Config) error {
278
284
} else {
279
285
var updatedGroupMember * directory.Member
280
286
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 ()
282
288
return err
283
289
})
284
290
if err != nil {
@@ -294,15 +300,15 @@ func upsertMember(email, gid, role string, config *Config) error {
294
300
var hasMemberResponse * directory.MembersHasMember
295
301
var err error
296
302
err = retry (func () error {
297
- hasMemberResponse , err = config .directory .Members .HasMember (gid , email ).Do ()
303
+ hasMemberResponse , err = config .directory .Members .HasMember (groupEmail , email ).Do ()
298
304
if err == nil {
299
305
return err
300
306
}
301
307
302
308
// When a user does not exist, the API returns a 400 "memberKey, required"
303
309
// Returning a friendly message
304
310
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 )
306
312
}
307
313
return err
308
314
})
@@ -313,7 +319,7 @@ func upsertMember(email, gid, role string, config *Config) error {
313
319
if hasMemberResponse .IsMember == true {
314
320
var updatedGroupMember * directory.Member
315
321
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 ()
317
323
return err
318
324
})
319
325
if err != nil {
@@ -323,7 +329,7 @@ func upsertMember(email, gid, role string, config *Config) error {
323
329
} else {
324
330
var createdGroupMember * directory.Member
325
331
err = retry (func () error {
326
- createdGroupMember , err = config .directory .Members .Insert (gid , groupMember ).Do ()
332
+ createdGroupMember , err = config .directory .Members .Insert (groupEmail , groupMember ).Do ()
327
333
return err
328
334
})
329
335
if err != nil {
@@ -336,9 +342,9 @@ func upsertMember(email, gid, role string, config *Config) error {
336
342
return nil
337
343
}
338
344
339
- func deleteMember (email , gid string , config * Config ) (err error ) {
345
+ func deleteMember (email , groupEmail string , config * Config ) (err error ) {
340
346
err = retry (func () error {
341
- err = config .directory .Members .Delete (gid , email ).Do ()
347
+ err = config .directory .Members .Delete (groupEmail , email ).Do ()
342
348
return err
343
349
})
344
350
@@ -347,3 +353,23 @@ func deleteMember(email, gid string, config *Config) (err error) {
347
353
}
348
354
return nil
349
355
}
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