@@ -51,6 +51,7 @@ type testGenericJob struct {
51
51
52
52
var _ jobframework.GenericJob = (* testGenericJob )(nil )
53
53
var _ jobframework.JobWithCustomValidation = (* testGenericJob )(nil )
54
+ var _ jobframework.JobWithManagedBy = (* testGenericJob )(nil )
54
55
55
56
func (t * testGenericJob ) Object () client.Object {
56
57
return t .Job
@@ -88,6 +89,20 @@ func (t *testGenericJob) PodsReady() bool {
88
89
panic ("not implemented" )
89
90
}
90
91
92
+ func (j * testGenericJob ) CanDefaultManagedBy () bool {
93
+ jobSpecManagedBy := j .Spec .ManagedBy
94
+ return features .Enabled (features .MultiKueue ) &&
95
+ (jobSpecManagedBy == nil || * jobSpecManagedBy == batchv1 .JobControllerName )
96
+ }
97
+
98
+ func (j * testGenericJob ) ManagedBy () * string {
99
+ return j .Spec .ManagedBy
100
+ }
101
+
102
+ func (j * testGenericJob ) SetManagedBy (managedBy * string ) {
103
+ j .Spec .ManagedBy = managedBy
104
+ }
105
+
91
106
func (t * testGenericJob ) GVK () schema.GroupVersionKind {
92
107
panic ("not implemented" )
93
108
}
@@ -133,6 +148,7 @@ func TestBaseWebhookDefault(t *testing.T) {
133
148
manageJobsWithoutQueueName bool
134
149
localQueueDefaulting bool
135
150
defaultLqExist bool
151
+ multiQueue bool
136
152
job * batchv1.Job
137
153
want * batchv1.Job
138
154
}{
@@ -198,11 +214,42 @@ func TestBaseWebhookDefault(t *testing.T) {
198
214
want : utiljob .MakeJob ("job" , "default" ).
199
215
Obj (),
200
216
},
217
+ "ManagedByDefaulting, targeting multikueue local queue" : {
218
+ job : utiljob .MakeJob ("job" , "default" ).
219
+ Queue ("multikueue" ).
220
+ Obj (),
221
+ want : utiljob .MakeJob ("job" , "default" ).
222
+ Queue ("multikueue" ).
223
+ ManagedBy (kueue .MultiKueueControllerName ).
224
+ Obj (),
225
+ multiQueue : true ,
226
+ },
227
+ "ManagedByDefaulting, targeting multikueue local queue but already managaed by someone else" : {
228
+ job : utiljob .MakeJob ("job" , "default" ).
229
+ Queue ("multikueue" ).
230
+ ManagedBy ("someone-else" ).
231
+ Obj (),
232
+ want : utiljob .MakeJob ("job" , "default" ).
233
+ Queue ("multikueue" ).
234
+ ManagedBy ("someone-else" ).
235
+ Obj (),
236
+ multiQueue : true ,
237
+ },
238
+ "ManagedByDefaulting, targeting non-multikueue local queue" : {
239
+ job : utiljob .MakeJob ("job" , "default" ).
240
+ Queue ("queue" ).
241
+ Obj (),
242
+ want : utiljob .MakeJob ("job" , "default" ).
243
+ Queue ("queue" ).
244
+ Obj (),
245
+ multiQueue : true ,
246
+ },
201
247
}
202
248
for name , tc := range testcases {
203
249
t .Run (name , func (t * testing.T ) {
204
250
ctx , _ := utiltesting .ContextWithLog (t )
205
251
features .SetFeatureGateDuringTest (t , features .LocalQueueDefaulting , tc .localQueueDefaulting )
252
+ features .SetFeatureGateDuringTest (t , features .MultiKueue , tc .multiQueue )
206
253
clientBuilder := utiltesting .NewClientBuilder ().
207
254
WithObjects (
208
255
& corev1.Namespace {ObjectMeta : metav1.ObjectMeta {Name : "default" }},
@@ -216,13 +263,35 @@ func TestBaseWebhookDefault(t *testing.T) {
216
263
t .Fatalf ("failed to create default local queue: %s" , err )
217
264
}
218
265
}
266
+ if tc .multiQueue {
267
+ if err := queueManager .AddLocalQueue (ctx , utiltesting .MakeLocalQueue ("multikueue" , "default" ).
268
+ ClusterQueue ("cluster-queue" ).Obj ()); err != nil {
269
+ t .Fatalf ("failed to create default local queue: %s" , err )
270
+ }
271
+ cq := * utiltesting .MakeClusterQueue ("cluster-queue" ).
272
+ AdmissionChecks ("admission-check" ).
273
+ Obj ()
274
+ if err := cqCache .AddClusterQueue (ctx , & cq ); err != nil {
275
+ t .Fatalf ("Inserting clusterQueue %s in cache: %v" , cq .Name , err )
276
+ }
277
+ ac := utiltesting .MakeAdmissionCheck ("admission-check" ).
278
+ ControllerName (kueue .MultiKueueControllerName ).
279
+ Active (metav1 .ConditionTrue ).
280
+ Obj ()
281
+ cqCache .AddOrUpdateAdmissionCheck (ac )
282
+ if err := queueManager .AddClusterQueue (ctx , & cq ); err != nil {
283
+ t .Fatalf ("Inserting clusterQueue %s in manager: %v" , cq .Name , err )
284
+ }
285
+ }
286
+
219
287
w := & jobframework.BaseWebhook {
220
288
ManageJobsWithoutQueueName : tc .manageJobsWithoutQueueName ,
221
289
FromObject : makeTestGenericJob ().fromObject ,
222
290
Queues : queueManager ,
291
+ Cache : cqCache ,
223
292
}
224
293
if err := w .Default (context .Background (), tc .job ); err != nil {
225
- t .Errorf ("set defaults to a kubeflow/mpijob by a Defaulter " )
294
+ t .Errorf ("set defaults by base webhook " )
226
295
}
227
296
if diff := cmp .Diff (tc .want , tc .job ); len (diff ) != 0 {
228
297
t .Errorf ("Default() mismatch (-want,+got):\n %s" , diff )
0 commit comments