Skip to content

Commit c88352f

Browse files
committed
proxy DNS, fix data race, shutdown test registries
1. use global DNS proxy instead of a mock resolver 2. fix data race and broken DefaultResolver 3. add previously missing test registry shutdowns Signed-off-by: leigh capili <leigh@null.net>
1 parent cda7eea commit c88352f

3 files changed

Lines changed: 64 additions & 32 deletions

File tree

go.mod

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ require (
4040
github.com/fluxcd/pkg/testserver v0.13.0
4141
github.com/fluxcd/pkg/version v0.11.0
4242
github.com/fluxcd/source-controller/api v1.7.0
43-
github.com/foxcpp/go-mockdns v1.2.0
4443
github.com/go-git/go-billy/v5 v5.7.0
4544
github.com/go-git/go-git/v5 v5.16.4
4645
github.com/go-logr/logr v1.4.3
4746
github.com/google/go-containerregistry v0.20.7
4847
github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20250613215107-59a4b8593039
4948
github.com/google/uuid v1.6.0
49+
github.com/miekg/dns v1.1.61
5050
github.com/minio/minio-go/v7 v7.0.95
5151
github.com/notaryproject/notation-core-go v1.3.0
5252
github.com/notaryproject/notation-go v1.3.2
@@ -276,7 +276,6 @@ require (
276276
github.com/mattn/go-colorable v0.1.14 // indirect
277277
github.com/mattn/go-isatty v0.0.20 // indirect
278278
github.com/mattn/go-runewidth v0.0.16 // indirect
279-
github.com/miekg/dns v1.1.61 // indirect
280279
github.com/miekg/pkcs11 v1.1.1 // indirect
281280
github.com/minio/crc64nvme v1.0.2 // indirect
282281
github.com/minio/md5-simd v1.1.2 // indirect

go.sum

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,6 @@ github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxU
727727
github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A=
728728
github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
729729
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
730-
github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk=
731730
github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs=
732731
github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ=
733732
github.com/miekg/pkcs11 v1.0.3-0.20190429190417-a667d056470f/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
@@ -1126,7 +1125,6 @@ golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58
11261125
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
11271126
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
11281127
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
1129-
golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g=
11301128
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
11311129
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
11321130
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
@@ -1144,7 +1142,6 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
11441142
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
11451143
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
11461144
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
1147-
golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
11481145
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
11491146
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
11501147
golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI=
@@ -1176,7 +1173,6 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
11761173
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
11771174
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
11781175
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
1179-
golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ=
11801176
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
11811177
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
11821178
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
@@ -1195,8 +1191,6 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
11951191
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
11961192
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
11971193
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
1198-
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
1199-
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
12001194
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
12011195
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
12021196
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
@@ -1235,7 +1229,6 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
12351229
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
12361230
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
12371231
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1238-
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
12391232
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
12401233
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
12411234
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
@@ -1250,7 +1243,6 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
12501243
golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
12511244
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
12521245
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
1253-
golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww=
12541246
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
12551247
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
12561248
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
@@ -1285,7 +1277,6 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f
12851277
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
12861278
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
12871279
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
1288-
golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk=
12891280
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
12901281
golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA=
12911282
golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc=

internal/controller/suite_test.go

Lines changed: 63 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
"crypto/x509"
2424
"fmt"
2525
"io"
26-
"log"
2726
"math/rand"
2827
"net"
2928
"net/http"
@@ -36,7 +35,7 @@ import (
3635
dockerRegistry "github.com/distribution/distribution/v3/registry"
3736
_ "github.com/distribution/distribution/v3/registry/auth/htpasswd"
3837
_ "github.com/distribution/distribution/v3/registry/storage/driver/inmemory"
39-
"github.com/foxcpp/go-mockdns"
38+
"github.com/miekg/dns"
4039
"github.com/phayes/freeport"
4140
"github.com/sirupsen/logrus"
4241
"golang.org/x/crypto/bcrypt"
@@ -123,7 +122,7 @@ type registryClientTestServer struct {
123122
registryHost string
124123
workspaceDir string
125124
registryClient *helmreg.Client
126-
dnsServer *mockdns.Server
125+
registry *dockerRegistry.Registry
127126
}
128127

129128
type registryOptions struct {
@@ -157,23 +156,11 @@ func setupRegistryServer(ctx context.Context, workspaceDir string, opts registry
157156
}
158157

159158
// Change the registry host to a host which is not localhost and
160-
// mock DNS to map example.com to 127.0.0.1.
159+
// TestMain() will create a DNS proxy to map example.com to 127.0.0.1.
161160
// This is required because Docker enforces HTTP if the registry
162161
// is hosted on localhost/127.0.0.1.
163162
if opts.withTLS {
164163
server.registryHost = fmt.Sprintf("example.com:%d", port)
165-
// Disable DNS server logging as it is extremely chatty.
166-
dnsLog := log.Default()
167-
dnsLog.SetOutput(io.Discard)
168-
server.dnsServer, err = mockdns.NewServerWithLogger(map[string]mockdns.Zone{
169-
"example.com.": {
170-
A: []string{"127.0.0.1"},
171-
},
172-
}, dnsLog, false)
173-
if err != nil {
174-
return nil, err
175-
}
176-
server.dnsServer.PatchNet(net.DefaultResolver)
177164
} else {
178165
server.registryHost = fmt.Sprintf("127.0.0.1:%d", port)
179166
}
@@ -230,6 +217,7 @@ func setupRegistryServer(ctx context.Context, workspaceDir string, opts registry
230217
if err != nil {
231218
return nil, fmt.Errorf("failed to create docker registry: %w", err)
232219
}
220+
server.registry = registry
233221

234222
// init test client
235223
helmClient, err := helmreg.NewClient(clientOpts...)
@@ -239,7 +227,7 @@ func setupRegistryServer(ctx context.Context, workspaceDir string, opts registry
239227
server.registryClient = helmClient
240228

241229
// Start Docker registry
242-
go registry.ListenAndServe()
230+
go server.registry.ListenAndServe()
243231

244232
return server, nil
245233
}
@@ -267,23 +255,39 @@ func tlsConfiguredHTTPCLient() (*http.Client, error) {
267255
}
268256

269257
func (r *registryClientTestServer) Close() {
270-
if r.dnsServer != nil {
271-
mockdns.UnpatchNet(net.DefaultResolver)
272-
r.dnsServer.Close()
258+
if r.registry != nil {
259+
_ = r.registry.Shutdown(ctx)
273260
}
274261
}
275262

276263
func TestMain(m *testing.M) {
277264
initTestTLS()
278265

266+
// Setup global test DNS proxy
267+
dnsServer, addr, err := startDNSProxy("1.1.1.1:53")
268+
if err != nil {
269+
panic(fmt.Sprintf("failed to create test DNS proxy: %v", err))
270+
}
271+
defer dnsServer.Shutdown()
272+
273+
origDial := net.DefaultResolver.Dial
274+
origPreferGo := net.DefaultResolver.PreferGo
275+
net.DefaultResolver.PreferGo = true
276+
net.DefaultResolver.Dial = func(ctx context.Context, network, address string) (net.Conn, error) {
277+
return net.Dial("udp", addr)
278+
}
279+
defer func() {
280+
net.DefaultResolver.Dial = origDial
281+
net.DefaultResolver.PreferGo = origPreferGo
282+
}()
283+
279284
utilruntime.Must(sourcev1.AddToScheme(scheme.Scheme))
280285

281286
testEnv = testenv.New(
282287
testenv.WithCRDPath(filepath.Join("..", "..", "config", "crd", "bases")),
283288
testenv.WithMaxConcurrentReconciles(4),
284289
)
285290

286-
var err error
287291
// Initialize a cacheless client for tests that need the latest objects.
288292
k8sClient, err = client.New(testEnv.Config, client.Options{Scheme: scheme.Scheme})
289293
if err != nil {
@@ -410,6 +414,44 @@ func TestMain(m *testing.M) {
410414
os.Exit(code)
411415
}
412416

417+
func startDNSProxy(upstream string) (*dns.Server, string, error) {
418+
pc, err := net.ListenPacket("udp", "127.0.0.1:0")
419+
if err != nil {
420+
return nil, "", err
421+
}
422+
423+
server := &dns.Server{
424+
PacketConn: pc,
425+
Handler: dns.HandlerFunc(func(w dns.ResponseWriter, r *dns.Msg) {
426+
m := new(dns.Msg)
427+
m.SetReply(r)
428+
m.RecursionAvailable = true
429+
430+
for _, q := range r.Question {
431+
if q.Name == "example.com." && q.Qtype == dns.TypeA {
432+
rr, _ := dns.NewRR("example.com. 3600 IN A 127.0.0.1")
433+
m.Answer = append(m.Answer, rr)
434+
} else {
435+
// Forward
436+
c := new(dns.Client)
437+
in, _, err := c.Exchange(r, upstream)
438+
if err == nil {
439+
m.Answer = append(m.Answer, in.Answer...)
440+
m.Ns = append(m.Ns, in.Ns...)
441+
m.Extra = append(m.Extra, in.Extra...)
442+
m.Rcode = in.Rcode
443+
} else {
444+
m.Rcode = dns.RcodeServerFailure
445+
}
446+
}
447+
}
448+
w.WriteMsg(m)
449+
}),
450+
}
451+
go server.ActivateAndServe()
452+
return server, pc.LocalAddr().String(), nil
453+
}
454+
413455
func initTestTLS() {
414456
var err error
415457
tlsPublicKey, err = os.ReadFile("testdata/certs/server.pem")

0 commit comments

Comments
 (0)