Skip to content

Commit

Permalink
feat: pre-allocate resources
Browse files Browse the repository at this point in the history
  • Loading branch information
christiangda committed Nov 1, 2024
1 parent f5ccf60 commit 73ce138
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 28 deletions.
50 changes: 22 additions & 28 deletions internal/scim/scim.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,15 +79,15 @@ func (s *Provider) GetGroups(ctx context.Context) (*model.GroupsResult, error) {
return nil, fmt.Errorf("scim: error listing groups: %w", err)
}

groups := make([]*model.Group, 0)
for _, group := range groupsResponse.Resources {
groups := make([]*model.Group, len(groupsResponse.Resources))
for i, group := range groupsResponse.Resources {
e := model.GroupBuilder().
WithSCIMID(group.ID).
WithName(group.DisplayName).
WithIPID(group.ExternalID).
Build()

groups = append(groups, e)
groups[i] = e
}

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

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

for _, group := range gr.Resources {
for i, group := range gr.Resources {
groupRequest := &aws.CreateGroupRequest{
DisplayName: group.Name,
ExternalID: group.IPID,
}

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

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

groups = append(groups, e)
groups[i] = e
}

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

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

for _, group := range gr.Resources {
for i, group := range gr.Resources {
groupRequest := &aws.PatchGroupRequest{
Group: aws.Group{
ID: group.SCIMID,
Expand Down Expand Up @@ -170,7 +169,7 @@ func (s *Provider) UpdateGroups(ctx context.Context, gr *model.GroupsResult) (*m
WithEmail(group.Email).
Build()

groups = append(groups, e)
groups[i] = e
}

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

users := make([]*model.User, 0)
for _, user := range usersResponse.Resources {
users := make([]*model.User, len(usersResponse.Resources))
for i, user := range usersResponse.Resources {
e := buildUser(user)
users = append(users, e)
users[i] = e
}

usersResult := model.UsersResultBuilder().WithResources(users).Build()

slog.Debug("scim: GetUsers()", "users", len(users))

return usersResult, nil
}

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

for _, user := range ur.Resources {
for i, user := range ur.Resources {
userRequest := buildCreateUserRequest(user)

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

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

users = append(users, user)
users[i] = user
}

usersResult := model.UsersResultBuilder().WithResources(users).Build()

slog.Debug("scim: CreateUsers()", "users", len(users))

return usersResult, nil
}

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

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

users = append(users, user)
users[i] = user
}

usersResult := model.UsersResultBuilder().WithResources(users).Build()

slog.Debug("scim: UpdateUsers()", "users", len(users))

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

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

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

e := model.GroupMembersBuilder().
Expand Down Expand Up @@ -427,9 +422,8 @@ func (s *Provider) GetGroupsMembers(ctx context.Context, gr *model.GroupsResult)
}
}

groupsMembersResult := model.GroupsMembersResultBuilder().WithResources(groupMembers).Build()

slog.Debug("scim: GetGroupsMembers()", "groups_members", len(groupMembers))
groupsMembersResult := model.GroupsMembersResultBuilder().WithResources(groupMembers).Build()

return groupsMembersResult, nil
}
Expand Down Expand Up @@ -462,6 +456,7 @@ func (s *Provider) GetGroupsMembersBruteForce(ctx context.Context, gr *model.Gro
if user.Active {
m.Status = "ACTIVE"
}

members = append(members, m)
}
}
Expand All @@ -473,9 +468,8 @@ func (s *Provider) GetGroupsMembersBruteForce(ctx context.Context, gr *model.Gro
groupMembers = append(groupMembers, e)
}

groupsMembersResult := model.GroupsMembersResultBuilder().WithResources(groupMembers).Build()

slog.Debug("scim: GetGroupsMembersBruteForce()", "groups_members", len(groupMembers))
groupsMembersResult := model.GroupsMembersResultBuilder().WithResources(groupMembers).Build()

return groupsMembersResult, nil
}
23 changes: 23 additions & 0 deletions internal/scim/scim_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,29 @@ func TestGetGroups(t *testing.T) {
assert.Equal(t, "", gr.Resources[0].Email)
assert.Equal(t, "", gr.Resources[1].Email)
})

t.Run("Should return a list of zero groups and no error", func(t *testing.T) {
mockSCIM := mocks.NewMockAWSSCIMProvider(mockCtrl)
groups := &aws.ListGroupsResponse{
ListResponse: aws.ListResponse{
TotalResults: 0,
ItemsPerPage: 0,
StartIndex: 0,
Schemas: []string{"urn:ietf:params:scim:api:messages:2.0:ListResponse"},
},
Resources: []*aws.Group{},
}

mockSCIM.EXPECT().ListGroups(context.TODO(), gomock.Any()).Return(groups, nil)

svc, _ := NewProvider(mockSCIM)
gr, err := svc.GetGroups(context.TODO())

assert.NoError(t, err)
assert.NotNil(t, gr)
assert.Equal(t, 0, len(gr.Resources))
assert.Equal(t, 0, gr.Items)
})
}

func TestCreateGroups(t *testing.T) {
Expand Down
1 change: 1 addition & 0 deletions pkg/aws/scim.go
Original file line number Diff line number Diff line change
Expand Up @@ -816,6 +816,7 @@ func (s *SCIMService) CreateOrGetGroup(ctx context.Context, cgr *CreateGroupRequ
DisplayName: response.DisplayName,
}, nil
}

return nil, e
}

Expand Down

0 comments on commit 73ce138

Please sign in to comment.