diff --git a/cmd/nginx/main.go b/cmd/nginx/main.go index 2e5e677c6..d1f0546f0 100644 --- a/cmd/nginx/main.go +++ b/cmd/nginx/main.go @@ -135,7 +135,9 @@ func main() { setupSSLProxy(conf.ListenPorts.HTTPS, conf.ListenPorts.SSLProxy, ngx) } - go handleSigterm(ngx) + go handleSigterm(ngx, func(code int) { + os.Exit(code) + }) mux := http.NewServeMux() go registerHandlers(conf.EnableProfiling, conf.ListenPorts.Health, ngx, mux) @@ -143,7 +145,9 @@ func main() { ngx.Start() } -func handleSigterm(ngx *controller.NGINXController) { +type exiter func(code int) + +func handleSigterm(ngx *controller.NGINXController, exit exiter) { signalChan := make(chan os.Signal, 1) signal.Notify(signalChan, syscall.SIGTERM) <-signalChan @@ -159,7 +163,7 @@ func handleSigterm(ngx *controller.NGINXController) { time.Sleep(10 * time.Second) glog.Infof("Exiting with %v", exitCode) - os.Exit(exitCode) + exit(exitCode) } func setupSSLProxy(sslPort, proxyPort int, n *controller.NGINXController) { diff --git a/cmd/nginx/main_test.go b/cmd/nginx/main_test.go new file mode 100644 index 000000000..7933b5df0 --- /dev/null +++ b/cmd/nginx/main_test.go @@ -0,0 +1,93 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "fmt" + "os" + "syscall" + "testing" + "time" + + "k8s.io/ingress-nginx/internal/ingress/controller" +) + +func TestCreateApiserverClient(t *testing.T) { + home := os.Getenv("HOME") + kubeConfigFile := fmt.Sprintf("%v/.kube/config", home) + + cli, err := createApiserverClient("", kubeConfigFile) + if err != nil { + t.Fatalf("unexpected error creating api server client: %v", err) + } + if cli == nil { + t.Fatalf("expected a kubernetes client but none returned") + } + + _, err = createApiserverClient("", "") + if err == nil { + t.Fatalf("expected an error creating api server client without an api server URL or kubeconfig file") + } +} + +func TestHandleSigterm(t *testing.T) { + home := os.Getenv("HOME") + kubeConfigFile := fmt.Sprintf("%v/.kube/config", home) + + cli, err := createApiserverClient("", kubeConfigFile) + if err != nil { + t.Fatalf("unexpected error creating api server client: %v", err) + } + + resetForTesting(func() { t.Fatal("bad parse") }) + + os.Setenv("POD_NAME", "test") + os.Setenv("POD_NAMESPACE", "test") + defer os.Setenv("POD_NAME", "") + defer os.Setenv("POD_NAMESPACE", "") + + oldArgs := os.Args + defer func() { os.Args = oldArgs }() + os.Args = []string{"cmd", "--default-backend-service", "ingress-nginx/default-backend-http", "--http-port", "0", "--https-port", "0"} + + _, conf, err := parseFlags() + if err != nil { + t.Errorf("unexpected error creating NGINX controller: %v", err) + } + conf.Client = cli + + ngx := controller.NewNGINXController(conf) + + go handleSigterm(ngx, func(code int) { + if code != 1 { + t.Errorf("expected exit code 1 but %v received", code) + } + + return + }) + + time.Sleep(1 * time.Second) + + t.Logf("sending SIGTERM to process PID %v", syscall.Getpid()) + err = syscall.Kill(syscall.Getpid(), syscall.SIGTERM) + if err != nil { + t.Errorf("unexpected error sending SIGTERM signal") + } +} + +func TestRegisterHandlers(t *testing.T) { +}