@@ -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+
91224func deployClusterForProject (projectID string ) (string , error ) {
92225 cliPath , err := e2e .AtlasCLIBin ()
93226 if err != nil {
0 commit comments