diff --git a/internal/ingress/controller/checker.go b/internal/ingress/controller/checker.go index d1bf19ddf..2a9245fc6 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 a8a0b67ad..13e238d3d 100644 --- a/internal/ingress/controller/checker_test.go +++ b/internal/ingress/controller/checker_test.go @@ -44,6 +44,7 @@ func TestNginxCheck(t *testing.T) { t.Run(testName, func(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) @@ -64,10 +65,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 fc586e9e8..7348f83a5 100644 --- a/internal/nginx/main.go +++ b/internal/nginx/main.go @@ -80,6 +80,24 @@ func NewGetStatusRequest(path string) (statusCode int, data []byte, err 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{}) (statusCode int, body []byte, err error) { url := fmt.Sprintf("http://127.0.0.1:%v%v", StatusPort, path)