Skip to content

Commit 0396b88

Browse files
authored
Merge pull request #7131 from tokers/fix/listen-on-nginx-status-port
fix: use exponential backoff policy to listen on `nginx.StatusPort` in unit test cases
2 parents 714783c + a088870 commit 0396b88

File tree

3 files changed

+54
-7
lines changed

3 files changed

+54
-7
lines changed

internal/ingress/controller/checker_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package controller
1818

1919
import (
2020
"fmt"
21-
"net"
2221
"net/http"
2322
"net/http/httptest"
2423
"os"
@@ -46,7 +45,7 @@ func TestNginxCheck(t *testing.T) {
4645

4746
mux := http.NewServeMux()
4847

49-
listener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
48+
listener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
5049
if err != nil {
5150
t.Fatalf("creating tcp listener: %s", err)
5251
}

internal/ingress/controller/nginx_test.go

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131

3232
jsoniter "github.com/json-iterator/go"
3333
apiv1 "k8s.io/api/core/v1"
34+
"k8s.io/apimachinery/pkg/util/wait"
3435

3536
"k8s.io/ingress-nginx/internal/ingress"
3637
"k8s.io/ingress-nginx/internal/nginx"
@@ -149,13 +150,13 @@ func TestIsDynamicConfigurationEnough(t *testing.T) {
149150
}
150151

151152
func TestConfigureDynamically(t *testing.T) {
152-
listener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
153+
listener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
153154
if err != nil {
154155
t.Fatalf("creating tcp listener: %s", err)
155156
}
156157
defer listener.Close()
157158

158-
streamListener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StreamPort))
159+
streamListener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StreamPort))
159160
if err != nil {
160161
t.Fatalf("creating tcp listener: %s", err)
161162
}
@@ -303,13 +304,13 @@ func TestConfigureDynamically(t *testing.T) {
303304
}
304305

305306
func TestConfigureCertificates(t *testing.T) {
306-
listener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
307+
listener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
307308
if err != nil {
308309
t.Fatalf("creating tcp listener: %s", err)
309310
}
310311
defer listener.Close()
311312

312-
streamListener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StreamPort))
313+
streamListener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StreamPort))
313314
if err != nil {
314315
t.Fatalf("creating tcp listener: %s", err)
315316
}
@@ -525,3 +526,25 @@ func TestCleanTempNginxCfg(t *testing.T) {
525526
t.Errorf("expected one file but %d were found", len(files))
526527
}
527528
}
529+
530+
func tryListen(network, address string) (l net.Listener, err error) {
531+
condFunc := func() (bool, error) {
532+
l, err = net.Listen(network, address)
533+
if err == nil {
534+
return true, nil
535+
}
536+
if strings.Contains(err.Error(), "bind: address already in use") {
537+
return false, nil
538+
}
539+
return false, err
540+
}
541+
542+
backoff := wait.Backoff{
543+
Duration: 500 * time.Millisecond,
544+
Factor: 2,
545+
Steps: 6,
546+
Cap: 128 * time.Second,
547+
}
548+
err = wait.ExponentialBackoff(backoff, condFunc)
549+
return
550+
}

internal/ingress/metric/collectors/nginx_status_test.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,13 @@ import (
2121
"net"
2222
"net/http"
2323
"net/http/httptest"
24+
"strings"
2425
"testing"
2526
"time"
2627

2728
"github.com/prometheus/client_golang/prometheus"
29+
"k8s.io/apimachinery/pkg/util/wait"
30+
2831
"k8s.io/ingress-nginx/internal/nginx"
2932
)
3033

@@ -96,7 +99,7 @@ func TestStatusCollector(t *testing.T) {
9699

97100
for _, c := range cases {
98101
t.Run(c.name, func(t *testing.T) {
99-
listener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
102+
listener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
100103
if err != nil {
101104
t.Fatalf("crating unix listener: %s", err)
102105
}
@@ -147,3 +150,25 @@ func TestStatusCollector(t *testing.T) {
147150
})
148151
}
149152
}
153+
154+
func tryListen(network, address string) (l net.Listener, err error) {
155+
condFunc := func() (bool, error) {
156+
l, err = net.Listen(network, address)
157+
if err == nil {
158+
return true, nil
159+
}
160+
if strings.Contains(err.Error(), "bind: address already in use") {
161+
return false, nil
162+
}
163+
return false, err
164+
}
165+
166+
backoff := wait.Backoff{
167+
Duration: 500 * time.Millisecond,
168+
Factor: 2,
169+
Steps: 6,
170+
Cap: 128 * time.Second,
171+
}
172+
err = wait.ExponentialBackoff(backoff, condFunc)
173+
return
174+
}

0 commit comments

Comments
 (0)