From 36b20c355b8376272439987f68773f381e36d146 Mon Sep 17 00:00:00 2001 From: Hans Kristian Moen Date: Mon, 6 Feb 2023 15:41:38 -0800 Subject: [PATCH] add default http check --- internal/ingress/controller/checker.go | 9 ++++++++ internal/ingress/controller/checker_test.go | 24 ++++++++++++++++++++- internal/nginx/main.go | 18 ++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/internal/ingress/controller/checker.go b/internal/ingress/controller/checker.go index 3229778bb..b0a49798e 100644 --- a/internal/ingress/controller/checker.go +++ b/internal/ingress/controller/checker.go @@ -69,5 +69,14 @@ func (n *NGINXController) Check(_ *http.Request) error { return fmt.Errorf("dynamic load balancer not started") } + statusCode, _, err = nginx.NewGetHealthzRequest(n.cfg.ListenPorts.HTTP, "/healthz") + if err != nil { + return fmt.Errorf("checking if default http port is responding: %w", err) + } + + if statusCode != 200 { + return fmt.Errorf("default nginx http port not responding") + } + return nil } diff --git a/internal/ingress/controller/checker_test.go b/internal/ingress/controller/checker_test.go index a0d2baafa..db02f396d 100644 --- a/internal/ingress/controller/checker_test.go +++ b/internal/ingress/controller/checker_test.go @@ -45,6 +45,7 @@ func TestNginxCheck(t *testing.T) { mux := http.NewServeMux() + // Status server listener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StatusPort)) if err != nil { t.Fatalf("creating tcp listener: %s", err) @@ -65,10 +66,31 @@ func TestNginxCheck(t *testing.T) { n := &NGINXController{ cfg: &Configuration{ - ListenPorts: &ngx_config.ListenPorts{}, + ListenPorts: &ngx_config.ListenPorts{ + HTTP: 80, + }, }, } + // http server + httpListener, err := tryListen("tcp", fmt.Sprintf(":%v", n.cfg.ListenPorts.HTTP)) + if err != nil { + t.Fatalf("creating tcp listener: %s", err) + } + defer httpListener.Close() + + httpServer := &httptest.Server{ + Listener: httpListener, + Config: &http.Server{ + Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + fmt.Fprintf(w, "ok") + }), + }, + } + defer httpServer.Close() + httpServer.Start() + t.Run("no pid or process", func(t *testing.T) { if err := callHealthz(true, tt.healthzPath, mux); err == nil { t.Error("expected an error but none returned") diff --git a/internal/nginx/main.go b/internal/nginx/main.go index ae319fe1f..93a6b05e0 100644 --- a/internal/nginx/main.go +++ b/internal/nginx/main.go @@ -80,6 +80,24 @@ func NewGetStatusRequest(path string) (int, []byte, error) { return res.StatusCode, data, nil } +func NewGetHealthzRequest(port int, path string) (int, []byte, error) { + url := fmt.Sprintf("http://127.0.0.1:%v%v", port, path) + + client := http.Client{} + res, err := client.Get(url) + if err != nil { + return 0, nil, err + } + defer res.Body.Close() + + data, err := io.ReadAll(res.Body) + if err != nil { + return 0, nil, err + } + + return res.StatusCode, data, nil +} + // NewPostStatusRequest creates a new POST request to the internal NGINX status server func NewPostStatusRequest(path, contentType string, data interface{}) (int, []byte, error) { url := fmt.Sprintf("http://127.0.0.1:%v%v", StatusPort, path)