Skip to content

Commit e30d613

Browse files
committed
fix: pagination fix for ipAcessList
1 parent 10a0ece commit e30d613

File tree

9 files changed

+159
-113
lines changed

9 files changed

+159
-113
lines changed

internal/kubernetes/operator/project/ipaccesslist.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,20 @@ func BuildIPAccessList(
4040
provider store.ProjectIPAccessListLister,
4141
request IPAccessListRequest,
4242
) (*akov2.AtlasIPAccessList, bool, error) {
43-
ipAccessLists, err := provider.ProjectIPAccessLists(request.ProjectID, &store.ListOptions{ItemsPerPage: MaxItems})
43+
pages, err := provider.ProjectIPAccessLists(request.ProjectID)
4444
if err != nil {
4545
return nil, false, err
4646
}
4747

48-
if len(ipAccessLists.GetResults()) == 0 {
49-
return nil, true, nil
48+
var entries []akov2.IPAccessEntry
49+
for _, page := range pages {
50+
for _, ipAccessList := range page.GetResults() {
51+
entries = append(entries, fromAtlas(ipAccessList))
52+
}
5053
}
5154

52-
entries := make([]akov2.IPAccessEntry, 0, len(ipAccessLists.GetResults()))
53-
for _, ipAccessList := range ipAccessLists.GetResults() {
54-
entries = append(entries, fromAtlas(ipAccessList))
55+
if len(entries) == 0 {
56+
return nil, true, nil
5557
}
5658

5759
resource := akov2.AtlasIPAccessList{

internal/kubernetes/operator/project/ipaccesslist_test.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"github.com/mongodb/atlas-cli-plugin-kubernetes/internal/kubernetes/operator/resources"
2626
"github.com/mongodb/atlas-cli-plugin-kubernetes/internal/mocks"
2727
"github.com/mongodb/atlas-cli-plugin-kubernetes/internal/pointer"
28-
"github.com/mongodb/atlas-cli-plugin-kubernetes/internal/store"
2928
akoapi "github.com/mongodb/mongodb-atlas-kubernetes/v2/api"
3029
akov2 "github.com/mongodb/mongodb-atlas-kubernetes/v2/api/v1"
3130
akov2common "github.com/mongodb/mongodb-atlas-kubernetes/v2/api/v1/common"
@@ -177,8 +176,11 @@ func TestBuildIPAccessList(t *testing.T) {
177176
ialStore := mocks.NewMockProjectIPAccessListLister(ctl)
178177
dictionary := resources.AtlasNameToKubernetesName()
179178

180-
ialStore.EXPECT().ProjectIPAccessLists(projectID, &store.ListOptions{ItemsPerPage: MaxItems}).
181-
Return(&admin.PaginatedNetworkAccess{Results: &tt.ipAccessList}, nil)
179+
ialStore.EXPECT().
180+
ProjectIPAccessLists(projectID).
181+
Return([]*admin.PaginatedNetworkAccess{
182+
&admin.PaginatedNetworkAccess{Results: &tt.ipAccessList},
183+
}, nil)
182184

183185
atlasIPAccessList, isEmpty, err := BuildIPAccessList(
184186
ialStore,

internal/kubernetes/operator/project/project.go

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -322,29 +322,31 @@ func projectBuildCustomRoles(crProvider store.DatabaseRoleLister, projectID stri
322322
}
323323

324324
func buildAccessLists(accessListProvider store.ProjectIPAccessListLister, projectID string) ([]akov2project.IPAccessList, error) {
325-
// pagination not required, max 200 entries can be configured via API
326-
accessLists, err := accessListProvider.ProjectIPAccessLists(projectID, &store.ListOptions{ItemsPerPage: MaxItems})
325+
pages, err := accessListProvider.ProjectIPAccessLists(projectID)
327326
if err != nil {
328327
return nil, err
329328
}
330329

331-
result := make([]akov2project.IPAccessList, 0, len(accessLists.GetResults()))
332-
for _, list := range accessLists.GetResults() {
333-
if strings.HasSuffix(list.GetCidrBlock(), cidrException) && list.GetIpAddress() != "" {
334-
list.CidrBlock = pointer.Get("")
335-
}
336-
deleteAfterDate := ""
337-
if !list.GetDeleteAfterDate().IsZero() {
338-
deleteAfterDate = list.GetDeleteAfterDate().String()
330+
var result []akov2project.IPAccessList
331+
for _, page := range pages {
332+
for _, ipAccessList := range page.GetResults() {
333+
if strings.HasSuffix(ipAccessList.GetCidrBlock(), cidrException) && ipAccessList.GetIpAddress() != "" {
334+
ipAccessList.CidrBlock = pointer.Get("")
335+
}
336+
deleteAfterDate := ""
337+
if !ipAccessList.GetDeleteAfterDate().IsZero() {
338+
deleteAfterDate = ipAccessList.GetDeleteAfterDate().String()
339+
}
340+
result = append(result, akov2project.IPAccessList{
341+
AwsSecurityGroup: ipAccessList.GetAwsSecurityGroup(),
342+
CIDRBlock: ipAccessList.GetCidrBlock(),
343+
Comment: ipAccessList.GetComment(),
344+
DeleteAfterDate: deleteAfterDate,
345+
IPAddress: ipAccessList.GetIpAddress(),
346+
})
339347
}
340-
result = append(result, akov2project.IPAccessList{
341-
AwsSecurityGroup: list.GetAwsSecurityGroup(),
342-
CIDRBlock: list.GetCidrBlock(),
343-
Comment: list.GetComment(),
344-
DeleteAfterDate: deleteAfterDate,
345-
IPAddress: list.GetIpAddress(),
346-
})
347348
}
349+
348350
return result, nil
349351
}
350352

internal/kubernetes/operator/project/project_test.go

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -63,19 +63,21 @@ func TestBuildAtlasProject(t *testing.T) {
6363
WithDefaultAlertsSettings: pointer.Get(false),
6464
}
6565

66-
ipAccessLists := &atlasv2.PaginatedNetworkAccess{
67-
Links: nil,
68-
Results: &[]atlasv2.NetworkPermissionEntry{
69-
{
70-
AwsSecurityGroup: pointer.Get("TestSecurity group"),
71-
CidrBlock: pointer.Get("0.0.0.0/0"),
72-
Comment: pointer.Get("Allow everyone"),
73-
DeleteAfterDate: pointer.Get(time.Now()),
74-
GroupId: pointer.Get("TestGroupID"),
75-
IpAddress: pointer.Get("0.0.0.0"),
66+
ipAccessLists := []*atlasv2.PaginatedNetworkAccess{
67+
{
68+
Links: nil,
69+
Results: &[]atlasv2.NetworkPermissionEntry{
70+
{
71+
AwsSecurityGroup: pointer.Get("TestSecurity group"),
72+
CidrBlock: pointer.Get("0.0.0.0/0"),
73+
Comment: pointer.Get("Allow everyone"),
74+
DeleteAfterDate: pointer.Get(time.Now()),
75+
GroupId: pointer.Get("TestGroupID"),
76+
IpAddress: pointer.Get("0.0.0.0"),
77+
},
7678
},
79+
TotalCount: pointer.Get(1),
7780
},
78-
TotalCount: pointer.Get(1),
7981
}
8082

8183
auditing := &atlasv2.AuditLog{
@@ -436,11 +438,11 @@ func TestBuildAtlasProject(t *testing.T) {
436438
},
437439
ProjectIPAccessList: []akov2project.IPAccessList{
438440
{
439-
AwsSecurityGroup: ipAccessLists.GetResults()[0].GetAwsSecurityGroup(),
440-
CIDRBlock: ipAccessLists.GetResults()[0].GetCidrBlock(),
441-
Comment: ipAccessLists.GetResults()[0].GetComment(),
442-
DeleteAfterDate: ipAccessLists.GetResults()[0].GetDeleteAfterDate().String(),
443-
IPAddress: ipAccessLists.GetResults()[0].GetIpAddress(),
441+
AwsSecurityGroup: ipAccessLists[0].GetResults()[0].GetAwsSecurityGroup(),
442+
CIDRBlock: ipAccessLists[0].GetResults()[0].GetCidrBlock(),
443+
Comment: ipAccessLists[0].GetResults()[0].GetComment(),
444+
DeleteAfterDate: ipAccessLists[0].GetResults()[0].GetDeleteAfterDate().String(),
445+
IPAddress: ipAccessLists[0].GetResults()[0].GetIpAddress(),
444446
},
445447
},
446448
MaintenanceWindow: akov2project.MaintenanceWindow{
@@ -687,7 +689,7 @@ func TestBuildAtlasProject(t *testing.T) {
687689
projectStore.EXPECT().DescribeCompliancePolicy(projectID).Return(bcp, nil)
688690
tt.privateEndpointMock(projectStore)
689691
if !tt.independentResource {
690-
projectStore.EXPECT().ProjectIPAccessLists(projectID, listOption).Return(ipAccessLists, nil)
692+
projectStore.EXPECT().ProjectIPAccessLists(projectID).Return(ipAccessLists, nil)
691693
projectStore.EXPECT().DatabaseRoles(projectID).Return(customRoles, nil)
692694
projectStore.EXPECT().PeeringConnections(projectID).Return(peeringConnections, nil)
693695
projectStore.EXPECT().Integrations(projectID).Return(thirdPartyIntegrations, nil)
@@ -817,24 +819,24 @@ func Test_buildAccessLists(t *testing.T) {
817819

818820
alProvider := mocks.NewMockProjectIPAccessListLister(ctl)
819821
t.Run("Can convert Access Lists", func(t *testing.T) {
820-
data := &atlasv2.PaginatedNetworkAccess{
821-
Links: nil,
822-
Results: &[]atlasv2.NetworkPermissionEntry{
823-
{
824-
AwsSecurityGroup: pointer.Get("TestSecGroup"),
825-
CidrBlock: pointer.Get("0.0.0.0/0"),
826-
Comment: pointer.Get("TestComment"),
827-
DeleteAfterDate: pointer.Get(time.Now()),
828-
GroupId: pointer.Get("TestGroupID"),
829-
IpAddress: pointer.Get("0.0.0.0"),
822+
data := []*atlasv2.PaginatedNetworkAccess{
823+
{
824+
Links: nil,
825+
Results: &[]atlasv2.NetworkPermissionEntry{
826+
{
827+
AwsSecurityGroup: pointer.Get("TestSecGroup"),
828+
CidrBlock: pointer.Get("0.0.0.0/0"),
829+
Comment: pointer.Get("TestComment"),
830+
DeleteAfterDate: pointer.Get(time.Now()),
831+
GroupId: pointer.Get("TestGroupID"),
832+
IpAddress: pointer.Get("0.0.0.0"),
833+
},
830834
},
835+
TotalCount: pointer.Get(1),
831836
},
832-
TotalCount: pointer.Get(1),
833837
}
834838

835-
listOptions := &store.ListOptions{ItemsPerPage: MaxItems}
836-
837-
alProvider.EXPECT().ProjectIPAccessLists(projectID, listOptions).Return(data, nil)
839+
alProvider.EXPECT().ProjectIPAccessLists(projectID).Return(data, nil)
838840

839841
got, err := buildAccessLists(alProvider, projectID)
840842
if err != nil {
@@ -843,11 +845,11 @@ func Test_buildAccessLists(t *testing.T) {
843845

844846
expected := []akov2project.IPAccessList{
845847
{
846-
AwsSecurityGroup: data.GetResults()[0].GetAwsSecurityGroup(),
847-
CIDRBlock: data.GetResults()[0].GetCidrBlock(),
848-
Comment: data.GetResults()[0].GetComment(),
849-
DeleteAfterDate: data.GetResults()[0].GetDeleteAfterDate().String(),
850-
IPAddress: data.GetResults()[0].GetIpAddress(),
848+
AwsSecurityGroup: data[0].GetResults()[0].GetAwsSecurityGroup(),
849+
CIDRBlock: data[0].GetResults()[0].GetCidrBlock(),
850+
Comment: data[0].GetResults()[0].GetComment(),
851+
DeleteAfterDate: data[0].GetResults()[0].GetDeleteAfterDate().String(),
852+
IPAddress: data[0].GetResults()[0].GetIpAddress(),
851853
},
852854
}
853855

internal/mocks/mock_atlas_generic_store.go

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/mocks/mock_atlas_operator_project_store.go

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/mocks/mock_project_ip_access_lists.go

Lines changed: 5 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/store/project_ip_access_lists.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,30 @@
1515
package store
1616

1717
import (
18+
"fmt"
19+
1820
atlasv2 "go.mongodb.org/atlas-sdk/v20241113004/admin"
1921
)
2022

2123
//go:generate mockgen -destination=../mocks/mock_project_ip_access_lists.go -package=mocks github.com/mongodb/atlas-cli-plugin-kubernetes/internal/store ProjectIPAccessListLister
2224

2325
type ProjectIPAccessListLister interface {
24-
ProjectIPAccessLists(string, *ListOptions) (*atlasv2.PaginatedNetworkAccess, error)
26+
ProjectIPAccessLists(string) ([]*atlasv2.PaginatedNetworkAccess, error)
2527
}
2628

2729
// ProjectIPAccessLists encapsulate the logic to manage different cloud providers.
28-
func (s *Store) ProjectIPAccessLists(projectID string, opts *ListOptions) (*atlasv2.PaginatedNetworkAccess, error) {
29-
res := s.clientv2.ProjectIPAccessListApi.ListProjectIpAccessLists(s.ctx, projectID)
30-
if opts != nil {
31-
res = res.PageNum(opts.PageNum).ItemsPerPage(fixPageSize(opts.ItemsPerPage)).IncludeCount(opts.IncludeCount)
32-
}
33-
result, _, err := res.Execute()
34-
return result, err
30+
func (s *Store) ProjectIPAccessLists(projectID string) ([]*atlasv2.PaginatedNetworkAccess, error) {
31+
return AllPages(func(pageNum, itemsPerPage int) ([]*atlasv2.PaginatedNetworkAccess, error) {
32+
req := s.clientv2.ProjectIPAccessListApi.ListProjectIpAccessLists(s.ctx, projectID).
33+
PageNum(pageNum).
34+
ItemsPerPage(itemsPerPage)
35+
36+
page, _, err := req.Execute()
37+
if err != nil {
38+
return nil, fmt.Errorf("failed to list project IP access lists: %w", err)
39+
}
40+
41+
fmt.Printf("Page %d results: %+v\n", pageNum, page.GetResults())
42+
return []*atlasv2.PaginatedNetworkAccess{page}, nil
43+
})
3544
}

0 commit comments

Comments
 (0)