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