From 97bce1ce6102b9fa59244776c5944fb984df027a Mon Sep 17 00:00:00 2001 From: Sergey Yakubov <sergey.yakubov@desy.de> Date: Wed, 2 Oct 2019 11:00:12 +0200 Subject: [PATCH] tries reconnect to db during health check --- broker/src/asapo_broker/database/database.go | 1 + .../asapo_broker/database/database_test.go | 2 + .../asapo_broker/database/mock_database.go | 5 +++ broker/src/asapo_broker/database/mongodb.go | 7 ++++ .../src/asapo_broker/database/mongodb_test.go | 12 ++++++ broker/src/asapo_broker/server/get_health.go | 7 +++- .../asapo_broker/server/get_health_test.go | 41 +++++++++++++++++-- 7 files changed, 71 insertions(+), 4 deletions(-) diff --git a/broker/src/asapo_broker/database/database.go b/broker/src/asapo_broker/database/database.go index 81cbb2d54..342eb2816 100644 --- a/broker/src/asapo_broker/database/database.go +++ b/broker/src/asapo_broker/database/database.go @@ -2,6 +2,7 @@ package database type Agent interface { ProcessRequest(db_name string, group_id string, op string, extra string) ([]byte, error) + Ping() error Connect(string) error Close() Copy() Agent diff --git a/broker/src/asapo_broker/database/database_test.go b/broker/src/asapo_broker/database/database_test.go index db511efdc..3ca42ab57 100644 --- a/broker/src/asapo_broker/database/database_test.go +++ b/broker/src/asapo_broker/database/database_test.go @@ -10,12 +10,14 @@ func TestMockDataBase(t *testing.T) { var db MockedDatabase db.On("Connect", mock.AnythingOfType("string")).Return(nil) db.On("Close").Return() + db.On("Ping").Return(nil) db.On("Copy").Return(nil) db.On("ProcessRequest", "", "", 0).Return([]byte(""), nil) db.Connect("") db.Close() db.Copy() + db.Ping() var err DBError err.Error() } diff --git a/broker/src/asapo_broker/database/mock_database.go b/broker/src/asapo_broker/database/mock_database.go index 97570e51b..7edb3bb83 100644 --- a/broker/src/asapo_broker/database/mock_database.go +++ b/broker/src/asapo_broker/database/mock_database.go @@ -19,6 +19,11 @@ func (db *MockedDatabase) Close() { db.Called() } +func (db *MockedDatabase) Ping() error { + args := db.Called() + return args.Error(0) +} + func (db *MockedDatabase) Copy() Agent { db.Called() return db diff --git a/broker/src/asapo_broker/database/mongodb.go b/broker/src/asapo_broker/database/mongodb.go index 921ca5231..2d7ed3987 100644 --- a/broker/src/asapo_broker/database/mongodb.go +++ b/broker/src/asapo_broker/database/mongodb.go @@ -65,6 +65,13 @@ func (db *Mongodb) updateDatabaseList() (err error) { return err } +func (db *Mongodb) Ping() (err error) { + if db.session == nil { + return &DBError{utils.StatusServiceUnavailable, no_session_msg} + } + return db.session.Ping() +} + func (db *Mongodb) dataBaseExist(dbname string) (err error) { if db.databaseInList(dbname) { return nil diff --git a/broker/src/asapo_broker/database/mongodb_test.go b/broker/src/asapo_broker/database/mongodb_test.go index 91bbad836..44dc0c445 100644 --- a/broker/src/asapo_broker/database/mongodb_test.go +++ b/broker/src/asapo_broker/database/mongodb_test.go @@ -302,6 +302,18 @@ func TestMongoDBGetSizeNoDatabase(t *testing.T) { assert.NotNil(t, err) } +func TestMongoPing(t *testing.T) { + db.Connect(dbaddress) + defer cleanup() + err := db.Ping() + assert.Nil(t, err) +} + +func TestMongoPingNotConected(t *testing.T) { + err := db.Ping() + assert.NotNil(t, err) +} + func TestMongoDBgetRecordByIDNotConnected(t *testing.T) { _, err := db.ProcessRequest(dbname, "", "id", "2") assert.Equal(t, utils.StatusServiceUnavailable, err.(*DBError).Code) diff --git a/broker/src/asapo_broker/server/get_health.go b/broker/src/asapo_broker/server/get_health.go index b7d9f2446..b12401003 100644 --- a/broker/src/asapo_broker/server/get_health.go +++ b/broker/src/asapo_broker/server/get_health.go @@ -4,8 +4,13 @@ import ( "net/http" ) - func routeGetHealth(w http.ResponseWriter, r *http.Request) { + db_new := db.Copy() + defer db_new.Close() + err := db_new.Ping() + if err != nil { + ReconnectDb() + } r.Header.Set("Content-type", "application/json") w.WriteHeader(http.StatusNoContent) } diff --git a/broker/src/asapo_broker/server/get_health_test.go b/broker/src/asapo_broker/server/get_health_test.go index 0efbdf70d..60a91692d 100644 --- a/broker/src/asapo_broker/server/get_health_test.go +++ b/broker/src/asapo_broker/server/get_health_test.go @@ -1,13 +1,48 @@ package server import ( - "github.com/stretchr/testify/assert" + "asapo_broker/database" + "asapo_common/logger" + "errors" + "github.com/stretchr/testify/suite" "net/http" "testing" ) +type GetHealthTestSuite struct { + suite.Suite + mock_db *database.MockedDatabase +} + +func (suite *GetHealthTestSuite) SetupTest() { + statistics.Reset() + suite.mock_db = new(database.MockedDatabase) + db = suite.mock_db + logger.SetMockLog() +} + +func (suite *GetHealthTestSuite) TearDownTest() { + assertExpectations(suite.T(), suite.mock_db) + logger.UnsetMockLog() + db = nil +} + +func TestGetHealthTestSuite(t *testing.T) { + suite.Run(t, new(GetHealthTestSuite)) +} + +func (suite *GetHealthTestSuite) TestGetHealthOk() { + suite.mock_db.On("Ping").Return(nil) + ExpectCopyClose(suite.mock_db) + + w := doRequest("/health") + suite.Equal(http.StatusNoContent, w.Code) +} + +func (suite *GetHealthTestSuite) TestGetHealthTriesToReconnectsToDataBase() { + suite.mock_db.On("Ping").Return(errors.New("ping error")) + ExpectCopyCloseReconnect(suite.mock_db) -func TestGetNext(t *testing.T) { w := doRequest("/health") - assert.Equal(t, http.StatusNoContent, w.Code) + suite.Equal(http.StatusNoContent, w.Code) } -- GitLab