Skip to content

Commit f4b267c

Browse files
committed
perf(talos): unify node result handling for Docker node operations
Signed-off-by: Nikolai Emil Damm <nikolaiemildamm@icloud.com>
1 parent 72707af commit f4b267c

1 file changed

Lines changed: 34 additions & 46 deletions

File tree

pkg/svc/provisioner/cluster/talos/scale_docker.go

Lines changed: 34 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,38 @@ func (p *Provisioner) scaleDockerByRole(
3838
return p.removeDockerNodes(ctx, clusterName, role, -delta, result)
3939
}
4040

41+
// nodeResult describes a single container operation outcome.
42+
type nodeResult interface {
43+
nodeName() string
44+
nodeErr() error
45+
action() string
46+
successLog() string
47+
}
48+
4149
// nodeCreationResult records the outcome of a single container creation attempt.
4250
type nodeCreationResult struct {
4351
name string
4452
ip netip.Addr
4553
err error
4654
}
4755

56+
func (r nodeCreationResult) nodeName() string { return r.name }
57+
func (r nodeCreationResult) nodeErr() error { return r.err }
58+
func (r nodeCreationResult) action() string { return "create" }
59+
60+
func (r nodeCreationResult) successLog() string { return fmt.Sprintf("Added (IP: %s)", r.ip.String()) }
61+
4862
// nodeRemovalResult records the outcome of a single container removal attempt.
4963
type nodeRemovalResult struct {
5064
name string
5165
err error
5266
}
5367

68+
func (r nodeRemovalResult) nodeName() string { return r.name }
69+
func (r nodeRemovalResult) nodeErr() error { return r.err }
70+
func (r nodeRemovalResult) action() string { return "remove" }
71+
func (r nodeRemovalResult) successLog() string { return "Removed" }
72+
5473
// nodeSpec holds the pre-calculated name and IP for a node to be created.
5574
type nodeSpec struct {
5675
name string
@@ -110,7 +129,7 @@ func (p *Provisioner) addDockerNodes(
110129
return err
111130
}
112131

113-
return p.collectCreationResults(results, role, result)
132+
return p.collectResults(results, role, result)
114133
}
115134

116135
// preCalculateNodeSpecs determines the name and static IP for each node to be created.
@@ -143,8 +162,8 @@ func (p *Provisioner) createNodesInParallel(
143162
clusterName, role string,
144163
specs []nodeSpec,
145164
config talosconfig.Provider,
146-
) ([]nodeCreationResult, error) {
147-
results := make([]nodeCreationResult, len(specs))
165+
) ([]nodeResult, error) {
166+
results := make([]nodeResult, len(specs))
148167

149168
group, _ := errgroup.WithContext(ctx)
150169
group.SetLimit(maxConcurrentContainerOps)
@@ -195,7 +214,7 @@ func (p *Provisioner) removeDockerNodes(
195214

196215
// Worker nodes have no etcd dependency and can be removed in parallel.
197216
toRemove := existing[len(existing)-count:]
198-
results := make([]nodeRemovalResult, len(toRemove))
217+
results := make([]nodeResult, len(toRemove))
199218

200219
group, _ := errgroup.WithContext(ctx)
201220
group.SetLimit(maxConcurrentContainerOps)
@@ -219,7 +238,7 @@ func (p *Provisioner) removeDockerNodes(
219238
)
220239
}
221240

222-
return p.collectRemovalResults(results, role, result)
241+
return p.collectResults(results, role, result)
223242
}
224243

225244
// removeControlPlaneNodesSequentially removes control-plane nodes one at a time,
@@ -258,61 +277,30 @@ func (p *Provisioner) removeControlPlaneNodesSequentially(
258277
return nil
259278
}
260279

261-
// collectCreationResults records creation outcomes and returns the first error encountered.
262-
func (p *Provisioner) collectCreationResults(
263-
results []nodeCreationResult,
264-
role string,
265-
updateResult *clusterupdate.UpdateResult,
266-
) error {
267-
var firstErr error
268-
269-
for _, res := range results {
270-
if res.err != nil {
271-
recordFailedChange(updateResult, role, res.name, res.err)
272-
273-
if firstErr == nil {
274-
firstErr = fmt.Errorf(
275-
"failed to create %s node %s: %w",
276-
role, res.name, res.err,
277-
)
278-
}
279-
} else {
280-
recordAppliedChange(updateResult, role, res.name, "added")
281-
282-
_, _ = fmt.Fprintf(
283-
p.logWriter, " ✓ Added %s node %s (IP: %s)\n",
284-
role, res.name, res.ip.String(),
285-
)
286-
}
287-
}
288-
289-
return firstErr
290-
}
291-
292-
// collectRemovalResults records removal outcomes and returns the first error encountered.
293-
func (p *Provisioner) collectRemovalResults(
294-
results []nodeRemovalResult,
280+
// collectResults records operation outcomes and returns the first error encountered.
281+
func (p *Provisioner) collectResults(
282+
results []nodeResult,
295283
role string,
296284
updateResult *clusterupdate.UpdateResult,
297285
) error {
298286
var firstErr error
299287

300288
for _, res := range results {
301-
if res.err != nil {
302-
recordFailedChange(updateResult, role, res.name, res.err)
289+
if res.nodeErr() != nil {
290+
recordFailedChange(updateResult, role, res.nodeName(), res.nodeErr())
303291

304292
if firstErr == nil {
305293
firstErr = fmt.Errorf(
306-
"failed to remove %s node %s: %w",
307-
role, res.name, res.err,
294+
"failed to %s %s node %s: %w",
295+
res.action(), role, res.nodeName(), res.nodeErr(),
308296
)
309297
}
310298
} else {
311-
recordAppliedChange(updateResult, role, res.name, "removed")
299+
recordAppliedChange(updateResult, role, res.nodeName(), res.action()+"d")
312300

313301
_, _ = fmt.Fprintf(
314-
p.logWriter, " ✓ Removed %s node %s\n",
315-
role, res.name,
302+
p.logWriter, " ✓ %s %s node %s\n",
303+
res.successLog(), role, res.nodeName(),
316304
)
317305
}
318306
}

0 commit comments

Comments
 (0)