sigs.k8s.io/kueue@v0.6.2/pkg/controller/core/indexer/indexer.go (about) 1 /* 2 Copyright 2023 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package indexer 18 19 import ( 20 "context" 21 "fmt" 22 23 corev1 "k8s.io/api/core/v1" 24 apimeta "k8s.io/apimachinery/pkg/api/meta" 25 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 26 "k8s.io/apimachinery/pkg/util/sets" 27 "sigs.k8s.io/controller-runtime/pkg/client" 28 29 kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1" 30 ) 31 32 const ( 33 WorkloadQueueKey = "spec.queueName" 34 WorkloadClusterQueueKey = "status.admission.clusterQueue" 35 QueueClusterQueueKey = "spec.clusterQueue" 36 LimitRangeHasContainerType = "spec.hasContainerType" 37 WorkloadQuotaReservedKey = "status.quotaReserved" 38 WorkloadRuntimeClassKey = "spec.runtimeClass" 39 ) 40 41 func IndexQueueClusterQueue(obj client.Object) []string { 42 q, ok := obj.(*kueue.LocalQueue) 43 if !ok { 44 return nil 45 } 46 return []string{string(q.Spec.ClusterQueue)} 47 } 48 49 func IndexWorkloadQueue(obj client.Object) []string { 50 wl, ok := obj.(*kueue.Workload) 51 if !ok { 52 return nil 53 } 54 return []string{wl.Spec.QueueName} 55 } 56 57 func IndexWorkloadClusterQueue(obj client.Object) []string { 58 wl, ok := obj.(*kueue.Workload) 59 if !ok { 60 return nil 61 } 62 if wl.Status.Admission == nil { 63 return nil 64 } 65 return []string{string(wl.Status.Admission.ClusterQueue)} 66 } 67 68 func IndexLimitRangeHasContainerType(obj client.Object) []string { 69 lr, ok := obj.(*corev1.LimitRange) 70 if !ok { 71 return nil 72 } 73 74 for i := range lr.Spec.Limits { 75 if lr.Spec.Limits[i].Type == corev1.LimitTypeContainer { 76 return []string{"true"} 77 } 78 } 79 return nil 80 } 81 82 func IndexWorkloadQuotaReserved(obj client.Object) []string { 83 wl, ok := obj.(*kueue.Workload) 84 if !ok { 85 return nil 86 } 87 88 cond := apimeta.FindStatusCondition(wl.Status.Conditions, kueue.WorkloadQuotaReserved) 89 if cond == nil { 90 return []string{string(metav1.ConditionFalse)} 91 } 92 93 return []string{string(cond.Status)} 94 } 95 96 func IndexWorkloadRuntimeClass(obj client.Object) []string { 97 wl, ok := obj.(*kueue.Workload) 98 if !ok { 99 return nil 100 } 101 set := sets.New[string]() 102 for _, ps := range wl.Spec.PodSets { 103 if ps.Template.Spec.RuntimeClassName != nil { 104 set.Insert(*ps.Template.Spec.RuntimeClassName) 105 } 106 } 107 if set.Len() > 0 { 108 return set.UnsortedList() 109 } 110 return nil 111 } 112 113 // Setup sets the index with the given fields for core apis. 114 func Setup(ctx context.Context, indexer client.FieldIndexer) error { 115 if err := indexer.IndexField(ctx, &kueue.Workload{}, WorkloadQueueKey, IndexWorkloadQueue); err != nil { 116 return fmt.Errorf("setting index on queue for Workload: %w", err) 117 } 118 if err := indexer.IndexField(ctx, &kueue.Workload{}, WorkloadClusterQueueKey, IndexWorkloadClusterQueue); err != nil { 119 return fmt.Errorf("setting index on clusterQueue for Workload: %w", err) 120 } 121 if err := indexer.IndexField(ctx, &kueue.Workload{}, WorkloadQuotaReservedKey, IndexWorkloadQuotaReserved); err != nil { 122 return fmt.Errorf("setting index on admitted for Workload: %w", err) 123 } 124 if err := indexer.IndexField(ctx, &kueue.Workload{}, WorkloadRuntimeClassKey, IndexWorkloadRuntimeClass); err != nil { 125 return fmt.Errorf("setting index on runtimeClass for Workload: %w", err) 126 } 127 if err := indexer.IndexField(ctx, &kueue.LocalQueue{}, QueueClusterQueueKey, IndexQueueClusterQueue); err != nil { 128 return fmt.Errorf("setting index on clusterQueue for localQueue: %w", err) 129 } 130 if err := indexer.IndexField(ctx, &corev1.LimitRange{}, LimitRangeHasContainerType, IndexLimitRangeHasContainerType); err != nil { 131 return fmt.Errorf("setting index on hasContainerType for limitRange: %w", err) 132 } 133 return nil 134 }