@@ -10,6 +10,7 @@ import (
1010
1111 "golang.org/x/exp/maps"
1212 v1 "k8s.io/api/core/v1"
13+ schedulingv1 "k8s.io/api/scheduling/v1"
1314 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1415 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1516 "k8s.io/apimachinery/pkg/runtime/schema"
@@ -36,19 +37,17 @@ type DefaultGrouper struct {
3637 kubeReader client.Reader
3738}
3839
39- func NewDefaultGrouper (queueLabelKey , nodePoolLabelKey string ) * DefaultGrouper {
40+ func NewDefaultGrouper (queueLabelKey , nodePoolLabelKey string , kubeReader client. Reader ) * DefaultGrouper {
4041 return & DefaultGrouper {
4142 queueLabelKey : queueLabelKey ,
4243 nodePoolLabelKey : nodePoolLabelKey ,
44+ kubeReader : kubeReader ,
4345 }
4446}
4547
46- func (dg * DefaultGrouper ) SetDefaultPrioritiesConfigMapParams (
47- defaultPrioritiesConfigMapName , defaultPrioritiesConfigMapNamespace string , kubeReader client.Reader ,
48- ) {
48+ func (dg * DefaultGrouper ) SetDefaultPrioritiesConfigMapParams (defaultPrioritiesConfigMapName , defaultPrioritiesConfigMapNamespace string ) {
4949 dg .defaultPrioritiesConfigMapName = defaultPrioritiesConfigMapName
5050 dg .defaultPrioritiesConfigMapNamespace = defaultPrioritiesConfigMapNamespace
51- dg .kubeReader = kubeReader
5251}
5352
5453func (dg * DefaultGrouper ) Name () string {
@@ -151,29 +150,63 @@ func (dg *DefaultGrouper) calculateQueueName(topOwner *unstructured.Unstructured
151150
152151func (dg * DefaultGrouper ) CalcPodGroupPriorityClass (topOwner * unstructured.Unstructured , pod * v1.Pod ,
153152 defaultPriorityClassForJob string ) string {
153+ priorityClassName := dg .calcPodGroupPriorityClass (topOwner , pod )
154+ if dg .validatePriorityClassExists (priorityClassName ) {
155+ return priorityClassName
156+ }
157+
158+ if priorityClassName != "" {
159+ logger .V (2 ).Info ("priorityClassName from pod or owner labels is not valid, falling back to default" ,
160+ "priorityClassName" , priorityClassName , "topOwner" , topOwner .GetName (), "pod" , pod .GetName ())
161+ }
162+
163+ groupKind := topOwner .GroupVersionKind ().GroupKind ()
164+ priorityClassName = dg .getDefaultPriorityClassNameForKind (& groupKind )
165+ if dg .validatePriorityClassExists (priorityClassName ) {
166+ return priorityClassName
167+ }
168+
169+ logger .V (2 ).Info ("No default priority class found for group kind, using default fallback" ,
170+ "groupKind" , groupKind .String (), "defaultFallback" , defaultPriorityClassForJob )
171+ return defaultPriorityClassForJob
172+ }
173+
174+ func (dg * DefaultGrouper ) calcPodGroupPriorityClass (topOwner * unstructured.Unstructured , pod * v1.Pod ) string {
154175 if priorityClassName , found := topOwner .GetLabels ()[constants .PriorityLabelKey ]; found {
155176 return priorityClassName
156177 } else if priorityClassName , found = pod .GetLabels ()[constants .PriorityLabelKey ]; found {
157178 return priorityClassName
158179 } else if len (pod .Spec .PriorityClassName ) != 0 {
159180 return pod .Spec .PriorityClassName
160- } else {
161- groupKind := topOwner .GroupVersionKind ().GroupKind ()
162- return dg .getDefaultPriorityClassNameForKind (& groupKind , defaultPriorityClassForJob )
163181 }
182+ return ""
183+ }
184+
185+ func (dg * DefaultGrouper ) validatePriorityClassExists (priorityClassName string ) bool {
186+ if priorityClassName == "" || dg .kubeReader == nil {
187+ return false
188+ }
189+
190+ priorityClass := & schedulingv1.PriorityClass {}
191+ err := dg .kubeReader .Get (context .Background (), client.ObjectKey {Name : priorityClassName }, priorityClass )
192+ if err != nil {
193+ logger .V (1 ).Error (err , "Failed to get priority class" , "priorityClassName" , priorityClassName )
194+ return false
195+ }
196+ return true
164197}
165198
166199// getDefaultPriorityClassNameForKind - returns the default priority class name for a given group kind.
167- func (dg * DefaultGrouper ) getDefaultPriorityClassNameForKind (groupKind * schema.GroupKind , defaultPriorityClassFallback string ) string {
200+ func (dg * DefaultGrouper ) getDefaultPriorityClassNameForKind (groupKind * schema.GroupKind ) string {
168201 if groupKind == nil || groupKind .String () == "" || groupKind .Kind == "" {
169202 logger .V (3 ).Info ("Unable to get default priority class name: GroupKind is empty, using default priority class fallback" )
170- return defaultPriorityClassFallback
203+ return ""
171204 }
172205
173206 defaultPriorities , err := dg .getDefaultPrioritiesPerTypeMapping ()
174207 if err != nil {
175208 logger .V (1 ).Error (err , "Unable to get default priorities mapping" )
176- return defaultPriorityClassFallback
209+ return ""
177210 }
178211
179212 // Check if the groupKind is in the default priorities map.
@@ -187,9 +220,7 @@ func (dg *DefaultGrouper) getDefaultPriorityClassNameForKind(groupKind *schema.G
187220 return priorityClassName
188221 }
189222
190- logger .V (4 ).Info ("No default priority class found for group kind, using default fallback" ,
191- "groupKind" , groupKind .String (), "defaultFallback" , defaultPriorityClassFallback )
192- return defaultPriorityClassFallback
223+ return ""
193224}
194225
195226// getDefaultPrioritiesPerTypeMapping - returns a map of workload type to default priority class name.
0 commit comments