Skip to content

Commit b1dbe37

Browse files
authored
Merge pull request #294 from slashdevops/feat-performance-improve
Feat performance improve
2 parents 69cad59 + 5aae014 commit b1dbe37

File tree

15 files changed

+220
-271
lines changed

15 files changed

+220
-271
lines changed

go.mod

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ require (
1717
github.com/spf13/viper v1.19.0
1818
github.com/stretchr/testify v1.9.0
1919
golang.org/x/oauth2 v0.23.0
20-
google.golang.org/api v0.203.0
20+
google.golang.org/api v0.204.0
2121
gopkg.in/yaml.v3 v3.0.1
2222
)
2323

2424
require (
25-
cloud.google.com/go/auth v0.9.9 // indirect
26-
cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect
25+
cloud.google.com/go/auth v0.10.0 // indirect
26+
cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect
2727
cloud.google.com/go/compute/metadata v0.5.2 // indirect
2828
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 // indirect
2929
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 // indirect
@@ -75,7 +75,7 @@ require (
7575
golang.org/x/sys v0.26.0 // indirect
7676
golang.org/x/text v0.19.0 // indirect
7777
google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 // indirect
78-
google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect
78+
google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect
7979
google.golang.org/grpc v1.67.1 // indirect
8080
google.golang.org/protobuf v1.35.1 // indirect
8181
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect

go.sum

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
2-
cloud.google.com/go/auth v0.9.9 h1:BmtbpNQozo8ZwW2t7QJjnrQtdganSdmqeIBxHxNkEZQ=
3-
cloud.google.com/go/auth v0.9.9/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI=
4-
cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY=
5-
cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc=
2+
cloud.google.com/go/auth v0.10.0 h1:tWlkvFAh+wwTOzXIjrwM64karR1iTBZ/GRr0S/DULYo=
3+
cloud.google.com/go/auth v0.10.0/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI=
4+
cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk=
5+
cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8=
66
cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo=
77
cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k=
88
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
@@ -235,17 +235,17 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
235235
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
236236
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
237237
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
238-
google.golang.org/api v0.203.0 h1:SrEeuwU3S11Wlscsn+LA1kb/Y5xT8uggJSkIhD08NAU=
239-
google.golang.org/api v0.203.0/go.mod h1:BuOVyCSYEPwJb3npWvDnNmFI92f3GeRnHNkETneT3SI=
238+
google.golang.org/api v0.204.0 h1:3PjmQQEDkR/ENVZZwIYB4W/KzYtN8OrqnNcHWpeR8E4=
239+
google.golang.org/api v0.204.0/go.mod h1:69y8QSoKIbL9F94bWgWAq6wGqGwyjBgi2y8rAK8zLag=
240240
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
241241
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
242242
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
243243
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
244244
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
245245
google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 h1:fVoAXEKA4+yufmbdVYv+SE73+cPZbbbe8paLsHfkK+U=
246246
google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53/go.mod h1:riSXTwQ4+nqmPGtobMFyW5FqVAmIs0St6VPp4Ug7CE4=
247-
google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 h1:X58yt85/IXCx0Y3ZwN6sEIKZzQtDEYaBWrDvErdXrRE=
248-
google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
247+
google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI=
248+
google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
249249
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
250250
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
251251
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=

internal/core/actions.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func scimSync(
3737

3838
groupsCreate, groupsUpdate, groupsEqual, groupsDelete, err := model.GroupsOperations(idpGroupsResult, scimGroupsResult)
3939
if err != nil {
40-
return nil, nil, nil, fmt.Errorf("error reconciling groups: %w", err)
40+
return nil, nil, nil, fmt.Errorf("error operating with groups: %w", err)
4141
}
4242

4343
groupsCreated, groupsUpdated, err := reconcilingGroups(ctx, scim, groupsCreate, groupsUpdate, groupsDelete)

internal/core/sync.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func (ss *SyncService) SyncGroupsAndTheirMembers(ctx context.Context) error {
8181

8282
slog.Info("groups members retrieved from the identity provider for syncing that match the filter",
8383
"group_filter", ss.provGroupsFilter,
84-
"groups_members", idpGroupsMembersResult.Items,
84+
"groups", idpGroupsResult.Items,
8585
)
8686

8787
slog.Info("getting users (using groups members) from the identity provider",

internal/scim/operations.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
// patchGroupOperations assembles the operations for patch groups
99
// bases in the limits of operations we can execute in a single request.
1010
func patchGroupOperations(op, path string, pvs []patchValue, gms *model.GroupMembers) []*aws.PatchGroupRequest {
11-
patchOperations := []*aws.PatchGroupRequest{}
11+
patchOperations := make([]*aws.PatchGroupRequest, 0)
1212

1313
if len(pvs) > MaxPatchGroupMembersPerRequest {
1414
for i := 0; i < len(pvs); i += MaxPatchGroupMembersPerRequest {
@@ -33,9 +33,11 @@ func patchGroupOperations(op, path string, pvs []patchValue, gms *model.GroupMem
3333
},
3434
},
3535
}
36+
3637
patchOperations = append(patchOperations, patchGroupRequest)
3738
}
3839
} else {
40+
3941
patchGroupRequest := &aws.PatchGroupRequest{
4042
Group: aws.Group{
4143
ID: gms.Group.SCIMID,
@@ -52,6 +54,7 @@ func patchGroupOperations(op, path string, pvs []patchValue, gms *model.GroupMem
5254
},
5355
},
5456
}
57+
5558
patchOperations = append(patchOperations, patchGroupRequest)
5659
}
5760

internal/scim/operations_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,14 @@ func Test_patchGroupOperations(t *testing.T) {
134134
})
135135
}
136136
}
137+
138+
func Benchmark_patchGroupOperations(b *testing.B) {
139+
for i := 0; i < b.N; i++ {
140+
patchGroupOperations("add", "members", patchValueGenerator(1, 350), &model.GroupMembers{
141+
Group: &model.Group{
142+
SCIMID: "016722b2be-ee23ed58-6e4e-4b2f-a94a-3ace8456a36e",
143+
Name: "group 1",
144+
},
145+
})
146+
}
147+
}

internal/scim/scim.go

Lines changed: 38 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@ type AWSSCIMProvider interface {
1818
// ListUsers lists users in SCIM Provider
1919
ListUsers(ctx context.Context, filter string) (*aws.ListUsersResponse, error)
2020

21-
// CreateUser creates a user in SCIM Provider
22-
CreateUser(ctx context.Context, u *aws.CreateUserRequest) (*aws.CreateUserResponse, error)
23-
2421
// CreateOrGetUser creates a user in SCIM Provider
2522
CreateOrGetUser(ctx context.Context, u *aws.CreateUserRequest) (*aws.CreateUserResponse, error)
2623

@@ -39,9 +36,6 @@ type AWSSCIMProvider interface {
3936
// ListGroups lists groups in SCIM Provider
4037
ListGroups(ctx context.Context, filter string) (*aws.ListGroupsResponse, error)
4138

42-
// CreateGroup creates a group in SCIM Provider
43-
CreateGroup(ctx context.Context, g *aws.CreateGroupRequest) (*aws.CreateGroupResponse, error)
44-
4539
// CreateOrGetGroup creates a group in SCIM Provider
4640
CreateOrGetGroup(ctx context.Context, g *aws.CreateGroupRequest) (*aws.CreateGroupResponse, error)
4741

@@ -81,24 +75,28 @@ func (s *Provider) GetGroups(ctx context.Context) (*model.GroupsResult, error) {
8175

8276
groups := make([]*model.Group, len(groupsResponse.Resources))
8377
for i, group := range groupsResponse.Resources {
84-
e := model.GroupBuilder().
78+
g := model.GroupBuilder().
8579
WithSCIMID(group.ID).
8680
WithName(group.DisplayName).
8781
WithIPID(group.ExternalID).
8882
Build()
8983

90-
groups[i] = e
84+
groups[i] = g
85+
9186
}
9287

9388
groupsResult := model.GroupsResultBuilder().WithResources(groups).Build()
94-
9589
slog.Debug("scim: GetGroups()", "groups", len(groups))
9690

9791
return groupsResult, nil
9892
}
9993

10094
// CreateGroups creates groups in SCIM Provider
10195
func (s *Provider) CreateGroups(ctx context.Context, gr *model.GroupsResult) (*model.GroupsResult, error) {
96+
if gr == nil {
97+
return nil, fmt.Errorf("scim: error creating groups, groups result is nil")
98+
}
99+
102100
groups := make([]*model.Group, len(gr.Resources))
103101

104102
for i, group := range gr.Resources {
@@ -114,18 +112,17 @@ func (s *Provider) CreateGroups(ctx context.Context, gr *model.GroupsResult) (*m
114112
return nil, fmt.Errorf("scim: error creating group: %w", err)
115113
}
116114

117-
e := model.GroupBuilder().
115+
g := model.GroupBuilder().
118116
WithSCIMID(r.ID).
119117
WithName(group.Name).
120118
WithIPID(group.IPID).
121119
WithEmail(group.Email).
122120
Build()
123121

124-
groups[i] = e
122+
groups[i] = g
125123
}
126124

127125
groupsResult := model.GroupsResultBuilder().WithResources(groups).Build()
128-
129126
slog.Debug("scim: CreateGroups()", "groups", len(groups))
130127

131128
return groupsResult, nil
@@ -162,14 +159,14 @@ func (s *Provider) UpdateGroups(ctx context.Context, gr *model.GroupsResult) (*m
162159
}
163160

164161
// return the same group
165-
e := model.GroupBuilder().
162+
g := model.GroupBuilder().
166163
WithSCIMID(group.SCIMID).
167164
WithName(group.Name).
168165
WithIPID(group.IPID).
169166
WithEmail(group.Email).
170167
Build()
171168

172-
groups[i] = e
169+
groups[i] = g
173170
}
174171

175172
groupsResult := model.GroupsResultBuilder().WithResources(groups).Build()
@@ -200,8 +197,8 @@ func (s *Provider) GetUsers(ctx context.Context) (*model.UsersResult, error) {
200197

201198
users := make([]*model.User, len(usersResponse.Resources))
202199
for i, user := range usersResponse.Resources {
203-
e := buildUser(user)
204-
users[i] = e
200+
u := buildUser(user)
201+
users[i] = u
205202
}
206203

207204
usersResult := model.UsersResultBuilder().WithResources(users).Build()
@@ -286,13 +283,13 @@ type patchValue struct {
286283

287284
// CreateGroupsMembers creates groups members in SCIM Provider given a list of groups members
288285
func (s *Provider) CreateGroupsMembers(ctx context.Context, gmr *model.GroupsMembersResult) (*model.GroupsMembersResult, error) {
289-
groupsMembers := make([]*model.GroupMembers, 0)
286+
groupsMembers := make([]*model.GroupMembers, len(gmr.Resources))
290287

291-
for _, groupMembers := range gmr.Resources {
292-
members := make([]*model.Member, 0)
293-
membersIDValue := []patchValue{}
288+
for i, groupMembers := range gmr.Resources {
289+
members := make([]*model.Member, len(groupMembers.Resources))
290+
membersIDValue := make([]patchValue, len(groupMembers.Resources))
294291

295-
for _, member := range groupMembers.Resources {
292+
for j, member := range groupMembers.Resources {
296293
if member.SCIMID == "" {
297294
u, err := s.scim.GetUserByUserName(ctx, member.Email)
298295
if err != nil {
@@ -301,28 +298,27 @@ func (s *Provider) CreateGroupsMembers(ctx context.Context, gmr *model.GroupsMem
301298
member.SCIMID = u.ID
302299
}
303300

304-
membersIDValue = append(membersIDValue, patchValue{
301+
membersIDValue[j] = patchValue{
305302
Value: member.SCIMID,
306-
})
303+
}
307304

308-
e := model.MemberBuilder().
305+
m := model.MemberBuilder().
309306
WithIPID(member.IPID).
310307
WithSCIMID(member.SCIMID).
311308
WithEmail(member.Email).
312309
WithStatus(member.Status).
313310
Build()
314311

315312
slog.Warn("adding member to group", "group", groupMembers.Group.Name, "email", member.Email)
316-
members = append(members, e)
317-
313+
members[j] = m
318314
}
319315

320-
e := model.GroupMembersBuilder().
316+
gm := model.GroupMembersBuilder().
321317
WithGroup(groupMembers.Group).
322318
WithResources(members).
323319
Build()
324320

325-
groupsMembers = append(groupsMembers, e)
321+
groupsMembers[i] = gm
326322

327323
patchOperations := patchGroupOperations("add", "members", membersIDValue, groupMembers)
328324

@@ -397,9 +393,9 @@ func (s *Provider) GetGroupsMembers(ctx context.Context, gr *model.GroupsResult)
397393
}
398394

399395
for _, gr := range lgr.Resources {
400-
members := make([]*model.Member, 0)
396+
members := make([]*model.Member, len(gr.Members))
401397

402-
for _, member := range gr.Members {
398+
for j, member := range gr.Members {
403399
u, err := s.scim.GetUser(ctx, member.Value)
404400
if err != nil {
405401
return nil, fmt.Errorf("scim: error getting user: %s, error %w", member.Value, err)
@@ -410,15 +406,15 @@ func (s *Provider) GetGroupsMembers(ctx context.Context, gr *model.GroupsResult)
410406
WithEmail(u.Emails[0].Value).
411407
Build()
412408

413-
members = append(members, m)
409+
members[j] = m
414410
}
415411

416-
e := model.GroupMembersBuilder().
412+
gms := model.GroupMembersBuilder().
417413
WithGroup(group).
418414
WithResources(members).
419415
Build()
420416

421-
groupMembers = append(groupMembers, e)
417+
groupMembers = append(groupMembers, gms)
422418
}
423419
}
424420

@@ -431,22 +427,23 @@ func (s *Provider) GetGroupsMembers(ctx context.Context, gr *model.GroupsResult)
431427
// GetGroupsMembersBruteForce returns a list of groups and their members from the SCIM Provider
432428
// NOTE: this is an bad alternative to the method GetGroupsMembers, because read the note in the method.
433429
func (s *Provider) GetGroupsMembersBruteForce(ctx context.Context, gr *model.GroupsResult, ur *model.UsersResult) (*model.GroupsMembersResult, error) {
434-
groupMembers := make([]*model.GroupMembers, 0)
430+
groupMembers := make([]*model.GroupMembers, len(gr.Resources))
435431

436432
// brute force implemented here thanks to the fxxckin' aws sso scim api
437-
for _, group := range gr.Resources {
433+
for i, group := range gr.Resources {
438434
members := make([]*model.Member, 0)
439435

440436
for _, user := range ur.Resources {
441437

442438
// https://docs.aws.amazon.com/singlesignon/latest/developerguide/listgroups.html
443-
f := fmt.Sprintf("id eq %q and members eq %q", group.SCIMID, user.SCIMID)
444-
lgr, err := s.scim.ListGroups(ctx, f)
439+
filter := fmt.Sprintf("id eq %q and members eq %q", group.SCIMID, user.SCIMID)
440+
lgr, err := s.scim.ListGroups(ctx, filter)
445441
if err != nil {
446442
return nil, fmt.Errorf("scim: error listing groups: %w", err)
447443
}
448444

449-
if lgr.TotalResults > 0 { // crazy thing of the AWS SSO SCIM API, it doesn't return the member into the Resources array
445+
// AWS SSO SCIM API, it doesn't return the member into the Resources array
446+
if lgr.TotalResults > 0 {
450447
m := model.MemberBuilder().
451448
WithIPID(user.IPID).
452449
WithSCIMID(user.SCIMID).
@@ -460,12 +457,13 @@ func (s *Provider) GetGroupsMembersBruteForce(ctx context.Context, gr *model.Gro
460457
members = append(members, m)
461458
}
462459
}
463-
e := model.GroupMembersBuilder().
460+
461+
gms := model.GroupMembersBuilder().
464462
WithGroup(group).
465463
WithResources(members).
466464
Build()
467465

468-
groupMembers = append(groupMembers, e)
466+
groupMembers[i] = gms
469467
}
470468

471469
slog.Debug("scim: GetGroupsMembersBruteForce()", "groups_members", len(groupMembers))

0 commit comments

Comments
 (0)