Skip to content

Commit c7aa266

Browse files
committed
fix: overwrite resolver config with machine config
Fixes #12614 Signed-off-by: Andrey Smirnov <andrey.smirnov@siderolabs.com>
1 parent cf70f05 commit c7aa266

File tree

3 files changed

+49
-7
lines changed

3 files changed

+49
-7
lines changed

hack/release.toml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,8 @@ BREAKING: If you were relying on the resources EtcdConfigs, KubeletConfigs, Cont
139139
"""
140140

141141
[notes.serviceAccountIssuer]
142-
title = "Service Account Issuer configuration"
143-
description = """\
142+
title = "Service Account Issuer configuration"
143+
description = """\
144144
In API Server, passing extra args with `service-account-issuer` will append them after default value.
145145
This allows easy migration, e.g. by changing `.cluster.controlPlane.endpoint` to new value, and keeping the old value in
146146
`.cluster.apiServer.extraArgs["service-account-issuer"]`.
@@ -155,6 +155,13 @@ For example:
155155
* a max size of "-25%" means the volume can grow to the available space minus 25%.
156156
"""
157157

158+
[notes.resolver_config]
159+
title = "ResolverConfig"
160+
description = """\
161+
The nameservers configuration in machine configuration now overwrites any previous layers (defaults, platform, etc.) when specified.
162+
Previously a smart merge was performed to keep IPv4/IPv6 nameservers from lower layers if the machine configuration specified only one type.
163+
"""
164+
158165
[make_deps]
159166

160167
[make_deps.tools]

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,19 @@ func NewResolverMergeController() controller.Controller {
4040

4141
final.SearchDomains = slices.Insert(final.SearchDomains, 0, spec.SearchDomains...)
4242

43-
if spec.ConfigLayer == final.ConfigLayer {
43+
switch spec.ConfigLayer { //nolint:exhaustive
44+
case final.ConfigLayer:
4445
// simply append server lists on the same layer
4546
final.DNSServers = append(final.DNSServers, spec.DNSServers...)
46-
} else {
47+
case network.ConfigMachineConfiguration:
48+
// machine configuration layer overrides any previous layers completely
49+
final.DNSServers = slices.Clone(spec.DNSServers)
50+
default:
4751
// otherwise, do a smart merge across IPv4/IPv6
48-
final.ConfigLayer = spec.ConfigLayer
4952
mergeDNSServers(&final.DNSServers, spec.DNSServers)
5053
}
54+
55+
final.ConfigLayer = spec.ConfigLayer
5156
}
5257

5358
if final.DNSServers != nil {
@@ -63,7 +68,7 @@ func NewResolverMergeController() controller.Controller {
6368

6469
func mergeDNSServers(dst *[]netip.Addr, src []netip.Addr) {
6570
if *dst == nil {
66-
*dst = src
71+
*dst = slices.Clone(src)
6772

6873
return
6974
}
@@ -81,6 +86,6 @@ func mergeDNSServers(dst *[]netip.Addr, src []netip.Addr) {
8186
case dstHasV6 && !srcHasV6:
8287
*dst = slices.Concat(src, xslices.Filter(*dst, netip.Addr.Is6))
8388
default:
84-
*dst = src
89+
*dst = slices.Clone(src)
8590
}
8691
}

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,36 @@ func (suite *ResolverMergeSuite) TestMergeIPv46() {
117117
)
118118
}
119119

120+
func (suite *ResolverMergeSuite) TestMergeIPv6OnlyConfig() {
121+
def := network.NewResolverSpec(network.ConfigNamespaceName, "default/resolvers")
122+
*def.TypedSpec() = network.ResolverSpecSpec{
123+
DNSServers: []netip.Addr{
124+
netip.MustParseAddr(constants.DefaultPrimaryResolver),
125+
netip.MustParseAddr(constants.DefaultSecondaryResolver),
126+
},
127+
ConfigLayer: network.ConfigDefault,
128+
}
129+
130+
cfg := network.NewResolverSpec(network.ConfigNamespaceName, "cfg/resolvers")
131+
*cfg.TypedSpec() = network.ResolverSpecSpec{
132+
DNSServers: []netip.Addr{netip.MustParseAddr("fe80::1")},
133+
ConfigLayer: network.ConfigMachineConfiguration,
134+
}
135+
136+
for _, res := range []resource.Resource{def, cfg} {
137+
suite.Create(res)
138+
}
139+
140+
suite.assertResolvers(
141+
[]string{
142+
"resolvers",
143+
}, func(r *network.ResolverSpec, asrt *assert.Assertions) {
144+
asrt.Equal(network.ConfigMachineConfiguration, r.TypedSpec().ConfigLayer)
145+
asrt.Equal(`["fe80::1"]`, fmt.Sprintf("%q", r.TypedSpec().DNSServers))
146+
},
147+
)
148+
}
149+
120150
func TestResolverMergeSuite(t *testing.T) {
121151
t.Parallel()
122152

0 commit comments

Comments
 (0)