From e503b0942f87b5e3a9f43e8395dcd6d185b8d9ca Mon Sep 17 00:00:00 2001 From: Lukasz Rajewski Date: Mon, 11 Apr 2022 20:36:00 +0200 Subject: Fixed detection of the etcd connection status Issue-ID: MULTICLOUD-1468 Signed-off-by: Lukasz Rajewski Change-Id: If243e9a484afe5db7d9538a1875241fa425a2516 --- src/k8splugin/api/healthcheckhandler.go | 5 +++++ src/k8splugin/api/healthcheckhandler_test.go | 24 +++++++++++++++++++++++- src/k8splugin/internal/db/etcd.go | 15 +++++++++++++++ src/k8splugin/internal/db/etcd_testing.go | 4 ++++ src/k8splugin/internal/utils/utils.go | 2 ++ 5 files changed, 49 insertions(+), 1 deletion(-) 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 } -- cgit 1.2.3-korg