@@ -54,11 +54,14 @@ func (s *State) runTask(node *kubeoneapi.HostConfig, task NodeTask) error {
5454 return fail .Runtime (task (s , node , conn ), "" )
5555}
5656
57+ type stateMutatorFn func (original * State , tmp * State )
58+
5759// RunTaskOnNodes runs the given task on the given selection of hosts.
58- func (s * State ) RunTaskOnNodes (nodes []kubeoneapi.HostConfig , task NodeTask , parallel RunModeEnum ) error {
60+ func (s * State ) RunTaskOnNodes (nodes []kubeoneapi.HostConfig , task NodeTask , parallel RunModeEnum , stateMutator stateMutatorFn ) error {
5961 var (
60- errorsLock sync.Mutex
61- aggregateErrs []error
62+ stateMutatorLock sync.Mutex
63+ errorsLock sync.Mutex
64+ aggregateErrs []error
6265 )
6366
6467 wg := sync.WaitGroup {}
@@ -79,6 +82,12 @@ func (s *State) RunTaskOnNodes(nodes []kubeoneapi.HostConfig, task NodeTask, par
7982 aggregateErrs = append (aggregateErrs , fail .Runtime (err , "running task on %q" , node .PublicAddress ))
8083 }
8184
85+ if stateMutator != nil {
86+ stateMutatorLock .Lock ()
87+ stateMutator (s , ctx )
88+ stateMutatorLock .Unlock ()
89+ }
90+
8291 wg .Done ()
8392 }(ctx , & nodes [i ])
8493 } else {
@@ -88,6 +97,10 @@ func (s *State) RunTaskOnNodes(nodes []kubeoneapi.HostConfig, task NodeTask, par
8897
8998 break
9099 }
100+
101+ if stateMutator != nil {
102+ stateMutator (s , ctx )
103+ }
91104 }
92105 }
93106
@@ -116,6 +129,16 @@ func (s *State) RunTaskOnAllNodes(task NodeTask, parallel RunModeEnum) error {
116129
117130// RunTaskOnLeader runs the given task on the leader host.
118131func (s * State ) RunTaskOnLeader (task NodeTask ) error {
132+ return s .runTaskOnLeader (task , nil )
133+ }
134+
135+ // RunTaskOnLeaderWithMutator runs the given task on the leader host with a state mutator function.
136+ func (s * State ) RunTaskOnLeaderWithMutator (task NodeTask , stateMutator stateMutatorFn ) error {
137+ return s .runTaskOnLeader (task , stateMutator )
138+ }
139+
140+ // RunTaskOnLeader runs the given task on the leader host.
141+ func (s * State ) runTaskOnLeader (task NodeTask , stateMutator stateMutatorFn ) error {
119142 leader , err := s .Cluster .Leader ()
120143 if err != nil {
121144 return err
@@ -125,18 +148,18 @@ func (s *State) RunTaskOnLeader(task NodeTask) error {
125148 leader ,
126149 }
127150
128- return s .RunTaskOnNodes (hosts , task , false )
151+ return s .RunTaskOnNodes (hosts , task , false , stateMutator )
129152}
130153
131154// RunTaskOnFollowers runs the given task on the follower hosts.
132155func (s * State ) RunTaskOnFollowers (task NodeTask , parallel RunModeEnum ) error {
133- return s .RunTaskOnNodes (s .Cluster .Followers (), task , parallel )
156+ return s .RunTaskOnNodes (s .Cluster .Followers (), task , parallel , nil )
134157}
135158
136159func (s * State ) RunTaskOnControlPlane (task NodeTask , parallel RunModeEnum ) error {
137- return s .RunTaskOnNodes (s .Cluster .ControlPlane .Hosts , task , parallel )
160+ return s .RunTaskOnNodes (s .Cluster .ControlPlane .Hosts , task , parallel , nil )
138161}
139162
140163func (s * State ) RunTaskOnStaticWorkers (task NodeTask , parallel RunModeEnum ) error {
141- return s .RunTaskOnNodes (s .Cluster .StaticWorkers .Hosts , task , parallel )
164+ return s .RunTaskOnNodes (s .Cluster .StaticWorkers .Hosts , task , parallel , nil )
142165}
0 commit comments