Skip to content

Commit c5dfe6b

Browse files
committed
Update feature-gate handling of TTLSecondsAfterFinished
1 parent 43f0423 commit c5dfe6b

File tree

5 files changed

+23
-13
lines changed

5 files changed

+23
-13
lines changed

pkg/apis/batch/validation/BUILD

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,11 @@ go_library(
1414
"//pkg/apis/batch:go_default_library",
1515
"//pkg/apis/core:go_default_library",
1616
"//pkg/apis/core/validation:go_default_library",
17-
"//pkg/features:go_default_library",
1817
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
1918
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library",
2019
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
2120
"//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library",
2221
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
23-
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
2422
"//vendor/github.com/robfig/cron:go_default_library",
2523
],
2624
)

pkg/apis/batch/validation/validation.go

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,9 @@ import (
2424
"k8s.io/apimachinery/pkg/labels"
2525
apimachineryvalidation "k8s.io/apimachinery/pkg/util/validation"
2626
"k8s.io/apimachinery/pkg/util/validation/field"
27-
utilfeature "k8s.io/apiserver/pkg/util/feature"
2827
"k8s.io/kubernetes/pkg/apis/batch"
2928
api "k8s.io/kubernetes/pkg/apis/core"
3029
apivalidation "k8s.io/kubernetes/pkg/apis/core/validation"
31-
"k8s.io/kubernetes/pkg/features"
3230
)
3331

3432
// TODO: generalize for other controller objects that will follow the same pattern, such as ReplicaSet and DaemonSet, and
@@ -119,13 +117,8 @@ func validateJobSpec(spec *batch.JobSpec, fldPath *field.Path) field.ErrorList {
119117
if spec.BackoffLimit != nil {
120118
allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*spec.BackoffLimit), fldPath.Child("backoffLimit"))...)
121119
}
122-
if utilfeature.DefaultFeatureGate.Enabled(features.TTLAfterFinished) {
123-
// normal validation for TTLSecondsAfterFinished
124-
if spec.TTLSecondsAfterFinished != nil {
125-
allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*spec.TTLSecondsAfterFinished), fldPath.Child("ttlSecondsAfterFinished"))...)
126-
}
127-
} else if spec.TTLSecondsAfterFinished != nil {
128-
allErrs = append(allErrs, field.Forbidden(fldPath.Child("ttlSecondsAfterFinished"), "disabled by feature-gate"))
120+
if spec.TTLSecondsAfterFinished != nil {
121+
allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*spec.TTLSecondsAfterFinished), fldPath.Child("ttlSecondsAfterFinished"))...)
129122
}
130123

131124
allErrs = append(allErrs, apivalidation.ValidatePodTemplateSpec(&spec.Template, fldPath.Child("template"))...)

pkg/registry/batch/job/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ go_test(
5050
"//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library",
5151
"//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library",
5252
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
53+
"//staging/src/k8s.io/apiserver/pkg/util/feature/testing:go_default_library",
5354
],
5455
)
5556

pkg/registry/batch/job/strategy.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,8 @@ func (jobStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object
8989
oldJob := old.(*batch.Job)
9090
newJob.Status = oldJob.Status
9191

92-
if !utilfeature.DefaultFeatureGate.Enabled(features.TTLAfterFinished) {
92+
if !utilfeature.DefaultFeatureGate.Enabled(features.TTLAfterFinished) && oldJob.Spec.TTLSecondsAfterFinished == nil {
9393
newJob.Spec.TTLSecondsAfterFinished = nil
94-
oldJob.Spec.TTLSecondsAfterFinished = nil
9594
}
9695

9796
pod.DropDisabledFields(&newJob.Spec.Template.Spec, &oldJob.Spec.Template.Spec)

pkg/registry/batch/job/strategy_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
2626
"k8s.io/apiserver/pkg/registry/rest"
2727
utilfeature "k8s.io/apiserver/pkg/util/feature"
28+
utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing"
2829
"k8s.io/kubernetes/pkg/api/testapi"
2930
apitesting "k8s.io/kubernetes/pkg/api/testing"
3031
"k8s.io/kubernetes/pkg/apis/batch"
@@ -121,6 +122,24 @@ func TestJobStrategy(t *testing.T) {
121122
t.Errorf("Job should only allow updating .spec.ttlSecondsAfterFinished when %v feature is enabled", features.TTLAfterFinished)
122123
}
123124

125+
// set TTLSecondsAfterFinished on both old and new jobs
126+
job.Spec.TTLSecondsAfterFinished = newInt32(1)
127+
updatedJob.Spec.TTLSecondsAfterFinished = newInt32(2)
128+
129+
// Existing TTLSecondsAfterFinished should be preserved when feature is on
130+
defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.TTLAfterFinished, true)()
131+
Strategy.PrepareForUpdate(ctx, updatedJob, job)
132+
if job.Spec.TTLSecondsAfterFinished == nil || updatedJob.Spec.TTLSecondsAfterFinished == nil {
133+
t.Errorf("existing TTLSecondsAfterFinished should be preserved")
134+
}
135+
136+
// Existing TTLSecondsAfterFinished should be preserved when feature is off
137+
defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.TTLAfterFinished, false)()
138+
Strategy.PrepareForUpdate(ctx, updatedJob, job)
139+
if job.Spec.TTLSecondsAfterFinished == nil || updatedJob.Spec.TTLSecondsAfterFinished == nil {
140+
t.Errorf("existing TTLSecondsAfterFinished should be preserved")
141+
}
142+
124143
// Make sure we correctly implement the interface.
125144
// Otherwise a typo could silently change the default.
126145
var gcds rest.GarbageCollectionDeleteStrategy = Strategy

0 commit comments

Comments
 (0)