sigs.k8s.io/kueue@v0.6.2/pkg/util/testingjobs/paddlejob/wrappers.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 paddlejob
    18  
    19  import (
    20  	kftraining "github.com/kubeflow/training-operator/pkg/apis/kubeflow.org/v1"
    21  	corev1 "k8s.io/api/core/v1"
    22  	"k8s.io/apimachinery/pkg/api/resource"
    23  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    24  	"k8s.io/apimachinery/pkg/types"
    25  	"k8s.io/utils/ptr"
    26  
    27  	"sigs.k8s.io/kueue/pkg/controller/constants"
    28  )
    29  
    30  // PaddleJobWrapper wraps a Job.
    31  type PaddleJobWrapper struct{ kftraining.PaddleJob }
    32  
    33  // MakePaddleJob creates a wrapper for a suspended job with a single container and parallelism=1.
    34  func MakePaddleJob(name, ns string) *PaddleJobWrapper {
    35  	return &PaddleJobWrapper{kftraining.PaddleJob{
    36  		ObjectMeta: metav1.ObjectMeta{
    37  			Name:        name,
    38  			Namespace:   ns,
    39  			Annotations: make(map[string]string, 1),
    40  		},
    41  		Spec: kftraining.PaddleJobSpec{
    42  			RunPolicy: kftraining.RunPolicy{
    43  				Suspend: ptr.To(true),
    44  			},
    45  			PaddleReplicaSpecs: map[kftraining.ReplicaType]*kftraining.ReplicaSpec{
    46  				kftraining.PaddleJobReplicaTypeMaster: {
    47  					Replicas: ptr.To[int32](1),
    48  					Template: corev1.PodTemplateSpec{
    49  						Spec: corev1.PodSpec{
    50  							RestartPolicy: "Never",
    51  							Containers: []corev1.Container{
    52  								{
    53  									Name:      "c",
    54  									Image:     "pause",
    55  									Command:   []string{},
    56  									Resources: corev1.ResourceRequirements{Requests: corev1.ResourceList{}},
    57  								},
    58  							},
    59  							NodeSelector: map[string]string{},
    60  						},
    61  					},
    62  				},
    63  				kftraining.PaddleJobReplicaTypeWorker: {
    64  					Replicas: ptr.To[int32](1),
    65  					Template: corev1.PodTemplateSpec{
    66  						Spec: corev1.PodSpec{
    67  							RestartPolicy: "Never",
    68  							Containers: []corev1.Container{
    69  								{
    70  									Name:      "c",
    71  									Image:     "pause",
    72  									Command:   []string{},
    73  									Resources: corev1.ResourceRequirements{Requests: corev1.ResourceList{}},
    74  								},
    75  							},
    76  							NodeSelector: map[string]string{},
    77  						},
    78  					},
    79  				},
    80  			},
    81  		},
    82  	}}
    83  }
    84  
    85  // PriorityClass updates job priorityclass.
    86  func (j *PaddleJobWrapper) PriorityClass(pc string) *PaddleJobWrapper {
    87  	if j.Spec.RunPolicy.SchedulingPolicy == nil {
    88  		j.Spec.RunPolicy.SchedulingPolicy = &kftraining.SchedulingPolicy{}
    89  	}
    90  	j.Spec.RunPolicy.SchedulingPolicy.PriorityClass = pc
    91  	return j
    92  }
    93  
    94  // Obj returns the inner Job.
    95  func (j *PaddleJobWrapper) Obj() *kftraining.PaddleJob {
    96  	return &j.PaddleJob
    97  }
    98  
    99  // Queue updates the queue name of the job.
   100  func (j *PaddleJobWrapper) Queue(queue string) *PaddleJobWrapper {
   101  	if j.Labels == nil {
   102  		j.Labels = make(map[string]string)
   103  	}
   104  	j.Labels[constants.QueueLabel] = queue
   105  	return j
   106  }
   107  
   108  // Request adds a resource request to the default container.
   109  func (j *PaddleJobWrapper) Request(replicaType kftraining.ReplicaType, r corev1.ResourceName, v string) *PaddleJobWrapper {
   110  	j.Spec.PaddleReplicaSpecs[replicaType].Template.Spec.Containers[0].Resources.Requests[r] = resource.MustParse(v)
   111  	return j
   112  }
   113  
   114  // Image updates images of the job.
   115  func (j *PaddleJobWrapper) Image(image string) *PaddleJobWrapper {
   116  	j.Spec.PaddleReplicaSpecs[kftraining.PaddleJobReplicaTypeMaster].Template.Spec.Containers[0].Image = image
   117  	j.Spec.PaddleReplicaSpecs[kftraining.PaddleJobReplicaTypeWorker].Template.Spec.Containers[0].Image = image
   118  	return j
   119  }
   120  
   121  // Args updates args of the job.
   122  func (j *PaddleJobWrapper) Args(args []string) *PaddleJobWrapper {
   123  	j.Spec.PaddleReplicaSpecs[kftraining.PaddleJobReplicaTypeMaster].Template.Spec.Containers[0].Args = args
   124  	j.Spec.PaddleReplicaSpecs[kftraining.PaddleJobReplicaTypeWorker].Template.Spec.Containers[0].Args = args
   125  	return j
   126  }
   127  
   128  // Parallelism updates job parallelism.
   129  func (j *PaddleJobWrapper) Parallelism(p int32) *PaddleJobWrapper {
   130  	j.Spec.PaddleReplicaSpecs[kftraining.PaddleJobReplicaTypeWorker].Replicas = ptr.To(p)
   131  	return j
   132  }
   133  
   134  // Suspend updates the suspend status of the job.
   135  func (j *PaddleJobWrapper) Suspend(s bool) *PaddleJobWrapper {
   136  	j.Spec.RunPolicy.Suspend = &s
   137  	return j
   138  }
   139  
   140  // UID updates the uid of the job.
   141  func (j *PaddleJobWrapper) UID(uid string) *PaddleJobWrapper {
   142  	j.ObjectMeta.UID = types.UID(uid)
   143  	return j
   144  }
   145  
   146  // NodeSelector updates the nodeSelector of job.
   147  func (j *PaddleJobWrapper) NodeSelector(k, v string) *PaddleJobWrapper {
   148  	if j.Spec.PaddleReplicaSpecs[kftraining.PaddleJobReplicaTypeMaster].Template.Spec.NodeSelector == nil {
   149  		j.Spec.PaddleReplicaSpecs[kftraining.PaddleJobReplicaTypeMaster].Template.Spec.NodeSelector = make(map[string]string)
   150  	}
   151  	if j.Spec.PaddleReplicaSpecs[kftraining.PaddleJobReplicaTypeWorker].Template.Spec.NodeSelector == nil {
   152  		j.Spec.PaddleReplicaSpecs[kftraining.PaddleJobReplicaTypeWorker].Template.Spec.NodeSelector = make(map[string]string)
   153  	}
   154  	j.Spec.PaddleReplicaSpecs[kftraining.PaddleJobReplicaTypeMaster].Template.Spec.NodeSelector[k] = v
   155  	j.Spec.PaddleReplicaSpecs[kftraining.PaddleJobReplicaTypeWorker].Template.Spec.NodeSelector[k] = v
   156  	return j
   157  }
   158  
   159  // Active updates the replicaStatus for Active of job.
   160  func (j *PaddleJobWrapper) Active(rType kftraining.ReplicaType, c int32) *PaddleJobWrapper {
   161  	if j.Status.ReplicaStatuses == nil {
   162  		j.Status.ReplicaStatuses = make(map[kftraining.ReplicaType]*kftraining.ReplicaStatus)
   163  	}
   164  	j.Status.ReplicaStatuses[rType] = &kftraining.ReplicaStatus{
   165  		Active: c,
   166  	}
   167  	return j
   168  }