55package network_test
66
77import (
8+ "errors"
89 "net"
910 "net/netip"
1011 "sync"
@@ -23,6 +24,8 @@ import (
2324
2425 "github.com/siderolabs/talos/internal/app/machined/pkg/controllers/ctest"
2526 netctrl "github.com/siderolabs/talos/internal/app/machined/pkg/controllers/network"
27+ "github.com/siderolabs/talos/pkg/machinery/config/machine"
28+ "github.com/siderolabs/talos/pkg/machinery/resources/cluster"
2629 "github.com/siderolabs/talos/pkg/machinery/resources/network"
2730)
2831
@@ -141,6 +144,108 @@ func (suite *DNSServer) TestSetupStartStop() {
141144 rtestutils .AssertLength [* network.DNSUpstream ](suite .Ctx (), suite .T (), suite .State (), len (dnsSlice ))
142145}
143146
147+ func (suite * DNSServer ) TestResolveMembers () {
148+ port := must .Value (getDynamicPort ())(suite .T ())
149+
150+ const (
151+ id = "talos-default-controlplane-1"
152+ id2 = "foo.example.com."
153+ )
154+
155+ member := cluster .NewMember (cluster .NamespaceName , id )
156+ * member .TypedSpec () = cluster.MemberSpec {
157+ NodeID : id ,
158+ Addresses : []netip.Addr {
159+ netip .MustParseAddr ("172.20.0.2" ),
160+ },
161+ Hostname : id ,
162+ MachineType : machine .TypeControlPlane ,
163+ OperatingSystem : "Talos dev" ,
164+ ControlPlane : nil ,
165+ }
166+
167+ suite .Require ().NoError (suite .State ().Create (suite .Ctx (), member ))
168+
169+ member = cluster .NewMember (cluster .NamespaceName , id2 )
170+ * member .TypedSpec () = cluster.MemberSpec {
171+ NodeID : id2 ,
172+ Addresses : []netip.Addr {
173+ netip .MustParseAddr ("172.20.0.3" ),
174+ },
175+ Hostname : id2 ,
176+ MachineType : machine .TypeWorker ,
177+ OperatingSystem : "Talos dev" ,
178+ ControlPlane : nil ,
179+ }
180+
181+ suite .Require ().NoError (suite .State ().Create (suite .Ctx (), member ))
182+
183+ cfg := network .NewHostDNSConfig (network .HostDNSConfigID )
184+ cfg .TypedSpec ().Enabled = true
185+ cfg .TypedSpec ().ListenAddresses = makeAddrs (port )
186+ cfg .TypedSpec ().ResolveMemberNames = true
187+ suite .Require ().NoError (suite .State ().Create (suite .Ctx (), cfg ))
188+
189+ rtestutils .AssertResources (suite .Ctx (), suite .T (), suite .State (),
190+ expectedDNSRunners (port ),
191+ func (r * network.DNSResolveCache , assert * assert.Assertions ) {
192+ assert .Equal ("running" , r .TypedSpec ().Status )
193+ },
194+ )
195+
196+ suite .Require ().NoError (retry .Constant (3 * time .Second , retry .WithUnits (100 * time .Millisecond )).Retry (func () error {
197+ exchange , err := dns .Exchange (
198+ & dns.Msg {
199+ MsgHdr : dns.MsgHdr {Id : dns .Id (), RecursionDesired : true },
200+ Question : []dns.Question {
201+ {Name : dns .Fqdn (id ), Qtype : dns .TypeA , Qclass : dns .ClassINET },
202+ },
203+ },
204+ "127.0.0.53:" + port ,
205+ )
206+ if err != nil {
207+ return retry .ExpectedError (err )
208+ }
209+
210+ if exchange .Rcode != dns .RcodeSuccess {
211+ return retry .ExpectedErrorf ("expected rcode %d, got %d for %q" , dns .RcodeSuccess , exchange .Rcode , id )
212+ }
213+
214+ proper := dns .Fqdn (id )
215+
216+ if exchange .Answer [0 ].Header ().Name != proper {
217+ return retry .ExpectedErrorf ("expected answer name %q, got %q" , proper , exchange .Answer [0 ].Header ().Name )
218+ }
219+
220+ return nil
221+ }))
222+
223+ suite .Require ().NoError (retry .Constant (3 * time .Second , retry .WithUnits (100 * time .Millisecond )).Retry (func () error {
224+ exchange , err := dns .Exchange (
225+ & dns.Msg {
226+ MsgHdr : dns.MsgHdr {Id : dns .Id (), RecursionDesired : true },
227+ Question : []dns.Question {
228+ {Name : dns .Fqdn ("foo" ), Qtype : dns .TypeA , Qclass : dns .ClassINET },
229+ },
230+ },
231+ "127.0.0.53:" + port ,
232+ )
233+ if err != nil {
234+ return retry .ExpectedError (err )
235+ }
236+
237+ if exchange .Rcode != dns .RcodeSuccess {
238+ return retry .ExpectedErrorf ("expected rcode %d, got %d for %q" , dns .RcodeSuccess , exchange .Rcode , id2 )
239+ }
240+
241+ if ! exchange .Answer [0 ].(* dns.A ).A .Equal (net .ParseIP ("172.20.0.3" )) {
242+ return retry .ExpectedError (errors .New ("unexpected ip" ))
243+ }
244+
245+ return nil
246+ }))
247+ }
248+
144249func TestDNSServer (t * testing.T ) {
145250 suite .Run (t , & DNSServer {
146251 DefaultSuite : ctest.DefaultSuite {
@@ -149,6 +254,7 @@ func TestDNSServer(t *testing.T) {
149254 suite .Require ().NoError (suite .Runtime ().RegisterController (& netctrl.DNSUpstreamController {}))
150255 suite .Require ().NoError (suite .Runtime ().RegisterController (& netctrl.DNSResolveCacheController {
151256 Logger : zaptest .NewLogger (t ),
257+ State : suite .State (),
152258 }))
153259 },
154260 },
0 commit comments