pkg/util/testing/wrappers.go (180 lines of code) (raw):
/*
Copyright 2023 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package testing
import (
batchv1 "k8s.io/api/batch/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/utils/pointer"
jobset "sigs.k8s.io/jobset/api/jobset/v1alpha1"
)
// TestPodSpec is the default pod spec used for testing.
var TestPodSpec = corev1.PodSpec{
RestartPolicy: "Never",
Containers: []corev1.Container{
{
Name: "test-container",
Image: "busybox:latest",
},
},
}
// JobSetWrapper wraps a JobSet.
type JobSetWrapper struct {
jobset.JobSet
}
// MakeJobSet creates a wrapper for a JobSet.
func MakeJobSet(name, ns string) *JobSetWrapper {
return &JobSetWrapper{
jobset.JobSet{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: ns,
},
Spec: jobset.JobSetSpec{
ReplicatedJobs: []jobset.ReplicatedJob{},
},
},
}
}
// SuccessPolicy sets the value of jobSet.spec.successPolicy
func (j *JobSetWrapper) SuccessPolicy(policy *jobset.SuccessPolicy) *JobSetWrapper {
j.Spec.SuccessPolicy = policy
return j
}
// FailurePolicy sets the value of jobSet.spec.failurePolicy
func (j *JobSetWrapper) FailurePolicy(policy *jobset.FailurePolicy) *JobSetWrapper {
j.Spec.FailurePolicy = policy
return j
}
// SetAnnotations sets the value of the jobSet.metadata.annotations.
func (j *JobSetWrapper) SetAnnotations(annotations map[string]string) *JobSetWrapper {
j.Annotations = annotations
return j
}
// Obj returns the inner JobSet.
func (j *JobSetWrapper) Obj() *jobset.JobSet {
return &j.JobSet
}
// ReplicatedJob adds a single ReplicatedJob to the JobSet.
func (j *JobSetWrapper) ReplicatedJob(job jobset.ReplicatedJob) *JobSetWrapper {
j.JobSet.Spec.ReplicatedJobs = append(j.JobSet.Spec.ReplicatedJobs, job)
return j
}
// Suspend adds a suspend flag to JobSet
func (j *JobSetWrapper) Suspend(suspend bool) *JobSetWrapper {
j.JobSet.Spec.Suspend = pointer.Bool(suspend)
return j
}
// ReplicatedJobWrapper wraps a ReplicatedJob.
type ReplicatedJobWrapper struct {
jobset.ReplicatedJob
}
// MakeReplicatedJob creates a wrapper for a ReplicatedJob.
func MakeReplicatedJob(name string) *ReplicatedJobWrapper {
return &ReplicatedJobWrapper{
jobset.ReplicatedJob{
Name: name,
Network: &jobset.Network{},
},
}
}
// Job sets the Job spec for the ReplicatedJob template.
func (r *ReplicatedJobWrapper) Job(jobSpec batchv1.JobTemplateSpec) *ReplicatedJobWrapper {
r.Template = jobSpec
return r
}
// EnableDNSHostnames sets the value of ReplicatedJob.Network.EnableDNSHostnames.
func (r *ReplicatedJobWrapper) EnableDNSHostnames(val bool) *ReplicatedJobWrapper {
r.ReplicatedJob.Network.EnableDNSHostnames = pointer.Bool(val)
return r
}
// Replicas sets the value of the ReplicatedJob.Replicas.
func (r *ReplicatedJobWrapper) Replicas(val int) *ReplicatedJobWrapper {
r.ReplicatedJob.Replicas = val
return r
}
// Obj returns the inner ReplicatedJob.
func (r *ReplicatedJobWrapper) Obj() jobset.ReplicatedJob {
return r.ReplicatedJob
}
// JobTemplateWrapper wraps a JobTemplateSpec.
type JobTemplateWrapper struct {
batchv1.JobTemplateSpec
}
// MakeJobTemplate creates a wrapper for a JobTemplateSpec.
func MakeJobTemplate(name, ns string) *JobTemplateWrapper {
return &JobTemplateWrapper{
batchv1.JobTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: ns,
},
Spec: batchv1.JobSpec{
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{},
},
},
},
}
}
// CompletionMode sets the value of job.spec.completionMode
func (j *JobTemplateWrapper) CompletionMode(mode batchv1.CompletionMode) *JobTemplateWrapper {
j.Spec.CompletionMode = &mode
return j
}
// Containers sets the pod template spec containers.
func (j *JobTemplateWrapper) PodSpec(podSpec corev1.PodSpec) *JobTemplateWrapper {
j.Spec.Template.Spec = podSpec
return j
}
// Obj returns the inner batchv1.JobTemplateSpec
func (j *JobTemplateWrapper) Obj() batchv1.JobTemplateSpec {
return j.JobTemplateSpec
}
// JobWrapper wraps a Job.
type JobWrapper struct {
batchv1.Job
}
// MakeJobWrapper creates a wrapper for a Job.
func MakeJob(jobName, ns string) *JobWrapper {
return &JobWrapper{
batchv1.Job{
ObjectMeta: metav1.ObjectMeta{
Name: jobName,
Namespace: ns,
},
Spec: batchv1.JobSpec{
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{},
},
},
},
}
}
// Affinity sets the pod affinities/anti-affinities for the pod template spec.
func (j *JobWrapper) Affinity(affinity *corev1.Affinity) *JobWrapper {
j.Spec.Template.Spec.Affinity = affinity
return j
}
// JobLabels sets the Job labels.
func (j *JobWrapper) JobLabels(labels map[string]string) *JobWrapper {
j.Labels = labels
return j
}
// JobAnnotations sets the Job annotations.
func (j *JobWrapper) JobAnnotations(annotations map[string]string) *JobWrapper {
j.Annotations = annotations
return j
}
// PodLabels sets the pod template spec labels.
func (j *JobWrapper) PodLabels(labels map[string]string) *JobWrapper {
j.Spec.Template.Labels = labels
return j
}
// Suspend sets suspend in the job spec.
func (j *JobWrapper) Suspend(suspend bool) *JobWrapper {
j.Spec.Suspend = pointer.Bool(suspend)
return j
}
// PodAnnotations sets the pod template spec annotations.
func (j *JobWrapper) PodAnnotations(annotations map[string]string) *JobWrapper {
j.Spec.Template.Annotations = annotations
return j
}
// PodSpec sets the pod template spec.
func (j *JobWrapper) PodSpec(podSpec corev1.PodSpec) *JobWrapper {
j.Spec.Template.Spec = podSpec
return j
}
// Subdomain sets the pod template spec subdomain.
func (j *JobWrapper) Subdomain(subdomain string) *JobWrapper {
j.Spec.Template.Spec.Subdomain = subdomain
return j
}
// Parallelism sets the job spec parallelism.
func (j *JobWrapper) Parallelism(parallelism int32) *JobWrapper {
j.Spec.Parallelism = pointer.Int32(parallelism)
return j
}
// Completions sets the job spec completions.
func (j *JobWrapper) Completions(completions int32) *JobWrapper {
j.Spec.Completions = pointer.Int32(completions)
return j
}
// Succeeded sets the job status succeeded.
func (j *JobWrapper) Succeeded(succeeded int32) *JobWrapper {
j.Status.Succeeded = succeeded
return j
}
// Ready sets the job status ready.
func (j *JobWrapper) Ready(ready int32) *JobWrapper {
j.Status.Ready = pointer.Int32(ready)
return j
}
// Obj returns the wrapped Job.
func (j *JobWrapper) Obj() *batchv1.Job {
return &j.Job
}