Skip to content

Commit d195427

Browse files
committed
feat: add extraArgs from service-account-issuer
In API Server, passing extra args with `service-account-issuer` will add them to default value. Fixes #11694 Signed-off-by: Mateusz Urbanek <mateusz.urbanek@siderolabs.com>
1 parent 91b88f7 commit d195427

File tree

5 files changed

+93
-3
lines changed

5 files changed

+93
-3
lines changed

hack/release.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,12 @@ Several Talos configuration fields that previously accepted single string values
136136
This includes fields such as `.cluster.apiServer.extraArgs`.
137137
138138
BREAKING: If you were relying on the resources EtcdConfigs, KubeletConfigs, ControllerManagerConfigs, SchedulerConfigs or APIServerConfigs, the protobuf format has changed from `map<string,string>` to `map<string,message>`.
139+
"""
140+
141+
[notes.serviceAccountIssuer]
142+
title = "Service Account Issuer configuration"
143+
description = """\
144+
In API Server, passing extra args with `service-account-issuer` will prepend them before default value.
139145
"""
140146

141147
[make_deps]

internal/app/machined/pkg/controllers/k8s/control_plane_static_pod.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ func (ctrl *ControlPlaneStaticPodController) manageAPIServer(ctx context.Context
429429
"etcd-keyfile": argsbuilder.MergeDenied,
430430
"kubelet-client-certificate": argsbuilder.MergeDenied,
431431
"kubelet-client-key": argsbuilder.MergeDenied,
432+
"service-account-issuer": argsbuilder.MergePrepend,
432433
"service-account-key-file": argsbuilder.MergeDenied,
433434
"service-account-signing-key-file": argsbuilder.MergeDenied,
434435
"tls-cert-file": argsbuilder.MergeDenied,

pkg/argsbuilder/argsbuilder_args.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,18 @@ func (a Args) Merge(args Args, setters ...MergeOption) error {
5353
case MergeOverwrite:
5454
a[key] = slices.Clone(val)
5555

56+
case MergeAppend:
57+
existing := make([]string, 0, len(val)+len(a[key]))
58+
existing = append(existing, a[key]...)
59+
existing = append(existing, val...)
60+
a[key] = existing
61+
62+
case MergePrepend:
63+
existing := make([]string, 0, len(val)+len(a[key]))
64+
existing = append(existing, val...)
65+
existing = append(existing, a[key]...)
66+
a[key] = existing
67+
5668
case MergeAdditive:
5769
// 1. Join the existing []string slice into one string so we can Split it.
5870
// This handles cases where a[key] might be ["a", "b"] or ["a,b"].

pkg/argsbuilder/argsbuilder_interface.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ const (
1414
MergeAdditive
1515
// MergeDenied fail merge if another object has the arg defined.
1616
MergeDenied
17+
// MergePrepend prepends new values before existing ones.
18+
MergePrepend
19+
// MergeAppend appends new values after existing ones.
20+
MergeAppend
1721
)
1822

1923
// MergePolicies merge policy map.

pkg/argsbuilder/argsbuilder_test.go

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ func (suite *ArgsbuilderSuite) TestMergeAdditive() {
2323
}
2424

2525
suite.Require().NoError(
26-
args.Merge(argsbuilder.Args{
27-
"param": {"value2, value10"},
28-
},
26+
args.Merge(
27+
argsbuilder.Args{
28+
"param": {"value2, value10"},
29+
},
2930
argsbuilder.WithMergePolicies(argsbuilder.MergePolicies{
3031
"param": argsbuilder.MergeAdditive,
3132
}),
@@ -73,6 +74,72 @@ func (suite *ArgsbuilderSuite) TestMergeOverwrite() {
7374
suite.Assert().Equal([]string{"--param=value10", "--param=value11"}, args.Args())
7475
}
7576

77+
//nolint:dupl
78+
func (suite *ArgsbuilderSuite) TestMergePrepend() {
79+
args := argsbuilder.Args{
80+
"param": {"value1"},
81+
}
82+
83+
suite.Require().NoError(
84+
args.Merge(argsbuilder.Args{
85+
"param": {"value2", "value3"},
86+
},
87+
argsbuilder.WithMergePolicies(argsbuilder.MergePolicies{
88+
"param": argsbuilder.MergePrepend,
89+
}),
90+
),
91+
)
92+
93+
suite.Require().Equal([]string{"value2", "value3", "value1"}, args["param"])
94+
suite.Assert().Equal([]string{"--param=value2", "--param=value3", "--param=value1"}, args.Args())
95+
96+
suite.Require().NoError(
97+
args.Merge(argsbuilder.Args{
98+
"param": {"value4"},
99+
},
100+
argsbuilder.WithMergePolicies(argsbuilder.MergePolicies{
101+
"param": argsbuilder.MergePrepend,
102+
}),
103+
),
104+
)
105+
106+
suite.Require().Equal([]string{"value4", "value2", "value3", "value1"}, args["param"])
107+
suite.Assert().Equal([]string{"--param=value4", "--param=value2", "--param=value3", "--param=value1"}, args.Args())
108+
}
109+
110+
//nolint:dupl
111+
func (suite *ArgsbuilderSuite) TestMergeAppend() {
112+
args := argsbuilder.Args{
113+
"param": {"value1"},
114+
}
115+
116+
suite.Require().NoError(
117+
args.Merge(argsbuilder.Args{
118+
"param": {"value2", "value3"},
119+
},
120+
argsbuilder.WithMergePolicies(argsbuilder.MergePolicies{
121+
"param": argsbuilder.MergeAppend,
122+
}),
123+
),
124+
)
125+
126+
suite.Require().Equal([]string{"value1", "value2", "value3"}, args["param"])
127+
suite.Assert().Equal([]string{"--param=value1", "--param=value2", "--param=value3"}, args.Args())
128+
129+
suite.Require().NoError(
130+
args.Merge(argsbuilder.Args{
131+
"param": {"value4"},
132+
},
133+
argsbuilder.WithMergePolicies(argsbuilder.MergePolicies{
134+
"param": argsbuilder.MergeAppend,
135+
}),
136+
),
137+
)
138+
139+
suite.Require().Equal([]string{"value1", "value2", "value3", "value4"}, args["param"])
140+
suite.Assert().Equal([]string{"--param=value1", "--param=value2", "--param=value3", "--param=value4"}, args.Args())
141+
}
142+
76143
func (suite *ArgsbuilderSuite) TestMergeDenied() {
77144
args := argsbuilder.Args{
78145
"param": {"value1,value2"},

0 commit comments

Comments
 (0)