Skip to content

Commit f754a9e

Browse files
committed
chore: clean-up code after fetching all pages
1 parent 408f274 commit f754a9e

File tree

6 files changed

+116
-93
lines changed

6 files changed

+116
-93
lines changed

internal/store/integrations.go

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -38,23 +38,3 @@ func (s *Store) Integrations(projectID string) ([]atlasv2.ThirdPartyIntegration,
3838
return page.GetResults(), nil
3939
})
4040
}
41-
42-
type getPageFn[T any] func(int, int) ([]T, error)
43-
44-
func AllPages[T any](getPageFn getPageFn[T]) ([]T, error) {
45-
allPages := []T{}
46-
pageNum := 1
47-
itemsPerPage := MaxAPIPageSize
48-
for {
49-
page, err := getPageFn(pageNum, itemsPerPage)
50-
if err != nil {
51-
return nil, fmt.Errorf("failed to get all pages: %w", err)
52-
}
53-
allPages = append(allPages, page...)
54-
if len(page) < itemsPerPage {
55-
break
56-
}
57-
pageNum += 1
58-
}
59-
return allPages, nil
60-
}

internal/store/network_containers.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@ import (
2121
atlasv2 "go.mongodb.org/atlas-sdk/v20241113004/admin"
2222
)
2323

