Skip to content

Commit 1027f72

Browse files
twoGiantstekton-robot
authored andcommitted
refactor: implement Validatable for step
Add `StepList` with a `Validate` method and implement a `Validate` method on `Step`. Move up check for duplicated Step names into `StepList.Validate` to be consistent with the check for duplicated Task names in `pipeline_validation.go`. Issue #8700. Signed-off-by: Stanislav Jakuschevskij <[email protected]>
1 parent e91bbdf commit 1027f72

File tree

5 files changed

+46
-16
lines changed

5 files changed

+46
-16
lines changed

pkg/apis/pipeline/v1/container_validation.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929
"github.com/tektoncd/pipeline/pkg/apis/config"
3030
"github.com/tektoncd/pipeline/pkg/apis/pipeline"
3131
"github.com/tektoncd/pipeline/pkg/internal/resultref"
32-
"k8s.io/apimachinery/pkg/util/sets"
3332
"k8s.io/apimachinery/pkg/util/validation"
3433
"knative.dev/pkg/apis"
3534
)
@@ -104,7 +103,8 @@ func RefNameLikeUrl(name string) error {
104103
return nil
105104
}
106105

107-
func validateStep(ctx context.Context, s Step, names sets.String) (errs *apis.FieldError) {
106+
// Validate implements apis.Validatable
107+
func (s *Step) Validate(ctx context.Context) (errs *apis.FieldError) {
108108
if err := validateArtifactsReferencesInStep(ctx, s); err != nil {
109109
return err
110110
}
@@ -181,17 +181,13 @@ func validateStep(ctx context.Context, s Step, names sets.String) (errs *apis.Fi
181181
}
182182

183183
if s.Name != "" {
184-
if names.Has(s.Name) {
185-
errs = errs.Also(apis.ErrMultipleOneOf("name"))
186-
}
187184
if e := validation.IsDNS1123Label(s.Name); len(e) > 0 {
188185
errs = errs.Also(&apis.FieldError{
189186
Message: fmt.Sprintf("invalid value %q", s.Name),
190187
Paths: []string{"name"},
191188
Details: "Task step name must be a valid DNS Label, For more info refer to https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
192189
})
193190
}
194-
names.Insert(s.Name)
195191
}
196192

197193
if s.Timeout != nil {
@@ -254,7 +250,7 @@ func isParamRefs(s string) bool {
254250
return strings.HasPrefix(s, "$("+ParamsPrefix)
255251
}
256252

257-
func validateArtifactsReferencesInStep(ctx context.Context, s Step) *apis.FieldError {
253+
func validateArtifactsReferencesInStep(ctx context.Context, s *Step) *apis.FieldError {
258254
cfg := config.FromContextOrDefaults(ctx)
259255
if cfg == nil || cfg.FeatureFlags == nil {
260256
cfg = &config.Config{
@@ -295,11 +291,11 @@ func taskArtifactReferenceExists(src string) bool {
295291
return len(artifactref.TaskArtifactRegex.FindAllStringSubmatch(src, -1)) > 0 || strings.Contains(src, "$("+artifactref.TaskArtifactPathPattern+")")
296292
}
297293

298-
func validateStepResultReference(s Step) (errs *apis.FieldError) {
294+
func validateStepResultReference(s *Step) (errs *apis.FieldError) {
299295
errs = errs.Also(errorIfStepResultReferencedInField(s.Name, "name"))
300296
errs = errs.Also(errorIfStepResultReferencedInField(s.Image, "image"))
301297
errs = errs.Also(errorIfStepResultReferencedInField(s.Script, "script"))
302-
errs = errs.Also(errorIfStepResultReferencedInField(string(s.ImagePullPolicy), "imagePullPoliicy"))
298+
errs = errs.Also(errorIfStepResultReferencedInField(string(s.ImagePullPolicy), "imagePullPolicy"))
303299
errs = errs.Also(errorIfStepResultReferencedInField(s.WorkingDir, "workingDir"))
304300
for _, e := range s.EnvFrom {
305301
errs = errs.Also(errorIfStepResultReferencedInField(e.Prefix, "envFrom.prefix"))
@@ -333,7 +329,7 @@ func errorIfStepResultReferencedInField(value, fieldName string) (errs *apis.Fie
333329
return errs
334330
}
335331

336-
func validateStepArtifactsReference(s Step) (errs *apis.FieldError) {
332+
func validateStepArtifactsReference(s *Step) (errs *apis.FieldError) {
337333
errs = errs.Also(errorIfStepArtifactReferencedInField(s.Name, "name"))
338334
errs = errs.Also(errorIfStepArtifactReferencedInField(s.Image, "image"))
339335
errs = errs.Also(errorIfStepArtifactReferencedInField(string(s.ImagePullPolicy), "imagePullPolicy"))

pkg/apis/pipeline/v1/task_types.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,5 +133,8 @@ type TaskList struct {
133133
Items []Task `json:"items"`
134134
}
135135

136+
// StepList is a list of Steps
137+
type StepList []Step
138+
136139
// SidecarList is a list of Sidecars
137140
type SidecarList []Sidecar

pkg/apis/pipeline/v1/task_validation.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func (ts *TaskSpec) Validate(ctx context.Context) (errs *apis.FieldError) {
8787
})
8888
}
8989

90-
errs = errs.Also(validateSteps(ctx, mergedSteps).ViaField("steps"))
90+
errs = errs.Also(StepList(mergedSteps).Validate(ctx).ViaField("steps"))
9191
errs = errs.Also(SidecarList(ts.Sidecars).Validate(ctx).ViaField("sidecars"))
9292
errs = errs.Also(ValidateParameterTypes(ctx, ts.Params).ViaField("params"))
9393
errs = errs.Also(ValidateParameterVariables(ctx, ts.Steps, ts.Params))
@@ -213,11 +213,20 @@ func ValidateVolumes(volumes []corev1.Volume) (errs *apis.FieldError) {
213213
return errs
214214
}
215215

216-
func validateSteps(ctx context.Context, steps []Step) (errs *apis.FieldError) {
216+
// Validate implements apis.Validatable
217+
func (l StepList) Validate(ctx context.Context) (errs *apis.FieldError) {
217218
// Task must not have duplicate step names.
218219
names := sets.NewString()
219-
for idx, s := range steps {
220-
errs = errs.Also(validateStep(ctx, s, names).ViaIndex(idx))
220+
for idx, s := range l {
221+
// names cannot be duplicated - checking that Step names are unique
222+
if s.Name != "" {
223+
if names.Has(s.Name) {
224+
errs = errs.Also(apis.ErrMultipleOneOf("name").ViaIndex(idx))
225+
}
226+
names.Insert(s.Name)
227+
}
228+
229+
errs = errs.Also(s.Validate(ctx).ViaIndex(idx))
221230
if s.Results != nil {
222231
errs = errs.Also(ValidateStepResultsVariables(ctx, s.Results, s.Script).ViaIndex(idx))
223232
errs = errs.Also(ValidateStepResults(ctx, s.Results).ViaIndex(idx).ViaField("results"))

pkg/apis/pipeline/v1/zz_generated.deepcopy.go

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/apis/pipeline/v1beta1/task_validation.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ func errorIfStepArtifactReferencedInField(value, fieldName string) (errs *apis.F
287287
func validateStepArtifactsReference(s Step) (errs *apis.FieldError) {
288288
errs = errs.Also(errorIfStepArtifactReferencedInField(s.Name, "name"))
289289
errs = errs.Also(errorIfStepArtifactReferencedInField(s.Image, "image"))
290-
errs = errs.Also(errorIfStepArtifactReferencedInField(string(s.ImagePullPolicy), "imagePullPoliicy"))
290+
errs = errs.Also(errorIfStepArtifactReferencedInField(string(s.ImagePullPolicy), "imagePullPolicy"))
291291
errs = errs.Also(errorIfStepArtifactReferencedInField(s.WorkingDir, "workingDir"))
292292
for _, e := range s.EnvFrom {
293293
errs = errs.Also(errorIfStepArtifactReferencedInField(e.Prefix, "envFrom.prefix"))
@@ -314,7 +314,7 @@ func validateStepResultReference(s Step) (errs *apis.FieldError) {
314314
errs = errs.Also(errorIfStepResultReferenceinField(s.Name, "name"))
315315
errs = errs.Also(errorIfStepResultReferenceinField(s.Image, "image"))
316316
errs = errs.Also(errorIfStepResultReferenceinField(s.Script, "script"))
317-
errs = errs.Also(errorIfStepResultReferenceinField(string(s.ImagePullPolicy), "imagePullPoliicy"))
317+
errs = errs.Also(errorIfStepResultReferenceinField(string(s.ImagePullPolicy), "imagePullPolicy"))
318318
errs = errs.Also(errorIfStepResultReferenceinField(s.WorkingDir, "workingDir"))
319319
for _, e := range s.EnvFrom {
320320
errs = errs.Also(errorIfStepResultReferenceinField(e.Prefix, "envFrom.prefix"))

0 commit comments

Comments
 (0)