diff --git a/pkg/apis/pipeline/v1beta1/result_defaults.go b/pkg/apis/pipeline/v1beta1/result_defaults.go new file mode 100644 index 00000000000..28cdc21cfa3 --- /dev/null +++ b/pkg/apis/pipeline/v1beta1/result_defaults.go @@ -0,0 +1,24 @@ +/* +Copyright 2022 The Tekton Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import "context" + +// SetDefaults set the default type for TaskResult +func (tr *TaskResult) SetDefaults(ctx context.Context) { + if tr != nil && tr.Type == "" { + // ResultsTypeString is the default value + tr.Type = ResultsTypeString + } +} diff --git a/pkg/apis/pipeline/v1beta1/result_types.go b/pkg/apis/pipeline/v1beta1/result_types.go new file mode 100644 index 00000000000..0411aaa753a --- /dev/null +++ b/pkg/apis/pipeline/v1beta1/result_types.go @@ -0,0 +1,55 @@ +/* +Copyright 2022 The Tekton Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +// TaskResult used to describe the results of a task +type TaskResult struct { + // Name the given name + Name string `json:"name"` + + // Type is the user-specified type of the result. The possible type + // is currently "string" and will support "array" in following work. + Type ResultsType `json:"type,omitempty"` + + // Description is a human-readable description of the result + // +optional + Description string `json:"description"` +} + +// TaskRunResult used to describe the results of a task +type TaskRunResult struct { + // Name the given name + Name string `json:"name"` + + // Type is the user-specified type of the result. The possible type + // is currently "string" and will support "array" in following work. + // +optional + Type ResultsType `json:"type,omitempty"` + + // Value the given value of the result + Value string `json:"value"` +} + +// ResultsType indicates the type of a result; +// Used to distinguish between a single string and an array of strings. +// TODO: add "array" and "object" support +type ResultsType string + +// Valid ResultsType: +const ( + ResultsTypeString ResultsType = "string" +) + +// AllResultsTypes can be used for ResultsTypes validation. +var AllResultsTypes = map[ResultsType]bool{ResultsTypeString: true} diff --git a/pkg/apis/pipeline/v1beta1/result_validation.go b/pkg/apis/pipeline/v1beta1/result_validation.go new file mode 100644 index 00000000000..c8b36229572 --- /dev/null +++ b/pkg/apis/pipeline/v1beta1/result_validation.go @@ -0,0 +1,35 @@ +/* +Copyright 2022 The Tekton Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + "context" + "fmt" + + "knative.dev/pkg/apis" +) + +// Validate implements apis.Validatable +func (tr TaskResult) Validate(_ context.Context) *apis.FieldError { + if !resultNameFormatRegex.MatchString(tr.Name) { + return apis.ErrInvalidKeyName(tr.Name, "name", fmt.Sprintf("Name must consist of alphanumeric characters, '-', '_', and must start and end with an alphanumeric character (e.g. 'MyName', or 'my-name', or 'my_name', regex used for validation is '%s')", ResultNameFormat)) + } + // Validate the result type + if tr.Type != "" { + if _, ok := AllResultsTypes[tr.Type]; !ok { + return apis.ErrInvalidValue(tr.Type, "type", fmt.Sprintf("type must be string")) + } + } + return nil +}