@@ -166,10 +166,6 @@ func (ctl *controller) OnDelete(obj any) {
166166 ctl .enqueueLogger .V (5 ).Info ("Enqueuing LauncherPopulationPolicy reference due to notification of delete" , "name" , typed .Name )
167167 item := lppItem {cache .MetaObjectToName (typed )}
168168 ctl .Queue .Add (item )
169- case * fmav1alpha1.LauncherConfig :
170- ctl .enqueueLogger .V (5 ).Info ("Enqueuing LauncherConfig reference due to notification of delete" , "name" , typed .Name )
171- item := lcItem {cache .MetaObjectToName (typed )}
172- ctl .Queue .Add (item )
173169 default :
174170 ctl .enqueueLogger .V (5 ).Info ("Notified of delete of type of ignored object" , "type" , fmt .Sprintf ("%T" , obj ))
175171 return
@@ -195,53 +191,16 @@ func (ctl *controller) process(ctx context.Context, item queueItem) (error, bool
195191
196192func (item lppItem ) process (ctx context.Context , ctl * controller ) (error , bool ) {
197193 logger := klog .FromContext (ctx )
198- // Get the list of LauncherPopulationPolicies
199- policies , err := ctl .lppLister .List (labels .Everything ())
200- if err != nil {
201- logger .Error (err , "Failed to list LauncherPopulationPolicies" )
202- return err , true // Return error and retry
203- }
204-
205- // If needed, process the retrieved policies here
206- // For example: iterate through policies to perform corresponding business logic
207194
208- logger .Info ("Successfully listed LauncherPopulationPolicies" , "count" , len (policies ))
209-
210- // Build the PopulationPolicy map, storing the maximum count for each (Node, LauncherConfig) pair
211- populationPolicy := make (map [NodeLauncherKey ]int32 )
212- for _ , lpp := range policies {
213- // Get matching nodes
214- nodes , err := ctl .getMatchingNodes (ctx , lpp .Spec .EnhancedNodeSelector )
215- if err != nil {
216- logger .Error (err , "Failed to get matching nodes for policy" , "policy" , lpp .Name )
217- return err , true
218- }
219- logger .Info ("Found matching nodes" , "count" , len (nodes ), "policy" , lpp .Name )
220- // For each CountForLauncher rule
221- for _ , countRule := range lpp .Spec .CountForLauncher {
222- for _ , node := range nodes {
223- key := NodeLauncherKey {
224- NodeName : node .Name ,
225- LauncherConfigName : countRule .LauncherConfigName ,
226- }
227- currentCount , exists := populationPolicy [key ]
228- logger .Info ("Current count for node" , "node" , node .Name , "launcherConfigName" ,
229- countRule .LauncherConfigName , "launcherCount" , countRule .LauncherCount , "currentCount" , currentCount , "exists" , exists )
230-
231- // Take the maximum value (rule: when multiple CountForLauncher apply to the same pair, take the maximum)
232- if ! exists || countRule .LauncherCount > currentCount {
233- populationPolicy [key ] = countRule .LauncherCount
234- logger .Info ("Updated population policy" ,
235- "node" , node .Name ,
236- "config" , countRule .LauncherConfigName ,
237- "count" , countRule .LauncherCount ,
238- "policy" , lpp .Name )
239- }
240- }
241- }
195+ // Build desired state from all policies
196+ populationPolicy , err := ctl .buildDesiredStateFromPolicies (ctx , nil )
197+ if err != nil {
198+ logger .Error (err , "Failed to build desired state from policies" )
199+ return err , true
242200 }
243201
244202 logger .Info ("Final population policy" , "policy" , MapToLoggable (populationPolicy ))
203+
245204 // Adjust launcher pods according to final requirements
246205 if err := ctl .reconcileAllLaunchers (ctx , populationPolicy ); err != nil {
247206 logger .Error (err , "Failed to reconcile launchers" )
@@ -257,21 +216,42 @@ func (item lcItem) process(ctx context.Context, ctl *controller) (error, bool) {
257216 lc , err := ctl .lcLister .LauncherConfigs (ctl .namespace ).Get (item .Name )
258217 if err != nil {
259218 if apierrors .IsNotFound (err ) {
260- logger .Info ("LauncherConfig no longer exists , skipping reconciliation" , "name" , item .Name )
219+ logger .Info ("LauncherConfig does not exist yet , skipping reconciliation" , "name" , item .Name )
261220 return nil , false
262221 }
263222 logger .Error (err , "Failed to get LauncherConfig" , "name" , item .Name )
264223 return err , true
265224 }
266225
267- // Get all LauncherPopulationPolicies that reference this LauncherConfig
268- policies , err := ctl .lppLister . List ( labels . Everything () )
226+ // Build desired state only for policies that reference this LauncherConfig
227+ populationPolicy , err := ctl .buildDesiredStateFromPolicies ( ctx , & item . Name )
269228 if err != nil {
270- logger .Error (err , "Failed to list LauncherPopulationPolicies " )
229+ logger .Error (err , "Failed to build desired state from policies " )
271230 return err , true
272231 }
273232
274- // Build desired state for this LauncherConfig across all nodes
233+ logger .Info ("Final population policy for LauncherConfig" , "config" , item .Name , "policy" , MapToLoggable (populationPolicy ))
234+
235+ // Reconcile launchers for this LauncherConfig
236+ if err := ctl .reconcileAllLaunchers (ctx , populationPolicy ); err != nil {
237+ logger .Error (err , "Failed to reconcile launchers for LauncherConfig" , "name" , lc .Name )
238+ return err , true
239+ }
240+
241+ logger .Info ("Successfully reconciled launchers for LauncherConfig" , "name" , lc .Name )
242+ return nil , false
243+ }
244+
245+ // buildDesiredStateFromPolicies builds the desired state map from all policies.
246+ // If filterByConfig is provided, only policies referencing that config are considered.
247+ func (ctl * controller ) buildDesiredStateFromPolicies (ctx context.Context , filterByConfig * string ) (map [NodeLauncherKey ]int32 , error ) {
248+ logger := klog .FromContext (ctx )
249+
250+ policies , err := ctl .lppLister .List (labels .Everything ())
251+ if err != nil {
252+ return nil , fmt .Errorf ("failed to list LauncherPopulationPolicies: %w" , err )
253+ }
254+
275255 desired := make (map [NodeLauncherKey ]int32 )
276256 for _ , lpp := range policies {
277257 nodes , err := ctl .getMatchingNodes (ctx , lpp .Spec .EnhancedNodeSelector )
@@ -281,30 +261,22 @@ func (item lcItem) process(ctx context.Context, ctl *controller) (error, bool) {
281261 }
282262
283263 for _ , countRule := range lpp .Spec .CountForLauncher {
284- if countRule .LauncherConfigName != lc . Name {
264+ if filterByConfig != nil && countRule .LauncherConfigName != * filterByConfig {
285265 continue
286266 }
287267 for _ , node := range nodes {
288268 key := NodeLauncherKey {
289269 NodeName : node .Name ,
290- LauncherConfigName : lc . Name ,
270+ LauncherConfigName : countRule . LauncherConfigName ,
291271 }
292- // Take the maximum count if multiple rules apply
293272 if current , exists := desired [key ]; ! exists || countRule .LauncherCount > current {
294273 desired [key ] = countRule .LauncherCount
295274 }
296275 }
297276 }
298277 }
299278
300- // Reconcile launchers for this LauncherConfig
301- if err := ctl .reconcileAllLaunchers (ctx , desired ); err != nil {
302- logger .Error (err , "Failed to reconcile launchers for LauncherConfig" , "name" , lc .Name )
303- return err , true
304- }
305-
306- logger .Info ("Successfully reconciled launchers for LauncherConfig" , "name" , lc .Name )
307- return nil , false
279+ return desired , nil
308280}
309281
310282// getMatchingNodes returns nodes that match the EnhancedNodeSelector
0 commit comments