sigs.k8s.io/kueue@v0.6.2/pkg/controller/admissionchecks/multikueue/batchjob_adapter.go (about) 1 /* 2 Copyright 2024 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 package multikueue 17 18 import ( 19 "context" 20 21 batchv1 "k8s.io/api/batch/v1" 22 corev1 "k8s.io/api/core/v1" 23 "k8s.io/apimachinery/pkg/types" 24 "sigs.k8s.io/controller-runtime/pkg/client" 25 26 kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1" 27 "sigs.k8s.io/kueue/pkg/controller/constants" 28 kueuejob "sigs.k8s.io/kueue/pkg/controller/jobs/job" 29 ) 30 31 type batchJobAdapter struct{} 32 33 var _ jobAdapter = (*batchJobAdapter)(nil) 34 35 func (b *batchJobAdapter) SyncJob(ctx context.Context, localClient client.Client, remoteClient client.Client, key types.NamespacedName, workloadName, origin string) error { 36 localJob := batchv1.Job{} 37 err := localClient.Get(ctx, key, &localJob) 38 if err != nil { 39 return err 40 } 41 42 remoteJob := batchv1.Job{} 43 err = remoteClient.Get(ctx, key, &remoteJob) 44 if client.IgnoreNotFound(err) != nil { 45 return err 46 } 47 48 // the remote job exists 49 if err == nil { 50 // This will no longer be necessary when batchJob will support live status update, by then 51 // we should only sync the Status of the job if it's "Finished". 52 remoteFinished := false 53 for _, c := range remoteJob.Status.Conditions { 54 if (c.Type == batchv1.JobComplete || c.Type == batchv1.JobFailed) && c.Status == corev1.ConditionTrue { 55 remoteFinished = true 56 break 57 } 58 } 59 60 if remoteFinished { 61 localJob.Status = remoteJob.Status 62 return localClient.Status().Update(ctx, &localJob) 63 } else { 64 return nil 65 } 66 67 } 68 69 remoteJob = batchv1.Job{ 70 ObjectMeta: cleanObjectMeta(&localJob.ObjectMeta), 71 Spec: *localJob.Spec.DeepCopy(), 72 } 73 74 // cleanup 75 // drop the selector 76 remoteJob.Spec.Selector = nil 77 // drop the templates cleanup labels 78 for _, cl := range kueuejob.ManagedLabels { 79 delete(remoteJob.Spec.Template.Labels, cl) 80 } 81 82 // add the prebuilt workload 83 if remoteJob.Labels == nil { 84 remoteJob.Labels = map[string]string{} 85 } 86 remoteJob.Labels[constants.PrebuiltWorkloadLabel] = workloadName 87 remoteJob.Labels[kueuealpha.MultiKueueOriginLabel] = origin 88 89 return remoteClient.Create(ctx, &remoteJob) 90 } 91 92 func (b *batchJobAdapter) DeleteRemoteObject(ctx context.Context, remoteClient client.Client, key types.NamespacedName) error { 93 job := batchv1.Job{} 94 err := remoteClient.Get(ctx, key, &job) 95 if err != nil { 96 return client.IgnoreNotFound(err) 97 } 98 return client.IgnoreNotFound(remoteClient.Delete(ctx, &job)) 99 } 100 101 func (b *batchJobAdapter) KeepAdmissionCheckPending() bool { 102 return true 103 }