aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukasz Rajewski <lukasz.rajewski@orange.com>2022-04-11 20:36:00 +0200
committerLukasz Rajewski <lukasz.rajewski@orange.com>2022-04-11 20:36:23 +0200
commite503b0942f87b5e3a9f43e8395dcd6d185b8d9ca (patch)
tree7a6f28a6718e153043ff6a428af83c886203e14f
parent76b4c1981e361b52e94c1545e15a9d90ed311b1e (diff)
Fixed detection of the etcd connection status
Issue-ID: MULTICLOUD-1468 Signed-off-by: Lukasz Rajewski <lukasz.rajewski@orange.com> Change-Id: If243e9a484afe5db7d9538a1875241fa425a2516
-rw-r--r--src/k8splugin/api/healthcheckhandler.go5
-rw-r--r--src/k8splugin/api/healthcheckhandler_test.go24
-rw-r--r--src/k8splugin/internal/db/etcd.go15
-rw-r--r--src/k8splugin/internal/db/etcd_testing.go4
-rw-r--r--src/k8splugin/internal/utils/utils.go2
5 files changed, 49 insertions, 1 deletions
diff --git a/src/k8splugin/api/healthcheckhandler.go b/src/k8splugin/api/healthcheckhandler.go
index 896c6df0..2b338b94 100644
--- a/src/k8splugin/api/healthcheckhandler.go
+++ b/src/k8splugin/api/healthcheckhandler.go
@@ -31,5 +31,10 @@ func healthCheckHandler(w http.ResponseWriter, r *http.Request) {
return
}
+ err = db.Etcd.HealthCheck()
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
w.WriteHeader(http.StatusOK)
}
diff --git a/src/k8splugin/api/healthcheckhandler_test.go b/src/k8splugin/api/healthcheckhandler_test.go
index c6c07c16..cadcf766 100644
--- a/src/k8splugin/api/healthcheckhandler_test.go
+++ b/src/k8splugin/api/healthcheckhandler_test.go
@@ -34,6 +34,9 @@ func TestHealthCheckHandler(t *testing.T) {
db.DBconn = &db.MockDB{
Err: nil,
}
+ db.Etcd = &db.MockEtcdClient{
+ Err: nil,
+ }
request := httptest.NewRequest("GET", "/v1/healthcheck", nil)
resp := executeRequest(request, NewRouter(nil, nil, nil, nil, nil, nil, nil, nil, nil))
@@ -43,10 +46,29 @@ func TestHealthCheckHandler(t *testing.T) {
}
})
- t.Run("FAILED HealthCheck", func(t *testing.T) {
+ t.Run("FAILED HealthCheck DB", func(t *testing.T) {
db.DBconn = &db.MockDB{
Err: pkgerrors.New("Runtime Error in DB"),
}
+ db.Etcd = &db.MockEtcdClient{
+ Err: nil,
+ }
+ request := httptest.NewRequest("GET", "/v1/healthcheck", nil)
+ resp := executeRequest(request, NewRouter(nil, nil, nil, nil, nil, nil, nil, nil, nil))
+
+ //Check returned code
+ if resp.StatusCode != http.StatusInternalServerError {
+ t.Fatalf("Expected %d; Got: %d", http.StatusInternalServerError, resp.StatusCode)
+ }
+ })
+
+ t.Run("FAILED HealthCheck Etcd", func(t *testing.T) {
+ db.DBconn = &db.MockDB{
+ Err: nil,
+ }
+ db.Etcd = &db.MockEtcdClient{
+ Err: pkgerrors.New("Runtime Error in Etcd"),
+ }
request := httptest.NewRequest("GET", "/v1/healthcheck", nil)
resp := executeRequest(request, NewRouter(nil, nil, nil, nil, nil, nil, nil, nil, nil))
diff --git a/src/k8splugin/internal/db/etcd.go b/src/k8splugin/internal/db/etcd.go
index 5ce8135a..a3a09352 100644
--- a/src/k8splugin/internal/db/etcd.go
+++ b/src/k8splugin/internal/db/etcd.go
@@ -35,6 +35,7 @@ type EtcdConfig struct {
// EtcdStore Interface needed for mocking
type EtcdStore interface {
+ HealthCheck() error
Get(key string) ([]byte, error)
GetKeys(key string) ([]string, error)
GetValues(key string) ([][]byte, error)
@@ -96,6 +97,20 @@ func newClient(store *clientv3.Client, c EtcdConfig) (EtcdClient, error) {
}, nil
}
+// HealthCheck verifies if the database is up and running
+func (e EtcdClient) HealthCheck() error {
+
+ if e.cli == nil {
+ return pkgerrors.Errorf("Etcd Client not initialized")
+ }
+ _, err := e.cli.Get(context.Background(), "HealthCheckKey")
+ if err != nil {
+ return pkgerrors.Errorf("Error getting etcd entry: %s", err.Error())
+ }
+
+ return nil
+}
+
// Put values in Etcd DB
func (e EtcdClient) Put(key, value string) error {
diff --git a/src/k8splugin/internal/db/etcd_testing.go b/src/k8splugin/internal/db/etcd_testing.go
index 2f62d365..4022d30e 100644
--- a/src/k8splugin/internal/db/etcd_testing.go
+++ b/src/k8splugin/internal/db/etcd_testing.go
@@ -24,6 +24,10 @@ type MockEtcdClient struct {
Err error
}
+func (c *MockEtcdClient) HealthCheck() error {
+ return c.Err
+}
+
func (c *MockEtcdClient) Put(key, value string) error {
if c.Items == nil {
c.Items = make(map[string]string)
diff --git a/src/k8splugin/internal/utils/utils.go b/src/k8splugin/internal/utils/utils.go
index 174f8e79..e8ce2f8e 100644
--- a/src/k8splugin/internal/utils/utils.go
+++ b/src/k8splugin/internal/utils/utils.go
@@ -76,6 +76,7 @@ func CheckDatabaseConnection() error {
err = db.DBconn.HealthCheck()
if err != nil {
+ log.Printf("MongoDB health problem: %s", err.Error())
return pkgerrors.Cause(err)
}
// TODO Convert these to configuration files instead of environment variables.
@@ -88,6 +89,7 @@ func CheckDatabaseConnection() error {
err = db.NewEtcdClient(nil, c)
if err != nil {
log.Printf("Etcd Client Initialization failed with error: %s", err.Error())
+ return pkgerrors.Cause(err)
}
return nil
}