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  }