diff --git a/controller/controller.go b/controller/controller.go index 7eca04715b4fe5685a4173881171e3b3cc1e0fb6..5dc392461584f6b9e7b04f36d6b3407c896a46ae 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -99,7 +99,10 @@ func initialize() error { return err } - db := database.GetDatabaseConnection() + db, err := database.GetDatabaseConnection() + if err != nil { + return err + } nodeService := nodes.NewNodeService(nodes.NewNodeStore(db), eventService) portService := ports.NewPortService(ports.NewPortStore(db), eventService) diff --git a/controller/nucleus/database/mongo-connection.go b/controller/nucleus/database/mongo-connection.go index 43b3a5132779fa2717b11f9c7e4f2301df3de257..0482d30031b0cb93d42d704577bfa5beb25872be 100644 --- a/controller/nucleus/database/mongo-connection.go +++ b/controller/nucleus/database/mongo-connection.go @@ -3,7 +3,6 @@ package database import ( "context" "fmt" - "log" "time" "code.fbi.h-da.de/danet/gosdn/controller/config" @@ -18,6 +17,9 @@ const ( timeout = 5 * time.Second // DatabaseName is the name of the mongoDB database used. DatabaseName = "gosdn" + + connectionRetries = 60 + connectionTimeout = time.Second * 2 ) // Connect Retrieves a client to the MongoDB. @@ -28,15 +30,13 @@ func Connect() (*mongo.Database, error) { client, err := mongo.Connect(ctx, options.Client().ApplyURI(mongoConnection)) if err != nil { - log.Printf("Failed to create client: %v", err) - return nil, err + return nil, fmt.Errorf("failed to create client: %w", err) } // Force a connection to verify our connection string err = client.Ping(ctx, nil) if err != nil { - log.Printf("Failed to connect to database: %v\n", err) - return nil, err + return nil, fmt.Errorf("failed to connect to database: %w", err) } db := client.Database(DatabaseName) @@ -47,18 +47,25 @@ func Connect() (*mongo.Database, error) { return db, nil } -func GetDatabaseConnection() *mongo.Database { +func GetDatabaseConnection() (*mongo.Database, error) { var db *mongo.Database storeMode := store.GetStoreMode() - if storeMode == store.Database { - db, err := Connect() - if err != nil { - logrus.Infof("Could not connect to database") + + switch storeMode { + case store.Database: + for i := 0; i < connectionRetries; i++ { + db, err := Connect() + if err == nil { + return db, nil + } + logrus.Errorf("could not connect to mongo with error: %s. Retrying in 2 seconds.", err.Error()) + time.Sleep(connectionTimeout) } - return db - } + return nil, fmt.Errorf("could not connect to mongo after %d retries", connectionRetries) - return db + default: + return db, nil + } } diff --git a/controller/nucleus/databaseNetworkElementStore.go b/controller/nucleus/databaseNetworkElementStore.go index 70dd9a7a1f83189d324cf033989a69f4a044949e..a5bc5cb0746246b4b53ea472f20ea635a2577110 100644 --- a/controller/nucleus/databaseNetworkElementStore.go +++ b/controller/nucleus/databaseNetworkElementStore.go @@ -122,7 +122,7 @@ func (s *DatabaseNetworkElementStore) Add(ctx context.Context, networkElementToA func (s *DatabaseNetworkElementStore) Update(ctx context.Context, networkElementToUpdate networkelement.NetworkElement) (err error) { var updatedLoadedNetworkElement networkelement.LoadedNetworkElement - db, err := database.Connect() + db, err := database.GetDatabaseConnection() if err != nil { return err } diff --git a/controller/rbac/databaseUserStore.go b/controller/rbac/databaseUserStore.go index 8f4b7c93b3d796cbf096a49490c8eec989d64379..cfa592de9761195c56f1c7e8185160d286213acc 100644 --- a/controller/rbac/databaseUserStore.go +++ b/controller/rbac/databaseUserStore.go @@ -134,7 +134,7 @@ func (s *DatabaseUserStore) GetAll(ctx context.Context) (loadedUsers []rbac.Load func (s *DatabaseUserStore) Update(ctx context.Context, userToUpdate rbac.User) (err error) { var updatedLoadedUser rbac.LoadedUser - db, err := database.Connect() + db, err := database.GetDatabaseConnection() if err != nil { return err } diff --git a/controller/topology/nodes/databaseNodeStore.go b/controller/topology/nodes/databaseNodeStore.go index 41271c9e0023ddffa6d033b0f483344479f8f6d3..b0389082c7dcd44055f3c160c834ddea9bb49a4c 100644 --- a/controller/topology/nodes/databaseNodeStore.go +++ b/controller/topology/nodes/databaseNodeStore.go @@ -133,7 +133,7 @@ func (s *DatabaseNodeStore) Add(ctx context.Context, node Node) (err error) { func (s *DatabaseNodeStore) Update(ctx context.Context, node Node) (err error) { var updatedLoadedNodes Node - db, err := database.Connect() + db, err := database.GetDatabaseConnection() if err != nil { return err }