@@ -13,6 +13,7 @@ import (
1313 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/provider"
1414 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status"
1515 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/controller/workflow"
16+ "github.com/mongodb/mongodb-atlas-kubernetes/pkg/util"
1617)
1718
1819const (
@@ -39,7 +40,7 @@ func ensureNetworkPeers(ctx *workflow.Context, groupID string, project *mdbv1.At
3940 return result
4041 }
4142 ctx .SetConditionTrue (status .NetworkPeerReadyType )
42- if len (networkPeerStatus ) == 0 && len ( networkPeerSpec ) == 0 {
43+ if len (networkPeerSpec ) == 0 {
4344 ctx .UnsetCondition (status .NetworkPeerReadyType )
4445 }
4546
@@ -69,7 +70,7 @@ func SyncNetworkPeer(context context.Context, ctx *workflow.Context, groupID str
6970 logger := ctx .Log
7071 mongoClient := ctx .Client
7172 logger .Debugf ("syncing network peers for project %v" , groupID )
72- list , err := getAllExistedNetworkPeer (context , logger , mongoClient .Peers , groupID )
73+ list , err := GetAllExistedNetworkPeer (context , mongoClient .Peers , groupID )
7374 if err != nil {
7475 logger .Errorf ("failed to get all network peers: %v" , err )
7576 return workflow .Terminate (workflow .ProjectNetworkPeerIsNotReadyInAtlas , "failed to get all network peers" ),
@@ -97,10 +98,16 @@ func SyncNetworkPeer(context context.Context, ctx *workflow.Context, groupID str
9798 peerStatuses = createNetworkPeers (context , mongoClient , groupID , diff .PeersToCreate , logger )
9899 peerStatuses , err = UpdateStatuses (context , mongoClient .Containers , peerStatuses , diff .PeersToUpdate , groupID , logger )
99100 if err != nil {
101+ logger .Errorf ("failed to update network peer statuses: %v" , err )
100102 return workflow .Terminate (workflow .ProjectNetworkPeerIsNotReadyInAtlas ,
101103 "failed to update network peer statuses" ), status .NetworkPeerReadyType
102104 }
103-
105+ err = deleteUnusedContainers (context , mongoClient .Containers , groupID , getPeerIDs (peerStatuses ))
106+ if err != nil {
107+ logger .Errorf ("failed to delete unused containers: %v" , err )
108+ return workflow .Terminate (workflow .ProjectNetworkPeerIsNotReadyInAtlas ,
109+ fmt .Sprintf ("failed to delete unused containers: %s" , err )), status .NetworkPeerReadyType
110+ }
104111 return ensurePeerStatus (peerStatuses , len (peerSpecs ), logger )
105112}
106113
@@ -124,6 +131,30 @@ func UpdateStatuses(context context.Context, containerService mongodbatlas.Conta
124131 return peerStatuses , nil
125132}
126133
134+ func getPeerIDs (statuses []status.AtlasNetworkPeer ) []string {
135+ ids := make ([]string , 0 , len (statuses ))
136+ for _ , networkPeer := range statuses {
137+ ids = append (ids , networkPeer .ContainerID )
138+ }
139+ return ids
140+ }
141+
142+ func deleteUnusedContainers (context context.Context , containerService mongodbatlas.ContainersService , groupID string , doNotDelete []string ) error {
143+ containers , _ , err := containerService .List (context , groupID , nil )
144+ if err != nil {
145+ return err
146+ }
147+ for _ , container := range containers {
148+ if ! util .Contains (doNotDelete , container .ID ) {
149+ response , errDelete := containerService .Delete (context , groupID , container .ID )
150+ if errDelete != nil && response .StatusCode != http .StatusConflict { // AWS peer does not contain container id
151+ return errDelete
152+ }
153+ }
154+ }
155+ return nil
156+ }
157+
127158func getContainer (context context.Context , containerService mongodbatlas.ContainersService ,
128159 peerToUpdate mongodbatlas.Peer , groupID string , logger * zap.SugaredLogger ) (mongodbatlas.Container , error ) {
129160 var container mongodbatlas.Container
@@ -260,34 +291,28 @@ func createNetworkPeers(context context.Context, mongoClient mongodbatlas.Client
260291 return newPeerStatuses
261292}
262293
263- func getAllExistedNetworkPeer (ctx context.Context , logger * zap. SugaredLogger , peerService mongodbatlas.PeersService , groupID string ) ([]mongodbatlas.Peer , error ) {
294+ func GetAllExistedNetworkPeer (ctx context.Context , peerService mongodbatlas.PeersService , groupID string ) ([]mongodbatlas.Peer , error ) {
264295 var peersList []mongodbatlas.Peer
265296 listAWS , _ , err := peerService .List (ctx , groupID , & mongodbatlas.ContainersListOptions {})
266297 if err != nil {
267- logger .Errorf ("failed to list network peers: %v" , err )
268- return nil , err
298+ return nil , fmt .Errorf ("failed to list network peers for AWS: %w" , err )
269299 }
270- logger .Debugf ("got %d aws peers" , len (listAWS ))
271300 peersList = append (peersList , listAWS ... )
272301
273302 listGCP , _ , err := peerService .List (ctx , groupID , & mongodbatlas.ContainersListOptions {
274303 ProviderName : string (provider .ProviderGCP ),
275304 })
276305 if err != nil {
277- logger .Errorf ("failed to list network peers: %v" , err )
278- return nil , err
306+ return nil , fmt .Errorf ("failed to list network peers for GCP: %w" , err )
279307 }
280- logger .Debugf ("got %d gcp peers" , len (listGCP ))
281308 peersList = append (peersList , listGCP ... )
282309
283310 listAzure , _ , err := peerService .List (ctx , groupID , & mongodbatlas.ContainersListOptions {
284311 ProviderName : string (provider .ProviderAzure ),
285312 })
286313 if err != nil {
287- logger .Errorf ("failed to list network peers: %v" , err )
288- return nil , err
314+ return nil , fmt .Errorf ("failed to list network peers for Azure: %w" , err )
289315 }
290- logger .Debugf ("got %d azure peers" , len (listAzure ))
291316 peersList = append (peersList , listAzure ... )
292317 return peersList , nil
293318}
@@ -548,7 +573,7 @@ func DeleteAllNetworkPeers(ctx context.Context, groupID string, service mongodba
548573}
549574
550575func deleteAllNetworkPeers (ctx context.Context , groupID string , service mongodbatlas.PeersService , logger * zap.SugaredLogger ) error {
551- peers , err := getAllExistedNetworkPeer (ctx , logger , service , groupID )
576+ peers , err := GetAllExistedNetworkPeer (ctx , service , groupID )
552577 if err != nil {
553578 logger .Errorf ("failed to list network peers for project %s: %v" , groupID , err )
554579 return err
0 commit comments