diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 75efa7a78d7..0e3c64155cc 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -57933,10 +57933,15 @@ ], "properties": { "activeDeadlineSeconds": { - "description": "Optional duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer", + "description": "Specifies the duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer", "type": "integer", "format": "int64" }, + "backoffLimit": { + "description": "Specifies the number of retries before marking this job failed. Defaults to 6", + "type": "integer", + "format": "int32" + }, "completions": { "description": "Specifies the desired number of successfully finished pods the job should be run with. Setting to nil means that the success of any pod signals the success of all pods, and allows parallelism to have any positive value. Setting to 1 means that parallelism is limited to 1 and the success of that pod signals the success of the job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", "type": "integer", diff --git a/api/swagger-spec/batch_v1.json b/api/swagger-spec/batch_v1.json index 5a694f048ba..b1c14f998f2 100644 --- a/api/swagger-spec/batch_v1.json +++ b/api/swagger-spec/batch_v1.json @@ -1385,7 +1385,12 @@ "activeDeadlineSeconds": { "type": "integer", "format": "int64", - "description": "Optional duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer" + "description": "Specifies the duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer" + }, + "backoffLimit": { + "type": "integer", + "format": "int32", + "description": "Specifies the number of retries before marking this job failed. Defaults to 6" }, "selector": { "$ref": "v1.LabelSelector", diff --git a/api/swagger-spec/batch_v1beta1.json b/api/swagger-spec/batch_v1beta1.json index b7dec46588c..87b25ef31d8 100644 --- a/api/swagger-spec/batch_v1beta1.json +++ b/api/swagger-spec/batch_v1beta1.json @@ -1440,7 +1440,12 @@ "activeDeadlineSeconds": { "type": "integer", "format": "int64", - "description": "Optional duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer" + "description": "Specifies the duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer" + }, + "backoffLimit": { + "type": "integer", + "format": "int32", + "description": "Specifies the number of retries before marking this job failed. Defaults to 6" }, "selector": { "$ref": "v1.LabelSelector", diff --git a/api/swagger-spec/batch_v2alpha1.json b/api/swagger-spec/batch_v2alpha1.json index b3a71a4f8c6..83d950c1775 100644 --- a/api/swagger-spec/batch_v2alpha1.json +++ b/api/swagger-spec/batch_v2alpha1.json @@ -1440,7 +1440,12 @@ "activeDeadlineSeconds": { "type": "integer", "format": "int64", - "description": "Optional duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer" + "description": "Specifies the duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer" + }, + "backoffLimit": { + "type": "integer", + "format": "int32", + "description": "Specifies the number of retries before marking this job failed. Defaults to 6" }, "selector": { "$ref": "v1.LabelSelector", diff --git a/docs/api-reference/batch/v1/definitions.html b/docs/api-reference/batch/v1/definitions.html index 447d3b5e2d4..058d4c508b8 100755 --- a/docs/api-reference/batch/v1/definitions.html +++ b/docs/api-reference/batch/v1/definitions.html @@ -2407,12 +2407,19 @@ When an object is created, the system will populate this list with the current s

activeDeadlineSeconds

-

Optional duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer

+

Specifies the duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer

false

integer (int64)

+

backoffLimit

+

Specifies the number of retries before marking this job failed. Defaults to 6

+

false

+

integer (int32)

+ + +

selector

A label query over pods that should match the pod count. Normally, the system sets this field for you. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors

false

diff --git a/docs/api-reference/batch/v1beta1/definitions.html b/docs/api-reference/batch/v1beta1/definitions.html index f8a3c5b898c..563a18c0f85 100755 --- a/docs/api-reference/batch/v1beta1/definitions.html +++ b/docs/api-reference/batch/v1beta1/definitions.html @@ -2441,12 +2441,19 @@ When an object is created, the system will populate this list with the current s

activeDeadlineSeconds

-

Optional duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer

+

Specifies the duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer

false

integer (int64)

+

backoffLimit

+

Specifies the number of retries before marking this job failed. Defaults to 6

+

false

+

integer (int32)

+ + +

selector

A label query over pods that should match the pod count. Normally, the system sets this field for you. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors

false

diff --git a/docs/api-reference/batch/v2alpha1/definitions.html b/docs/api-reference/batch/v2alpha1/definitions.html index cb521444744..f891aef6ea2 100755 --- a/docs/api-reference/batch/v2alpha1/definitions.html +++ b/docs/api-reference/batch/v2alpha1/definitions.html @@ -2414,12 +2414,19 @@ When an object is created, the system will populate this list with the current s

activeDeadlineSeconds

-

Optional duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer

+

Specifies the duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer

false

integer (int64)

+

backoffLimit

+

Specifies the number of retries before marking this job failed. Defaults to 6

+

false

+

integer (int32)

+ + +

selector

A label query over pods that should match the pod count. Normally, the system sets this field for you. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors

false

diff --git a/pkg/apis/batch/fuzzer/fuzzer.go b/pkg/apis/batch/fuzzer/fuzzer.go index cb4b751f6d1..07a8cc1ed59 100644 --- a/pkg/apis/batch/fuzzer/fuzzer.go +++ b/pkg/apis/batch/fuzzer/fuzzer.go @@ -36,8 +36,10 @@ var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { c.FuzzNoCustom(j) // fuzz self without calling this function again completions := int32(c.Rand.Int31()) parallelism := int32(c.Rand.Int31()) + backoffLimit := int32(c.Rand.Int31()) j.Completions = &completions j.Parallelism = ¶llelism + j.BackoffLimit = &backoffLimit if c.Rand.Int31()%2 == 0 { j.ManualSelector = newBool(true) } else { diff --git a/pkg/apis/batch/types.go b/pkg/apis/batch/types.go index 7b450d4ffd1..be2b692f296 100644 --- a/pkg/apis/batch/types.go +++ b/pkg/apis/batch/types.go @@ -109,6 +109,16 @@ type JobSpec struct { // +optional ActiveDeadlineSeconds *int64 + // Optional number of retries before marking this job failed. + // Defaults to 6 + // +optional + BackoffLimit *int32 + + // TODO enabled it when https://github.com/kubernetes/kubernetes/issues/28486 has been fixed + // Optional number of failed pods to retain. + // +optional + // FailedPodsLimit *int32 + // A label query over pods that should match the pod count. // Normally, the system sets this field for you. // +optional diff --git a/pkg/apis/batch/v1/conversion.go b/pkg/apis/batch/v1/conversion.go index 55215676cc1..941b61d4a70 100644 --- a/pkg/apis/batch/v1/conversion.go +++ b/pkg/apis/batch/v1/conversion.go @@ -53,6 +53,7 @@ func Convert_batch_JobSpec_To_v1_JobSpec(in *batch.JobSpec, out *batchv1.JobSpec out.Parallelism = in.Parallelism out.Completions = in.Completions out.ActiveDeadlineSeconds = in.ActiveDeadlineSeconds + out.BackoffLimit = in.BackoffLimit out.Selector = in.Selector if in.ManualSelector != nil { out.ManualSelector = new(bool) @@ -71,6 +72,7 @@ func Convert_v1_JobSpec_To_batch_JobSpec(in *batchv1.JobSpec, out *batch.JobSpec out.Parallelism = in.Parallelism out.Completions = in.Completions out.ActiveDeadlineSeconds = in.ActiveDeadlineSeconds + out.BackoffLimit = in.BackoffLimit out.Selector = in.Selector if in.ManualSelector != nil { out.ManualSelector = new(bool) diff --git a/pkg/apis/batch/v1/defaults.go b/pkg/apis/batch/v1/defaults.go index 0d2af9e6aca..72e7e2a9d5b 100644 --- a/pkg/apis/batch/v1/defaults.go +++ b/pkg/apis/batch/v1/defaults.go @@ -38,6 +38,10 @@ func SetDefaults_Job(obj *batchv1.Job) { obj.Spec.Parallelism = new(int32) *obj.Spec.Parallelism = 1 } + if obj.Spec.BackoffLimit == nil { + obj.Spec.BackoffLimit = new(int32) + *obj.Spec.BackoffLimit = 6 + } labels := obj.Spec.Template.Labels if labels != nil && len(obj.Labels) == 0 { obj.Labels = labels diff --git a/pkg/apis/batch/v1/defaults_test.go b/pkg/apis/batch/v1/defaults_test.go index d1d48b1666f..f19ac542a5c 100644 --- a/pkg/apis/batch/v1/defaults_test.go +++ b/pkg/apis/batch/v1/defaults_test.go @@ -38,7 +38,7 @@ func TestSetDefaultJob(t *testing.T) { expected *batchv1.Job expectLabels bool }{ - "both unspecified -> sets both to 1": { + "All unspecified -> sets all to default values": { original: &batchv1.Job{ Spec: batchv1.JobSpec{ Template: v1.PodTemplateSpec{ @@ -48,13 +48,14 @@ func TestSetDefaultJob(t *testing.T) { }, expected: &batchv1.Job{ Spec: batchv1.JobSpec{ - Completions: newInt32(1), - Parallelism: newInt32(1), + Completions: newInt32(1), + Parallelism: newInt32(1), + BackoffLimit: newInt32(6), }, }, expectLabels: true, }, - "both unspecified -> sets both to 1 and no default labels": { + "All unspecified -> all integers are defaulted and no default labels": { original: &batchv1.Job{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"mylabel": "myvalue"}, @@ -67,12 +68,13 @@ func TestSetDefaultJob(t *testing.T) { }, expected: &batchv1.Job{ Spec: batchv1.JobSpec{ - Completions: newInt32(1), - Parallelism: newInt32(1), + Completions: newInt32(1), + Parallelism: newInt32(1), + BackoffLimit: newInt32(6), }, }, }, - "WQ: Parallelism explicitly 0 and completions unset -> no change": { + "WQ: Parallelism explicitly 0 and completions unset -> BackoffLimit is defaulted": { original: &batchv1.Job{ Spec: batchv1.JobSpec{ Parallelism: newInt32(0), @@ -83,12 +85,13 @@ func TestSetDefaultJob(t *testing.T) { }, expected: &batchv1.Job{ Spec: batchv1.JobSpec{ - Parallelism: newInt32(0), + Parallelism: newInt32(0), + BackoffLimit: newInt32(6), }, }, expectLabels: true, }, - "WQ: Parallelism explicitly 2 and completions unset -> no change": { + "WQ: Parallelism explicitly 2 and completions unset -> BackoffLimit is defaulted": { original: &batchv1.Job{ Spec: batchv1.JobSpec{ Parallelism: newInt32(2), @@ -99,12 +102,13 @@ func TestSetDefaultJob(t *testing.T) { }, expected: &batchv1.Job{ Spec: batchv1.JobSpec{ - Parallelism: newInt32(2), + Parallelism: newInt32(2), + BackoffLimit: newInt32(6), }, }, expectLabels: true, }, - "Completions explicitly 2 and parallelism unset -> parallelism is defaulted": { + "Completions explicitly 2 and others unset -> parallelism and BackoffLimit are defaulted": { original: &batchv1.Job{ Spec: batchv1.JobSpec{ Completions: newInt32(2), @@ -115,17 +119,17 @@ func TestSetDefaultJob(t *testing.T) { }, expected: &batchv1.Job{ Spec: batchv1.JobSpec{ - Completions: newInt32(2), - Parallelism: newInt32(1), + Completions: newInt32(2), + Parallelism: newInt32(1), + BackoffLimit: newInt32(6), }, }, expectLabels: true, }, - "Both set -> no change": { + "BackoffLimit explicitly 5 and others unset -> parallelism and completions are defaulted": { original: &batchv1.Job{ Spec: batchv1.JobSpec{ - Completions: newInt32(10), - Parallelism: newInt32(11), + BackoffLimit: newInt32(5), Template: v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{Labels: defaultLabels}, }, @@ -133,20 +137,19 @@ func TestSetDefaultJob(t *testing.T) { }, expected: &batchv1.Job{ Spec: batchv1.JobSpec{ - Completions: newInt32(10), - Parallelism: newInt32(11), - Template: v1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{Labels: defaultLabels}, - }, + Completions: newInt32(1), + Parallelism: newInt32(1), + BackoffLimit: newInt32(5), }, }, expectLabels: true, }, - "Both set, flipped -> no change": { + "All set -> no change": { original: &batchv1.Job{ Spec: batchv1.JobSpec{ - Completions: newInt32(11), - Parallelism: newInt32(10), + Completions: newInt32(8), + Parallelism: newInt32(9), + BackoffLimit: newInt32(10), Template: v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{Labels: defaultLabels}, }, @@ -154,8 +157,32 @@ func TestSetDefaultJob(t *testing.T) { }, expected: &batchv1.Job{ Spec: batchv1.JobSpec{ - Completions: newInt32(11), - Parallelism: newInt32(10), + Completions: newInt32(8), + Parallelism: newInt32(9), + BackoffLimit: newInt32(10), + Template: v1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{Labels: defaultLabels}, + }, + }, + }, + expectLabels: true, + }, + "All set, flipped -> no change": { + original: &batchv1.Job{ + Spec: batchv1.JobSpec{ + Completions: newInt32(11), + Parallelism: newInt32(10), + BackoffLimit: newInt32(9), + Template: v1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{Labels: defaultLabels}, + }, + }, + }, + expected: &batchv1.Job{ + Spec: batchv1.JobSpec{ + Completions: newInt32(11), + Parallelism: newInt32(10), + BackoffLimit: newInt32(9), }, }, expectLabels: true, @@ -171,22 +198,11 @@ func TestSetDefaultJob(t *testing.T) { t.Errorf("%s: unexpected object: %v", name, actual) t.FailNow() } - if (actual.Spec.Completions == nil) != (expected.Spec.Completions == nil) { - t.Errorf("%s: got different *completions than expected: %v %v", name, actual.Spec.Completions, expected.Spec.Completions) - } - if actual.Spec.Completions != nil && expected.Spec.Completions != nil { - if *actual.Spec.Completions != *expected.Spec.Completions { - t.Errorf("%s: got different completions than expected: %d %d", name, *actual.Spec.Completions, *expected.Spec.Completions) - } - } - if (actual.Spec.Parallelism == nil) != (expected.Spec.Parallelism == nil) { - t.Errorf("%s: got different *Parallelism than expected: %v %v", name, actual.Spec.Parallelism, expected.Spec.Parallelism) - } - if actual.Spec.Parallelism != nil && expected.Spec.Parallelism != nil { - if *actual.Spec.Parallelism != *expected.Spec.Parallelism { - t.Errorf("%s: got different parallelism than expected: %d %d", name, *actual.Spec.Parallelism, *expected.Spec.Parallelism) - } - } + + validateDefaultInt32(t, name, "Completions", actual.Spec.Completions, expected.Spec.Completions) + validateDefaultInt32(t, name, "Parallelism", actual.Spec.Parallelism, expected.Spec.Parallelism) + validateDefaultInt32(t, name, "BackoffLimit", actual.Spec.BackoffLimit, expected.Spec.BackoffLimit) + if test.expectLabels != reflect.DeepEqual(actual.Labels, actual.Spec.Template.Labels) { if test.expectLabels { t.Errorf("%s: expected: %v, got: %v", name, actual.Spec.Template.Labels, actual.Labels) @@ -198,6 +214,17 @@ func TestSetDefaultJob(t *testing.T) { } } +func validateDefaultInt32(t *testing.T, name string, field string, actual *int32, expected *int32) { + if (actual == nil) != (expected == nil) { + t.Errorf("%s: got different *%s than expected: %v %v", name, field, actual, expected) + } + if actual != nil && expected != nil { + if *actual != *expected { + t.Errorf("%s: got different %s than expected: %d %d", name, field, *actual, *expected) + } + } +} + func roundTrip(t *testing.T, obj runtime.Object) runtime.Object { data, err := runtime.Encode(api.Codecs.LegacyCodec(SchemeGroupVersion), obj) if err != nil { diff --git a/pkg/apis/batch/v1/zz_generated.conversion.go b/pkg/apis/batch/v1/zz_generated.conversion.go index 015a0f76a41..487b9c63ab8 100644 --- a/pkg/apis/batch/v1/zz_generated.conversion.go +++ b/pkg/apis/batch/v1/zz_generated.conversion.go @@ -161,6 +161,7 @@ func autoConvert_v1_JobSpec_To_batch_JobSpec(in *v1.JobSpec, out *batch.JobSpec, out.Parallelism = (*int32)(unsafe.Pointer(in.Parallelism)) out.Completions = (*int32)(unsafe.Pointer(in.Completions)) out.ActiveDeadlineSeconds = (*int64)(unsafe.Pointer(in.ActiveDeadlineSeconds)) + out.BackoffLimit = (*int32)(unsafe.Pointer(in.BackoffLimit)) out.Selector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.Selector)) out.ManualSelector = (*bool)(unsafe.Pointer(in.ManualSelector)) if err := api_v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { @@ -173,6 +174,7 @@ func autoConvert_batch_JobSpec_To_v1_JobSpec(in *batch.JobSpec, out *v1.JobSpec, out.Parallelism = (*int32)(unsafe.Pointer(in.Parallelism)) out.Completions = (*int32)(unsafe.Pointer(in.Completions)) out.ActiveDeadlineSeconds = (*int64)(unsafe.Pointer(in.ActiveDeadlineSeconds)) + out.BackoffLimit = (*int32)(unsafe.Pointer(in.BackoffLimit)) out.Selector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.Selector)) out.ManualSelector = (*bool)(unsafe.Pointer(in.ManualSelector)) if err := api_v1.Convert_api_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { diff --git a/pkg/apis/batch/validation/validation.go b/pkg/apis/batch/validation/validation.go index 77ab204e4a7..c736c10fbd4 100644 --- a/pkg/apis/batch/validation/validation.go +++ b/pkg/apis/batch/validation/validation.go @@ -113,6 +113,9 @@ func validateJobSpec(spec *batch.JobSpec, fldPath *field.Path) field.ErrorList { if spec.ActiveDeadlineSeconds != nil { allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*spec.ActiveDeadlineSeconds), fldPath.Child("activeDeadlineSeconds"))...) } + if spec.BackoffLimit != nil { + allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*spec.BackoffLimit), fldPath.Child("backoffLimit"))...) + } allErrs = append(allErrs, apivalidation.ValidatePodTemplateSpec(&spec.Template, fldPath.Child("template"))...) if spec.Template.Spec.RestartPolicy != api.RestartPolicyOnFailure && diff --git a/pkg/apis/batch/zz_generated.deepcopy.go b/pkg/apis/batch/zz_generated.deepcopy.go index 10d4b5f15de..483452c09e0 100644 --- a/pkg/apis/batch/zz_generated.deepcopy.go +++ b/pkg/apis/batch/zz_generated.deepcopy.go @@ -342,6 +342,15 @@ func (in *JobSpec) DeepCopyInto(out *JobSpec) { **out = **in } } + if in.BackoffLimit != nil { + in, out := &in.BackoffLimit, &out.BackoffLimit + if *in == nil { + *out = nil + } else { + *out = new(int32) + **out = **in + } + } if in.Selector != nil { in, out := &in.Selector, &out.Selector if *in == nil { diff --git a/staging/src/k8s.io/api/batch/v1/generated.pb.go b/staging/src/k8s.io/api/batch/v1/generated.pb.go index ace57748b83..5909ab76633 100644 --- a/staging/src/k8s.io/api/batch/v1/generated.pb.go +++ b/staging/src/k8s.io/api/batch/v1/generated.pb.go @@ -271,6 +271,11 @@ func (m *JobSpec) MarshalTo(dAtA []byte) (int, error) { return 0, err } i += n8 + if m.BackoffLimit != nil { + dAtA[i] = 0x38 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.BackoffLimit)) + } return i, nil } @@ -425,6 +430,9 @@ func (m *JobSpec) Size() (n int) { } l = m.Template.Size() n += 1 + l + sovGenerated(uint64(l)) + if m.BackoffLimit != nil { + n += 1 + sovGenerated(uint64(*m.BackoffLimit)) + } return n } @@ -513,6 +521,7 @@ func (this *JobSpec) String() string { `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, `ManualSelector:` + valueToStringGenerated(this.ManualSelector) + `,`, `Template:` + strings.Replace(strings.Replace(this.Template.String(), "PodTemplateSpec", "k8s_io_api_core_v1.PodTemplateSpec", 1), `&`, ``, 1) + `,`, + `BackoffLimit:` + valueToStringGenerated(this.BackoffLimit) + `,`, `}`, }, "") return s @@ -1190,6 +1199,26 @@ func (m *JobSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BackoffLimit", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.BackoffLimit = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -1525,61 +1554,62 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 882 bytes of a gzipped FileDescriptorProto + // 907 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0x41, 0x6f, 0xe3, 0x44, - 0x18, 0x8d, 0x9b, 0xa6, 0x4d, 0x26, 0x6d, 0x77, 0x19, 0x54, 0x29, 0x54, 0xc8, 0x59, 0x82, 0x84, - 0x0a, 0x12, 0x36, 0xe9, 0x56, 0x08, 0x21, 0x40, 0xc2, 0x45, 0x2b, 0x51, 0xb5, 0xda, 0x32, 0x29, - 0x42, 0x42, 0x20, 0x31, 0xb6, 0xbf, 0xa6, 0x43, 0x6d, 0x8f, 0xe5, 0x99, 0x44, 0xea, 0x8d, 0x9f, - 0xc0, 0x8f, 0x40, 0x1c, 0xf9, 0x19, 0xa8, 0xc7, 0x3d, 0xee, 0x29, 0xa2, 0xe6, 0x07, 0x70, 0xdf, - 0x13, 0x9a, 0xf1, 0xc4, 0x76, 0xda, 0x44, 0x74, 0xb9, 0x79, 0xde, 0xbc, 0xf7, 0xbe, 0x99, 0xf9, - 0xde, 0x67, 0xf4, 0xd9, 0xd5, 0x27, 0xc2, 0x61, 0xdc, 0xbd, 0x9a, 0xf8, 0x90, 0x25, 0x20, 0x41, - 0xb8, 0x53, 0x48, 0x42, 0x9e, 0xb9, 0x66, 0x83, 0xa6, 0xcc, 0xf5, 0xa9, 0x0c, 0x2e, 0xdd, 0xe9, - 0xd0, 0x1d, 0x43, 0x02, 0x19, 0x95, 0x10, 0x3a, 0x69, 0xc6, 0x25, 0xc7, 0x6f, 0x16, 0x24, 0x87, - 0xa6, 0xcc, 0xd1, 0x24, 0x67, 0x3a, 0xdc, 0xfb, 0x70, 0xcc, 0xe4, 0xe5, 0xc4, 0x77, 0x02, 0x1e, - 0xbb, 0x63, 0x3e, 0xe6, 0xae, 0xe6, 0xfa, 0x93, 0x0b, 0xbd, 0xd2, 0x0b, 0xfd, 0x55, 0x78, 0xec, - 0x0d, 0x6a, 0x85, 0x02, 0x9e, 0xc1, 0x92, 0x3a, 0x7b, 0x87, 0x15, 0x27, 0xa6, 0xc1, 0x25, 0x4b, - 0x20, 0xbb, 0x76, 0xd3, 0xab, 0xb1, 0x02, 0x84, 0x1b, 0x83, 0xa4, 0xcb, 0x54, 0xee, 0x2a, 0x55, - 0x36, 0x49, 0x24, 0x8b, 0xe1, 0x9e, 0xe0, 0xe3, 0xff, 0x12, 0x88, 0xe0, 0x12, 0x62, 0x7a, 0x4f, - 0xf7, 0x74, 0x95, 0x6e, 0x22, 0x59, 0xe4, 0xb2, 0x44, 0x0a, 0x99, 0xdd, 0x15, 0x0d, 0xfe, 0xb1, - 0x50, 0xf3, 0x98, 0xfb, 0xf8, 0x27, 0xd4, 0x56, 0x17, 0x08, 0xa9, 0xa4, 0x3d, 0xeb, 0x89, 0xb5, - 0xdf, 0x3d, 0xf8, 0xc8, 0xa9, 0x9e, 0xb5, 0xf4, 0x73, 0xd2, 0xab, 0xb1, 0x02, 0x84, 0xa3, 0xd8, - 0xce, 0x74, 0xe8, 0x3c, 0xf7, 0x7f, 0x86, 0x40, 0x9e, 0x82, 0xa4, 0x1e, 0xbe, 0x99, 0xf5, 0x1b, - 0xf9, 0xac, 0x8f, 0x2a, 0x8c, 0x94, 0xae, 0xf8, 0x0b, 0xb4, 0x2e, 0x52, 0x08, 0x7a, 0x6b, 0xda, - 0xfd, 0x6d, 0x67, 0x49, 0xd3, 0x9c, 0x63, 0xee, 0x8f, 0x52, 0x08, 0xbc, 0x2d, 0xe3, 0xb4, 0xae, - 0x56, 0x44, 0xeb, 0xf0, 0x33, 0xb4, 0x21, 0x24, 0x95, 0x13, 0xd1, 0x6b, 0x6a, 0x07, 0x7b, 0xa5, - 0x83, 0x66, 0x79, 0x3b, 0xc6, 0x63, 0xa3, 0x58, 0x13, 0xa3, 0x1e, 0xfc, 0xd9, 0x44, 0x5b, 0xc7, - 0xdc, 0x3f, 0xe2, 0x49, 0xc8, 0x24, 0xe3, 0x09, 0x3e, 0x44, 0xeb, 0xf2, 0x3a, 0x05, 0x7d, 0xed, - 0x8e, 0xf7, 0x64, 0x5e, 0xfa, 0xfc, 0x3a, 0x85, 0x57, 0xb3, 0xfe, 0xe3, 0x3a, 0x57, 0x61, 0x44, - 0xb3, 0xf1, 0x49, 0x79, 0x9c, 0x35, 0xad, 0x3b, 0x5c, 0x2c, 0xf7, 0x6a, 0xd6, 0x5f, 0x12, 0x29, - 0xa7, 0x74, 0x5a, 0x3c, 0x14, 0x1e, 0xa3, 0xed, 0x88, 0x0a, 0x79, 0x96, 0x71, 0x1f, 0xce, 0x59, - 0x0c, 0xe6, 0x8e, 0x1f, 0x3c, 0xac, 0x07, 0x4a, 0xe1, 0xed, 0x9a, 0x03, 0x6c, 0x9f, 0xd4, 0x8d, - 0xc8, 0xa2, 0x2f, 0x9e, 0x22, 0xac, 0x80, 0xf3, 0x8c, 0x26, 0xa2, 0xb8, 0x92, 0xaa, 0xb6, 0xfe, - 0xda, 0xd5, 0xf6, 0x4c, 0x35, 0x7c, 0x72, 0xcf, 0x8d, 0x2c, 0xa9, 0x80, 0xdf, 0x43, 0x1b, 0x19, - 0x50, 0xc1, 0x93, 0x5e, 0x4b, 0x3f, 0x57, 0xd9, 0x1d, 0xa2, 0x51, 0x62, 0x76, 0xf1, 0xfb, 0x68, - 0x33, 0x06, 0x21, 0xe8, 0x18, 0x7a, 0x1b, 0x9a, 0xf8, 0xc8, 0x10, 0x37, 0x4f, 0x0b, 0x98, 0xcc, - 0xf7, 0x07, 0xbf, 0x5b, 0x68, 0xf3, 0x98, 0xfb, 0x27, 0x4c, 0x48, 0xfc, 0xc3, 0xbd, 0xf8, 0x3a, - 0x0f, 0xbb, 0x8c, 0x52, 0xeb, 0xf0, 0x3e, 0x36, 0x75, 0xda, 0x73, 0xa4, 0x16, 0xdd, 0xcf, 0x51, - 0x8b, 0x49, 0x88, 0x55, 0xab, 0x9b, 0xfb, 0xdd, 0x83, 0xde, 0xaa, 0xe4, 0x79, 0xdb, 0xc6, 0xa4, - 0xf5, 0xb5, 0xa2, 0x93, 0x42, 0x35, 0xf8, 0xa3, 0xa9, 0x0f, 0xaa, 0xb2, 0x8c, 0x87, 0xa8, 0x9b, - 0xd2, 0x8c, 0x46, 0x11, 0x44, 0x4c, 0xc4, 0xfa, 0xac, 0x2d, 0xef, 0x51, 0x3e, 0xeb, 0x77, 0xcf, - 0x2a, 0x98, 0xd4, 0x39, 0x4a, 0x12, 0xf0, 0x38, 0x8d, 0x40, 0x3d, 0x66, 0x11, 0x37, 0x23, 0x39, - 0xaa, 0x60, 0x52, 0xe7, 0xe0, 0xe7, 0x68, 0x97, 0x06, 0x92, 0x4d, 0xe1, 0x2b, 0xa0, 0x61, 0xc4, - 0x12, 0x18, 0x41, 0xc0, 0x93, 0xb0, 0x18, 0x9d, 0xa6, 0xf7, 0x56, 0x3e, 0xeb, 0xef, 0x7e, 0xb9, - 0x8c, 0x40, 0x96, 0xeb, 0xf0, 0x8f, 0xa8, 0x2d, 0x20, 0x82, 0x40, 0xf2, 0xcc, 0x84, 0xe5, 0xe9, - 0x03, 0xdf, 0x97, 0xfa, 0x10, 0x8d, 0x8c, 0xd4, 0xdb, 0x52, 0x0f, 0x3c, 0x5f, 0x91, 0xd2, 0x12, - 0x7f, 0x8a, 0x76, 0x62, 0x9a, 0x4c, 0x68, 0xc9, 0xd4, 0x29, 0x69, 0x7b, 0x38, 0x9f, 0xf5, 0x77, - 0x4e, 0x17, 0x76, 0xc8, 0x1d, 0x26, 0xfe, 0x06, 0xb5, 0x25, 0xc4, 0x69, 0x44, 0x65, 0x11, 0x99, - 0xee, 0xc1, 0xbb, 0xf5, 0xfe, 0xa8, 0xc9, 0x53, 0x07, 0x39, 0xe3, 0xe1, 0xb9, 0xa1, 0xe9, 0x5f, - 0x4c, 0xd9, 0xef, 0x39, 0x4a, 0x4a, 0x9b, 0xc1, 0x6f, 0x4d, 0xd4, 0x29, 0x7f, 0x24, 0xf8, 0x5b, - 0x84, 0x82, 0xf9, 0xd8, 0x8a, 0x9e, 0xa5, 0x23, 0xf0, 0xce, 0xaa, 0x08, 0x94, 0x03, 0x5e, 0xfd, - 0x0d, 0x4b, 0x48, 0x90, 0x9a, 0x11, 0xfe, 0x0e, 0x75, 0x84, 0xa4, 0x99, 0xd4, 0x03, 0xb8, 0xf6, - 0xda, 0x03, 0xb8, 0x9d, 0xcf, 0xfa, 0x9d, 0xd1, 0xdc, 0x80, 0x54, 0x5e, 0xf8, 0x02, 0xed, 0x54, - 0x59, 0xf8, 0x9f, 0x3f, 0x13, 0xfd, 0xf0, 0x47, 0x0b, 0x2e, 0xe4, 0x8e, 0xab, 0x1a, 0xe9, 0x22, - 0x2c, 0x3a, 0x11, 0xad, 0x6a, 0xa4, 0x8b, 0x64, 0x11, 0xb3, 0x8b, 0x5d, 0xd4, 0x11, 0x93, 0x20, - 0x00, 0x08, 0x21, 0xd4, 0x7d, 0x6d, 0x79, 0x6f, 0x18, 0x6a, 0x67, 0x34, 0xdf, 0x20, 0x15, 0x47, - 0x19, 0x5f, 0x50, 0x16, 0x41, 0xa8, 0xfb, 0x59, 0x33, 0x7e, 0xa6, 0x51, 0x62, 0x76, 0xbd, 0xfd, - 0x9b, 0x5b, 0xbb, 0xf1, 0xe2, 0xd6, 0x6e, 0xbc, 0xbc, 0xb5, 0x1b, 0xbf, 0xe4, 0xb6, 0x75, 0x93, - 0xdb, 0xd6, 0x8b, 0xdc, 0xb6, 0x5e, 0xe6, 0xb6, 0xf5, 0x57, 0x6e, 0x5b, 0xbf, 0xfe, 0x6d, 0x37, - 0xbe, 0x5f, 0x9b, 0x0e, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xb5, 0xea, 0xfc, 0x71, 0x60, 0x08, - 0x00, 0x00, + 0x18, 0x8d, 0x9b, 0xa6, 0x4d, 0x26, 0x69, 0x77, 0x19, 0x54, 0x29, 0x54, 0xc8, 0x59, 0x82, 0x84, + 0x0a, 0x12, 0x36, 0xe9, 0x56, 0x08, 0x21, 0x40, 0xc2, 0x45, 0x2b, 0x51, 0xa5, 0xda, 0x32, 0x29, + 0x42, 0x42, 0x20, 0x31, 0xb6, 0xbf, 0xa4, 0x43, 0x6c, 0x8f, 0xe5, 0x99, 0x44, 0xea, 0x8d, 0x9f, + 0xc0, 0x8f, 0x40, 0xfc, 0x14, 0xd4, 0xe3, 0x1e, 0xf7, 0x14, 0x51, 0xc3, 0x9d, 0xfb, 0x9e, 0xd0, + 0x8c, 0x1d, 0xdb, 0x69, 0x13, 0xd1, 0xe5, 0x66, 0xbf, 0x79, 0xef, 0x7d, 0x33, 0xf3, 0xbd, 0xf9, + 0xd0, 0x67, 0xd3, 0x4f, 0x84, 0xc5, 0xb8, 0x3d, 0x9d, 0xb9, 0x90, 0x44, 0x20, 0x41, 0xd8, 0x73, + 0x88, 0x7c, 0x9e, 0xd8, 0xf9, 0x02, 0x8d, 0x99, 0xed, 0x52, 0xe9, 0x5d, 0xd9, 0xf3, 0x81, 0x3d, + 0x81, 0x08, 0x12, 0x2a, 0xc1, 0xb7, 0xe2, 0x84, 0x4b, 0x8e, 0xdf, 0xcc, 0x48, 0x16, 0x8d, 0x99, + 0xa5, 0x49, 0xd6, 0x7c, 0x70, 0xf8, 0xe1, 0x84, 0xc9, 0xab, 0x99, 0x6b, 0x79, 0x3c, 0xb4, 0x27, + 0x7c, 0xc2, 0x6d, 0xcd, 0x75, 0x67, 0x63, 0xfd, 0xa7, 0x7f, 0xf4, 0x57, 0xe6, 0x71, 0xd8, 0xaf, + 0x14, 0xf2, 0x78, 0x02, 0x6b, 0xea, 0x1c, 0x9e, 0x94, 0x9c, 0x90, 0x7a, 0x57, 0x2c, 0x82, 0xe4, + 0xda, 0x8e, 0xa7, 0x13, 0x05, 0x08, 0x3b, 0x04, 0x49, 0xd7, 0xa9, 0xec, 0x4d, 0xaa, 0x64, 0x16, + 0x49, 0x16, 0xc2, 0x3d, 0xc1, 0xc7, 0xff, 0x25, 0x10, 0xde, 0x15, 0x84, 0xf4, 0x9e, 0xee, 0xe9, + 0x26, 0xdd, 0x4c, 0xb2, 0xc0, 0x66, 0x91, 0x14, 0x32, 0xb9, 0x2b, 0xea, 0xff, 0x63, 0xa0, 0xfa, + 0x19, 0x77, 0xf1, 0x4f, 0xa8, 0xa9, 0x0e, 0xe0, 0x53, 0x49, 0xbb, 0xc6, 0x13, 0xe3, 0xa8, 0x7d, + 0xfc, 0x91, 0x55, 0x5e, 0x6b, 0xe1, 0x67, 0xc5, 0xd3, 0x89, 0x02, 0x84, 0xa5, 0xd8, 0xd6, 0x7c, + 0x60, 0x3d, 0x77, 0x7f, 0x06, 0x4f, 0x9e, 0x83, 0xa4, 0x0e, 0xbe, 0x59, 0xf4, 0x6a, 0xe9, 0xa2, + 0x87, 0x4a, 0x8c, 0x14, 0xae, 0xf8, 0x0b, 0xb4, 0x2d, 0x62, 0xf0, 0xba, 0x5b, 0xda, 0xfd, 0x6d, + 0x6b, 0x4d, 0xd3, 0xac, 0x33, 0xee, 0x8e, 0x62, 0xf0, 0x9c, 0x4e, 0xee, 0xb4, 0xad, 0xfe, 0x88, + 0xd6, 0xe1, 0x67, 0x68, 0x47, 0x48, 0x2a, 0x67, 0xa2, 0x5b, 0xd7, 0x0e, 0xe6, 0x46, 0x07, 0xcd, + 0x72, 0xf6, 0x73, 0x8f, 0x9d, 0xec, 0x9f, 0xe4, 0xea, 0xfe, 0x1f, 0x75, 0xd4, 0x39, 0xe3, 0xee, + 0x29, 0x8f, 0x7c, 0x26, 0x19, 0x8f, 0xf0, 0x09, 0xda, 0x96, 0xd7, 0x31, 0xe8, 0x63, 0xb7, 0x9c, + 0x27, 0xcb, 0xd2, 0x97, 0xd7, 0x31, 0xbc, 0x5a, 0xf4, 0x1e, 0x57, 0xb9, 0x0a, 0x23, 0x9a, 0x8d, + 0x87, 0xc5, 0x76, 0xb6, 0xb4, 0xee, 0x64, 0xb5, 0xdc, 0xab, 0x45, 0x6f, 0x4d, 0xa4, 0xac, 0xc2, + 0x69, 0x75, 0x53, 0x78, 0x82, 0xf6, 0x02, 0x2a, 0xe4, 0x45, 0xc2, 0x5d, 0xb8, 0x64, 0x21, 0xe4, + 0x67, 0xfc, 0xe0, 0x61, 0x3d, 0x50, 0x0a, 0xe7, 0x20, 0xdf, 0xc0, 0xde, 0xb0, 0x6a, 0x44, 0x56, + 0x7d, 0xf1, 0x1c, 0x61, 0x05, 0x5c, 0x26, 0x34, 0x12, 0xd9, 0x91, 0x54, 0xb5, 0xed, 0xd7, 0xae, + 0x76, 0x98, 0x57, 0xc3, 0xc3, 0x7b, 0x6e, 0x64, 0x4d, 0x05, 0xfc, 0x1e, 0xda, 0x49, 0x80, 0x0a, + 0x1e, 0x75, 0x1b, 0xfa, 0xba, 0x8a, 0xee, 0x10, 0x8d, 0x92, 0x7c, 0x15, 0xbf, 0x8f, 0x76, 0x43, + 0x10, 0x82, 0x4e, 0xa0, 0xbb, 0xa3, 0x89, 0x8f, 0x72, 0xe2, 0xee, 0x79, 0x06, 0x93, 0xe5, 0x7a, + 0xff, 0x77, 0x03, 0xed, 0x9e, 0x71, 0x77, 0xc8, 0x84, 0xc4, 0x3f, 0xdc, 0x8b, 0xaf, 0xf5, 0xb0, + 0xc3, 0x28, 0xb5, 0x0e, 0xef, 0xe3, 0xbc, 0x4e, 0x73, 0x89, 0x54, 0xa2, 0xfb, 0x39, 0x6a, 0x30, + 0x09, 0xa1, 0x6a, 0x75, 0xfd, 0xa8, 0x7d, 0xdc, 0xdd, 0x94, 0x3c, 0x67, 0x2f, 0x37, 0x69, 0x7c, + 0xad, 0xe8, 0x24, 0x53, 0xf5, 0xff, 0xae, 0xeb, 0x8d, 0xaa, 0x2c, 0xe3, 0x01, 0x6a, 0xc7, 0x34, + 0xa1, 0x41, 0x00, 0x01, 0x13, 0xa1, 0xde, 0x6b, 0xc3, 0x79, 0x94, 0x2e, 0x7a, 0xed, 0x8b, 0x12, + 0x26, 0x55, 0x8e, 0x92, 0x78, 0x3c, 0x8c, 0x03, 0x50, 0x97, 0x99, 0xc5, 0x2d, 0x97, 0x9c, 0x96, + 0x30, 0xa9, 0x72, 0xf0, 0x73, 0x74, 0x40, 0x3d, 0xc9, 0xe6, 0xf0, 0x15, 0x50, 0x3f, 0x60, 0x11, + 0x8c, 0xc0, 0xe3, 0x91, 0x9f, 0x3d, 0x9d, 0xba, 0xf3, 0x56, 0xba, 0xe8, 0x1d, 0x7c, 0xb9, 0x8e, + 0x40, 0xd6, 0xeb, 0xf0, 0x8f, 0xa8, 0x29, 0x20, 0x00, 0x4f, 0xf2, 0x24, 0x0f, 0xcb, 0xd3, 0x07, + 0xde, 0x2f, 0x75, 0x21, 0x18, 0xe5, 0x52, 0xa7, 0xa3, 0x2e, 0x78, 0xf9, 0x47, 0x0a, 0x4b, 0xfc, + 0x29, 0xda, 0x0f, 0x69, 0x34, 0xa3, 0x05, 0x53, 0xa7, 0xa4, 0xe9, 0xe0, 0x74, 0xd1, 0xdb, 0x3f, + 0x5f, 0x59, 0x21, 0x77, 0x98, 0xf8, 0x1b, 0xd4, 0x94, 0x10, 0xc6, 0x01, 0x95, 0x59, 0x64, 0xda, + 0xc7, 0xef, 0x56, 0xfb, 0xa3, 0x5e, 0x9e, 0xda, 0xc8, 0x05, 0xf7, 0x2f, 0x73, 0x9a, 0x1e, 0x31, + 0x45, 0xbf, 0x97, 0x28, 0x29, 0x6c, 0xf0, 0x09, 0xea, 0xb8, 0xd4, 0x9b, 0xf2, 0xf1, 0x78, 0xc8, + 0x42, 0x26, 0xbb, 0xbb, 0xfa, 0xca, 0x1f, 0xa7, 0x8b, 0x5e, 0xc7, 0xa9, 0xe0, 0x64, 0x85, 0xd5, + 0xff, 0xad, 0x8e, 0x5a, 0xc5, 0xf8, 0xc1, 0xdf, 0x22, 0xe4, 0x2d, 0x1f, 0xbb, 0xe8, 0x1a, 0x3a, + 0x38, 0xef, 0x6c, 0x0a, 0x4e, 0x31, 0x16, 0xca, 0x19, 0x5a, 0x40, 0x82, 0x54, 0x8c, 0xf0, 0x77, + 0xa8, 0x25, 0x24, 0x4d, 0xa4, 0x7e, 0xb6, 0x5b, 0xaf, 0xfd, 0x6c, 0xf7, 0xd2, 0x45, 0xaf, 0x35, + 0x5a, 0x1a, 0x90, 0xd2, 0x0b, 0x8f, 0xd1, 0x7e, 0x99, 0xa0, 0xff, 0x39, 0x82, 0x74, 0xbb, 0x4e, + 0x57, 0x5c, 0xc8, 0x1d, 0x57, 0x35, 0x08, 0xb2, 0x88, 0xe9, 0x1c, 0x35, 0xca, 0x41, 0x90, 0xe5, + 0x91, 0xe4, 0xab, 0xd8, 0x46, 0x2d, 0x31, 0xf3, 0x3c, 0x00, 0x1f, 0x7c, 0x9d, 0x86, 0x86, 0xf3, + 0x46, 0x4e, 0x6d, 0x8d, 0x96, 0x0b, 0xa4, 0xe4, 0x28, 0xe3, 0x31, 0x65, 0x01, 0xf8, 0x3a, 0x05, + 0x15, 0xe3, 0x67, 0x1a, 0x25, 0xf9, 0xaa, 0x73, 0x74, 0x73, 0x6b, 0xd6, 0x5e, 0xdc, 0x9a, 0xb5, + 0x97, 0xb7, 0x66, 0xed, 0x97, 0xd4, 0x34, 0x6e, 0x52, 0xd3, 0x78, 0x91, 0x9a, 0xc6, 0xcb, 0xd4, + 0x34, 0xfe, 0x4c, 0x4d, 0xe3, 0xd7, 0xbf, 0xcc, 0xda, 0xf7, 0x5b, 0xf3, 0xc1, 0xbf, 0x01, 0x00, + 0x00, 0xff, 0xff, 0xce, 0x80, 0xf2, 0xbe, 0x96, 0x08, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/batch/v1/generated.proto b/staging/src/k8s.io/api/batch/v1/generated.proto index a54f1466a75..08635ad2b2c 100644 --- a/staging/src/k8s.io/api/batch/v1/generated.proto +++ b/staging/src/k8s.io/api/batch/v1/generated.proto @@ -103,11 +103,16 @@ message JobSpec { // +optional optional int32 completions = 2; - // Optional duration in seconds relative to the startTime that the job may be active + // Specifies the duration in seconds relative to the startTime that the job may be active // before the system tries to terminate it; value must be positive integer // +optional optional int64 activeDeadlineSeconds = 3; + // Specifies the number of retries before marking this job failed. + // Defaults to 6 + // +optional + optional int32 backoffLimit = 7; + // A label query over pods that should match the pod count. // Normally, the system sets this field for you. // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors diff --git a/staging/src/k8s.io/api/batch/v1/types.go b/staging/src/k8s.io/api/batch/v1/types.go index 7124e0719f0..4f3b83e8a8d 100644 --- a/staging/src/k8s.io/api/batch/v1/types.go +++ b/staging/src/k8s.io/api/batch/v1/types.go @@ -77,11 +77,21 @@ type JobSpec struct { // +optional Completions *int32 `json:"completions,omitempty" protobuf:"varint,2,opt,name=completions"` - // Optional duration in seconds relative to the startTime that the job may be active + // Specifies the duration in seconds relative to the startTime that the job may be active // before the system tries to terminate it; value must be positive integer // +optional ActiveDeadlineSeconds *int64 `json:"activeDeadlineSeconds,omitempty" protobuf:"varint,3,opt,name=activeDeadlineSeconds"` + // Specifies the number of retries before marking this job failed. + // Defaults to 6 + // +optional + BackoffLimit *int32 `json:"backoffLimit,omitempty" protobuf:"varint,7,opt,name=backoffLimit"` + + // TODO enabled it when https://github.com/kubernetes/kubernetes/issues/28486 has been fixed + // Optional number of failed pods to retain. + // +optional + // FailedPodsLimit *int32 `json:"failedPodsLimit,omitempty" protobuf:"varint,9,opt,name=failedPodsLimit"` + // A label query over pods that should match the pod count. // Normally, the system sets this field for you. // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors diff --git a/staging/src/k8s.io/api/batch/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/batch/v1/types_swagger_doc_generated.go index da4985192c5..53b2d634fd7 100644 --- a/staging/src/k8s.io/api/batch/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/batch/v1/types_swagger_doc_generated.go @@ -66,7 +66,8 @@ var map_JobSpec = map[string]string{ "": "JobSpec describes how the job execution will look like.", "parallelism": "Specifies the maximum desired number of pods the job should run at any given time. The actual number of pods running in steady state will be less than this number when ((.spec.completions - .status.successful) < .spec.parallelism), i.e. when the work left to do is less than max parallelism. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", "completions": "Specifies the desired number of successfully finished pods the job should be run with. Setting to nil means that the success of any pod signals the success of all pods, and allows parallelism to have any positive value. Setting to 1 means that parallelism is limited to 1 and the success of that pod signals the success of the job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", - "activeDeadlineSeconds": "Optional duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer", + "activeDeadlineSeconds": "Specifies the duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer", + "backoffLimit": "Specifies the number of retries before marking this job failed. Defaults to 6", "selector": "A label query over pods that should match the pod count. Normally, the system sets this field for you. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors", "manualSelector": "manualSelector controls generation of pod labels and pod selectors. Leave `manualSelector` unset unless you are certain what you are doing. When false or unset, the system pick labels unique to this job and appends those labels to the pod template. When true, the user is responsible for picking unique labels and specifying the selector. Failure to pick a unique label may cause this and other jobs to not function correctly. However, You may see `manualSelector=true` in jobs that were created with the old `extensions/v1beta1` API. More info: https://git.k8s.io/community/contributors/design-proposals/selector-generation.md", "template": "Describes the pod that will be created when executing a job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", diff --git a/staging/src/k8s.io/api/batch/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/batch/v1/zz_generated.deepcopy.go index 9e692af36de..8738bd5d2c3 100644 --- a/staging/src/k8s.io/api/batch/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/batch/v1/zz_generated.deepcopy.go @@ -171,6 +171,15 @@ func (in *JobSpec) DeepCopyInto(out *JobSpec) { **out = **in } } + if in.BackoffLimit != nil { + in, out := &in.BackoffLimit, &out.BackoffLimit + if *in == nil { + *out = nil + } else { + *out = new(int32) + **out = **in + } + } if in.Selector != nil { in, out := &in.Selector, &out.Selector if *in == nil { diff --git a/test/e2e_federation/job.go b/test/e2e_federation/job.go index e31f19dadb4..3cbe6d315fc 100644 --- a/test/e2e_federation/job.go +++ b/test/e2e_federation/job.go @@ -226,6 +226,7 @@ func verifyJob(fedJob, localJob *batchv1.Job) bool { localJob.Spec.ManualSelector = fedJob.Spec.ManualSelector localJob.Spec.Completions = fedJob.Spec.Completions localJob.Spec.Parallelism = fedJob.Spec.Parallelism + localJob.Spec.BackoffLimit = fedJob.Spec.BackoffLimit return fedutil.ObjectMetaAndSpecEquivalent(fedJob, localJob) }