@@ -18,6 +18,7 @@ package controllers
1818
1919import (
2020 "context"
21+ "fmt"
2122 "time"
2223
2324 corev1 "k8s.io/api/core/v1"
@@ -162,22 +163,19 @@ func (r *UpgradeReconciler) BuildState(ctx context.Context) (*upgrade.ClusterUpg
162163 return nil , err
163164 }
164165
165- for i := range podList .Items {
166- pod := & podList .Items [i ]
167- if pod .OwnerReferences == nil || len (pod .OwnerReferences ) < 1 {
168- r .Log .V (consts .LogLevelWarning ).Info ("OFED Driver Pod has no owner DaemonSet" , "pod" , pod )
169- continue
170- }
171- r .Log .V (consts .LogLevelDebug ).Info ("Pod" , "pod" , pod .Name , "owner" , pod .OwnerReferences [0 ].Name )
172-
173- ownerDaemonSet , ok := daemonSets [pod .OwnerReferences [0 ].UID ]
174-
175- if ! ok {
176- r .Log .V (consts .LogLevelWarning ).Info ("OFED Driver Pod is not owned by an OFED Driver DaemonSet" ,
177- "pod" , pod , "actual owner" , pod .OwnerReferences [0 ])
178- continue
166+ filteredPodList := []corev1.Pod {}
167+ for _ , ds := range daemonSets {
168+ dsPods := r .getPodsOwnedbyDs (ds , podList .Items )
169+ if int (ds .Status .DesiredNumberScheduled ) < len (dsPods ) {
170+ r .Log .V (consts .LogLevelInfo ).Info ("Driver daemon set has Unscheduled pods" , "name" , ds .Name )
171+ return nil , fmt .Errorf ("DS should not have Unscheduled pods" )
179172 }
173+ filteredPodList = append (filteredPodList , dsPods ... )
174+ }
180175
176+ for i := range filteredPodList {
177+ pod := & filteredPodList [i ]
178+ ownerDaemonSet := daemonSets [pod .OwnerReferences [0 ].UID ]
181179 nodeState , err := r .buildNodeUpgradeState (ctx , pod , ownerDaemonSet )
182180 if err != nil {
183181 r .Log .V (consts .LogLevelError ).Error (err , "Failed to build node upgrade state for pod" , "pod" , pod )
@@ -229,6 +227,27 @@ func (r *UpgradeReconciler) getDriverDaemonSets(ctx context.Context) (map[types.
229227 return daemonSetMap , nil
230228}
231229
230+ // getPodsOwnedbyDs gets a list of pods return a list of the pods owned by the specified DaemonSet
231+ func (r * UpgradeReconciler ) getPodsOwnedbyDs (ds * appsv1.DaemonSet , pods []corev1.Pod ) []corev1.Pod {
232+ dsPodList := []corev1.Pod {}
233+ for i := range pods {
234+ pod := & pods [i ]
235+ if pod .OwnerReferences == nil || len (pod .OwnerReferences ) < 1 {
236+ r .Log .V (consts .LogLevelWarning ).Info ("OFED Driver Pod has no owner DaemonSet" , "pod" , pod )
237+ continue
238+ }
239+ r .Log .V (consts .LogLevelDebug ).Info ("Pod" , "pod" , pod .Name , "owner" , pod .OwnerReferences [0 ].Name )
240+
241+ if ds .UID == pod .OwnerReferences [0 ].UID {
242+ dsPodList = append (dsPodList , * pod )
243+ } else {
244+ r .Log .V (consts .LogLevelWarning ).Info ("OFED Driver Pod is not owned by an OFED Driver DaemonSet" ,
245+ "pod" , pod , "actual owner" , pod .OwnerReferences [0 ])
246+ }
247+ }
248+ return dsPodList
249+ }
250+
232251// SetupWithManager sets up the controller with the Manager.
233252//nolint:dupl
234253func (r * UpgradeReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
0 commit comments