fix: use exponential backoff mechanism to listen on nginx.StatusPort
This commit is contained in:
parent
714783c052
commit
a08887040b
3 changed files with 54 additions and 7 deletions
|
@ -18,7 +18,6 @@ package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"os"
|
"os"
|
||||||
|
@ -46,7 +45,7 @@ func TestNginxCheck(t *testing.T) {
|
||||||
|
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
|
|
||||||
listener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
|
listener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("creating tcp listener: %s", err)
|
t.Fatalf("creating tcp listener: %s", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ import (
|
||||||
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
jsoniter "github.com/json-iterator/go"
|
||||||
apiv1 "k8s.io/api/core/v1"
|
apiv1 "k8s.io/api/core/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
|
|
||||||
"k8s.io/ingress-nginx/internal/ingress"
|
"k8s.io/ingress-nginx/internal/ingress"
|
||||||
"k8s.io/ingress-nginx/internal/nginx"
|
"k8s.io/ingress-nginx/internal/nginx"
|
||||||
|
@ -149,13 +150,13 @@ func TestIsDynamicConfigurationEnough(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestConfigureDynamically(t *testing.T) {
|
func TestConfigureDynamically(t *testing.T) {
|
||||||
listener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
|
listener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("creating tcp listener: %s", err)
|
t.Fatalf("creating tcp listener: %s", err)
|
||||||
}
|
}
|
||||||
defer listener.Close()
|
defer listener.Close()
|
||||||
|
|
||||||
streamListener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StreamPort))
|
streamListener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StreamPort))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("creating tcp listener: %s", err)
|
t.Fatalf("creating tcp listener: %s", err)
|
||||||
}
|
}
|
||||||
|
@ -303,13 +304,13 @@ func TestConfigureDynamically(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestConfigureCertificates(t *testing.T) {
|
func TestConfigureCertificates(t *testing.T) {
|
||||||
listener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
|
listener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("creating tcp listener: %s", err)
|
t.Fatalf("creating tcp listener: %s", err)
|
||||||
}
|
}
|
||||||
defer listener.Close()
|
defer listener.Close()
|
||||||
|
|
||||||
streamListener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StreamPort))
|
streamListener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StreamPort))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("creating tcp listener: %s", err)
|
t.Fatalf("creating tcp listener: %s", err)
|
||||||
}
|
}
|
||||||
|
@ -525,3 +526,25 @@ func TestCleanTempNginxCfg(t *testing.T) {
|
||||||
t.Errorf("expected one file but %d were found", len(files))
|
t.Errorf("expected one file but %d were found", len(files))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func tryListen(network, address string) (l net.Listener, err error) {
|
||||||
|
condFunc := func() (bool, error) {
|
||||||
|
l, err = net.Listen(network, address)
|
||||||
|
if err == nil {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
if strings.Contains(err.Error(), "bind: address already in use") {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
backoff := wait.Backoff{
|
||||||
|
Duration: 500 * time.Millisecond,
|
||||||
|
Factor: 2,
|
||||||
|
Steps: 6,
|
||||||
|
Cap: 128 * time.Second,
|
||||||
|
}
|
||||||
|
err = wait.ExponentialBackoff(backoff, condFunc)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
|
@ -21,10 +21,13 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
|
|
||||||
"k8s.io/ingress-nginx/internal/nginx"
|
"k8s.io/ingress-nginx/internal/nginx"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -96,7 +99,7 @@ func TestStatusCollector(t *testing.T) {
|
||||||
|
|
||||||
for _, c := range cases {
|
for _, c := range cases {
|
||||||
t.Run(c.name, func(t *testing.T) {
|
t.Run(c.name, func(t *testing.T) {
|
||||||
listener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
|
listener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("crating unix listener: %s", err)
|
t.Fatalf("crating unix listener: %s", err)
|
||||||
}
|
}
|
||||||
|
@ -147,3 +150,25 @@ func TestStatusCollector(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func tryListen(network, address string) (l net.Listener, err error) {
|
||||||
|
condFunc := func() (bool, error) {
|
||||||
|
l, err = net.Listen(network, address)
|
||||||
|
if err == nil {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
if strings.Contains(err.Error(), "bind: address already in use") {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
backoff := wait.Backoff{
|
||||||
|
Duration: 500 * time.Millisecond,
|
||||||
|
Factor: 2,
|
||||||
|
Steps: 6,
|
||||||
|
Cap: 128 * time.Second,
|
||||||
|
}
|
||||||
|
err = wait.ExponentialBackoff(backoff, condFunc)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue