Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: pre-allocate resources #293

Merged
merged 1 commit into from
Nov 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading