Skip to content

Commit afa71d6

Browse files
author
Dmitriy Matrenichev
committed
chore: use "handle-like" resource in DNSResolveCacheController
Rework (and simplify) `DNSResolveCacheController` to use `DNSUpstream` "handle-like" resources. Depends on cosi-project/runtime#400 Signed-off-by: Dmitriy Matrenichev <dmitry.matrenichev@siderolabs.com>
1 parent 013e130 commit afa71d6

24 files changed

Lines changed: 981 additions & 1019 deletions

File tree

api/api.descriptors

-41 Bytes
Binary file not shown.

api/resource/definitions/network/network.proto

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ message DHCP6OperatorSpec {
9393
// DNSResolveCacheSpec describes DNS servers status.
9494
message DNSResolveCacheSpec {
9595
string status = 1;
96-
repeated common.NetIP servers = 2;
9796
}
9897

9998
// HardwareAddrSpec describes spec for the link.

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ require (
4747
github.com/containernetworking/plugins v1.4.0
4848
github.com/coredns/coredns v1.11.1
4949
github.com/coreos/go-iptables v0.7.0
50-
github.com/cosi-project/runtime v0.3.20
50+
github.com/cosi-project/runtime v0.4.0-alpha.4
5151
github.com/distribution/reference v0.5.0
5252
github.com/docker/docker v25.0.2+incompatible
5353
github.com/docker/go-connections v0.5.0
@@ -235,7 +235,7 @@ require (
235235
github.com/gorilla/websocket v1.5.0 // indirect
236236
github.com/gosuri/uilive v0.0.4 // indirect
237237
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect
238-
github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect
238+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect
239239
github.com/hashicorp/errwrap v1.1.0 // indirect
240240
github.com/hashicorp/go-safetemp v1.0.0 // indirect
241241
github.com/hashicorp/go-version v1.6.0 // indirect

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,8 @@ github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr
184184
github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
185185
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
186186
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
187-
github.com/cosi-project/runtime v0.3.20 h1:pl8mwbHMFIRFYV8v0Glxw2ruhTXn/5ij7TSlO9nApi4=
188-
github.com/cosi-project/runtime v0.3.20/go.mod h1:3DQsIr7zF/bmWfHOnpHmOQ9mDukFGi8AMoHx2rNsi+s=
187+
github.com/cosi-project/runtime v0.4.0-alpha.4 h1:3TN+Y0NVKa/1QXqR3QTJ6ceWrcflyUeIZbQnrU2BprM=
188+
github.com/cosi-project/runtime v0.4.0-alpha.4/go.mod h1:JE9yuyufGRCd28AyCWFkTNf3UMiZJT722bpfPEPnsNE=
189189
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
190190
github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM=
191191
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
@@ -397,8 +397,8 @@ github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWet
397397
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
398398
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI=
399399
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8=
400-
github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=
401-
github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=
400+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=
401+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=
402402
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
403403
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
404404
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=

hack/cloud-image-uploader/go.sum

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+
66
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo=
77
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 h1:6oNBlSdi1QqM1PNW7FPA6xOGA5UNsXnkaYZz9vdPGhA=
88
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI=
9-
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.4.0 h1:QfV5XZt6iNa2aWMAt96CZEbfJ7kgG/qYIpq465Shr5E=
10-
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.4.0/go.mod h1:uYt4CfhkJA9o0FN7jfE5minm/i4nUE4MjGUJkzB6Zs8=
119
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 h1:MxA59PGoCFb+vCwRQi3PhQEwHj4+r2dhuv9HG+vM7iM=
1210
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0/go.mod h1:uYt4CfhkJA9o0FN7jfE5minm/i4nUE4MjGUJkzB6Zs8=
1311
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do=
@@ -47,8 +45,6 @@ github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUM
4745
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
4846
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA=
4947
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
50-
github.com/aws/aws-sdk-go v1.50.5 h1:H2Aadcgwr7a2aqS6ZwcE+l1mA6ZrTseYCvjw2QLmxIA=
51-
github.com/aws/aws-sdk-go v1.50.5/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
5248
github.com/aws/aws-sdk-go v1.50.8 h1:gY0WoOW+/Wz6XmYSgDH9ge3wnAevYDSQWPxxJvqAkP4=
5349
github.com/aws/aws-sdk-go v1.50.8/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
5450
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=

internal/app/machined/internal/server/v1alpha1/v1alpha1_inspect.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ func (s *InspectServer) ControllerRuntimeDependencies(ctx context.Context, in *e
4444
edgeType = inspectapi.DependencyEdgeType_INPUT_WEAK
4545
case controller.EdgeInputDestroyReady:
4646
edgeType = inspectapi.DependencyEdgeType_INPUT_DESTROY_READY
47+
case controller.EdgeInputQPrimary,
48+
controller.EdgeInputQMapped,
49+
controller.EdgeInputQMappedDestroyReady:
50+
return nil, fmt.Errorf("unexpected edge type: %v", graph.Edges[i].EdgeType)
4751
}
4852

4953
edges = append(edges, &inspectapi.ControllerDependencyEdge{

internal/app/machined/pkg/controllers/network/dns_resolve_cache.go

Lines changed: 22 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,15 @@ import (
99
"fmt"
1010
"time"
1111

12+
"github.com/coredns/coredns/plugin/pkg/proxy"
1213
"github.com/cosi-project/runtime/pkg/controller"
1314
"github.com/cosi-project/runtime/pkg/resource"
1415
"github.com/cosi-project/runtime/pkg/safe"
1516
"github.com/cosi-project/runtime/pkg/state"
16-
"github.com/siderolabs/gen/optional"
1717
"go.uber.org/zap"
1818

1919
"github.com/siderolabs/talos/internal/pkg/ctxutil"
2020
"github.com/siderolabs/talos/internal/pkg/dns"
21-
"github.com/siderolabs/talos/pkg/machinery/resources/config"
2221
"github.com/siderolabs/talos/pkg/machinery/resources/network"
2322
)
2423

@@ -36,18 +35,7 @@ func (ctrl *DNSResolveCacheController) Name() string {
3635
// Inputs implements controller.Controller interface.
3736
func (ctrl *DNSResolveCacheController) Inputs() []controller.Input {
3837
return []controller.Input{
39-
{
40-
Namespace: network.NamespaceName,
41-
Type: network.ResolverStatusType,
42-
ID: optional.Some(network.ResolverID),
43-
Kind: controller.InputWeak,
44-
},
45-
{
46-
Namespace: config.NamespaceName,
47-
Type: config.MachineConfigType,
48-
ID: optional.Some(config.V1Alpha1ID),
49-
Kind: controller.InputWeak,
50-
},
38+
safe.Input[*network.DNSUpstream](controller.InputWeak),
5139
}
5240
}
5341

@@ -70,22 +58,18 @@ func (ctrl *DNSResolveCacheController) Run(ctx context.Context, r controller.Run
7058
case <-r.EventCh():
7159
}
7260

73-
mc, err := safe.ReaderGetByID[*config.MachineConfig](ctx, r, config.V1Alpha1ID)
61+
upstreams, err := safe.ReaderListAll[*network.DNSUpstream](ctx, r)
7462
if err != nil {
75-
if state.IsNotFoundError(err) {
76-
continue
77-
}
78-
79-
return err
63+
return fmt.Errorf("error getting resolver status: %w", err)
8064
}
8165

82-
if !mc.Config().Machine().Features().LocalDNSEnabled() {
66+
if upstreams.Len() == 0 {
8367
continue
8468
}
8569

8670
err = func() error {
87-
ctrl.Logger.Info("starting dns cache resolve")
88-
defer ctrl.Logger.Info("stopping dns cache resolve")
71+
ctrl.Logger.Info("starting dns caching resolver")
72+
defer ctrl.Logger.Info("stopping dns caching resolver")
8973

9074
return ctrl.runServer(ctx, r)
9175
}()
@@ -95,10 +79,9 @@ func (ctrl *DNSResolveCacheController) Run(ctx context.Context, r controller.Run
9579
}
9680
}
9781

98-
func (ctrl *DNSResolveCacheController) writeDNSStatus(ctx context.Context, r controller.Runtime, net resource.ID, handler *dns.Handler) error {
82+
func (ctrl *DNSResolveCacheController) writeDNSStatus(ctx context.Context, r controller.Runtime, net resource.ID) error {
9983
return safe.WriterModify(ctx, r, network.NewDNSResolveCache(net), func(drc *network.DNSResolveCache) error {
10084
drc.TypedSpec().Status = "running"
101-
drc.TypedSpec().Servers = handler.ProxyList()
10285

10386
return nil
10487
})
@@ -140,7 +123,7 @@ func (ctrl *DNSResolveCacheController) runServer(originCtx context.Context, r co
140123

141124
runner := dns.NewRunner(dns.NewServer(opt), l)
142125

143-
err := ctrl.writeDNSStatus(ctx, r, opt.Net, handler)
126+
err := ctrl.writeDNSStatus(ctx, r, opt.Net)
144127
if err != nil {
145128
return err
146129
}
@@ -164,33 +147,31 @@ func (ctrl *DNSResolveCacheController) runServer(originCtx context.Context, r co
164147

165148
eventCh = r.EventCh()
166149

167-
mc, err := safe.ReaderGetByID[*config.MachineConfig](ctx, r, config.V1Alpha1ID)
150+
upstreams, err := safe.ReaderListAll[*network.DNSUpstream](ctx, r)
168151
if err != nil {
169-
return err
152+
return fmt.Errorf("error getting resolver status: %w", err)
170153
}
171154

172-
if !mc.Config().Machine().Features().LocalDNSEnabled() {
155+
if upstreams.Len() == 0 {
173156
return nil
174157
}
175158

176-
resolverStatus, err := safe.ReaderGetByID[*network.ResolverStatus](ctx, r, network.ResolverID)
177-
if err != nil {
178-
if state.IsNotFoundError(err) {
179-
continue
180-
}
159+
addrs := make([]string, 0, upstreams.Len())
160+
prxs := make([]*proxy.Proxy, 0, len(addrs))
181161

182-
return fmt.Errorf("error getting resolver status: %w", err)
183-
}
162+
for it := upstreams.Iterator(); it.Next(); {
163+
upstream := it.Value()
184164

185-
ctrl.Logger.Info("updating dns server nameservers", zap.Stringers("data", resolverStatus.TypedSpec().DNSServers))
165+
addrs = append(addrs, upstream.TypedSpec().Value.Prx.Addr())
166+
prxs = append(prxs, upstream.TypedSpec().Value.Prx.(*proxy.Proxy)) //nolint:forcetypeassert
167+
}
186168

187-
err = handler.SetProxy(resolverStatus.TypedSpec().DNSServers)
188-
if err != nil {
189-
return fmt.Errorf("error setting dns server nameservers: %w", err)
169+
if handler.SetProxy(prxs) {
170+
ctrl.Logger.Info("updated dns server nameservers", zap.Strings("addrs", addrs))
190171
}
191172

192173
for _, n := range []string{"udp", "tcp"} {
193-
err = ctrl.writeDNSStatus(ctx, r, n, handler)
174+
err = ctrl.writeDNSStatus(ctx, r, n)
194175
if err != nil {
195176
return err
196177
}

internal/app/machined/pkg/controllers/network/dns_resolve_cache_test.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,10 @@ func (suite *DNSServer) TestResolving() {
5656

5757
rtestutils.AssertResources(suite.Ctx(), suite.T(), suite.State(), []resource.ID{"tcp", "udp"}, func(r *network.DNSResolveCache, assert *assert.Assertions) {
5858
assert.Equal("running", r.TypedSpec().Status)
59-
assert.Equal(dnsSlice, xslices.Map(r.TypedSpec().Servers, netip.Addr.String))
6059
})
6160

61+
rtestutils.AssertLength[*network.DNSUpstream](suite.Ctx(), suite.T(), suite.State(), len(dnsSlice))
62+
6263
msg := &dns.Msg{
6364
MsgHdr: dns.MsgHdr{
6465
Id: dns.Id(),
@@ -111,9 +112,9 @@ func (suite *DNSServer) TestSetupStartStop() {
111112

112113
rtestutils.AssertResources(suite.Ctx(), suite.T(), suite.State(), []resource.ID{"tcp", "udp"}, func(r *network.DNSResolveCache, assert *assert.Assertions) {
113114
assert.Equal("running", r.TypedSpec().Status)
114-
assert.Equal(dnsSlice, xslices.Map(r.TypedSpec().Servers, netip.Addr.String))
115115
})
116116

117+
rtestutils.AssertLength[*network.DNSUpstream](suite.Ctx(), suite.T(), suite.State(), len(dnsSlice))
117118
// stop dns resolver
118119

119120
cfg.Container().RawV1Alpha1().MachineConfig.MachineFeatures.LocalDNS = pointer.To(false)
@@ -123,6 +124,10 @@ func (suite *DNSServer) TestSetupStartStop() {
123124
ctest.AssertNoResource[*network.DNSResolveCache](suite, "tcp")
124125
ctest.AssertNoResource[*network.DNSResolveCache](suite, "udp")
125126

127+
for _, d := range dnsSlice {
128+
ctest.AssertNoResource[*network.DNSUpstream](suite, d)
129+
}
130+
126131
// start dns resolver again
127132

128133
cfg.Container().RawV1Alpha1().MachineConfig.MachineFeatures.LocalDNS = pointer.To(true)
@@ -131,15 +136,17 @@ func (suite *DNSServer) TestSetupStartStop() {
131136

132137
rtestutils.AssertResources(suite.Ctx(), suite.T(), suite.State(), []resource.ID{"tcp", "udp"}, func(r *network.DNSResolveCache, assert *assert.Assertions) {
133138
assert.Equal("running", r.TypedSpec().Status)
134-
assert.Equal(dnsSlice, xslices.Map(r.TypedSpec().Servers, netip.Addr.String))
135139
})
140+
141+
rtestutils.AssertLength[*network.DNSUpstream](suite.Ctx(), suite.T(), suite.State(), len(dnsSlice))
136142
}
137143

138144
func TestDNSServer(t *testing.T) {
139145
suite.Run(t, &DNSServer{
140146
DefaultSuite: ctest.DefaultSuite{
141147
Timeout: 10 * time.Second,
142148
AfterSetup: func(suite *ctest.DefaultSuite) {
149+
suite.Require().NoError(suite.Runtime().RegisterController(&netctrl.DNSUpstreamController{}))
143150
suite.Require().NoError(suite.Runtime().RegisterController(&netctrl.DNSResolveCacheController{
144151
Addr: ":10700",
145152
Logger: zaptest.NewLogger(t),

0 commit comments

Comments
 (0)