Skip to content

Commit 8aeb6d1

Browse files
authored
278 intermittent 503 from google workspace deletes users and its aliases in aws without retrying (#279)
Description of changes: Add retries, to compensate for the increased frequency of 503 errors from the directory api. By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.
1 parent 243f7b9 commit 8aeb6d1

File tree

2 files changed

+66
-6
lines changed

2 files changed

+66
-6
lines changed

internal/google/client.go

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ type client struct {
3838
service *admin.Service
3939
}
4040

41+
const (
42+
// Maximum number of retries for admin api
43+
MaxRetries = 5
44+
)
45+
4146
// NewClient creates a new client for Google's Admin API
4247
func NewClient(ctx context.Context, adminEmail string, serviceAccountKey []byte) (Client, error) {
4348
config, err := google.JWTConfigFromJSON(serviceAccountKey, admin.AdminDirectoryGroupReadonlyScope,
@@ -65,6 +70,19 @@ func NewClient(ctx context.Context, adminEmail string, serviceAccountKey []byte)
6570

6671
// GetDeletedUsers will get the deleted users from the Google's Admin API.
6772
func (c *client) GetDeletedUsers() ([]*admin.User, error) {
73+
var err error
74+
var members []*admin.User
75+
76+
for iteration := 1; iteration < MaxRetries; iteration++ {
77+
members, err = c.getDeletedUsers()
78+
if err == nil {
79+
return members, nil
80+
}
81+
}
82+
return nil, err
83+
}
84+
85+
func (c *client) getDeletedUsers() ([]*admin.User, error) {
6886
u := make([]*admin.User, 0)
6987
var err error
7088

@@ -80,6 +98,19 @@ func (c *client) GetDeletedUsers() ([]*admin.User, error) {
8098

8199
// GetGroupMembers will get the members of the group specified
82100
func (c *client) GetGroupMembers(g *admin.Group) ([]*admin.Member, error) {
101+
var err error
102+
var members []*admin.Member
103+
104+
for iteration := 1; iteration < MaxRetries; iteration++ {
105+
members, err = c.getGroupMembers(g)
106+
if err == nil {
107+
return members, nil
108+
}
109+
}
110+
return nil, err
111+
}
112+
113+
func (c *client) getGroupMembers(g *admin.Group) ([]*admin.Member, error) {
83114
m := make([]*admin.Member, 0)
84115
var err error
85116

@@ -108,12 +139,25 @@ func (c *client) GetGroupMembers(g *admin.Group) ([]*admin.Member, error) {
108139
// orgName=Engineering orgTitle:Manager
109140
// EmploymentData.projects:'GeneGnomes'
110141
func (c *client) GetUsers(query string, filter string) ([]*admin.User, error) {
142+
var err error
143+
var users []*admin.User
144+
145+
for iteration := 1; iteration < MaxRetries; iteration++ {
146+
users, err = c.getUsers(query, filter)
147+
if err == nil {
148+
return users, nil
149+
}
150+
}
151+
return nil, err
152+
}
153+
154+
func (c *client) getUsers(query string, filter string) ([]*admin.User, error) {
111155
u := make([]*admin.User, 0)
112156
var err error
113157

114158
// If we have an empty query, return nothing.
115159
if query == "" {
116-
return u, err
160+
return nil, nil
117161
}
118162

119163
// If we have wildcard then fetch all users
@@ -170,6 +214,19 @@ func (c *client) GetUsers(query string, filter string) ([]*admin.User, error) {
170214
// name:Admin* email:aws-*
171215
// email:aws-*
172216
func (c *client) GetGroups(query string) ([]*admin.Group, error) {
217+
var err error
218+
var groups []*admin.Group
219+
220+
for iteration := 1; iteration < MaxRetries; iteration++ {
221+
groups, err = c.getGroups(query)
222+
if err == nil {
223+
return groups, nil
224+
}
225+
}
226+
return nil, err
227+
}
228+
229+
func (c *client) getGroups(query string) ([]*admin.Group, error) {
173230
g := make([]*admin.Group, 0)
174231
var err error
175232

internal/sync.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -762,7 +762,10 @@ func (s *syncGSuite) getGoogleGroupsAndUsers(queryGroups string, queryUsers stri
762762
}
763763

764764
log.WithField("func", funcName).Debug("fetch membership")
765-
membersUsers := s.getGoogleUsersInGroup(g, gUserDetailCache, gGroupDetailCache)
765+
membersUsers, err := s.getGoogleUsersInGroup(g, gUserDetailCache, gGroupDetailCache)
766+
if err != nil {
767+
return nil, nil, nil, err
768+
}
766769

767770
// If we've not seen the user email address before add it to the list of unique users
768771
// also, we need to deduplicate the list of members.
@@ -1311,7 +1314,7 @@ func (s *syncGSuite) RemoveUserFromGroup(userID *string, groupID *string) error
13111314
return nil
13121315
}
13131316

1314-
func (s *syncGSuite) getGoogleUsersInGroup(group *admin.Group, userCache map[string]*admin.User, groupCache map[string]*admin.Group) []*admin.User {
1317+
func (s *syncGSuite) getGoogleUsersInGroup(group *admin.Group, userCache map[string]*admin.User, groupCache map[string]*admin.Group) ([]*admin.User, error) {
13151318
funcName := "getGoogleUsersInGroup"
13161319
log.WithFields(log.Fields{
13171320
"func": funcName,
@@ -1326,7 +1329,7 @@ func (s *syncGSuite) getGoogleUsersInGroup(group *admin.Group, userCache map[str
13261329
"GroupId": group.Id,
13271330
"Error": err,
13281331
}).Error("failed retrieving membership")
1329-
return nil
1332+
return nil, err
13301333
}
13311334
membersUsers := make([]*admin.User, 0)
13321335

@@ -1429,7 +1432,7 @@ func (s *syncGSuite) getGoogleUsersInGroup(group *admin.Group, userCache map[str
14291432
"error": err,
14301433
"Member.Email": m.Email,
14311434
}).Error("Fetching user")
1432-
continue
1435+
return nil, err
14331436
}
14341437
// Add user to the cache
14351438
for _, u := range googleUsers {
@@ -1479,5 +1482,5 @@ func (s *syncGSuite) getGoogleUsersInGroup(group *admin.Group, userCache map[str
14791482
"# Members": len(membersUsers),
14801483
"membersUsers": membersUsers,
14811484
}).Debug("Return")
1482-
return membersUsers
1485+
return membersUsers, nil
14831486
}

0 commit comments

Comments
 (0)