24-
const (
25-
MaxAPIPageSize = 1 // To increase once done testing!!
26-
)
27-
2824
var (
2925
supportedCloudProviders = []akov2provider.ProviderName{
3026
akov2provider.ProviderAWS,

internal/store/operator.go

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,6 @@ package store
2121
//go:generate mockgen -destination=../mocks/mock_atlas_operator_org_store.go -package=mocks github.com/mongodb/atlas-cli-plugin-kubernetes/internal/store OperatorOrgStore
2222
//go:generate mockgen -destination=../mocks/mock_atlas_generic_store.go -package=mocks github.com/mongodb/atlas-cli-plugin-kubernetes/internal/store OperatorGenericStore
2323

24-
type ListOptions struct {
25-
PageNum int
26-
ItemsPerPage int
27-
IncludeCount bool
28-
}
29-
30-
type ContainersListOptions struct {
31-
ListOptions
32-
ProviderName string
33-
}
34-
3524
type OperatorProjectStore interface {
3625
OperatorTeamsStore
3726
ProjectDescriber

internal/store/store.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ const (
3737
cloudGovServiceURL = "https://cloud.mongodbgov.com/"
3838
)
3939

40+
const (
41+
MaxAPIPageSize = 10
42+
)
43+
4044
var errUnsupportedService = errors.New("unsupported service")
4145

4246
type Store struct {
@@ -291,3 +295,25 @@ func New(opts ...Option) (*Store, error) {
291295

292296
return store, nil
293297
}
298+
299+
// AllPages should be used to retrive all the occurences of a resource
300+
// when listing. If not used, Atlas SDK will fallback to a default amount.
301+
type getPageFn[T any] func(int, int) ([]T, error)
302+
303+
func AllPages[T any](getPageFn getPageFn[T]) ([]T, error) {
304+
allPages := []T{}
305+
pageNum := 1
306+
itemsPerPage := MaxAPIPageSize
307+
for {
308+
page, err := getPageFn(pageNum, itemsPerPage)
309+
if err != nil {
310+
return nil, fmt.Errorf("failed to get all pages: %w", err)
311+
}
312+
allPages = append(allPages, page...)
313+
if len(page) < itemsPerPage {
314+
break
315+
}
316+
pageNum += 1
317+
}
318+
return allPages, nil
319+
}

test/e2e/helper_test.go

Lines changed: 77 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -716,7 +716,7 @@ func deleteStreamsInstance(t *testing.T, projectID, name string) error {
716716
cmd := exec.Command(
717717
cliPath,
718718
streamsEntity,
719-
"instance",
719+
"instances",
720720
"delete",
721721
name,
722722
"--projectId", projectID,
@@ -727,7 +727,6 @@ func deleteStreamsInstance(t *testing.T, projectID, name string) error {
727727
if err != nil {
728728
return fmt.Errorf("%s (%w)", string(resp), err)
729729
}
730-
731730
return nil
732731
}
733732

@@ -934,6 +933,7 @@ func generateTestAtlasIPAccessList(t *testing.T, projectID string, resourceType,
934933
require.NoError(t, err, string(resp))
935934

936935
t.Cleanup(func() {
936+
t.Logf("Deleting IP access list: %s", address)
937937
deleteCmd := exec.Command(cliPath,
938938
accessListEntity, "delete", address,
939939
"--projectId", projectID, "--force")
@@ -959,6 +959,74 @@ func findTestAtlasIPAccessList(objects []rt.Object, projectID string, address st
959959
return nil
960960
}
961961

962+
func generateTestAtlasAlertConfiguration(t *testing.T, projectID, marker string) string {
963+
t.Helper()
964+
cliPath, err := AtlasCLIBin()
965+
require.NoError(t, err)
966+
967+
cmd := exec.Command(cliPath,
968+
alertsEntity, configEntity, "create",
969+
"--projectId", projectID,
970+
"--event", "OUTSIDE_METRIC_THRESHOLD",
971+
"--enabled",
972+
"--metricName", "ASSERT_REGULAR",
973+
"--metricOperator", "GREATER_THAN",
974+
"--metricThreshold", "0",
975+
"--metricUnits", "RAW",
976+
"--metricMode", "AVERAGE",
977+
"--notificationIntervalMin", "42",
978+
"--notificationEmailAddress", "abc@example.com",
979+
"--notificationType", "EMAIL",
980+
"--notificationRegion", "US",
981+
"--matcherFieldName", "HOSTNAME",
982+
"--matcherOperator", "EQUALS",
983+
"--matcherValue", marker,
984+
"-o=json")
985+
cmd.Env = os.Environ()
986+
987+
resp, err := test.RunAndGetStdOut(cmd)
988+
require.NoError(t, err)
989+
990+
var result struct {
991+
ID string `json:"id"`
992+
}
993+
require.NoError(t, json.Unmarshal(resp, &result))
994+
995+
t.Cleanup(func() {
996+
t.Logf("Deleting test alert configuration: %s", result.ID)
997+
deleteCmd := exec.Command(cliPath,
998+
alertsEntity, configEntity, "delete",
999+
result.ID, "--projectId", projectID, "--force")
1000+
deleteCmd.Env = os.Environ()
1001+
_, _ = test.RunAndGetStdOut(deleteCmd)
1002+
})
1003+
1004+
return marker
1005+
}
1006+
1007+
func findTestAtlasAlertConfiguration(objects []rt.Object, projectName string, marker string) *akov2.AtlasProject {
1008+
for _, obj := range objects {
1009+
project, ok := obj.(*akov2.AtlasProject)
1010+
if !ok {
1011+
continue
1012+
}
1013+
1014+
if project.Spec.Name != projectName {
1015+
continue
1016+
}
1017+
1018+
for _, alert := range project.Spec.AlertConfigurations {
1019+
for _, matcher := range alert.Matchers {
1020+
if strings.EqualFold(matcher.FieldName, "HOSTNAME") &&
1021+
strings.EqualFold(matcher.Value, marker) {
1022+
return project
1023+
}
1024+
}
1025+
}
1026+
}
1027+
return nil
1028+
}
1029+
9621030
func generateTestAtlasIntegration(t *testing.T, projectID string, integrationType string) {
9631031
t.Helper()
9641032
cliPath, err := AtlasCLIBin()
@@ -1016,6 +1084,7 @@ func generateTestAtlasDatabaseUser(t *testing.T, projectID string, username stri
10161084
require.NoError(t, err)
10171085

10181086
t.Cleanup(func() {
1087+
t.Logf("Deleting test DB user: %s", username)
10191088
cmd := exec.Command(cliPath,
10201089
dbusersEntity, "delete",
10211090
username,
@@ -1040,65 +1109,14 @@ func findTestAtlasDatabaseUser(objects []rt.Object, projectID string, username s
10401109
return nil
10411110
}
10421111

1043-
func generateTestAtlasIdentityProvider(t *testing.T, federationSettingsID string, displayName string) string {
1044-
t.Helper()
1045-
cliPath, err := AtlasCLIBin()
1046-
require.NoError(t, err)
1047-
1048-
args := []string{
1049-
federatedAuthenticationEntity, federationSettingsEntity, identityProviderEntity, "create", "oidc", displayName,
1050-
"--audience", fmt.Sprintf("https://accounts-%s.google.com", displayName),
1051-
"--authorizationType", "GROUP",
1052-
"--desc", fmt.Sprintf("OIDC provider for %s", displayName),
1053-
"--federationSettingsId", federationSettingsID,
1054-
"--groupsClaim", fmt.Sprintf("group-%s", displayName),
1055-
"--userClaim", fmt.Sprintf("email-%s", displayName),
1056-
"--idpType", "WORKLOAD",
1057-
"--issuerUri", "https://accounts.google.com",
1058-
"-o=json",
1059-
}
1060-
cmd := exec.Command(cliPath, args...)
1061-
cmd.Env = os.Environ()
1062-
resp, err := test.RunAndGetStdOut(cmd)
1063-
require.NoError(t, err)
1064-
1065-
var result struct {
1066-
Id string `json:"id"`
1067-
}
1068-
require.NoError(t, json.Unmarshal(resp, &result))
1069-
1070-
t.Cleanup(func() {
1071-
deleteCmd := exec.Command(cliPath,
1072-
federatedAuthenticationEntity, federationSettingsEntity, identityProviderEntity, "delete",
1073-
result.Id, "--federationSettingsId", federationSettingsID, "--force")
1074-
deleteCmd.Env = os.Environ()
1075-
_, _ = test.RunAndGetStdOut(deleteCmd)
1076-
})
1077-
1078-
return result.Id
1079-
}
1080-
1081-
func findTestAtlasIdentityProvider(objects []rt.Object, idpID string) *akov2.AtlasFederatedAuth {
1082-
for _, obj := range objects {
1083-
if fed, ok := obj.(*akov2.AtlasFederatedAuth); ok && fed.Spec.DataAccessIdentityProviders != nil {
1084-
for _, listed := range *fed.Spec.DataAccessIdentityProviders {
1085-
if listed == idpID {
1086-
return fed
1087-
}
1088-
}
1089-
}
1090-
}
1091-
return nil
1092-
}
1093-
10941112
func generateTestAtlasStreamInstance(t *testing.T, projectID string, instanceName string) string {
10951113
cliPath, err := AtlasCLIBin()
10961114
require.NoError(t, err)
10971115

10981116
cmd := exec.Command(
10991117
cliPath,
11001118
streamsEntity,
1101-
"instance",
1119+
"instances",
11021120
"create",
11031121
instanceName,
11041122
"--projectId", projectID,
@@ -1111,6 +1129,7 @@ func generateTestAtlasStreamInstance(t *testing.T, projectID string, instanceNam
11111129
require.NoError(t, err)
11121130

11131131
t.Cleanup(func() {
1132+
t.Logf("Deleting test Stream Instance: %s", instanceName)
11141133
deleteStreamsInstance(t, projectID, instanceName)
11151134
})
11161135

@@ -1147,7 +1166,8 @@ func generateTestAtlasAdvancedDeployment(t *testing.T, projectID string, cluster
11471166
require.NoError(t, err)
11481167

11491168
t.Cleanup(func() {
1150-
_ = deleteClusterForProject(projectID, clusterName)
1169+
t.Logf("Deleting test Advanced Deployment: %s", clusterName)
1170+
deleteClusterForProject(projectID, clusterName)
11511171
})
11521172

11531173
return clusterName
@@ -1185,7 +1205,8 @@ func generateTestAtlasFlexCluster(t *testing.T, projectID string, clusterName st
11851205
require.NoError(t, err)
11861206

11871207
t.Cleanup(func() {
1188-
_ = deleteClusterForProject(projectID, clusterName)
1208+
t.Logf("Deleting test Advanced Deployment: %s", clusterName)
1209+
deleteClusterForProject(projectID, clusterName)
11891210
})
11901211

11911212
return clusterName

test/e2e/kubernetes_config_generate_test.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3082,6 +3082,13 @@ func TestGenerateMany(t *testing.T) {
30823082
ipAccessList[i] = generateTestAtlasIPAccessList(t, projectID, "ip", ip)
30833083
}
30843084

3085+
// Test alertConfigurations with pagination (25 entries)
3086+
alertMarkers := make([]string, 25)
3087+
for i := range alertMarkers {
3088+
marker := fmt.Sprintf("alert-marker-%02d-%s", i+1, randSuffix(t))
3089+
alertMarkers[i] = generateTestAtlasAlertConfiguration(t, projectID, marker)
3090+
}
3091+
30853092
// Test databaseUsers with pagination (25 entries)
30863093
dbUsers := make([]string, 25)
30873094
for i := range dbUsers {
@@ -3142,14 +3149,18 @@ func TestGenerateMany(t *testing.T) {
31423149
assert.NotNil(t, findTestAtlasIPAccessList(objects, projectID, ip), "IP access list %d with ID %s not found", i+1, ip)
31433150
}
31443151

3145-
for i, typ := range []string{datadogEntity, opsgenieEntity, victoropsEntity, pagerdutyEntity, webhookEntity} {
3146-
assert.NotNil(t, findTestAtlasIntegration(objects, projectID, typ), "Integration %d of type %s not found", i+1, typ)
3152+
for i, marker := range alertMarkers {
3153+
assert.NotNil(t, findTestAtlasAlertConfiguration(objects, projectName, marker), "Alert configuration %d with marker %s not found", i+1, marker)
31473154
}
31483155

31493156
for i, name := range dbUsers {
31503157
assert.NotNil(t, findTestAtlasDatabaseUser(objects, projectID, name), "DB user %d with username %s not found", i+1, name)
31513158
}
31523159

3160+
for i, typ := range []string{datadogEntity, opsgenieEntity, victoropsEntity, pagerdutyEntity, webhookEntity} {
3161+
assert.NotNil(t, findTestAtlasIntegration(objects, projectID, typ), "Integration %d of type %s not found", i+1, typ)
3162+
}
3163+
31533164
for i, name := range streams {
31543165
assert.NotNil(t, findTestAtlasStreamInstance(objects, projectName, name), "Stream instance %d with name %s not found", i+1, name)
31553166
}

0 commit comments

Comments
 (0)