@@ -24,6 +24,7 @@ import (
2424 "github.com/google/go-containerregistry/pkg/name"
2525 "github.com/tektoncd/pipeline/pkg/apis/config"
2626 "github.com/tektoncd/pipeline/pkg/apis/validate"
27+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2728 "knative.dev/pkg/apis"
2829)
2930
@@ -83,34 +84,30 @@ func (ps *PipelineRunSpec) Validate(ctx context.Context) (errs *apis.FieldError)
8384 }
8485 }
8586
87+ // This is an alpha feature and will fail validation if it's used in a pipelinerun spec
88+ // when the enable-api-fields feature gate is anything but "alpha".
8689 if ps .Timeouts != nil {
8790 if ps .Timeout != nil {
8891 // can't have both at the same time
8992 errs = errs .Also (apis .ErrDisallowedFields ("timeout" , "timeouts" ))
9093 }
9194
95+ errs = errs .Also (ValidateEnabledAPIFields (ctx , "timeouts" , config .AlphaAPIFields ))
96+
9297 // tasks timeout should be a valid duration of at least 0.
93- if ps .Timeouts .Tasks != nil && ps .Timeouts .Tasks .Duration < 0 {
94- errs = errs .Also (apis .ErrInvalidValue (fmt .Sprintf ("%s should be >= 0" , ps .Timeouts .Tasks .Duration .String ()), "timeouts.tasks" ))
95- }
98+ errs = errs .Also (validateTimeoutDuration ("tasks" , ps .Timeouts .Tasks ))
9699
97100 // finally timeout should be a valid duration of at least 0.
98- if ps .Timeouts .Finally != nil && ps .Timeouts .Finally .Duration < 0 {
99- errs = errs .Also (apis .ErrInvalidValue (fmt .Sprintf ("%s should be >= 0" , ps .Timeouts .Finally .Duration .String ()), "timeouts.finally" ))
100- }
101+ errs = errs .Also (validateTimeoutDuration ("finally" , ps .Timeouts .Finally ))
101102
102- if ps .Timeouts .Pipeline != nil {
103- // pipeline timeout should be a valid duration of at least 0.
104- if ps .Timeouts .Pipeline .Duration < 0 {
105- errs = errs .Also (apis .ErrInvalidValue (fmt .Sprintf ("%s should be >= 0" , ps .Timeouts .Pipeline .Duration .String ()), "timeouts.pipeline" ))
106- }
103+ // pipeline timeout should be a valid duration of at least 0.
104+ errs = errs .Also (validateTimeoutDuration ("pipeline" , ps .Timeouts .Pipeline ))
107105
106+ if ps .Timeouts .Pipeline != nil {
108107 errs = errs .Also (ps .validatePipelineTimeout (ps .Timeouts .Pipeline .Duration , "should be <= pipeline duration" ))
109-
110108 } else {
111109 defaultTimeout := time .Duration (config .FromContextOrDefaults (ctx ).Defaults .DefaultTimeoutMinutes )
112110 errs = errs .Also (ps .validatePipelineTimeout (defaultTimeout , "should be <= default timeout duration" ))
113-
114111 }
115112 }
116113
@@ -134,19 +131,27 @@ func (ps *PipelineRunSpec) Validate(ctx context.Context) (errs *apis.FieldError)
134131 return errs
135132}
136133
134+ func validateTimeoutDuration (field string , d * metav1.Duration ) (errs * apis.FieldError ) {
135+ if d != nil && d .Duration < 0 {
136+ fieldPath := fmt .Sprintf ("timeouts.%s" , field )
137+ return errs .Also (apis .ErrInvalidValue (fmt .Sprintf ("%s should be >= 0" , d .Duration .String ()), fieldPath ))
138+ }
139+ return nil
140+ }
141+
137142func (ps * PipelineRunSpec ) validatePipelineTimeout (timeout time.Duration , errorMsg string ) (errs * apis.FieldError ) {
138143 if ps .Timeouts .Tasks != nil && ps .Timeouts .Tasks .Duration > timeout {
139- errs = errs .Also (apis .ErrInvalidValue (fmt .Sprintf ("%s " + errorMsg , ps .Timeouts .Tasks .Duration .String ()), "timeouts.tasks" ))
144+ errs = errs .Also (apis .ErrInvalidValue (fmt .Sprintf ("%s %s" , ps .Timeouts .Tasks .Duration .String (), errorMsg ), "timeouts.tasks" ))
140145 }
141146
142147 if ps .Timeouts .Finally != nil && ps .Timeouts .Finally .Duration > timeout {
143- errs = errs .Also (apis .ErrInvalidValue (fmt .Sprintf ("%s " + errorMsg , ps .Timeouts .Finally .Duration .String ()), "timeouts.finally" ))
148+ errs = errs .Also (apis .ErrInvalidValue (fmt .Sprintf ("%s %s" , ps .Timeouts .Finally .Duration .String (), errorMsg ), "timeouts.finally" ))
144149 }
145150
146151 if ps .Timeouts .Tasks != nil && ps .Timeouts .Finally != nil {
147152 if ps .Timeouts .Tasks .Duration + ps .Timeouts .Finally .Duration > timeout {
148- errs = errs .Also (apis .ErrInvalidValue (fmt .Sprintf ("%s + %s " + errorMsg , ps .Timeouts .Tasks .Duration .String (), ps .Timeouts .Finally .Duration .String ()), "timeouts.tasks" ))
149- errs = errs .Also (apis .ErrInvalidValue (fmt .Sprintf ("%s + %s " + errorMsg , ps .Timeouts .Tasks .Duration .String (), ps .Timeouts .Finally .Duration .String ()), "timeouts.finally" ))
153+ errs = errs .Also (apis .ErrInvalidValue (fmt .Sprintf ("%s + %s %s" , ps .Timeouts .Tasks .Duration .String (), ps .Timeouts .Finally .Duration .String (), errorMsg ), "timeouts.tasks" ))
154+ errs = errs .Also (apis .ErrInvalidValue (fmt .Sprintf ("%s + %s %s" , ps .Timeouts .Tasks .Duration .String (), ps .Timeouts .Finally .Duration .String (), errorMsg ), "timeouts.finally" ))
150155 }
151156 }
152157 return errs
0 commit comments