@@ -24,8 +24,6 @@ import (
24
24
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
25
25
"github.com/tektoncd/pipeline/pkg/list"
26
26
"github.com/tektoncd/pipeline/pkg/reconciler/taskrun"
27
- "github.com/tektoncd/pipeline/pkg/substitution"
28
- "k8s.io/apimachinery/pkg/util/sets"
29
27
)
30
28
31
29
// ValidateParamTypesMatching validate that parameters in PipelineRun override corresponding parameters in Pipeline of the same type.
@@ -90,108 +88,56 @@ func ValidateObjectParamRequiredKeys(pipelineParameters []v1beta1.ParamSpec, pip
90
88
}
91
89
92
90
// ValidateParamArrayIndex validate if the array indexing param reference target is existent
93
- func ValidateParamArrayIndex (ctx context.Context , p * v1beta1.PipelineSpec , pr * v1beta1.PipelineRun ) error {
91
+ func ValidateParamArrayIndex (ctx context.Context , pipelineSpec * v1beta1.PipelineSpec , prParams [] v1beta1.Param ) error {
94
92
if ! config .CheckAlphaOrBetaAPIFields (ctx ) {
95
93
return nil
96
94
}
97
95
98
- arrayParams := extractParamIndexes (p .Params , pr .Spec .Params )
96
+ // Collect all array params lengths
97
+ // Example: {"$(params.array-params)": 2, "$(params[\"array-params\"])": 2, "$(params['array-params'])": 2}
98
+ arrayParamsLengths := taskrun .ExtractParamArrayLengths (pipelineSpec .Params , prParams )
99
99
100
- outofBoundParams := sets.String {}
101
-
102
- // collect all the references
103
- for i := range p .Tasks {
104
- findInvalidParamArrayReferences (p .Tasks [i ].Params , arrayParams , & outofBoundParams )
105
- if p .Tasks [i ].IsMatrixed () {
106
- findInvalidParamArrayReferences (p .Tasks [i ].Matrix .Params , arrayParams , & outofBoundParams )
100
+ // extract all array indexing references, for example []{"$(params.array-params[1])"}
101
+ arrayIndexParamRefs := []string {}
102
+ for i := range pipelineSpec .Tasks {
103
+ extractArrayIndexingRefsFromParams (pipelineSpec .Tasks [i ].Params , & arrayIndexParamRefs )
104
+ if pipelineSpec .Tasks [i ].IsMatrixed () {
105
+ extractArrayIndexingRefsFromParams (pipelineSpec .Tasks [i ].Matrix .Params , & arrayIndexParamRefs )
107
106
}
108
- for j := range p .Tasks [i ].Workspaces {
109
- findInvalidParamArrayReference ( p .Tasks [i ].Workspaces [j ].SubPath , arrayParams , & outofBoundParams )
107
+ for j := range pipelineSpec .Tasks [i ].Workspaces {
108
+ taskrun . ExtractArrayIndexingParamRefs ( pipelineSpec .Tasks [i ].Workspaces [j ].SubPath , & arrayIndexParamRefs )
110
109
}
111
- for _ , wes := range p .Tasks [i ].WhenExpressions {
112
- findInvalidParamArrayReference (wes .Input , arrayParams , & outofBoundParams )
110
+ for _ , wes := range pipelineSpec .Tasks [i ].WhenExpressions {
111
+ taskrun . ExtractArrayIndexingParamRefs (wes .Input , & arrayIndexParamRefs )
113
112
for _ , v := range wes .Values {
114
- findInvalidParamArrayReference (v , arrayParams , & outofBoundParams )
113
+ taskrun . ExtractArrayIndexingParamRefs (v , & arrayIndexParamRefs )
115
114
}
116
115
}
117
116
}
118
117
119
- for i := range p .Finally {
120
- findInvalidParamArrayReferences ( p .Finally [i ].Params , arrayParams , & outofBoundParams )
121
- if p .Finally [i ].IsMatrixed () {
122
- findInvalidParamArrayReferences ( p .Finally [i ].Matrix .Params , arrayParams , & outofBoundParams )
118
+ for i := range pipelineSpec .Finally {
119
+ extractArrayIndexingRefsFromParams ( pipelineSpec .Finally [i ].Params , & arrayIndexParamRefs )
120
+ if pipelineSpec .Finally [i ].IsMatrixed () {
121
+ extractArrayIndexingRefsFromParams ( pipelineSpec .Finally [i ].Matrix .Params , & arrayIndexParamRefs )
123
122
}
124
- for _ , wes := range p .Finally [i ].WhenExpressions {
123
+ for _ , wes := range pipelineSpec .Finally [i ].WhenExpressions {
125
124
for _ , v := range wes .Values {
126
- findInvalidParamArrayReference (v , arrayParams , & outofBoundParams )
125
+ taskrun . ExtractArrayIndexingParamRefs (v , & arrayIndexParamRefs )
127
126
}
128
127
}
129
128
}
130
-
131
- if outofBoundParams .Len () > 0 {
132
- return fmt .Errorf ("non-existent param references:%v" , outofBoundParams .List ())
133
- }
134
- return nil
129
+ return taskrun .ValidateOutofBoundArrayParams (arrayIndexParamRefs , arrayParamsLengths )
135
130
}
136
131
137
- func extractParamIndexes (defaults []v1beta1.ParamSpec , params []v1beta1.Param ) map [string ]int {
138
- // Collect all array params
139
- arrayParams := make (map [string ]int )
140
-
141
- patterns := []string {
142
- "$(params.%s)" ,
143
- "$(params[%q])" ,
144
- "$(params['%s'])" ,
145
- }
146
-
147
- // Collect array params lengths from defaults
148
- for _ , p := range defaults {
149
- if p .Default != nil {
150
- if p .Default .Type == v1beta1 .ParamTypeArray {
151
- for _ , pattern := range patterns {
152
- for i := 0 ; i < len (p .Default .ArrayVal ); i ++ {
153
- arrayParams [fmt .Sprintf (pattern , p .Name )] = len (p .Default .ArrayVal )
154
- }
155
- }
156
- }
157
- }
158
- }
159
-
160
- // Collect array params lengths from pipelinerun or taskrun
161
- for _ , p := range params {
162
- if p .Value .Type == v1beta1 .ParamTypeArray {
163
- for _ , pattern := range patterns {
164
- for i := 0 ; i < len (p .Value .ArrayVal ); i ++ {
165
- arrayParams [fmt .Sprintf (pattern , p .Name )] = len (p .Value .ArrayVal )
166
- }
167
- }
168
- }
169
- }
170
- return arrayParams
171
- }
172
-
173
- func findInvalidParamArrayReferences (params []v1beta1.Param , arrayParams map [string ]int , outofBoundParams * sets.String ) {
132
+ // extractArrayIndexingRefsFromParams get all array indexing references from params
133
+ func extractArrayIndexingRefsFromParams (params []v1beta1.Param , arrayIndexingParams * []string ) {
174
134
for i := range params {
175
- findInvalidParamArrayReference (params [i ].Value .StringVal , arrayParams , outofBoundParams )
135
+ taskrun . ExtractArrayIndexingParamRefs (params [i ].Value .StringVal , arrayIndexingParams )
176
136
for _ , v := range params [i ].Value .ArrayVal {
177
- findInvalidParamArrayReference (v , arrayParams , outofBoundParams )
137
+ taskrun . ExtractArrayIndexingParamRefs (v , arrayIndexingParams )
178
138
}
179
139
for _ , v := range params [i ].Value .ObjectVal {
180
- findInvalidParamArrayReference (v , arrayParams , outofBoundParams )
181
- }
182
- }
183
- }
184
-
185
- func findInvalidParamArrayReference (paramReference string , arrayParams map [string ]int , outofBoundParams * sets.String ) {
186
- list := substitution .ExtractParamsExpressions (paramReference )
187
- for _ , val := range list {
188
- indexString := substitution .ExtractIndexString (paramReference )
189
- idx , _ := substitution .ExtractIndex (indexString )
190
- v := substitution .TrimArrayIndex (val )
191
- if paramLength , ok := arrayParams [v ]; ok {
192
- if idx >= paramLength {
193
- outofBoundParams .Insert (val )
194
- }
140
+ taskrun .ExtractArrayIndexingParamRefs (v , arrayIndexingParams )
195
141
}
196
142
}
197
143
}
0 commit comments