@@ -3,6 +3,7 @@ package int
33import (
44 "context"
55 "fmt"
6+ "net/http"
67 "net/url"
78 "strings"
89 "time"
@@ -13,6 +14,7 @@ import (
1314 "go.mongodb.org/mongo-driver/bson"
1415 "go.mongodb.org/mongo-driver/mongo/options"
1516 corev1 "k8s.io/api/core/v1"
17+ apiErrors "k8s.io/apimachinery/pkg/api/errors"
1618 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1719 "sigs.k8s.io/controller-runtime/pkg/client"
1820
@@ -61,7 +63,7 @@ var _ = Describe("AtlasDatabaseUser", func() {
6163 WithIPAccessList (project .NewIPAccessList ().WithIP ("0.0.0.0/0" ))
6264 if DevMode {
6365 // While developing tests we need to reuse the same project
64- createdProject .Spec .Name = "dev-test- atlas-project"
66+ createdProject .Spec .Name = "dev-test atlas-project"
6567 }
6668
6769 Expect (k8sClient .Create (context .Background (), createdProject )).To (Succeed ())
@@ -128,6 +130,10 @@ var _ = Describe("AtlasDatabaseUser", func() {
128130 })
129131 }
130132
133+ connSecretname := func (suffix string ) string {
134+ return kube .NormalizeIdentifier (createdProject .Spec .Name ) + suffix
135+ }
136+
131137 Describe ("Create/Update the db user" , func () {
132138 It ("Should be created successfully" , func () {
133139 createdDBUser = mdbv1 .DefaultDBUser (namespace .Name , "test-db-user" , createdProject .Name ).WithPasswordSecret (UserPasswordSecret )
@@ -147,6 +153,12 @@ var _ = Describe("AtlasDatabaseUser", func() {
147153 validateSecret (k8sClient , * createdProject , * createdClusterGCP , * createdDBUser )
148154 validateSecret (k8sClient , * createdProject , * createdClusterAWS , * createdDBUser )
149155 checkNumberOfConnectionSecrets (k8sClient , * createdProject , 2 )
156+
157+ expectedSecretsInStatus := map [string ]string {
158+ "test-cluster-aws" : connSecretname ("-test-cluster-aws-test-db-user" ),
159+ "test-cluster-gcp" : connSecretname ("-test-cluster-gcp-test-db-user" ),
160+ }
161+ Expect (createdDBUser .Status .ConnectionSecrets ).To (Equal (expectedSecretsInStatus ))
150162 })
151163 By ("Checking connectivity to Clusters" , func () {
152164 // The user created lacks read/write roles
@@ -174,6 +186,12 @@ var _ = Describe("AtlasDatabaseUser", func() {
174186 validateSecret (k8sClient , * createdProject , * createdClusterGCP , * createdDBUser )
175187 validateSecret (k8sClient , * createdProject , * createdClusterAWS , * createdDBUser )
176188 checkNumberOfConnectionSecrets (k8sClient , * createdProject , 2 )
189+
190+ expectedSecretsInStatus := map [string ]string {
191+ "test-cluster-aws" : connSecretname ("-test-cluster-aws-test-db-user" ),
192+ "test-cluster-gcp" : connSecretname ("-test-cluster-gcp-test-db-user" ),
193+ }
194+ Expect (createdDBUser .Status .ConnectionSecrets ).To (Equal (expectedSecretsInStatus ))
177195 })
178196
179197 By ("Checking write permissions for Clusters" , func () {
@@ -201,6 +219,8 @@ var _ = Describe("AtlasDatabaseUser", func() {
201219 validateSecret (k8sClient , * createdProject , * createdClusterAWS , * createdDBUser )
202220 validateSecret (k8sClient , * createdProject , * createdClusterGCP , * secondDBUser )
203221 checkNumberOfConnectionSecrets (k8sClient , * createdProject , 3 )
222+ expectedSecretsInStatus := map [string ]string {"test-cluster-gcp" : connSecretname ("-test-cluster-gcp-second-db-user" )}
223+ Expect (secondDBUser .Status .ConnectionSecrets ).To (Equal (expectedSecretsInStatus ))
204224 })
205225
206226 By ("Checking write permissions for Clusters" , func () {
@@ -216,7 +236,24 @@ var _ = Describe("AtlasDatabaseUser", func() {
216236 Expect (err ).To (HaveOccurred ())
217237 Expect (err .Error ()).To (MatchRegexp ("not authorized" ))
218238 })
239+ By ("Removing Second user" , func () {
240+ Expect (k8sClient .Delete (context .Background (), secondDBUser )).To (Succeed ())
241+ Eventually (checkAtlasDatabaseUserRemoved (createdProject .Status .ID , * secondDBUser ), 50 , interval ).Should (BeTrue ())
242+
243+ secretNames := []string {connSecretname ("-test-cluster-gcp-second-db-user" )}
244+ Eventually (checkSecretsDontExist (namespace .Name , secretNames ), 50 , interval ).Should (BeTrue ())
245+ })
219246 })
247+ By ("Removing First user" , func () {
248+ Expect (k8sClient .Delete (context .Background (), createdDBUser )).To (Succeed ())
249+ Eventually (checkAtlasDatabaseUserRemoved (createdProject .Status .ID , * createdDBUser ), 50 , interval ).Should (BeTrue ())
250+
251+ secretNames := []string {connSecretname ("-test-cluster-aws-test-db-user" ), connSecretname ("-test-cluster-gcp-test-db-user" )}
252+ Eventually (checkSecretsDontExist (namespace .Name , secretNames ), 50 , interval ).Should (BeTrue ())
253+
254+ checkNumberOfConnectionSecrets (k8sClient , * createdProject , 0 )
255+ })
256+
220257 })
221258 })
222259})
@@ -344,7 +381,7 @@ func validateSecret(k8sClient client.Client, project mdbv1.AtlasProject, cluster
344381
345382func checkNumberOfConnectionSecrets (k8sClient client.Client , project mdbv1.AtlasProject , length int ) {
346383 secretList := corev1.SecretList {}
347- Expect (k8sClient .List (context .Background (), & secretList )).To (Succeed ())
384+ Expect (k8sClient .List (context .Background (), & secretList , client . InNamespace ( namespace . Name ) )).To (Succeed ())
348385
349386 names := make ([]string , 0 )
350387 for _ , item := range secretList .Items {
@@ -360,3 +397,30 @@ func buildConnectionURL(connURL, userName, password string) string {
360397 Expect (err ).NotTo (HaveOccurred ())
361398 return u
362399}
400+
401+ func checkAtlasDatabaseUserRemoved (projectID string , user mdbv1.AtlasDatabaseUser ) func () bool {
402+ return func () bool {
403+ _ , r , err := atlasClient .DatabaseUsers .Get (context .Background (), user .Spec .DatabaseName , projectID , user .Spec .Username )
404+ if err != nil {
405+ if r != nil && r .StatusCode == http .StatusNotFound {
406+ return true
407+ }
408+ }
409+
410+ return false
411+ }
412+ }
413+
414+ func checkSecretsDontExist (namespace string , secretNames []string ) func () bool {
415+ return func () bool {
416+ nonExisting := 0
417+ for _ , name := range secretNames {
418+ s := corev1.Secret {}
419+ err := k8sClient .Get (context .Background (), kube .ObjectKey (namespace , name ), & s )
420+ if err != nil && apiErrors .IsNotFound (err ) {
421+ nonExisting ++
422+ }
423+ }
424+ return nonExisting == len (secretNames )
425+ }
426+ }
0 commit comments