Skip to content

Commit 69cad59

Browse files
authored
Merge pull request #293 from slashdevops/feat-improve-performance
feat: pre-allocate resources
2 parents f5ccf60 + 73ce138 commit 69cad59

File tree

3 files changed

+46
-28
lines changed

3 files changed

+46
-28
lines changed

internal/scim/scim.go

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,15 @@ func (s *Provider) GetGroups(ctx context.Context) (*model.GroupsResult, error) {
7979
return nil, fmt.Errorf("scim: error listing groups: %w", err)
8080
}
8181

82-
groups := make([]*model.Group, 0)
83-
for _, group := range groupsResponse.Resources {
82+
groups := make([]*model.Group, len(groupsResponse.Resources))
83+
for i, group := range groupsResponse.Resources {
8484
e := model.GroupBuilder().
8585
WithSCIMID(group.ID).
8686
WithName(group.DisplayName).
8787
WithIPID(group.ExternalID).
8888
Build()
8989

90-
groups = append(groups, e)
90+
groups[i] = e
9191
}
9292

9393
groupsResult := model.GroupsResultBuilder().WithResources(groups).Build()
@@ -99,17 +99,16 @@ func (s *Provider) GetGroups(ctx context.Context) (*model.GroupsResult, error) {
9999

100100
// CreateGroups creates groups in SCIM Provider
101101
func (s *Provider) CreateGroups(ctx context.Context, gr *model.GroupsResult) (*model.GroupsResult, error) {
102-
groups := make([]*model.Group, 0)
102+
groups := make([]*model.Group, len(gr.Resources))
103103

104-
for _, group := range gr.Resources {
104+
for i, group := range gr.Resources {
105105
groupRequest := &aws.CreateGroupRequest{
106106
DisplayName: group.Name,
107107
ExternalID: group.IPID,
108108
}
109109

110110
slog.Warn("creating group", "group", group.Name)
111111

112-
// TODO: r, err := s.scim.CreateGroup(ctx, groupRequest)
113112
r, err := s.scim.CreateOrGetGroup(ctx, groupRequest)
114113
if err != nil {
115114
return nil, fmt.Errorf("scim: error creating group: %w", err)
@@ -122,7 +121,7 @@ func (s *Provider) CreateGroups(ctx context.Context, gr *model.GroupsResult) (*m
122121
WithEmail(group.Email).
123122
Build()
124123

125-
groups = append(groups, e)
124+
groups[i] = e
126125
}
127126

128127
groupsResult := model.GroupsResultBuilder().WithResources(groups).Build()
@@ -134,9 +133,9 @@ func (s *Provider) CreateGroups(ctx context.Context, gr *model.GroupsResult) (*m
134133

135134
// UpdateGroups updates groups in SCIM Provider
136135
func (s *Provider) UpdateGroups(ctx context.Context, gr *model.GroupsResult) (*model.GroupsResult, error) {
137-
groups := make([]*model.Group, 0)
136+
groups := make([]*model.Group, len(gr.Resources))
138137

139-
for _, group := range gr.Resources {
138+
for i, group := range gr.Resources {
140139
groupRequest := &aws.PatchGroupRequest{
141140
Group: aws.Group{
142141
ID: group.SCIMID,
@@ -170,7 +169,7 @@ func (s *Provider) UpdateGroups(ctx context.Context, gr *model.GroupsResult) (*m
170169
WithEmail(group.Email).
171170
Build()
172171

173-
groups = append(groups, e)
172+
groups[i] = e
174173
}
175174

176175
groupsResult := model.GroupsResultBuilder().WithResources(groups).Build()
@@ -199,29 +198,27 @@ func (s *Provider) GetUsers(ctx context.Context) (*model.UsersResult, error) {
199198
return nil, fmt.Errorf("scim: error listing users: %w", err)
200199
}
201200

202-
users := make([]*model.User, 0)
203-
for _, user := range usersResponse.Resources {
201+
users := make([]*model.User, len(usersResponse.Resources))
202+
for i, user := range usersResponse.Resources {
204203
e := buildUser(user)
205-
users = append(users, e)
204+
users[i] = e
206205
}
207206

208207
usersResult := model.UsersResultBuilder().WithResources(users).Build()
209-
210208
slog.Debug("scim: GetUsers()", "users", len(users))
211209

212210
return usersResult, nil
213211
}
214212

215213
// CreateUsers creates users in SCIM Provider
216214
func (s *Provider) CreateUsers(ctx context.Context, ur *model.UsersResult) (*model.UsersResult, error) {
217-
users := make([]*model.User, 0)
215+
users := make([]*model.User, len(ur.Resources))
218216

219-
for _, user := range ur.Resources {
217+
for i, user := range ur.Resources {
220218
userRequest := buildCreateUserRequest(user)
221219

222220
slog.Warn("creating user", "user", user.DisplayName, "email", user.GetPrimaryEmailAddress())
223221

224-
// TODO: r, err := s.scim.CreateUser(ctx, userRequest)
225222
cogu, err := s.scim.CreateOrGetUser(ctx, userRequest)
226223
if err != nil {
227224
return nil, fmt.Errorf("scim: error creating user: %w", err)
@@ -230,21 +227,20 @@ func (s *Provider) CreateUsers(ctx context.Context, ur *model.UsersResult) (*mod
230227
user.SCIMID = cogu.ID
231228
user.SetHashCode()
232229

233-
users = append(users, user)
230+
users[i] = user
234231
}
235232

236233
usersResult := model.UsersResultBuilder().WithResources(users).Build()
237-
238234
slog.Debug("scim: CreateUsers()", "users", len(users))
239235

240236
return usersResult, nil
241237
}
242238

243239
// UpdateUsers updates users in SCIM Provider given a list of users
244240
func (s *Provider) UpdateUsers(ctx context.Context, ur *model.UsersResult) (*model.UsersResult, error) {
245-
users := make([]*model.User, 0)
241+
users := make([]*model.User, len(ur.Resources))
246242

247-
for _, user := range ur.Resources {
243+
for i, user := range ur.Resources {
248244
if user.SCIMID == "" {
249245
return nil, fmt.Errorf("scim: error updating user, user ID is empty: %s", user.SCIMID)
250246
}
@@ -262,11 +258,10 @@ func (s *Provider) UpdateUsers(ctx context.Context, ur *model.UsersResult) (*mod
262258
user.SCIMID = pur.ID
263259
user.SetHashCode()
264260

265-
users = append(users, user)
261+
users[i] = user
266262
}
267263

268264
usersResult := model.UsersResultBuilder().WithResources(users).Build()
269-
270265
slog.Debug("scim: UpdateUsers()", "users", len(users))
271266

272267
return usersResult, nil
@@ -317,9 +312,9 @@ func (s *Provider) CreateGroupsMembers(ctx context.Context, gmr *model.GroupsMem
317312
WithStatus(member.Status).
318313
Build()
319314

315+
slog.Warn("adding member to group", "group", groupMembers.Group.Name, "email", member.Email)
320316
members = append(members, e)
321317

322-
slog.Warn("adding member to group", "group", groupMembers.Group.Name, "email", member.Email)
323318
}
324319

325320
e := model.GroupMembersBuilder().
@@ -427,9 +422,8 @@ func (s *Provider) GetGroupsMembers(ctx context.Context, gr *model.GroupsResult)
427422
}
428423
}
429424

430-
groupsMembersResult := model.GroupsMembersResultBuilder().WithResources(groupMembers).Build()
431-
432425
slog.Debug("scim: GetGroupsMembers()", "groups_members", len(groupMembers))
426+
groupsMembersResult := model.GroupsMembersResultBuilder().WithResources(groupMembers).Build()
433427

434428
return groupsMembersResult, nil
435429
}
@@ -462,6 +456,7 @@ func (s *Provider) GetGroupsMembersBruteForce(ctx context.Context, gr *model.Gro
462456
if user.Active {
463457
m.Status = "ACTIVE"
464458
}
459+
465460
members = append(members, m)
466461
}
467462
}
@@ -473,9 +468,8 @@ func (s *Provider) GetGroupsMembersBruteForce(ctx context.Context, gr *model.Gro
473468
groupMembers = append(groupMembers, e)
474469
}
475470

476-
groupsMembersResult := model.GroupsMembersResultBuilder().WithResources(groupMembers).Build()
477-
478471
slog.Debug("scim: GetGroupsMembersBruteForce()", "groups_members", len(groupMembers))
472+
groupsMembersResult := model.GroupsMembersResultBuilder().WithResources(groupMembers).Build()
479473

480474
return groupsMembersResult, nil
481475
}

internal/scim/scim_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,29 @@ func TestGetGroups(t *testing.T) {
136136
assert.Equal(t, "", gr.Resources[0].Email)
137137
assert.Equal(t, "", gr.Resources[1].Email)
138138
})
139+
140+
t.Run("Should return a list of zero groups and no error", func(t *testing.T) {
141+
mockSCIM := mocks.NewMockAWSSCIMProvider(mockCtrl)
142+
groups := &aws.ListGroupsResponse{
143+
ListResponse: aws.ListResponse{
144+
TotalResults: 0,
145+
ItemsPerPage: 0,
146+
StartIndex: 0,
147+
Schemas: []string{"urn:ietf:params:scim:api:messages:2.0:ListResponse"},
148+
},
149+
Resources: []*aws.Group{},
150+
}
151+
152+
mockSCIM.EXPECT().ListGroups(context.TODO(), gomock.Any()).Return(groups, nil)
153+
154+
svc, _ := NewProvider(mockSCIM)
155+
gr, err := svc.GetGroups(context.TODO())
156+
157+
assert.NoError(t, err)
158+
assert.NotNil(t, gr)
159+
assert.Equal(t, 0, len(gr.Resources))
160+
assert.Equal(t, 0, gr.Items)
161+
})
139162
}
140163

141164
func TestCreateGroups(t *testing.T) {

pkg/aws/scim.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -816,6 +816,7 @@ func (s *SCIMService) CreateOrGetGroup(ctx context.Context, cgr *CreateGroupRequ
816816
DisplayName: response.DisplayName,
817817
}, nil
818818
}
819+
819820
return nil, e
820821
}
821822

0 commit comments

Comments
 (0)