Skip to content

Commit

Permalink
Add validation for child jobs without ownerReference
Browse files Browse the repository at this point in the history
Signed-off-by: Yuki Iwai <yuki.iwai.tz@gmail.com>
  • Loading branch information
tenzen-y committed Jun 17, 2023
1 parent 860bd12 commit 0349b30
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 9 deletions.
10 changes: 10 additions & 0 deletions pkg/controller/jobframework/validation.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,16 @@ func validateLabelAsCRDName(job GenericJob, crdNameLabel string) field.ErrorList
return allErrs
}

func ValidateCreateForParentWorkload(job GenericJob) field.ErrorList {
var allErrs field.ErrorList
if value, exists := job.Object().GetAnnotations()[constants.ParentWorkloadAnnotation]; exists {
if job.Object().GetOwnerReferences() == nil {
allErrs = append(allErrs, field.Invalid(parentWorkloadKeyPath, value, "must not add a parent workload annotation to job without OwnerReference"))
}
}
return allErrs
}

func ValidateUpdateForQueueName(oldJob, newJob GenericJob) field.ErrorList {
var allErrs field.ErrorList
if !newJob.IsSuspended() && (QueueName(oldJob) != QueueName(newJob)) {
Expand Down
1 change: 1 addition & 0 deletions pkg/controller/jobs/job/job_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ func validateCreate(job *Job) field.ErrorList {
allErrs = append(allErrs, jobframework.ValidateAnnotationAsCRDName(job, constants.ParentWorkloadAnnotation)...)
allErrs = append(allErrs, jobframework.ValidateCreateForQueueName(job)...)
allErrs = append(allErrs, validatePartialAdmissionCreate(job)...)
allErrs = append(allErrs, jobframework.ValidateCreateForParentWorkload(job)...)
return allErrs
}

Expand Down
47 changes: 38 additions & 9 deletions pkg/controller/jobs/job/job_webhook_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,33 @@ func TestValidateCreate(t *testing.T) {
wantErr: nil,
},
{
name: "valid parent-workload annotation",
job: testingutil.MakeJob("job", "default").ParentWorkload("parent-workload-name").Queue("queue").Obj(),
name: "valid parent-workload annotation",
job: testingutil.MakeJob("job", "default").
ParentWorkload("parent-workload-name").
Queue("queue").
OwnerReference("parent-workload-name", kubeflow.SchemeGroupVersionKind).
Obj(),
wantErr: nil,
},
{
name: "invalid parent-workload annotation",
job: testingutil.MakeJob("job", "default").ParentWorkload("parent workload name").Queue("queue").Obj(),
name: "invalid parent-workload annotation",
job: testingutil.MakeJob("job", "default").
ParentWorkload("parent workload name").
OwnerReference("parent workload name", kubeflow.SchemeGroupVersionKind).
Queue("queue").
Obj(),
wantErr: field.ErrorList{field.Invalid(parentWorkloadKeyPath, "parent workload name", invalidRFC1123Message)},
},
{
name: "invalid parent-workload annotation (owner is missing)",
job: testingutil.MakeJob("job", "default").
ParentWorkload("parent-workload").
Queue("queue").
Obj(),
wantErr: field.ErrorList{
field.Invalid(parentWorkloadKeyPath, "parent-workload", "must not add a parent workload annotation to job without OwnerReference"),
},
},
{
name: "invalid queue-name label",
job: testingutil.MakeJob("job", "default").Queue("queue name").Obj(),
Expand All @@ -79,7 +97,11 @@ func TestValidateCreate(t *testing.T) {
},
{
name: "invalid queue-name and parent-workload annotation",
job: testingutil.MakeJob("job", "default").Queue("queue name").ParentWorkload("parent workload name").Obj(),
job: testingutil.MakeJob("job", "default").
Queue("queue name").
ParentWorkload("parent workload name").
OwnerReference("parent workload name", kubeflow.SchemeGroupVersionKind).
Obj(),
wantErr: field.ErrorList{
field.Invalid(parentWorkloadKeyPath, "parent workload name", invalidRFC1123Message),
field.Invalid(queueNameLabelPath, "queue name", invalidRFC1123Message),
Expand Down Expand Up @@ -173,9 +195,12 @@ func TestValidateUpdate(t *testing.T) {
wantErr: field.ErrorList{field.Invalid(queueNameLabelPath, "queue name", invalidRFC1123Message)},
},
{
name: "update the nil parent workload to non-empty",
oldJob: testingutil.MakeJob("job", "default").Obj(),
newJob: testingutil.MakeJob("job", "default").ParentWorkload("parent").Obj(),
name: "update the nil parent workload to non-empty",
oldJob: testingutil.MakeJob("job", "default").Obj(),
newJob: testingutil.MakeJob("job", "default").
ParentWorkload("parent").
OwnerReference("parent", kubeflow.SchemeGroupVersionKind).
Obj(),
wantErr: field.ErrorList{field.Forbidden(parentWorkloadKeyPath, "this annotation is immutable")},
},
{
Expand All @@ -187,7 +212,11 @@ func TestValidateUpdate(t *testing.T) {
{
name: "invalid queue name and immutable parent",
oldJob: testingutil.MakeJob("job", "default").Obj(),
newJob: testingutil.MakeJob("job", "default").Queue("queue name").ParentWorkload("parent").Obj(),
newJob: testingutil.MakeJob("job", "default").
Queue("queue name").
ParentWorkload("parent").
OwnerReference("parent", kubeflow.SchemeGroupVersionKind).
Obj(),
wantErr: field.ErrorList{
field.Invalid(queueNameLabelPath, "queue name", invalidRFC1123Message),
field.Forbidden(parentWorkloadKeyPath, "this annotation is immutable"),
Expand Down

0 comments on commit 0349b30

Please sign in to comment.