Skip to content

Commit a5eb069

Browse files
Atlas Operator Import: Added E2E tests (#1544)
1 parent 0acfb08 commit a5eb069

File tree

7 files changed

+459
-26
lines changed

7 files changed

+459
-26
lines changed

go.mod

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ require (
1010
github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.9.0
1111
github.com/Masterminds/semver/v3 v3.2.0
1212
github.com/PaesslerAG/jsonpath v0.1.1
13-
github.com/aws/aws-sdk-go v1.44.146
13+
github.com/aws/aws-sdk-go v1.44.151
1414
github.com/briandowns/spinner v1.19.0
1515
github.com/evergreen-ci/shrub v0.0.0-20220520145438-44fbdf0045c8
1616
github.com/gemalto/kmip-go v0.0.6-0.20210426170211-84e83580888d
@@ -22,7 +22,7 @@ require (
2222
github.com/mattn/go-isatty v0.0.16
2323
github.com/mongodb-forks/digest v1.0.4
2424
github.com/mongodb-labs/cobra2snooty v0.12.2
25-
github.com/mongodb/mongodb-atlas-kubernetes v1.4.2-0.20221201111116-f392310fe252
25+
github.com/mongodb/mongodb-atlas-kubernetes v1.5.0
2626
github.com/openlyinc/pointy v1.2.0
2727
github.com/pelletier/go-toml v1.9.5
2828
github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4
@@ -102,10 +102,10 @@ require (
102102
go.uber.org/atomic v1.9.0 // indirect
103103
go.uber.org/multierr v1.8.0 // indirect
104104
go.uber.org/zap v1.23.0 // indirect
105-
golang.org/x/net v0.1.0 // indirect
105+
golang.org/x/net v0.2.0 // indirect
106106
golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect
107-
golang.org/x/sys v0.1.0 // indirect
108-
golang.org/x/term v0.1.0 // indirect
107+
golang.org/x/sys v0.2.0 // indirect
108+
golang.org/x/term v0.2.0 // indirect
109109
golang.org/x/text v0.4.0 // indirect
110110
golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect
111111
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect

go.sum

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko
7878
github.com/ansel1/merry v1.5.0/go.mod h1:wUy/yW0JX0ix9GYvUbciq+bi3jW/vlKPlbpI7qdZpOw=
7979
github.com/ansel1/merry v1.5.1 h1:/MlZd3Irx2HQsUlOcXTTYev7N1t1Rsdnxwg6xkOVJp4=
8080
github.com/ansel1/merry v1.5.1/go.mod h1:wUy/yW0JX0ix9GYvUbciq+bi3jW/vlKPlbpI7qdZpOw=
81-
github.com/aws/aws-sdk-go v1.44.146 h1:7YdGgPxDPRJu/yYffzZp/H7yHzQ6AqmuNFZPYraaN8I=
82-
github.com/aws/aws-sdk-go v1.44.146/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
81+
github.com/aws/aws-sdk-go v1.44.151 h1:2FrJZm3kTcyTtfpE7LEQT9XW+jkoi4KEvBhFWqHEZmo=
82+
github.com/aws/aws-sdk-go v1.44.151/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
8383
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
8484
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
8585
github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E=
@@ -300,17 +300,17 @@ github.com/mongodb-forks/digest v1.0.4 h1:9FrGTc7MGAchgaQBcXBnEwUM/Oo8obW7OGWxns
300300
github.com/mongodb-forks/digest v1.0.4/go.mod h1:eHRfgovT+dvSFfltrOa27hy1oR/rcwyDdp5H1ZQxEMA=
301301
github.com/mongodb-labs/cobra2snooty v0.12.2 h1:elp0tRGcOHixj00+vAvscsGelDVLjeWKBJMwDdpg7bg=
302302
github.com/mongodb-labs/cobra2snooty v0.12.2/go.mod h1:35BYcRwKG+Lu+bKidg7lw1RT8W4K3zLsExyMLyTZB7U=
303-
github.com/mongodb/mongodb-atlas-kubernetes v1.4.2-0.20221201111116-f392310fe252 h1:t8erMun/w0rn9MGCsBzi9scSEBa+QQHI7hxc3nnKQsA=
304-
github.com/mongodb/mongodb-atlas-kubernetes v1.4.2-0.20221201111116-f392310fe252/go.mod h1:imHiPWtckmjn8Qte2kT/tV0rKrhnQUW5jPCiq/lH/Vs=
303+
github.com/mongodb/mongodb-atlas-kubernetes v1.5.0 h1:czdV5fQ0DfiZOEfeu9Mvn90b7tB/y1PVf2ck9Eq8zfI=
304+
github.com/mongodb/mongodb-atlas-kubernetes v1.5.0/go.mod h1:AMsM1HTofYNJlx47BXZK6ngRqMRY2Dl+q55iqSsU9D0=
305305
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
306306
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
307307
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
308308
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
309309
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
310310
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
311311
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
312-
github.com/onsi/ginkgo/v2 v2.4.0 h1:+Ig9nvqgS5OBSACXNk15PLdp0U9XPYROt9CFzVdFGIs=
313-
github.com/onsi/gomega v1.22.1 h1:pY8O4lBfsHKZHM/6nrxkhVPUznOlIu3quZcKP/M20KI=
312+
github.com/onsi/ginkgo/v2 v2.5.0 h1:TRtrvv2vdQqzkwrQ1ke6vtXf7IK34RBUJafIy1wMwls=
313+
github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E=
314314
github.com/openlyinc/pointy v1.2.0 h1:vbb/WoPbshyTH8j3/XYu3enlZfv+NHxAD15qTm1zbk0=
315315
github.com/openlyinc/pointy v1.2.0/go.mod h1:JodZOTJoBNaAQHeU0F/SwA4PL0lg4pKF7fYFpX291P0=
316316
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
@@ -492,8 +492,9 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
492492
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
493493
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
494494
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
495-
golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0=
496495
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
496+
golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU=
497+
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
497498
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
498499
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
499500
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -566,13 +567,15 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
566567
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
567568
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
568569
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
569-
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
570570
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
571+
golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
572+
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
571573
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
572574
golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY=
573575
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
574-
golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw=
575576
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
577+
golang.org/x/term v0.2.0 h1:z85xZCsEl7bi/KwbNADeBYoOP0++7W1ipu+aGnpwzRM=
578+
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
576579
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
577580
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
578581
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

internal/kubernetes/operator/config_exporter.go

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,16 @@ import (
2323
"github.com/mongodb/mongodb-atlas-cli/internal/kubernetes/operator/deployment"
2424
"github.com/mongodb/mongodb-atlas-cli/internal/kubernetes/operator/project"
2525
"github.com/mongodb/mongodb-atlas-cli/internal/store"
26+
"go.mongodb.org/atlas/mongodbatlas"
2627
"k8s.io/apimachinery/pkg/runtime"
2728
"k8s.io/apimachinery/pkg/runtime/serializer/json"
2829
"k8s.io/client-go/kubernetes/scheme"
2930
)
3031

3132
const (
32-
yamlSeparator = "---\r\n"
33+
yamlSeparator = "---\r\n"
34+
maxClusters = 500
35+
DefaultClustersCount = 10
3336
)
3437

3538
type ConfigExporter struct {
@@ -43,7 +46,9 @@ type ConfigExporter struct {
4346
}
4447

4548
var (
46-
ErrClusterNotFound = errors.New("cluster not found")
49+
ErrClusterNotFound = errors.New("cluster not found")
50+
ErrNoOpsManagerClusters = errors.New("can not get 'clusters' object")
51+
ErrNoCloudManagerClusters = errors.New("can not get 'advanced clusters' object")
4752
)
4853

4954
func NewConfigExporter(dataProvider store.AtlasOperatorGenericStore, credsProvider store.CredentialsGetter, projectID, orgID string) *ConfigExporter {
@@ -146,6 +151,14 @@ func (e *ConfigExporter) exportProject() ([]runtime.Object, string, error) {
146151
func (e *ConfigExporter) exportDeployments(projectName string) ([]runtime.Object, error) {
147152
var result []runtime.Object
148153

154+
if len(e.clusters) == 0 {
155+
clusters, err := fetchClusterNames(e.dataProvider, e.projectID)
156+
if err != nil {
157+
return nil, err
158+
}
159+
e.clusters = clusters
160+
}
161+
149162
for _, deploymentName := range e.clusters {
150163
// Try advanced cluster first
151164
if advancedCluster, err := deployment.BuildAtlasAdvancedDeployment(e.dataProvider, e.projectID, projectName, deploymentName, e.targetNamespace); err == nil {
@@ -173,3 +186,44 @@ func (e *ConfigExporter) exportDeployments(projectName string) ([]runtime.Object
173186
}
174187
return result, nil
175188
}
189+
190+
func fetchClusterNames(clustersProvider store.AtlasAllClustersLister, projectID string) ([]string, error) {
191+
result := make([]string, 0, DefaultClustersCount)
192+
response, err := clustersProvider.ProjectClusters(projectID, &mongodbatlas.ListOptions{ItemsPerPage: maxClusters})
193+
if err != nil {
194+
return nil, err
195+
}
196+
197+
if clusters, ok := response.(*mongodbatlas.AdvancedClustersResponse); ok {
198+
if clusters == nil {
199+
return nil, ErrNoCloudManagerClusters
200+
}
201+
202+
for i := range clusters.Results {
203+
cluster := clusters.Results[i]
204+
if cluster == nil {
205+
continue
206+
}
207+
result = append(result, cluster.Name)
208+
}
209+
}
210+
211+
serverlessInstances, err := clustersProvider.ServerlessInstances(projectID, &mongodbatlas.ListOptions{ItemsPerPage: maxClusters})
212+
if err != nil {
213+
return nil, err
214+
}
215+
216+
if serverlessInstances == nil {
217+
return result, nil
218+
}
219+
220+
for i := range serverlessInstances.Results {
221+
cluster := serverlessInstances.Results[i]
222+
if cluster == nil {
223+
continue
224+
}
225+
result = append(result, serverlessInstances.Results[i].Name)
226+
}
227+
228+
return result, nil
229+
}

internal/kubernetes/operator/deployment/deployment_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,42 @@ type MockAtlasOperatorClusterStore struct {
4040
projectIDToServerlessPrivateEndpoints map[string]map[string][]mongodbatlas.ServerlessPrivateEndpointConnection
4141
}
4242

43+
func (m *MockAtlasOperatorClusterStore) ServerlessInstances(projectID string, _ *mongodbatlas.ListOptions) (*mongodbatlas.ClustersResponse, error) {
44+
clusters := make([]*mongodbatlas.Cluster, 0, len(m.projectToServerlessClusters[projectID]))
45+
46+
for clusterName := range m.projectToServerlessClusters[projectID] {
47+
clusters = append(clusters, m.projectToServerlessClusters[projectID][clusterName])
48+
}
49+
return &mongodbatlas.ClustersResponse{
50+
Links: nil,
51+
Results: clusters,
52+
TotalCount: 0,
53+
}, nil
54+
}
55+
56+
func (m *MockAtlasOperatorClusterStore) ProjectClusters(projectID string, _ *mongodbatlas.ListOptions) (interface{}, error) {
57+
clusterNames := make([]string, 0, len(m.projectToAdvancedClusters[projectID])+len(m.projectToServerlessClusters[projectID]))
58+
for k := range m.projectToAdvancedClusters[projectID] {
59+
clusterNames = append(clusterNames, m.projectToAdvancedClusters[projectID][k].Name)
60+
}
61+
for k := range m.projectToServerlessClusters[projectID] {
62+
clusterNames = append(clusterNames, m.projectToServerlessClusters[projectID][k].Name)
63+
}
64+
65+
clusters := make([]*mongodbatlas.AdvancedCluster, 0, len(clusterNames))
66+
for i := range clusterNames {
67+
clusters = append(clusters, &mongodbatlas.AdvancedCluster{
68+
Name: clusterNames[i],
69+
GroupID: projectID,
70+
})
71+
}
72+
return &mongodbatlas.AdvancedClustersResponse{
73+
Links: nil,
74+
Results: clusters,
75+
TotalCount: 0,
76+
}, nil
77+
}
78+
4379
func (m *MockAtlasOperatorClusterStore) ServerlessPrivateEndpoints(projectID, instanceName string, _ *mongodbatlas.ListOptions) ([]mongodbatlas.ServerlessPrivateEndpointConnection, error) {
4480
return m.projectIDToServerlessPrivateEndpoints[projectID][instanceName], nil
4581
}

internal/store/operator.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,19 @@ type AtlasOperatorDBUsersStore interface {
3535
}
3636

3737
type AtlasOperatorClusterStore interface {
38+
AtlasAllClustersLister
3839
AtlasClusterDescriber
3940
AtlasClusterConfigurationOptionsDescriber
4041
ScheduleDescriber
4142
ServerlessInstanceDescriber
4243
ServerlessPrivateEndpointsLister
4344
}
4445

46+
type AtlasAllClustersLister interface {
47+
ClusterLister
48+
ServerlessInstanceLister
49+
}
50+
4551
type AtlasOperatorTeamsStore interface {
4652
TeamDescriber
4753
ProjectTeamLister

test/e2e/atlas/helper_test.go

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,12 @@ import (
2424
"os"
2525
"os/exec"
2626
"testing"
27+
"time"
2728

29+
"github.com/mongodb-forks/digest"
2830
"github.com/mongodb/mongodb-atlas-cli/test/e2e"
2931
"github.com/stretchr/testify/assert"
32+
"github.com/stretchr/testify/require"
3033
"go.mongodb.org/atlas/mongodbatlas"
3134
)
3235

@@ -88,6 +91,136 @@ const (
8891
e2eSharedMDBVer = "5.0"
8992
)
9093

94+
const (
95+
defaultTimeout = 30 * time.Minute
96+
defaultTick = 1 * time.Minute
97+
ResourceNotFound = "RESOURCE_NOT_FOUND"
98+
)
99+
100+
type K8SHelper struct {
101+
atlasClient *mongodbatlas.Client
102+
project *mongodbatlas.Project
103+
clusters map[string]*mongodbatlas.Cluster
104+
orgID string
105+
t *testing.T
106+
}
107+
108+
func NewK8sHelper(t *testing.T) *K8SHelper {
109+
t.Helper()
110+
111+
// These ENV variables MUST be set before running the test
112+
orgID := os.Getenv("MCLI_ORG_ID")
113+
privateKey := os.Getenv("MCLI_PRIVATE_API_KEY")
114+
publicKey := os.Getenv("MCLI_PUBLIC_API_KEY")
115+
opsManagerURL := os.Getenv("MCLI_OPS_MANAGER_URL")
116+
transport := digest.NewTransport(publicKey, privateKey)
117+
tClient, err := transport.Client()
118+
require.NoError(t, err, "can not create transport for atlas client")
119+
120+
atlasClient := mongodbatlas.NewClient(tClient)
121+
atlasClient.BaseURL, err = url.Parse(opsManagerURL)
122+
require.NoError(t, err, "can not create atlas client")
123+
124+
return &K8SHelper{
125+
atlasClient: atlasClient,
126+
t: t,
127+
orgID: orgID,
128+
clusters: map[string]*mongodbatlas.Cluster{},
129+
}
130+
}
131+
132+
func (kh *K8SHelper) NewProject(project *mongodbatlas.Project) {
133+
kh.t.Helper()
134+
135+
createdProject, resp, err := kh.atlasClient.Projects.Create(context.Background(), project, &mongodbatlas.CreateProjectOptions{})
136+
require.Nil(kh.t, err, "error while creating project", err, resp.Status)
137+
kh.project = createdProject
138+
139+
assert.Eventually(kh.t, func() bool {
140+
_, _, err := kh.atlasClient.Projects.GetOneProject(context.Background(), kh.project.ID)
141+
return assert.NoError(kh.t, err, "waiting for project to be created", kh.project.ID)
142+
}, defaultTimeout, defaultTick, "project should've been created")
143+
144+
kh.t.Cleanup(func() {
145+
assert.Eventually(kh.t, func() bool {
146+
_, err := kh.atlasClient.Projects.Delete(context.Background(), kh.project.ID)
147+
if err != nil {
148+
var apiError *mongodbatlas.ErrorResponse
149+
if errors.As(err, &apiError) && (apiError.ErrorCode == "GROUP_NOT_FOUND" || apiError.ErrorCode == ResourceNotFound) {
150+
return true
151+
}
152+
return false
153+
}
154+
return true
155+
}, defaultTimeout, defaultTick, "project should've been deleted", project.ID)
156+
})
157+
}
158+
159+
func (kh *K8SHelper) NewCluster(cluster *mongodbatlas.Cluster) {
160+
kh.t.Helper()
161+
162+
require.True(kh.t, kh.project != nil, "can not create cluster without a project")
163+
createdCluster, _, err := kh.atlasClient.Clusters.Create(context.Background(), kh.project.ID, cluster)
164+
require.Nil(kh.t, err, "error while creating cluster")
165+
166+
kh.clusters[cluster.Name] = createdCluster
167+
168+
assert.Eventually(kh.t, func() bool {
169+
_, _, err := kh.atlasClient.Clusters.Get(context.Background(), kh.project.ID, cluster.Name)
170+
return assert.NoError(kh.t, err, "waiting for cluster to be created", cluster.Name)
171+
}, defaultTimeout, defaultTick, "cluster should've been created")
172+
173+
kh.t.Cleanup(func() {
174+
assert.Eventually(kh.t, func() bool {
175+
_, err := kh.atlasClient.Clusters.Delete(context.Background(), kh.project.ID, cluster.Name)
176+
if !assert.NoError(kh.t, err, "can not delete test cluster", cluster.Name) {
177+
return false
178+
}
179+
_, _, err = kh.atlasClient.Clusters.Get(context.Background(), kh.project.ID, cluster.Name)
180+
if err != nil {
181+
var apiError *mongodbatlas.ErrorResponse
182+
if errors.As(err, &apiError) && (apiError.ErrorCode == "CLUSTER_NOT_FOUND" || apiError.ErrorCode == ResourceNotFound) {
183+
return true
184+
}
185+
return false
186+
}
187+
return true
188+
}, defaultTimeout, defaultTick, "cluster should've been deleted", cluster.Name, cluster.ID)
189+
})
190+
}
191+
192+
func (kh *K8SHelper) NewServerlessInstance(instance *mongodbatlas.ServerlessCreateRequestParams) {
193+
kh.t.Helper()
194+
require.True(kh.t, kh.project != nil, "can not create serverless instance without a project")
195+
createdInstance, _, err := kh.atlasClient.ServerlessInstances.Create(context.Background(), kh.project.ID, instance)
196+
require.Nil(kh.t, err, "error while creating serverless instance")
197+
198+
kh.clusters[createdInstance.Name] = createdInstance
199+
200+
assert.Eventually(kh.t, func() bool {
201+
_, _, err := kh.atlasClient.ServerlessInstances.Get(context.Background(), kh.project.ID, createdInstance.Name)
202+
return assert.NoError(kh.t, err, "waiting for serverless instance to be created", createdInstance.Name)
203+
}, defaultTimeout, defaultTick, "serverless instance should've been created")
204+
205+
kh.t.Cleanup(func() {
206+
assert.Eventually(kh.t, func() bool {
207+
_, err := kh.atlasClient.ServerlessInstances.Delete(context.Background(), kh.project.ID, createdInstance.Name)
208+
if !assert.NoError(kh.t, err, "can not delete test cluster", createdInstance.Name) {
209+
return false
210+
}
211+
_, _, err = kh.atlasClient.ServerlessInstances.Get(context.Background(), kh.project.ID, createdInstance.Name)
212+
if err != nil {
213+
var apiError *mongodbatlas.ErrorResponse
214+
if errors.As(err, &apiError) && (apiError.ErrorCode == "SERVERLESS_INSTANCE_NOT_FOUND" || apiError.ErrorCode == ResourceNotFound) {
215+
return true
216+
}
217+
return false
218+
}
219+
return true
220+
}, defaultTimeout, defaultTick, "serverless instance should've been deleted", createdInstance.Name, createdInstance.ID)
221+
})
222+
}
223+
91224
func deployClusterForProject(projectID string) (string, error) {
92225
cliPath, err := e2e.AtlasCLIBin()
93226
if err != nil {

0 commit comments

Comments
 (0)