diff --git a/internal/builder/README.md b/internal/builder/README.md deleted file mode 100644 index 703fa6db2f1..00000000000 --- a/internal/builder/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# PLEASE AVOID USING THESE PACKAGES - -See https://github.com/tektoncd/pipeline/issues/3178 for more information - -Instead of using these packages to define a Pipeline: - -```go -import tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" - -p := tb.Pipeline("my-pipeline", tb.PipelineNamespace("my-namespace"), tb.PipelineSpec( - tb.PipelineDescription("Example Pipeline"), - tb.PipelineParamSpec("first-param", v1beta1.ParamTypeString, tb.ParamSpecDefault("default-value"), tb.ParamSpecDescription("default description")), - tb.PipelineTask("my-task", "task-name", - tb.PipelineTaskParam("stringparam", "value"), - ), -)) -``` - -Just use the Go structs directly: - -```go -import ( - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" -) - -p := &v1beta1.Pipeline{ - ObjectMeta: metav1.ObjectMeta{ - Name: "my-pipeline", - Namespace: "my-namespace", - }, - Spec: v1beta1.PipelineSpec{ - Description: "Test Pipeline", - Params: []v1beta1.ParamSpec{{ - Name: "first-param", - Type: v1beta1.ParamTypeString, - Default: v1beta1.ArrayOrString{ - Type: v1beta1.ParamTypeString, - StringValue: "default-value", - }, - Description: "default description", - }}, - Tasks: []v1beta1.PipelineTask{{ - Name: "my-task", - TaskRef: &v1beta1.TaskRef{ - Name: "task-name", - Params: []v1beta1.Param{{ - Name: "stringparam", - Value: v1beta1.ArrayOrString{ - Type: v1beta1.ParamTypeString, - StringValue: "value", - }, - }}, - }, - }}, - }, -} -``` - -It's more typing, but it's more consistent with other Go code, all fields are -clearly named, and nobody has to write and test and maintain the wrapper -functions. diff --git a/internal/builder/v1beta1/container.go b/internal/builder/v1beta1/container.go deleted file mode 100644 index dff0ea94dd5..00000000000 --- a/internal/builder/v1beta1/container.go +++ /dev/null @@ -1,142 +0,0 @@ -/* -Copyright 2019 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 builder - -import ( - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" -) - -// ContainerOp is an operation which modifies a Container struct. -type ContainerOp func(*corev1.Container) - -// VolumeMountOp is an operation which modifies a VolumeMount struct. -type VolumeMountOp func(*corev1.VolumeMount) - -// ResourceRequirementsOp is an operation which modifies a ResourceRequirements struct. -type ResourceRequirementsOp func(*corev1.ResourceRequirements) - -// ResourceListOp is an operation which modifies a ResourceList struct. -type ResourceListOp func(corev1.ResourceList) - -// Command sets the command to the Container (step in this case). -func Command(args ...string) ContainerOp { - return func(container *corev1.Container) { - container.Command = args - } -} - -// Args sets the command arguments to the Container (step in this case). -func Args(args ...string) ContainerOp { - return func(container *corev1.Container) { - container.Args = args - } -} - -// EnvVar add an environment variable, with specified name and value, to the Container (step). -func EnvVar(name, value string) ContainerOp { - return func(c *corev1.Container) { - c.Env = append(c.Env, corev1.EnvVar{ - Name: name, - Value: value, - }) - } -} - -// WorkingDir sets the WorkingDir on the Container. -func WorkingDir(workingDir string) ContainerOp { - return func(c *corev1.Container) { - c.WorkingDir = workingDir - } -} - -// VolumeMount add a VolumeMount to the Container (step). -func VolumeMount(name, mountPath string, ops ...VolumeMountOp) ContainerOp { - return func(c *corev1.Container) { - mount := &corev1.VolumeMount{ - Name: name, - MountPath: mountPath, - } - for _, op := range ops { - op(mount) - } - c.VolumeMounts = append(c.VolumeMounts, *mount) - } -} - -var VolumeMountRO = func(vm *corev1.VolumeMount) { vm.ReadOnly = true } - -// Resources adds ResourceRequirements to the Container (step). -func Resources(ops ...ResourceRequirementsOp) ContainerOp { - return func(c *corev1.Container) { - rr := &corev1.ResourceRequirements{} - for _, op := range ops { - op(rr) - } - c.Resources = *rr - } -} - -// Limits adds Limits to the ResourceRequirements. -func Limits(ops ...ResourceListOp) ResourceRequirementsOp { - return func(rr *corev1.ResourceRequirements) { - limits := corev1.ResourceList{} - for _, op := range ops { - op(limits) - } - rr.Limits = limits - } -} - -// Requests adds Requests to the ResourceRequirements. -func Requests(ops ...ResourceListOp) ResourceRequirementsOp { - return func(rr *corev1.ResourceRequirements) { - requests := corev1.ResourceList{} - for _, op := range ops { - op(requests) - } - rr.Requests = requests - } -} - -// CPU sets the CPU resource on the ResourceList. -func CPU(val string) ResourceListOp { - return func(r corev1.ResourceList) { - r[corev1.ResourceCPU] = resource.MustParse(val) - } -} - -// Memory sets the memory resource on the ResourceList. -func Memory(val string) ResourceListOp { - return func(r corev1.ResourceList) { - r[corev1.ResourceMemory] = resource.MustParse(val) - } -} - -// EphemeralStorage sets the ephemeral storage resource on the ResourceList. -func EphemeralStorage(val string) ResourceListOp { - return func(r corev1.ResourceList) { - r[corev1.ResourceEphemeralStorage] = resource.MustParse(val) - } -} - -// TerminationMessagePath sets the termination message path. -func TerminationMessagePath(terminationMessagePath string) ContainerOp { - return func(c *corev1.Container) { - c.TerminationMessagePath = terminationMessagePath - } -} diff --git a/internal/builder/v1beta1/doc.go b/internal/builder/v1beta1/doc.go deleted file mode 100644 index 59e2ba93b80..00000000000 --- a/internal/builder/v1beta1/doc.go +++ /dev/null @@ -1,27 +0,0 @@ -/* -Copyright 2019 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 builder holds Builder functions that can be used to create -struct in tests with less noise. - -By convention, this package is import with the "tb" as alias. The -examples make that assumption. - -Deprecated: This package is deprecated. See -https://github.com/tektoncd/pipeline/issues/3178 for more information. -*/ -package builder diff --git a/internal/builder/v1beta1/examples_test.go b/internal/builder/v1beta1/examples_test.go deleted file mode 100644 index 7dc9cb8d682..00000000000 --- a/internal/builder/v1beta1/examples_test.go +++ /dev/null @@ -1,153 +0,0 @@ -/* -Copyright 2019 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 builder_test - -import ( - "testing" - - "github.com/google/go-cmp/cmp" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - resource "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" -) - -// This is a "hack" to make the example "look" like tests -var t *testing.T - -func ExampleTask() { - // You can declare re-usable modifiers - myStep := tb.Step("myimage") - // … and use them in a Task definition - myTask := tb.Task("my-task", tb.TaskSpec( - tb.Step("myotherimage", tb.StepCommand("/mycmd")), - myStep, - )) - // … and another one. - myOtherTask := tb.Task("my-other-task", - tb.TaskSpec(myStep, - tb.TaskResources(tb.TaskResourcesInput("workspace", resource.PipelineResourceTypeGit)), - ), - ) - expectedTask := &v1beta1.Task{ - // […] - } - expectedOtherTask := &v1beta1.Task{ - // […] - } - // […] - if d := cmp.Diff(expectedTask, myTask); d != "" { - t.Fatalf("Task diff -want, +got: %v", d) - } - if d := cmp.Diff(expectedOtherTask, myOtherTask); d != "" { - t.Fatalf("Task diff -want, +got: %v", d) - } -} - -func ExampleClusterTask() { - myClusterTask := tb.ClusterTask("my-task", tb.ClusterTaskSpec( - tb.Step("myotherimage", tb.StepCommand("/mycmd")), - )) - expectedClusterTask := &v1beta1.Task{ - // […] - } - // […] - if d := cmp.Diff(expectedClusterTask, myClusterTask); d != "" { - t.Fatalf("ClusterTask diff -want, +got: %v", d) - } -} - -func ExampleTaskRun() { - // A simple definition, with a Task reference - myTaskRun := tb.TaskRun("my-taskrun", tb.TaskRunSpec( - tb.TaskRunTaskRef("my-task"), - )) - // … or a more complex one with inline TaskSpec - myTaskRunWithSpec := tb.TaskRun("my-taskrun-with-spec", tb.TaskRunSpec( - tb.TaskRunParam("myarg", "foo"), - tb.TaskRunResources( - tb.TaskRunResourcesInput("workspace", tb.TaskResourceBindingRef("git-resource")), - ), - tb.TaskRunTaskSpec( - tb.TaskResources(tb.TaskResourcesInput("workspace", resource.PipelineResourceTypeGit)), - tb.TaskParam("myarg", v1beta1.ParamTypeString, tb.ParamSpecDefault("mydefault")), - tb.Step("myimage", tb.StepCommand("/mycmd"), - tb.StepArgs("--my-arg=$(inputs.params.myarg)"), - ), - ), - )) - expectedTaskRun := &v1beta1.TaskRun{ - // […] - } - expectedTaskRunWithSpec := &v1beta1.TaskRun{ - // […] - } - // […] - if d := cmp.Diff(expectedTaskRun, myTaskRun); d != "" { - t.Fatalf("Task diff -want, +got: %v", d) - } - if d := cmp.Diff(expectedTaskRunWithSpec, myTaskRunWithSpec); d != "" { - t.Fatalf("Task diff -want, +got: %v", d) - } -} - -func ExamplePipeline() { - pipeline := tb.Pipeline("tomatoes", - tb.PipelineSpec(tb.PipelineTask("foo", "banana")), - ) - expectedPipeline := &v1beta1.Pipeline{ - // […] - } - // […] - if d := cmp.Diff(expectedPipeline, pipeline); d != "" { - t.Fatalf("Task diff -want, +got: %v", d) - } -} - -func ExamplePipelineRun() { - pipelineRun := tb.PipelineRun("pear", - tb.PipelineRunSpec("tomatoes", tb.PipelineRunServiceAccountName("inexistent")), - ) - expectedPipelineRun := &v1beta1.PipelineRun{ - // […] - } - // […] - if d := cmp.Diff(expectedPipelineRun, pipelineRun); d != "" { - t.Fatalf("Task diff -want, +got: %v", d) - } -} - -func ExamplePipelineResource() { - gitResource := tb.PipelineResource("git-resource", tb.PipelineResourceSpec( - v1beta1.PipelineResourceTypeGit, tb.PipelineResourceSpecParam("URL", "https://foo.git"), - )) - imageResource := tb.PipelineResource("image-resource", tb.PipelineResourceSpec( - v1beta1.PipelineResourceTypeImage, tb.PipelineResourceSpecParam("URL", "gcr.io/kristoff/sven"), - )) - expectedGitResource := resource.PipelineResource{ - // […] - } - expectedImageResource := resource.PipelineResource{ - // […] - } - // […] - if d := cmp.Diff(expectedGitResource, gitResource); d != "" { - t.Fatalf("Task diff -want, +got: %v", d) - } - if d := cmp.Diff(expectedImageResource, imageResource); d != "" { - t.Fatalf("Task diff -want, +got: %v", d) - } -} diff --git a/internal/builder/v1beta1/owner_reference.go b/internal/builder/v1beta1/owner_reference.go deleted file mode 100644 index 93b2ecc0c6b..00000000000 --- a/internal/builder/v1beta1/owner_reference.go +++ /dev/null @@ -1,41 +0,0 @@ -/* -Copyright 2019 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 builder - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// OwnerReferenceOp is an operation which modifies an OwnerReference struct. -type OwnerReferenceOp func(*metav1.OwnerReference) - -// OwnerReferenceAPIVersion sets the APIVersion to the OwnerReference. -func OwnerReferenceAPIVersion(version string) OwnerReferenceOp { - return func(o *metav1.OwnerReference) { - o.APIVersion = version - } -} - -// Controller sets the Controller to the OwnerReference.y -func Controller(o *metav1.OwnerReference) { - o.Controller = &trueB -} - -// BlockOwnerDeletion sets the BlockOwnerDeletion to the OwnerReference. -func BlockOwnerDeletion(o *metav1.OwnerReference) { - o.BlockOwnerDeletion = &trueB -} diff --git a/internal/builder/v1beta1/param.go b/internal/builder/v1beta1/param.go deleted file mode 100644 index 682792c3504..00000000000 --- a/internal/builder/v1beta1/param.go +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright 2019 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 builder - -import "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - -// ParamSpecOp is an operation which modify a ParamSpec struct. -type ParamSpecOp func(*v1beta1.ParamSpec) - -// ParamSpecDescription sets the description of a ParamSpec. -func ParamSpecDescription(desc string) ParamSpecOp { - return func(ps *v1beta1.ParamSpec) { - ps.Description = desc - } -} - -// ParamSpecDefault sets the default value of a ParamSpec. -func ParamSpecDefault(value string, additionalValues ...string) ParamSpecOp { - return func(ps *v1beta1.ParamSpec) { - ps.Default = v1beta1.NewArrayOrString(value, additionalValues...) - } -} diff --git a/internal/builder/v1beta1/pipeline.go b/internal/builder/v1beta1/pipeline.go deleted file mode 100644 index 11616049664..00000000000 --- a/internal/builder/v1beta1/pipeline.go +++ /dev/null @@ -1,683 +0,0 @@ -/* -Copyright 2019 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 builder - -import ( - "time" - - "github.com/tektoncd/pipeline/pkg/apis/config" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - resource "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/selection" - "knative.dev/pkg/apis" -) - -// PipelineOp is an operation which modify a Pipeline struct. -type PipelineOp func(*v1beta1.Pipeline) - -// PipelineSpecOp is an operation which modify a PipelineSpec struct. -type PipelineSpecOp func(*v1beta1.PipelineSpec) - -// PipelineTaskOp is an operation which modify a PipelineTask struct. -type PipelineTaskOp func(*v1beta1.PipelineTask) - -// PipelineRunOp is an operation which modify a PipelineRun struct. -type PipelineRunOp func(*v1beta1.PipelineRun) - -// PipelineRunSpecOp is an operation which modify a PipelineRunSpec struct. -type PipelineRunSpecOp func(*v1beta1.PipelineRunSpec) - -// PipelineResourceBindingOp is an operation which modify a PipelineResourceBinding struct. -type PipelineResourceBindingOp func(*v1beta1.PipelineResourceBinding) - -// PipelineTaskInputResourceOp is an operation which modifies a PipelineTaskInputResource. -type PipelineTaskInputResourceOp func(*v1beta1.PipelineTaskInputResource) - -// PipelineRunStatusOp is an operation which modifies a PipelineRunStatus -type PipelineRunStatusOp func(*v1beta1.PipelineRunStatus) - -// PipelineTaskConditionOp is an operation which modifies a PipelineTaskCondition -type PipelineTaskConditionOp func(condition *v1beta1.PipelineTaskCondition) - -// Pipeline creates a Pipeline with default values. -// Any number of Pipeline modifier can be passed to transform it. -func Pipeline(name string, ops ...PipelineOp) *v1beta1.Pipeline { - p := &v1beta1.Pipeline{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - } - - for _, op := range ops { - op(p) - } - - return p -} - -// PipelineType will add a TypeMeta to the pipeline's definition. -func PipelineType(t *v1beta1.Pipeline) { - t.TypeMeta = metav1.TypeMeta{ - Kind: "Pipeline", - APIVersion: "tekton.dev/v1beta1", - } -} - -// PipelineNamespace sets the namespace on the Pipeline -func PipelineNamespace(namespace string) PipelineOp { - return func(t *v1beta1.Pipeline) { - t.ObjectMeta.Namespace = namespace - } -} - -// PipelineSpec sets the PipelineSpec to the Pipeline. -// Any number of PipelineSpec modifier can be passed to transform it. -func PipelineSpec(ops ...PipelineSpecOp) PipelineOp { - return func(p *v1beta1.Pipeline) { - ps := &p.Spec - - for _, op := range ops { - op(ps) - } - - p.Spec = *ps - } -} - -// PipelineCreationTimestamp sets the creation time of the pipeline -func PipelineCreationTimestamp(t time.Time) PipelineOp { - return func(p *v1beta1.Pipeline) { - p.CreationTimestamp = metav1.Time{Time: t} - } -} - -// PipelineDescription sets the description of the pipeline -func PipelineDescription(desc string) PipelineSpecOp { - return func(ps *v1beta1.PipelineSpec) { - ps.Description = desc - } -} - -// PipelineRunCancelled sets the status to Cancelled in the PipelineRunSpec. -func PipelineRunCancelled(spec *v1beta1.PipelineRunSpec) { - spec.Status = v1beta1.PipelineRunSpecStatusCancelled -} - -// PipelineRunCancelledDeprecated sets the status to PipelineRunCancelled in the PipelineRunSpec. -func PipelineRunCancelledDeprecated(spec *v1beta1.PipelineRunSpec) { - spec.Status = v1beta1.PipelineRunSpecStatusCancelledDeprecated -} - -// PipelineRunCancelledRunFinally sets the status to cancel and run finally in the PipelineRunSpec. -func PipelineRunCancelledRunFinally(spec *v1beta1.PipelineRunSpec) { - spec.Status = v1beta1.PipelineRunSpecStatusCancelledRunFinally -} - -// PipelineRunStoppedRunFinally sets the status to stop and run finally in the PipelineRunSpec. -func PipelineRunStoppedRunFinally(spec *v1beta1.PipelineRunSpec) { - spec.Status = v1beta1.PipelineRunSpecStatusStoppedRunFinally -} - -// PipelineRunPending sets the status to pending in the PipelineRunSpec. -func PipelineRunPending(spec *v1beta1.PipelineRunSpec) { - spec.Status = v1beta1.PipelineRunSpecStatusPending -} - -// PipelineDeclaredResource adds a resource declaration to the Pipeline Spec, -// with the specified name and type. -func PipelineDeclaredResource(name string, t v1beta1.PipelineResourceType) PipelineSpecOp { - return func(ps *v1beta1.PipelineSpec) { - r := v1beta1.PipelineDeclaredResource{ - Name: name, - Type: t, - } - ps.Resources = append(ps.Resources, r) - } -} - -// PipelineParamSpec adds a param, with specified name and type, to the PipelineSpec. -// Any number of PipelineParamSpec modifiers can be passed to transform it. -func PipelineParamSpec(name string, pt v1beta1.ParamType, ops ...ParamSpecOp) PipelineSpecOp { - return func(ps *v1beta1.PipelineSpec) { - pp := &v1beta1.ParamSpec{Name: name, Type: pt} - for _, op := range ops { - op(pp) - } - ps.Params = append(ps.Params, *pp) - } -} - -// PipelineTask adds a PipelineTask, with specified name and task name, to the PipelineSpec. -// Any number of PipelineTask modifier can be passed to transform it. -func PipelineTask(name, taskName string, ops ...PipelineTaskOp) PipelineSpecOp { - return func(ps *v1beta1.PipelineSpec) { - pTask := &v1beta1.PipelineTask{ - Name: name, - } - if taskName != "" { - pTask.TaskRef = &v1beta1.TaskRef{ - Name: taskName, - } - } - for _, op := range ops { - op(pTask) - } - ps.Tasks = append(ps.Tasks, *pTask) - } -} - -// FinalTask adds a final PipelineTask, with specified name and task name, to the PipelineSpec. -// Any number of PipelineTask modifier can be passed to transform it. -func FinalPipelineTask(name, taskName string, ops ...PipelineTaskOp) PipelineSpecOp { - return func(ps *v1beta1.PipelineSpec) { - pTask := &v1beta1.PipelineTask{ - Name: name, - } - if taskName != "" { - pTask.TaskRef = &v1beta1.TaskRef{ - Name: taskName, - } - } - for _, op := range ops { - op(pTask) - } - ps.Finally = append(ps.Finally, *pTask) - } -} - -// PipelineResult adds a PipelineResult, with specified name, value and description, to the PipelineSpec. -func PipelineResult(name, value, description string, ops ...PipelineOp) PipelineSpecOp { - return func(ps *v1beta1.PipelineSpec) { - pResult := &v1beta1.PipelineResult{ - Name: name, - Value: value, - Description: description, - } - ps.Results = append(ps.Results, *pResult) - } -} - -// PipelineRunResult adds a PipelineResultStatus, with specified name, value and description, to the PipelineRunStatusSpec. -func PipelineRunResult(name, value string) PipelineRunStatusOp { - return func(s *v1beta1.PipelineRunStatus) { - pResult := &v1beta1.PipelineRunResult{ - Name: name, - Value: value, - } - s.PipelineResults = append(s.PipelineResults, *pResult) - } -} - -// PipelineTaskRefBundle will add the specified URL as a bundle url on the task ref. -func PipelineTaskRefBundle(url string) PipelineTaskOp { - return func(pt *v1beta1.PipelineTask) { - pt.TaskRef.Bundle = url - } -} - -// PipelineTaskSpec sets the TaskSpec on a PipelineTask. -func PipelineTaskSpec(spec v1beta1.TaskSpec) PipelineTaskOp { - return func(pt *v1beta1.PipelineTask) { - if pt.TaskSpec == nil { - pt.TaskSpec = &v1beta1.EmbeddedTask{} - } - pt.TaskSpec.TaskSpec = spec - } -} - -// TaskSpecMetadata sets the Metadata on a TaskSpec within PipelineTask. -func TaskSpecMetadata(metadata v1beta1.PipelineTaskMetadata) PipelineTaskOp { - return func(pt *v1beta1.PipelineTask) { - if pt.TaskSpec == nil { - pt.TaskSpec = &v1beta1.EmbeddedTask{} - } - pt.TaskSpec.Metadata = metadata - } -} - -// Retries sets the number of retries on a PipelineTask. -func Retries(retries int) PipelineTaskOp { - return func(pt *v1beta1.PipelineTask) { - pt.Retries = retries - } -} - -// RunAfter will update the provided Pipeline Task to indicate that it -// should be run after the provided list of Pipeline Task names. -func RunAfter(tasks ...string) PipelineTaskOp { - return func(pt *v1beta1.PipelineTask) { - pt.RunAfter = tasks - } -} - -// PipelineTaskRefKind sets the TaskKind to the PipelineTaskRef. -func PipelineTaskRefKind(kind v1beta1.TaskKind) PipelineTaskOp { - return func(pt *v1beta1.PipelineTask) { - pt.TaskRef.Kind = kind - } -} - -// PipelineTaskParam adds a ResourceParam, with specified name and value, to the PipelineTask. -func PipelineTaskParam(name string, value string, additionalValues ...string) PipelineTaskOp { - return func(pt *v1beta1.PipelineTask) { - pt.Params = append(pt.Params, v1beta1.Param{ - Name: name, - Value: *v1beta1.NewArrayOrString(value, additionalValues...), - }) - } -} - -// From will update the provided PipelineTaskInputResource to indicate that it -// should come from tasks. -func From(tasks ...string) PipelineTaskInputResourceOp { - return func(r *v1beta1.PipelineTaskInputResource) { - r.From = tasks - } -} - -// PipelineTaskInputResource adds an input resource to the PipelineTask with the specified -// name, pointing at the declared resource. -// Any number of PipelineTaskInputResource modifies can be passed to transform it. -func PipelineTaskInputResource(name, resource string, ops ...PipelineTaskInputResourceOp) PipelineTaskOp { - return func(pt *v1beta1.PipelineTask) { - r := v1beta1.PipelineTaskInputResource{ - Name: name, - Resource: resource, - } - for _, op := range ops { - op(&r) - } - if pt.Resources == nil { - pt.Resources = &v1beta1.PipelineTaskResources{} - } - pt.Resources.Inputs = append(pt.Resources.Inputs, r) - } -} - -// PipelineTaskOutputResource adds an output resource to the PipelineTask with the specified -// name, pointing at the declared resource. -func PipelineTaskOutputResource(name, resource string) PipelineTaskOp { - return func(pt *v1beta1.PipelineTask) { - r := v1beta1.PipelineTaskOutputResource{ - Name: name, - Resource: resource, - } - if pt.Resources == nil { - pt.Resources = &v1beta1.PipelineTaskResources{} - } - pt.Resources.Outputs = append(pt.Resources.Outputs, r) - } -} - -// PipelineTaskCondition adds a condition to the PipelineTask with the -// specified conditionRef. Any number of PipelineTaskCondition modifiers can be passed -// to transform it -func PipelineTaskCondition(conditionRef string, ops ...PipelineTaskConditionOp) PipelineTaskOp { - return func(pt *v1beta1.PipelineTask) { - c := &v1beta1.PipelineTaskCondition{ - ConditionRef: conditionRef, - } - for _, op := range ops { - op(c) - } - pt.Conditions = append(pt.Conditions, *c) - } -} - -// PipelineTaskConditionParam adds a parameter to a PipelineTaskCondition -func PipelineTaskConditionParam(name, val string) PipelineTaskConditionOp { - return func(condition *v1beta1.PipelineTaskCondition) { - if condition.Params == nil { - condition.Params = []v1beta1.Param{} - } - condition.Params = append(condition.Params, v1beta1.Param{ - Name: name, - Value: *v1beta1.NewArrayOrString(val), - }) - } -} - -// PipelineTaskConditionResource adds a resource to a PipelineTaskCondition -func PipelineTaskConditionResource(name, resource string, from ...string) PipelineTaskConditionOp { - return func(condition *v1beta1.PipelineTaskCondition) { - if condition.Resources == nil { - condition.Resources = []v1beta1.PipelineTaskInputResource{} - } - condition.Resources = append(condition.Resources, v1beta1.PipelineTaskInputResource{ - Name: name, - Resource: resource, - From: from, - }) - } -} - -// PipelineTaskWhenExpression adds a WhenExpression with the specified input, operator and values -// which are used to determine whether the PipelineTask should be executed or skipped. -func PipelineTaskWhenExpression(input string, operator selection.Operator, values []string) PipelineTaskOp { - return func(pt *v1beta1.PipelineTask) { - pt.WhenExpressions = append(pt.WhenExpressions, v1beta1.WhenExpression{ - Input: input, - Operator: operator, - Values: values, - }) - } -} - -// PipelineTaskWorkspaceBinding adds a workspace with the specified name, workspace and subpath on a PipelineTask. -func PipelineTaskWorkspaceBinding(name, workspace, subPath string) PipelineTaskOp { - return func(pt *v1beta1.PipelineTask) { - pt.Workspaces = append(pt.Workspaces, v1beta1.WorkspacePipelineTaskBinding{ - Name: name, - Workspace: workspace, - SubPath: subPath, - }) - } -} - -// PipelineTaskTimeout sets the timeout for the PipelineTask. -func PipelineTaskTimeout(duration time.Duration) PipelineTaskOp { - return func(pt *v1beta1.PipelineTask) { - pt.Timeout = &metav1.Duration{Duration: duration} - } -} - -// PipelineRun creates a PipelineRun with default values. -// Any number of PipelineRun modifier can be passed to transform it. -func PipelineRun(name string, ops ...PipelineRunOp) *v1beta1.PipelineRun { - pr := &v1beta1.PipelineRun{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - Spec: v1beta1.PipelineRunSpec{}, - } - - for _, op := range ops { - op(pr) - } - - return pr -} - -// PipelineRunNamespace sets the namespace on a PipelineRun -func PipelineRunNamespace(namespace string) PipelineRunOp { - return func(t *v1beta1.PipelineRun) { - t.ObjectMeta.Namespace = namespace - } -} - -// PipelineRunSelfLink adds a SelfLink -func PipelineRunSelfLink(selflink string) PipelineRunOp { - return func(tr *v1beta1.PipelineRun) { - tr.ObjectMeta.SelfLink = selflink - } -} - -// PipelineRunSpec sets the PipelineRunSpec, references Pipeline with specified name, to the PipelineRun. -// Any number of PipelineRunSpec modifier can be passed to transform it. -func PipelineRunSpec(name string, ops ...PipelineRunSpecOp) PipelineRunOp { - return func(pr *v1beta1.PipelineRun) { - prs := &pr.Spec - - prs.PipelineRef = &v1beta1.PipelineRef{ - Name: name, - } - // Set a default timeout - prs.Timeout = &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute} - - for _, op := range ops { - op(prs) - } - - pr.Spec = *prs - } -} - -// PipelineRunLabel adds a label to the PipelineRun. -func PipelineRunLabel(key, value string) PipelineRunOp { - return func(pr *v1beta1.PipelineRun) { - if pr.ObjectMeta.Labels == nil { - pr.ObjectMeta.Labels = map[string]string{} - } - pr.ObjectMeta.Labels[key] = value - } -} - -// PipelineRunAnnotation adds a annotation to the PipelineRun. -func PipelineRunAnnotation(key, value string) PipelineRunOp { - return func(pr *v1beta1.PipelineRun) { - if pr.ObjectMeta.Annotations == nil { - pr.ObjectMeta.Annotations = map[string]string{} - } - pr.ObjectMeta.Annotations[key] = value - } -} - -// PipelineRunResourceBinding adds bindings from actual instances to a Pipeline's declared resources. -func PipelineRunResourceBinding(name string, ops ...PipelineResourceBindingOp) PipelineRunSpecOp { - return func(prs *v1beta1.PipelineRunSpec) { - r := &v1beta1.PipelineResourceBinding{ - Name: name, - } - for _, op := range ops { - op(r) - } - prs.Resources = append(prs.Resources, *r) - } -} - -// PipelineResourceBindingRef set the ResourceRef name to the Resource called Name. -func PipelineResourceBindingRef(name string) PipelineResourceBindingOp { - return func(b *v1beta1.PipelineResourceBinding) { - b.ResourceRef = &v1beta1.PipelineResourceRef{ - Name: name, - } - } -} - -// PipelineResourceBindingResourceSpec set the PipelineResourceResourceSpec to the PipelineResourceBinding. -func PipelineResourceBindingResourceSpec(spec *resource.PipelineResourceSpec) PipelineResourceBindingOp { - return func(b *v1beta1.PipelineResourceBinding) { - b.ResourceSpec = spec - } -} - -// PipelineRunServiceAccountName sets the service account to the PipelineRunSpec. -func PipelineRunServiceAccountName(sa string) PipelineRunSpecOp { - return func(prs *v1beta1.PipelineRunSpec) { - prs.ServiceAccountName = sa - } -} - -// PipelineRunServiceAccountNameTask configures the service account for given Task in PipelineRun. -func PipelineRunServiceAccountNameTask(taskName, sa string) PipelineRunSpecOp { - return func(prs *v1beta1.PipelineRunSpec) { - prs.ServiceAccountNames = append(prs.ServiceAccountNames, v1beta1.PipelineRunSpecServiceAccountName{ - TaskName: taskName, - ServiceAccountName: sa, - }) - } -} - -// PipelineTaskRunSpec adds customs TaskRunSpecs -func PipelineTaskRunSpecs(taskRunSpecs []v1beta1.PipelineTaskRunSpec) PipelineRunSpecOp { - return func(prs *v1beta1.PipelineRunSpec) { - prs.TaskRunSpecs = taskRunSpecs - } -} - -// PipelineRunParam add a param, with specified name and value, to the PipelineRunSpec. -func PipelineRunParam(name string, value string, additionalValues ...string) PipelineRunSpecOp { - return func(prs *v1beta1.PipelineRunSpec) { - prs.Params = append(prs.Params, v1beta1.Param{ - Name: name, - Value: *v1beta1.NewArrayOrString(value, additionalValues...), - }) - } -} - -// PipelineRunTimeout sets the timeout to the PipelineRunSpec. -func PipelineRunTimeout(duration time.Duration) PipelineRunSpecOp { - return func(prs *v1beta1.PipelineRunSpec) { - prs.Timeout = &metav1.Duration{Duration: duration} - } -} - -// PipelineRunNilTimeout sets the timeout to nil on the PipelineRunSpec -func PipelineRunNilTimeout(prs *v1beta1.PipelineRunSpec) { - prs.Timeout = nil -} - -func initTimeouts(prs *v1beta1.PipelineRunSpec) { - if prs.Timeouts == nil { - prs.Timeouts = &v1beta1.TimeoutFields{} - } -} - -// PipelineRunTasksTimeout sets the timeout to the PipelineRunSpec. -func PipelineRunTasksTimeout(duration time.Duration) PipelineRunSpecOp { - return func(prs *v1beta1.PipelineRunSpec) { - initTimeouts(prs) - prs.Timeouts.Tasks = &metav1.Duration{Duration: duration} - } -} - -// PipelineRunFinallyTimeout sets the timeout to the PipelineRunSpec. -func PipelineRunFinallyTimeout(duration time.Duration) PipelineRunSpecOp { - return func(prs *v1beta1.PipelineRunSpec) { - initTimeouts(prs) - prs.Timeouts.Finally = &metav1.Duration{Duration: duration} - } -} - -// PipelineRunPipelineTimeout sets the timeout to the PipelineRunSpec. -func PipelineRunPipelineTimeout(duration time.Duration) PipelineRunSpecOp { - return func(prs *v1beta1.PipelineRunSpec) { - initTimeouts(prs) - prs.Timeouts.Pipeline = &metav1.Duration{Duration: duration} - } -} - -// PipelineRunNodeSelector sets the Node selector to the PipelineRunSpec. -func PipelineRunNodeSelector(values map[string]string) PipelineRunSpecOp { - return func(prs *v1beta1.PipelineRunSpec) { - if prs.PodTemplate == nil { - prs.PodTemplate = &pod.Template{} - } - prs.PodTemplate.NodeSelector = values - } -} - -// PipelineRunPipelineSpec adds a PipelineSpec to the PipelineRunSpec. -// Any number of PipelineSpec modifiers can be passed to transform it. -func PipelineRunPipelineSpec(ops ...PipelineSpecOp) PipelineRunSpecOp { - return func(prs *v1beta1.PipelineRunSpec) { - ps := &v1beta1.PipelineSpec{} - prs.PipelineRef = nil - for _, op := range ops { - op(ps) - } - prs.PipelineSpec = ps - } -} - -// PipelineRunPipelineRefBundle will specify the given URL as the bundle url in the pipeline ref. -func PipelineRunPipelineRefBundle(url string) PipelineRunSpecOp { - return func(prs *v1beta1.PipelineRunSpec) { - prs.PipelineRef.Bundle = url - } -} - -// PipelineRunStatus sets the PipelineRunStatus to the PipelineRun. -// Any number of PipelineRunStatus modifier can be passed to transform it. -func PipelineRunStatus(ops ...PipelineRunStatusOp) PipelineRunOp { - return func(pr *v1beta1.PipelineRun) { - s := &v1beta1.PipelineRunStatus{} - for _, op := range ops { - op(s) - } - pr.Status = *s - } -} - -// PipelineRunStatusCondition adds a StatusCondition to the TaskRunStatus. -func PipelineRunStatusCondition(condition apis.Condition) PipelineRunStatusOp { - return func(s *v1beta1.PipelineRunStatus) { - s.Conditions = append(s.Conditions, condition) - } -} - -// PipelineRunStartTime sets the start time to the PipelineRunStatus. -func PipelineRunStartTime(startTime time.Time) PipelineRunStatusOp { - return func(s *v1beta1.PipelineRunStatus) { - s.StartTime = &metav1.Time{Time: startTime} - } -} - -// PipelineRunCompletionTime sets the completion time to the PipelineRunStatus. -func PipelineRunCompletionTime(t time.Time) PipelineRunStatusOp { - return func(s *v1beta1.PipelineRunStatus) { - s.CompletionTime = &metav1.Time{Time: t} - } -} - -// PipelineRunTaskRunsStatus sets the status of TaskRun to the PipelineRunStatus. -func PipelineRunTaskRunsStatus(taskRunName string, status *v1beta1.PipelineRunTaskRunStatus) PipelineRunStatusOp { - return func(s *v1beta1.PipelineRunStatus) { - if s.TaskRuns == nil { - s.TaskRuns = make(map[string]*v1beta1.PipelineRunTaskRunStatus) - } - s.TaskRuns[taskRunName] = status - } -} - -// PipelineWorkspaceDeclaration adds a Workspace to the workspaces listed in the pipeline spec. -func PipelineWorkspaceDeclaration(names ...string) PipelineSpecOp { - return func(spec *v1beta1.PipelineSpec) { - for _, name := range names { - spec.Workspaces = append(spec.Workspaces, v1beta1.PipelineWorkspaceDeclaration{Name: name}) - } - } -} - -// PipelineRunWorkspaceBindingEmptyDir adds an EmptyDir Workspace to the workspaces of a pipelinerun spec. -func PipelineRunWorkspaceBindingEmptyDir(name string) PipelineRunSpecOp { - return func(spec *v1beta1.PipelineRunSpec) { - spec.Workspaces = append(spec.Workspaces, v1beta1.WorkspaceBinding{ - Name: name, - EmptyDir: &corev1.EmptyDirVolumeSource{}, - }) - } -} - -// PipelineRunWorkspaceBindingVolumeClaimTemplate adds an VolumeClaimTemplate Workspace to the workspaces of a pipelineRun spec. -func PipelineRunWorkspaceBindingVolumeClaimTemplate(name string, claimName string, subPath string) PipelineRunSpecOp { - return func(spec *v1beta1.PipelineRunSpec) { - spec.Workspaces = append(spec.Workspaces, v1beta1.WorkspaceBinding{ - Name: name, - SubPath: subPath, - VolumeClaimTemplate: &corev1.PersistentVolumeClaim{ - ObjectMeta: metav1.ObjectMeta{ - Name: claimName, - }, - Spec: corev1.PersistentVolumeClaimSpec{}, - }, - }) - } -} diff --git a/internal/builder/v1beta1/pipeline_test.go b/internal/builder/v1beta1/pipeline_test.go deleted file mode 100644 index 21d0c861c69..00000000000 --- a/internal/builder/v1beta1/pipeline_test.go +++ /dev/null @@ -1,542 +0,0 @@ -/* -Copyright 2019 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 builder_test - -import ( - "testing" - "time" - - "github.com/google/go-cmp/cmp" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - resource "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/selection" - "knative.dev/pkg/apis" - duckv1beta1 "knative.dev/pkg/apis/duck/v1beta1" -) - -func TestPipeline(t *testing.T) { - creationTime := time.Now() - - pipeline := tb.Pipeline("tomatoes", tb.PipelineType, tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineDeclaredResource("my-only-git-resource", "git"), - tb.PipelineDeclaredResource("my-only-image-resource", "image"), - tb.PipelineDescription("Test Pipeline"), - tb.PipelineParamSpec("first-param", v1beta1.ParamTypeString, tb.ParamSpecDefault("default-value"), tb.ParamSpecDescription("default description")), - tb.PipelineTask("foo", "banana", - tb.PipelineTaskParam("stringparam", "value"), - tb.PipelineTaskParam("arrayparam", "array", "value"), - tb.PipelineTaskCondition("some-condition-ref", - tb.PipelineTaskConditionParam("param-name", "param-value"), - tb.PipelineTaskConditionResource("some-resource", "my-only-git-resource", "bar", "never-gonna"), - ), - tb.PipelineTaskWorkspaceBinding("task-workspace1", "workspace1", ""), - tb.PipelineTaskRefBundle("/some/registry"), - ), - tb.PipelineTask("bar", "chocolate", - tb.PipelineTaskRefKind(v1beta1.ClusterTaskKind), - tb.PipelineTaskInputResource("some-repo", "my-only-git-resource", tb.From("foo")), - tb.PipelineTaskOutputResource("some-image", "my-only-image-resource"), - ), - tb.PipelineTask("never-gonna", "give-you-up", - tb.PipelineTaskWhenExpression("foo", selection.In, []string{"foo", "bar"}), - tb.RunAfter("foo"), - tb.PipelineTaskTimeout(5*time.Second), - ), - tb.PipelineTask("foo", "", tb.PipelineTaskSpec(getTaskSpec())), - tb.PipelineTask("task-with-taskSpec", "", - tb.TaskSpecMetadata(v1beta1.PipelineTaskMetadata{ - Labels: map[string]string{"label": "labelvalue"}, - Annotations: map[string]string{"annotation": "annotationvalue"}}, - ), - tb.PipelineTaskSpec(getTaskSpec()), - ), - tb.PipelineWorkspaceDeclaration("workspace1"), - ), - tb.PipelineCreationTimestamp(creationTime), - ) - expectedPipeline := &v1beta1.Pipeline{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "tekton.dev/v1beta1", - Kind: "Pipeline", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "tomatoes", Namespace: "foo", - CreationTimestamp: metav1.Time{Time: creationTime}, - }, - Spec: v1beta1.PipelineSpec{ - Resources: []v1beta1.PipelineDeclaredResource{{ - Name: "my-only-git-resource", - Type: "git", - }, { - Name: "my-only-image-resource", - Type: "image", - }}, - Description: "Test Pipeline", - Params: []v1beta1.ParamSpec{{ - Name: "first-param", - Type: v1beta1.ParamTypeString, - Default: v1beta1.NewArrayOrString("default-value"), - Description: "default description", - }}, - Tasks: []v1beta1.PipelineTask{{ - Name: "foo", - TaskRef: &v1beta1.TaskRef{Name: "banana", Bundle: "/some/registry"}, - Params: []v1beta1.Param{{ - Name: "stringparam", - Value: *v1beta1.NewArrayOrString("value"), - }, { - Name: "arrayparam", - Value: *v1beta1.NewArrayOrString("array", "value"), - }}, - Conditions: []v1beta1.PipelineTaskCondition{{ - ConditionRef: "some-condition-ref", - Params: []v1beta1.Param{{ - Name: "param-name", - Value: v1beta1.ArrayOrString{ - Type: "string", - StringVal: "param-value", - }, - }}, - Resources: []v1beta1.PipelineTaskInputResource{{ - Name: "some-resource", - Resource: "my-only-git-resource", - From: []string{"bar", "never-gonna"}, - }}, - }}, - Workspaces: []v1beta1.WorkspacePipelineTaskBinding{{ - Name: "task-workspace1", - Workspace: "workspace1", - }}, - }, { - Name: "bar", - TaskRef: &v1beta1.TaskRef{Name: "chocolate", Kind: v1beta1.ClusterTaskKind}, - Resources: &v1beta1.PipelineTaskResources{ - Inputs: []v1beta1.PipelineTaskInputResource{{ - Name: "some-repo", - Resource: "my-only-git-resource", - From: []string{"foo"}, - }}, - Outputs: []v1beta1.PipelineTaskOutputResource{{ - Name: "some-image", - Resource: "my-only-image-resource", - }}, - }, - }, { - Name: "never-gonna", - TaskRef: &v1beta1.TaskRef{Name: "give-you-up"}, - WhenExpressions: []v1beta1.WhenExpression{{Input: "foo", Operator: selection.In, Values: []string{"foo", "bar"}}}, - RunAfter: []string{"foo"}, - Timeout: &metav1.Duration{Duration: 5 * time.Second}, - }, { - Name: "foo", - TaskSpec: &v1beta1.EmbeddedTask{ - TaskSpec: getTaskSpec()}, - }, { - Name: "task-with-taskSpec", - TaskSpec: &v1beta1.EmbeddedTask{ - Metadata: v1beta1.PipelineTaskMetadata{ - Labels: map[string]string{"label": "labelvalue"}, - Annotations: map[string]string{"annotation": "annotationvalue"}, - }, - - TaskSpec: getTaskSpec(), - }, - }}, - Workspaces: []v1beta1.PipelineWorkspaceDeclaration{{ - Name: "workspace1", - }}, - }, - } - if d := cmp.Diff(expectedPipeline, pipeline); d != "" { - t.Fatalf("Pipeline diff -want, +got: %v", d) - } -} - -func TestPipelineRun(t *testing.T) { - startTime := time.Now() - completedTime := startTime.Add(5 * time.Minute) - - pipelineRun := tb.PipelineRun("pear", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec( - "tomatoes", tb.PipelineRunServiceAccountName("sa"), - tb.PipelineRunParam("first-param-string", "first-value"), - tb.PipelineRunParam("second-param-array", "some", "array"), - tb.PipelineRunTimeout(1*time.Hour), - tb.PipelineRunPipelineTimeout(100*time.Minute), - tb.PipelineRunTasksTimeout(50*time.Minute), - tb.PipelineRunFinallyTimeout(50*time.Minute), - tb.PipelineRunResourceBinding("some-resource", tb.PipelineResourceBindingRef("my-special-resource")), - tb.PipelineRunServiceAccountNameTask("foo", "sa-2"), - tb.PipelineRunPipelineRefBundle("/some/registry"), - ), tb.PipelineRunStatus(tb.PipelineRunStatusCondition( - apis.Condition{Type: apis.ConditionSucceeded}), - tb.PipelineRunStartTime(startTime), - tb.PipelineRunCompletionTime(completedTime), - tb.PipelineRunTaskRunsStatus("trname", &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: "task-1", - }), - ), tb.PipelineRunLabel("label-key", "label-value")) - expectedPipelineRun := &v1beta1.PipelineRun{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pear", - Namespace: "foo", - Labels: map[string]string{ - "label-key": "label-value", - }, - }, - Spec: v1beta1.PipelineRunSpec{ - PipelineRef: &v1beta1.PipelineRef{Name: "tomatoes", Bundle: "/some/registry"}, - ServiceAccountName: "sa", - ServiceAccountNames: []v1beta1.PipelineRunSpecServiceAccountName{{TaskName: "foo", ServiceAccountName: "sa-2"}}, - Params: []v1beta1.Param{{ - Name: "first-param-string", - Value: *v1beta1.NewArrayOrString("first-value"), - }, { - Name: "second-param-array", - Value: *v1beta1.NewArrayOrString("some", "array"), - }}, - Timeout: &metav1.Duration{Duration: 1 * time.Hour}, - Timeouts: &v1beta1.TimeoutFields{ - Pipeline: &metav1.Duration{Duration: 100 * time.Minute}, - Tasks: &metav1.Duration{Duration: 50 * time.Minute}, - Finally: &metav1.Duration{Duration: 50 * time.Minute}, - }, - Resources: []v1beta1.PipelineResourceBinding{{ - Name: "some-resource", - ResourceRef: &v1beta1.PipelineResourceRef{ - Name: "my-special-resource", - }, - }}, - }, - Status: v1beta1.PipelineRunStatus{ - Status: duckv1beta1.Status{ - Conditions: []apis.Condition{{Type: apis.ConditionSucceeded}}, - }, - PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ - StartTime: &metav1.Time{Time: startTime}, - CompletionTime: &metav1.Time{Time: completedTime}, - TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ - "trname": {PipelineTaskName: "task-1"}, - }, - }, - }, - } - if d := cmp.Diff(expectedPipelineRun, pipelineRun); d != "" { - t.Fatalf("PipelineRun diff -want, +got: %v", d) - } -} - -func TestPipelineRunWithPodTemplate(t *testing.T) { - startTime := time.Now() - completedTime := startTime.Add(5 * time.Minute) - - pipelineRun := tb.PipelineRun("pear", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec( - "tomatoes", tb.PipelineRunServiceAccountName("sa"), - tb.PipelineRunParam("first-param-string", "first-value"), - tb.PipelineRunParam("second-param-array", "some", "array"), - tb.PipelineRunTimeout(1*time.Hour), - tb.PipelineRunPipelineTimeout(50*time.Minute), - tb.PipelineRunTasksTimeout(50*time.Minute), - tb.PipelineRunFinallyTimeout(50*time.Minute), - tb.PipelineRunResourceBinding("some-resource", tb.PipelineResourceBindingRef("my-special-resource")), - tb.PipelineRunServiceAccountNameTask("foo", "sa-2"), - tb.PipelineRunNodeSelector(map[string]string{ - "label": "value", - }), - ), tb.PipelineRunStatus(tb.PipelineRunStatusCondition( - apis.Condition{Type: apis.ConditionSucceeded}), - tb.PipelineRunStartTime(startTime), - tb.PipelineRunCompletionTime(completedTime), - tb.PipelineRunTaskRunsStatus("trname", &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: "task-1", - }), - ), tb.PipelineRunLabel("label-key", "label-value")) - expectedPipelineRun := &v1beta1.PipelineRun{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pear", - Namespace: "foo", - Labels: map[string]string{ - "label-key": "label-value", - }, - }, - Spec: v1beta1.PipelineRunSpec{ - PipelineRef: &v1beta1.PipelineRef{Name: "tomatoes"}, - ServiceAccountName: "sa", - ServiceAccountNames: []v1beta1.PipelineRunSpecServiceAccountName{{TaskName: "foo", ServiceAccountName: "sa-2"}}, - Params: []v1beta1.Param{{ - Name: "first-param-string", - Value: *v1beta1.NewArrayOrString("first-value"), - }, { - Name: "second-param-array", - Value: *v1beta1.NewArrayOrString("some", "array"), - }}, - Timeout: &metav1.Duration{Duration: 1 * time.Hour}, - Timeouts: &v1beta1.TimeoutFields{ - Pipeline: &metav1.Duration{Duration: 50 * time.Minute}, - Tasks: &metav1.Duration{Duration: 50 * time.Minute}, - Finally: &metav1.Duration{Duration: 50 * time.Minute}, - }, - Resources: []v1beta1.PipelineResourceBinding{{ - Name: "some-resource", - ResourceRef: &v1beta1.PipelineResourceRef{ - Name: "my-special-resource", - }, - }}, - PodTemplate: &pod.Template{ - NodeSelector: map[string]string{ - "label": "value", - }, - }, - }, - Status: v1beta1.PipelineRunStatus{ - Status: duckv1beta1.Status{ - Conditions: []apis.Condition{{Type: apis.ConditionSucceeded}}, - }, - PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ - StartTime: &metav1.Time{Time: startTime}, - CompletionTime: &metav1.Time{Time: completedTime}, - TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ - "trname": {PipelineTaskName: "task-1"}, - }, - }, - }, - } - if d := cmp.Diff(expectedPipelineRun, pipelineRun); d != "" { - t.Fatalf("PipelineRun diff -want, +got: %v", d) - } -} - -func TestPipelineRunWithResourceSpec(t *testing.T) { - startTime := time.Now() - completedTime := startTime.Add(5 * time.Minute) - - pipelineRun := tb.PipelineRun("pear", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec( - "tomatoes", tb.PipelineRunServiceAccountName("sa"), - tb.PipelineRunParam("first-param-string", "first-value"), - tb.PipelineRunParam("second-param-array", "some", "array"), - tb.PipelineRunTimeout(1*time.Hour), - tb.PipelineRunPipelineTimeout(50*time.Minute), - tb.PipelineRunTasksTimeout(50*time.Minute), - tb.PipelineRunFinallyTimeout(50*time.Minute), - tb.PipelineRunResourceBinding("some-resource", - tb.PipelineResourceBindingResourceSpec(&resource.PipelineResourceSpec{ - Type: v1beta1.PipelineResourceTypeGit, - Params: []resource.ResourceParam{{ - Name: "url", - Value: "git", - }}})), - tb.PipelineRunServiceAccountNameTask("foo", "sa-2"), - ), tb.PipelineRunStatus(tb.PipelineRunStatusCondition( - apis.Condition{Type: apis.ConditionSucceeded}), - tb.PipelineRunStartTime(startTime), - tb.PipelineRunCompletionTime(completedTime), - tb.PipelineRunTaskRunsStatus("trname", &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: "task-1", - }), - ), tb.PipelineRunLabel("label-key", "label-value")) - expectedPipelineRun := &v1beta1.PipelineRun{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pear", - Namespace: "foo", - Labels: map[string]string{ - "label-key": "label-value", - }, - }, - Spec: v1beta1.PipelineRunSpec{ - PipelineRef: &v1beta1.PipelineRef{Name: "tomatoes"}, - ServiceAccountName: "sa", - ServiceAccountNames: []v1beta1.PipelineRunSpecServiceAccountName{{TaskName: "foo", ServiceAccountName: "sa-2"}}, - Params: []v1beta1.Param{{ - Name: "first-param-string", - Value: *v1beta1.NewArrayOrString("first-value"), - }, { - Name: "second-param-array", - Value: *v1beta1.NewArrayOrString("some", "array"), - }}, - Timeout: &metav1.Duration{Duration: 1 * time.Hour}, - Timeouts: &v1beta1.TimeoutFields{ - Pipeline: &metav1.Duration{Duration: 50 * time.Minute}, - Tasks: &metav1.Duration{Duration: 50 * time.Minute}, - Finally: &metav1.Duration{Duration: 50 * time.Minute}, - }, - Resources: []v1beta1.PipelineResourceBinding{{ - Name: "some-resource", - ResourceSpec: &resource.PipelineResourceSpec{ - Type: v1beta1.PipelineResourceType("git"), - Params: []resource.ResourceParam{{ - Name: "url", - Value: "git", - }}, - SecretParams: nil, - }, - }}, - }, - Status: v1beta1.PipelineRunStatus{ - Status: duckv1beta1.Status{ - Conditions: []apis.Condition{{Type: apis.ConditionSucceeded}}, - }, - PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ - StartTime: &metav1.Time{Time: startTime}, - CompletionTime: &metav1.Time{Time: completedTime}, - TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ - "trname": {PipelineTaskName: "task-1"}, - }, - }, - }, - } - if d := cmp.Diff(expectedPipelineRun, pipelineRun); d != "" { - t.Fatalf("PipelineRun diff -want, +got: %v", d) - } -} - -func TestPipelineRunWithPipelineSpec(t *testing.T) { - pipelineRun := tb.PipelineRun("pear", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("", tb.PipelineRunPipelineSpec( - tb.PipelineTask("a-task", "some-task")), - tb.PipelineRunServiceAccountName("sa"), - )) - - expectedPipelineRun := &v1beta1.PipelineRun{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pear", - Namespace: "foo", - }, - Spec: v1beta1.PipelineRunSpec{ - PipelineRef: nil, - PipelineSpec: &v1beta1.PipelineSpec{ - Tasks: []v1beta1.PipelineTask{{ - Name: "a-task", - TaskRef: &v1beta1.TaskRef{Name: "some-task"}, - }}, - }, - ServiceAccountName: "sa", - Timeout: &metav1.Duration{Duration: 1 * time.Hour}, - }, - } - - if diff := cmp.Diff(expectedPipelineRun, pipelineRun); diff != "" { - t.Fatalf("PipelineRun diff -want, +got: %s", diff) - } -} - -func TestPipelineRunWithFinalTask(t *testing.T) { - pipelineRun := tb.PipelineRun("pear", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("", tb.PipelineRunPipelineSpec( - tb.PipelineTask("dag-task", "some-task"), - tb.FinalPipelineTask("final-task", "some-task")), - tb.PipelineRunServiceAccountName("sa"), - )) - - expectedPipelineRun := &v1beta1.PipelineRun{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pear", - Namespace: "foo", - }, - Spec: v1beta1.PipelineRunSpec{ - PipelineRef: nil, - PipelineSpec: &v1beta1.PipelineSpec{ - Tasks: []v1beta1.PipelineTask{{ - Name: "dag-task", - TaskRef: &v1beta1.TaskRef{Name: "some-task"}, - }}, - Finally: []v1beta1.PipelineTask{{ - Name: "final-task", - TaskRef: &v1beta1.TaskRef{Name: "some-task"}, - }}, - }, - ServiceAccountName: "sa", - Timeout: &metav1.Duration{Duration: 1 * time.Hour}, - }, - } - - if diff := cmp.Diff(expectedPipelineRun, pipelineRun); diff != "" { - t.Fatalf("PipelineRun diff -want, +got: %s", diff) - } -} - -func TestPipelineRunCancelled(t *testing.T) { - pipelineRun := tb.PipelineRun("pear", tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("pears", tb.PipelineRunCancelled)) - - expectedPipelineRun := &v1beta1.PipelineRun{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pear", - Namespace: "foo", - }, - Spec: v1beta1.PipelineRunSpec{ - PipelineRef: &v1beta1.PipelineRef{Name: "pears"}, - Status: v1beta1.PipelineRunSpecStatusCancelled, - Timeout: &metav1.Duration{Duration: 1 * time.Hour}, - }, - } - - if diff := cmp.Diff(expectedPipelineRun, pipelineRun); diff != "" { - t.Fatalf("PipelineRun diff -want, +got: %s", diff) - } -} - -func TestPipelineRunCancelledRunFinally(t *testing.T) { - pipelineRun := tb.PipelineRun("pear", tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("pears", tb.PipelineRunCancelledRunFinally)) - - expectedPipelineRun := &v1beta1.PipelineRun{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pear", - Namespace: "foo", - }, - Spec: v1beta1.PipelineRunSpec{ - PipelineRef: &v1beta1.PipelineRef{Name: "pears"}, - Status: v1beta1.PipelineRunSpecStatusCancelledRunFinally, - Timeout: &metav1.Duration{Duration: 1 * time.Hour}, - }, - } - - if diff := cmp.Diff(expectedPipelineRun, pipelineRun); diff != "" { - t.Fatalf("PipelineRun diff -want, +got: %s", diff) - } -} - -func TestPipelineRunStoppedRunFinally(t *testing.T) { - pipelineRun := tb.PipelineRun("pear", tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("pears", tb.PipelineRunStoppedRunFinally)) - - expectedPipelineRun := &v1beta1.PipelineRun{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pear", - Namespace: "foo", - }, - Spec: v1beta1.PipelineRunSpec{ - PipelineRef: &v1beta1.PipelineRef{Name: "pears"}, - Status: v1beta1.PipelineRunSpecStatusStoppedRunFinally, - Timeout: &metav1.Duration{Duration: 1 * time.Hour}, - }, - } - - if diff := cmp.Diff(expectedPipelineRun, pipelineRun); diff != "" { - t.Fatalf("PipelineRun diff -want, +got: %s", diff) - } -} - -func getTaskSpec() v1beta1.TaskSpec { - return v1beta1.TaskSpec{ - Steps: []v1beta1.Step{{Container: corev1.Container{ - Name: "step", - Image: "myimage", - }}}, - } -} diff --git a/internal/builder/v1beta1/pod.go b/internal/builder/v1beta1/pod.go deleted file mode 100644 index 4e0f9b98871..00000000000 --- a/internal/builder/v1beta1/pod.go +++ /dev/null @@ -1,155 +0,0 @@ -/* -Copyright 2019 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 builder - -import ( - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// PodOp is an operation which modifies a Pod struct. -type PodOp func(*corev1.Pod) - -// PodSpecOp is an operation which modifies a PodSpec struct. -type PodSpecOp func(*corev1.PodSpec) - -// PodStatusOp is an operation which modifies a PodStatus struct. -type PodStatusOp func(status *corev1.PodStatus) - -// Pod creates a Pod with default values. -// Any number of Pod modifiers can be passed to transform it. -func Pod(name string, ops ...PodOp) *corev1.Pod { - pod := &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Annotations: map[string]string{}, - }, - } - for _, op := range ops { - op(pod) - } - return pod -} - -// PodNamespace sets the namespace on the Pod. -func PodNamespace(namespace string) PodOp { - return func(t *corev1.Pod) { - t.ObjectMeta.Namespace = namespace - } -} - -// PodAnnotation adds an annotation to the Pod. -func PodAnnotation(key, value string) PodOp { - return func(pod *corev1.Pod) { - if pod.ObjectMeta.Annotations == nil { - pod.ObjectMeta.Annotations = map[string]string{} - } - pod.ObjectMeta.Annotations[key] = value - } -} - -// PodLabel adds a label to the Pod. -func PodLabel(key, value string) PodOp { - return func(pod *corev1.Pod) { - if pod.ObjectMeta.Labels == nil { - pod.ObjectMeta.Labels = map[string]string{} - } - pod.ObjectMeta.Labels[key] = value - } -} - -// PodOwnerReference adds an OwnerReference, with specified kind and name, to the Pod. -func PodOwnerReference(kind, name string, ops ...OwnerReferenceOp) PodOp { - trueB := true - return func(pod *corev1.Pod) { - o := &metav1.OwnerReference{ - Kind: kind, - Name: name, - Controller: &trueB, - BlockOwnerDeletion: &trueB, - } - for _, op := range ops { - op(o) - } - pod.ObjectMeta.OwnerReferences = append(pod.ObjectMeta.OwnerReferences, *o) - } -} - -// PodSpec creates a PodSpec with default values. -// Any number of PodSpec modifiers can be passed to transform it. -func PodSpec(ops ...PodSpecOp) PodOp { - return func(pod *corev1.Pod) { - podSpec := &pod.Spec - for _, op := range ops { - op(podSpec) - } - pod.Spec = *podSpec - } -} - -// PodRestartPolicy sets the restart policy on the PodSpec. -func PodRestartPolicy(restartPolicy corev1.RestartPolicy) PodSpecOp { - return func(spec *corev1.PodSpec) { - spec.RestartPolicy = restartPolicy - } -} - -// PodServiceAccountName sets the service account on the PodSpec. -func PodServiceAccountName(sa string) PodSpecOp { - return func(spec *corev1.PodSpec) { - spec.ServiceAccountName = sa - } -} - -// PodContainer adds a Container, with the specified name and image, to the PodSpec. -// Any number of Container modifiers can be passed to transform it. -func PodContainer(name, image string, ops ...ContainerOp) PodSpecOp { - return func(spec *corev1.PodSpec) { - c := &corev1.Container{ - Name: name, - Image: image, - } - for _, op := range ops { - op(c) - } - spec.Containers = append(spec.Containers, *c) - } -} - -// PodInitContainer adds an InitContainer, with the specified name and image, to the PodSpec. -// Any number of Container modifiers can be passed to transform it. -func PodInitContainer(name, image string, ops ...ContainerOp) PodSpecOp { - return func(spec *corev1.PodSpec) { - c := &corev1.Container{ - Name: name, - Image: image, - Args: []string{}, - } - for _, op := range ops { - op(c) - } - spec.InitContainers = append(spec.InitContainers, *c) - } -} - -// PodVolumes sets the Volumes on the PodSpec. -func PodVolumes(volumes ...corev1.Volume) PodSpecOp { - return func(spec *corev1.PodSpec) { - spec.Volumes = volumes - } -} diff --git a/internal/builder/v1beta1/pod_test.go b/internal/builder/v1beta1/pod_test.go deleted file mode 100644 index 7098fa0cb98..00000000000 --- a/internal/builder/v1beta1/pod_test.go +++ /dev/null @@ -1,121 +0,0 @@ -/* -Copyright 2019 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 builder_test - -import ( - "testing" - - "github.com/google/go-cmp/cmp" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -func TestPod(t *testing.T) { - trueB := true - resourceQuantityCmp := cmp.Comparer(func(x, y resource.Quantity) bool { - return x.Cmp(y) == 0 - }) - volume := corev1.Volume{ - Name: "tools-volume", - VolumeSource: corev1.VolumeSource{}, - } - got := tb.Pod("foo-pod-123456", - tb.PodNamespace("foo"), - tb.PodAnnotation("annotation", "annotation-value"), - tb.PodLabel("label", "label-value"), - tb.PodOwnerReference("TaskRun", "taskrun-foo", - tb.OwnerReferenceAPIVersion("a1")), - tb.PodSpec( - tb.PodServiceAccountName("sa"), - tb.PodRestartPolicy(corev1.RestartPolicyNever), - tb.PodContainer("nop", "nop:latest"), - tb.PodInitContainer("basic", "ubuntu", - tb.Command("ls", "-l"), - tb.Args(), - tb.WorkingDir("/workspace"), - tb.EnvVar("HOME", "/tekton/home"), - tb.VolumeMount("tools-volume", "/tools"), - tb.Resources( - tb.Limits(tb.Memory("1.5Gi")), - tb.Requests( - tb.CPU("100m"), - tb.Memory("1Gi"), - tb.EphemeralStorage("500Mi"), - ), - ), - ), - tb.PodVolumes(volume), - ), - ) - want := &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: "foo", - Name: "foo-pod-123456", - Annotations: map[string]string{ - "annotation": "annotation-value", - }, - Labels: map[string]string{ - "label": "label-value", - }, - OwnerReferences: []metav1.OwnerReference{{ - Kind: "TaskRun", - Name: "taskrun-foo", - APIVersion: "a1", - Controller: &trueB, - BlockOwnerDeletion: &trueB, - }}, - }, - Spec: corev1.PodSpec{ - ServiceAccountName: "sa", - RestartPolicy: corev1.RestartPolicyNever, - Containers: []corev1.Container{{ - Name: "nop", - Image: "nop:latest", - }}, - InitContainers: []corev1.Container{{ - Name: "basic", - Image: "ubuntu", - Command: []string{"ls", "-l"}, - WorkingDir: "/workspace", - Env: []corev1.EnvVar{{ - Name: "HOME", - Value: "/tekton/home", - }}, - VolumeMounts: []corev1.VolumeMount{{ - Name: "tools-volume", - MountPath: "/tools", - }}, - Resources: corev1.ResourceRequirements{ - Limits: corev1.ResourceList{ - corev1.ResourceMemory: resource.MustParse("1.5Gi"), - }, - Requests: corev1.ResourceList{ - corev1.ResourceCPU: resource.MustParse("100m"), - corev1.ResourceMemory: resource.MustParse("1Gi"), - corev1.ResourceEphemeralStorage: resource.MustParse("500Mi"), - }, - }, - }}, - Volumes: []corev1.Volume{volume}, - }, - } - if d := cmp.Diff(want, got, resourceQuantityCmp); d != "" { - t.Fatalf("Pod diff -want, +got: %v", d) - } -} diff --git a/internal/builder/v1beta1/resource.go b/internal/builder/v1beta1/resource.go deleted file mode 100644 index 8149737109d..00000000000 --- a/internal/builder/v1beta1/resource.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright 2020 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 builder - -import ( - resource "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// PipelineResourceOp is an operation which modify a PipelineResource struct. -type PipelineResourceOp func(*resource.PipelineResource) - -// PipelineResourceSpecOp is an operation which modify a PipelineResourceSpec struct. -type PipelineResourceSpecOp func(*resource.PipelineResourceSpec) - -// PipelineResource creates a PipelineResource with default values. -// Any number of PipelineResource modifier can be passed to transform it. -func PipelineResource(name string, ops ...PipelineResourceOp) *resource.PipelineResource { - resource := &resource.PipelineResource{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - } - for _, op := range ops { - op(resource) - } - return resource -} - -// PipelineResourceNamespace sets the namespace on a PipelineResource. -func PipelineResourceNamespace(namespace string) PipelineResourceOp { - return func(t *resource.PipelineResource) { - t.ObjectMeta.Namespace = namespace - } -} - -// PipelineResourceSpec set the PipelineResourceSpec, with specified type, to the PipelineResource. -// Any number of PipelineResourceSpec modifier can be passed to transform it. -func PipelineResourceSpec(resourceType resource.PipelineResourceType, ops ...PipelineResourceSpecOp) PipelineResourceOp { - return func(r *resource.PipelineResource) { - spec := &r.Spec - spec.Type = resourceType - for _, op := range ops { - op(spec) - } - r.Spec = *spec - } -} - -// PipelineResourceDescription sets the description of the pipeline resource -func PipelineResourceDescription(desc string) PipelineResourceSpecOp { - return func(spec *resource.PipelineResourceSpec) { - spec.Description = desc - } -} - -// PipelineResourceSpecParam adds a ResourceParam, with specified name and value, to the PipelineResourceSpec. -func PipelineResourceSpecParam(name, value string) PipelineResourceSpecOp { - return func(spec *resource.PipelineResourceSpec) { - spec.Params = append(spec.Params, resource.ResourceParam{ - Name: name, - Value: value, - }) - } -} - -// PipelineResourceSpecSecretParam adds a SecretParam, with specified fieldname, secretKey and secretName, to the PipelineResourceSpec. -func PipelineResourceSpecSecretParam(fieldname, secretName, secretKey string) PipelineResourceSpecOp { - return func(spec *resource.PipelineResourceSpec) { - spec.SecretParams = append(spec.SecretParams, resource.SecretParam{ - FieldName: fieldname, - SecretKey: secretKey, - SecretName: secretName, - }) - } -} diff --git a/internal/builder/v1beta1/resource_test.go b/internal/builder/v1beta1/resource_test.go deleted file mode 100644 index 8e3273e5e03..00000000000 --- a/internal/builder/v1beta1/resource_test.go +++ /dev/null @@ -1,46 +0,0 @@ -/* -Copyright 2020 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 builder_test - -import ( - "testing" - - "github.com/google/go-cmp/cmp" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - resource "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -func TestPipelineResource(t *testing.T) { - pipelineResource := tb.PipelineResource("git-resource", tb.PipelineResourceNamespace("foo"), tb.PipelineResourceSpec( - v1beta1.PipelineResourceTypeGit, tb.PipelineResourceSpecParam("URL", "https://foo.git"), tb.PipelineResourceDescription("test description"), - )) - expectedPipelineResource := &resource.PipelineResource{ - ObjectMeta: metav1.ObjectMeta{Name: "git-resource", Namespace: "foo"}, - Spec: resource.PipelineResourceSpec{ - Description: "test description", - Type: v1beta1.PipelineResourceTypeGit, - Params: []resource.ResourceParam{{ - Name: "URL", Value: "https://foo.git", - }}, - }, - } - if d := cmp.Diff(expectedPipelineResource, pipelineResource); d != "" { - t.Fatalf("PipelineResource diff -want, +got: %v", d) - } -} diff --git a/internal/builder/v1beta1/sidecar.go b/internal/builder/v1beta1/sidecar.go deleted file mode 100644 index 9766d947dd6..00000000000 --- a/internal/builder/v1beta1/sidecar.go +++ /dev/null @@ -1,67 +0,0 @@ -/* -Copyright 2020 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 builder - -import ( - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - corev1 "k8s.io/api/core/v1" -) - -// SidecarStateName sets the name of the Sidecar for the SidecarState. -func SidecarStateName(name string) SidecarStateOp { - return func(s *v1beta1.SidecarState) { - s.Name = name - } -} - -// SidecarStateImageID sets ImageID of Sidecar for SidecarState. -func SidecarStateImageID(imageID string) SidecarStateOp { - return func(s *v1beta1.SidecarState) { - s.ImageID = imageID - } -} - -// SidecarStateContainerName sets ContainerName of Sidecar for SidecarState. -func SidecarStateContainerName(containerName string) SidecarStateOp { - return func(s *v1beta1.SidecarState) { - s.ContainerName = containerName - } -} - -// SetSidecarStateTerminated sets Terminated state of a Sidecar. -func SetSidecarStateTerminated(terminated corev1.ContainerStateTerminated) SidecarStateOp { - return func(s *v1beta1.SidecarState) { - s.ContainerState = corev1.ContainerState{ - Terminated: &terminated, - } - } -} - -// SetSidecarStateRunning sets Running state of a Sidecar. -func SetSidecarStateRunning(running corev1.ContainerStateRunning) SidecarStateOp { - return func(s *v1beta1.SidecarState) { - s.ContainerState = corev1.ContainerState{ - Running: &running, - } - } -} - -// SetSidecarStateWaiting sets Waiting state of a Sidecar. -func SetSidecarStateWaiting(waiting corev1.ContainerStateWaiting) SidecarStateOp { - return func(s *v1beta1.SidecarState) { - s.ContainerState = corev1.ContainerState{ - Waiting: &waiting, - } - } -} diff --git a/internal/builder/v1beta1/step.go b/internal/builder/v1beta1/step.go deleted file mode 100644 index 01ec2805d9c..00000000000 --- a/internal/builder/v1beta1/step.go +++ /dev/null @@ -1,95 +0,0 @@ -/* -Copyright 2019 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 builder - -import ( - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - corev1 "k8s.io/api/core/v1" -) - -// StepOp is an operation which modifies a Container struct. -type StepOp func(*v1beta1.Step) - -// StepName sets the name of the step. -func StepName(name string) StepOp { - return func(step *v1beta1.Step) { - step.Name = name - } -} - -// StepCommand sets the command to the Container (step in this case). -func StepCommand(args ...string) StepOp { - return func(step *v1beta1.Step) { - step.Command = args - } -} - -// StepSecurityContext sets the SecurityContext to the Step. -func StepSecurityContext(context *corev1.SecurityContext) StepOp { - return func(step *v1beta1.Step) { - step.SecurityContext = context - } -} - -// StepArgs sets the command arguments to the Container (step in this case). -func StepArgs(args ...string) StepOp { - return func(step *v1beta1.Step) { - step.Args = args - } -} - -// StepEnvVar add an environment variable, with specified name and value, to the Container (step). -func StepEnvVar(name, value string) StepOp { - return func(step *v1beta1.Step) { - step.Env = append(step.Env, corev1.EnvVar{ - Name: name, - Value: value, - }) - } -} - -// StepWorkingDir sets the WorkingDir on the Container. -func StepWorkingDir(workingDir string) StepOp { - return func(step *v1beta1.Step) { - step.WorkingDir = workingDir - } -} - -// StepVolumeMount add a VolumeMount to the Container (step). -func StepVolumeMount(name, mountPath string, ops ...VolumeMountOp) StepOp { - return func(step *v1beta1.Step) { - mount := &corev1.VolumeMount{ - Name: name, - MountPath: mountPath, - } - for _, op := range ops { - op(mount) - } - step.VolumeMounts = append(step.VolumeMounts, *mount) - } -} - -// StepScript sets the script to the Step. -func StepScript(script string) StepOp { - return func(step *v1beta1.Step) { - step.Script = script - } -} - -// StepOnError sets the onError of a step -func StepOnError(e string) StepOp { - return func(step *v1beta1.Step) { - step.OnError = e - } -} diff --git a/internal/builder/v1beta1/task.go b/internal/builder/v1beta1/task.go deleted file mode 100644 index 60e8ca4cdb8..00000000000 --- a/internal/builder/v1beta1/task.go +++ /dev/null @@ -1,763 +0,0 @@ -/* -Copyright 2019 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 builder - -import ( - "time" - - "github.com/tektoncd/pipeline/pkg/apis/config" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - resource "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "knative.dev/pkg/apis" -) - -// TaskOp is an operation which modify a Task struct. -type TaskOp func(*v1beta1.Task) - -// ClusterTaskOp is an operation which modify a ClusterTask struct. -type ClusterTaskOp func(*v1beta1.ClusterTask) - -// TaskSpecOp is an operation which modify a TaskSpec struct. -type TaskSpecOp func(*v1beta1.TaskSpec) - -// TaskResourcesOp is an operation which modify a TaskResources struct. -type TaskResourcesOp func(*v1beta1.TaskResources) - -// TaskRunOp is an operation which modify a TaskRun struct. -type TaskRunOp func(*v1beta1.TaskRun) - -// TaskRunSpecOp is an operation which modify a TaskRunSpec struct. -type TaskRunSpecOp func(*v1beta1.TaskRunSpec) - -// TaskRunResourcesOp is an operation which modify a TaskRunResources struct. -type TaskRunResourcesOp func(*v1beta1.TaskRunResources) - -// TaskResourceOp is an operation which modify a TaskResource struct. -type TaskResourceOp func(*v1beta1.TaskResource) - -// TaskResourceBindingOp is an operation which modify a TaskResourceBinding struct. -type TaskResourceBindingOp func(*v1beta1.TaskResourceBinding) - -// TaskRunStatusOp is an operation which modify a TaskRunStatus struct. -type TaskRunStatusOp func(*v1beta1.TaskRunStatus) - -// TaskRefOp is an operation which modify a TaskRef struct. -type TaskRefOp func(*v1beta1.TaskRef) - -// TaskResultOp is an operation which modifies there -type TaskResultOp func(result *v1beta1.TaskResult) - -// StepStateOp is an operation which modifies a StepState struct. -type StepStateOp func(*v1beta1.StepState) - -// SidecarStateOp is an operation which modifies a SidecarState struct. -type SidecarStateOp func(*v1beta1.SidecarState) - -// VolumeOp is an operation which modify a Volume struct. -type VolumeOp func(*corev1.Volume) - -var ( - trueB = true -) - -// Task creates a Task with default values. -// Any number of Task modifier can be passed to transform it. -func Task(name string, ops ...TaskOp) *v1beta1.Task { - t := &v1beta1.Task{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - } - - for _, op := range ops { - op(t) - } - - return t -} - -// TaskType sets the TypeMeta on the Task which is useful for making it serializable/deserializable. -func TaskType(t *v1beta1.Task) { - t.TypeMeta = metav1.TypeMeta{ - APIVersion: "tekton.dev/v1beta1", - Kind: "Task", - } -} - -// ClusterTask creates a ClusterTask with default values. -// Any number of ClusterTask modifier can be passed to transform it. -func ClusterTask(name string, ops ...ClusterTaskOp) *v1beta1.ClusterTask { - t := &v1beta1.ClusterTask{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - } - - for _, op := range ops { - op(t) - } - - return t -} - -// TaskNamespace sets the namespace to the Task. -func TaskNamespace(namespace string) TaskOp { - return func(t *v1beta1.Task) { - t.ObjectMeta.Namespace = namespace - } -} - -// ClusterTaskType sets the TypeMeta on the ClusterTask which is useful for making it serializable/deserializable. -func ClusterTaskType(t *v1beta1.ClusterTask) { - t.TypeMeta = metav1.TypeMeta{ - APIVersion: "tekton.dev/v1beta1", - Kind: "ClusterTask", - } -} - -// ClusterTaskSpec sets the specified spec of the cluster task. -// Any number of TaskSpec modifier can be passed to create it. -func ClusterTaskSpec(ops ...TaskSpecOp) ClusterTaskOp { - return func(t *v1beta1.ClusterTask) { - spec := &t.Spec - for _, op := range ops { - op(spec) - } - t.Spec = *spec - } -} - -// TaskSpec sets the specified spec of the task. -// Any number of TaskSpec modifier can be passed to create/modify it. -func TaskSpec(ops ...TaskSpecOp) TaskOp { - return func(t *v1beta1.Task) { - spec := &t.Spec - for _, op := range ops { - op(spec) - } - t.Spec = *spec - } -} - -// TaskDescription sets the description of the task -func TaskDescription(desc string) TaskSpecOp { - return func(spec *v1beta1.TaskSpec) { - spec.Description = desc - } -} - -// Step adds a step with the specified name and image to the TaskSpec. -// Any number of Container modifier can be passed to transform it. -func Step(image string, ops ...StepOp) TaskSpecOp { - return func(spec *v1beta1.TaskSpec) { - if spec.Steps == nil { - spec.Steps = []v1beta1.Step{} - } - step := v1beta1.Step{Container: corev1.Container{ - Image: image, - }} - for _, op := range ops { - op(&step) - } - spec.Steps = append(spec.Steps, step) - } -} - -// Sidecar adds a sidecar container with the specified name and image to the TaskSpec. -// Any number of Container modifier can be passed to transform it. -func Sidecar(name, image string, ops ...ContainerOp) TaskSpecOp { - return func(spec *v1beta1.TaskSpec) { - c := corev1.Container{ - Name: name, - Image: image, - } - for _, op := range ops { - op(&c) - } - spec.Sidecars = append(spec.Sidecars, v1beta1.Sidecar{Container: c}) - } -} - -// TaskWorkspace adds a workspace declaration. -func TaskWorkspace(name, desc, mountPath string, readOnly bool) TaskSpecOp { - return func(spec *v1beta1.TaskSpec) { - spec.Workspaces = append(spec.Workspaces, v1beta1.WorkspaceDeclaration{ - Name: name, - Description: desc, - MountPath: mountPath, - ReadOnly: readOnly, - }) - } -} - -// TaskStepTemplate adds a base container for all steps in the task. -func TaskStepTemplate(ops ...ContainerOp) TaskSpecOp { - return func(spec *v1beta1.TaskSpec) { - base := &corev1.Container{} - for _, op := range ops { - op(base) - } - spec.StepTemplate = base - } -} - -// TaskVolume adds a volume with specified name to the TaskSpec. -// Any number of Volume modifier can be passed to transform it. -func TaskVolume(name string, ops ...VolumeOp) TaskSpecOp { - return func(spec *v1beta1.TaskSpec) { - v := &corev1.Volume{Name: name} - for _, op := range ops { - op(v) - } - spec.Volumes = append(spec.Volumes, *v) - } -} - -// VolumeSource sets the VolumeSource to the Volume. -func VolumeSource(s corev1.VolumeSource) VolumeOp { - return func(v *corev1.Volume) { - v.VolumeSource = s - } -} - -// TaskParam sets the Params to the TaskSpec -func TaskParam(name string, pt v1beta1.ParamType, ops ...ParamSpecOp) TaskSpecOp { - return func(spec *v1beta1.TaskSpec) { - ps := &v1beta1.ParamSpec{Name: name, Type: pt} - for _, op := range ops { - op(ps) - } - spec.Params = append(spec.Params, *ps) - } -} - -// TaskResources sets the Resources to the TaskSpec -func TaskResources(ops ...TaskResourcesOp) TaskSpecOp { - return func(spec *v1beta1.TaskSpec) { - r := &v1beta1.TaskResources{} - for _, op := range ops { - op(r) - } - spec.Resources = r - } -} - -// TaskResults sets the Results to the TaskSpec -func TaskResults(name, desc string) TaskSpecOp { - return func(spec *v1beta1.TaskSpec) { - r := &v1beta1.TaskResult{ - Name: name, - Description: desc, - } - spec.Results = append(spec.Results, *r) - } -} - -// TaskResourcesInput adds a TaskResource as Inputs to the TaskResources -func TaskResourcesInput(name string, resourceType resource.PipelineResourceType, ops ...TaskResourceOp) TaskResourcesOp { - return func(r *v1beta1.TaskResources) { - i := &v1beta1.TaskResource{ - ResourceDeclaration: v1beta1.ResourceDeclaration{ - Name: name, - Type: resourceType, - }, - } - for _, op := range ops { - op(i) - } - r.Inputs = append(r.Inputs, *i) - } -} - -// TaskResourcesOutput adds a TaskResource as Outputs to the TaskResources -func TaskResourcesOutput(name string, resourceType resource.PipelineResourceType, ops ...TaskResourceOp) TaskResourcesOp { - return func(r *v1beta1.TaskResources) { - o := &v1beta1.TaskResource{ - ResourceDeclaration: v1beta1.ResourceDeclaration{ - Name: name, - Type: resourceType, - }, - } - for _, op := range ops { - op(o) - } - r.Outputs = append(r.Outputs, *o) - } -} - -// ResourceOptional marks a TaskResource as optional. -func ResourceOptional(optional bool) TaskResourceOp { - return func(r *v1beta1.TaskResource) { - r.Optional = optional - } -} - -// ResourceTargetPath sets the target path to a TaskResource. -func ResourceTargetPath(path string) TaskResourceOp { - return func(r *v1beta1.TaskResource) { - r.TargetPath = path - } -} - -// TaskRun creates a TaskRun with default values. -// Any number of TaskRun modifier can be passed to transform it. -func TaskRun(name string, ops ...TaskRunOp) *v1beta1.TaskRun { - tr := &v1beta1.TaskRun{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Annotations: map[string]string{}, - }, - } - - for _, op := range ops { - op(tr) - } - - return tr -} - -// TaskRunNamespace sets the namespace for the TaskRun. -func TaskRunNamespace(namespace string) TaskRunOp { - return func(t *v1beta1.TaskRun) { - t.ObjectMeta.Namespace = namespace - } -} - -// TaskRunStatus sets the TaskRunStatus to tshe TaskRun -func TaskRunStatus(ops ...TaskRunStatusOp) TaskRunOp { - return func(tr *v1beta1.TaskRun) { - status := &tr.Status - for _, op := range ops { - op(status) - } - tr.Status = *status - } -} - -// PodName sets the Pod name to the TaskRunStatus. -func PodName(name string) TaskRunStatusOp { - return func(s *v1beta1.TaskRunStatus) { - s.PodName = name - } -} - -// StatusCondition adds a StatusCondition to the TaskRunStatus. -func StatusCondition(condition apis.Condition) TaskRunStatusOp { - return func(s *v1beta1.TaskRunStatus) { - s.Conditions = append(s.Conditions, condition) - } -} - -// TaskRunResult adds a result with the specified name and value to the TaskRunStatus. -func TaskRunResult(name, value string) TaskRunStatusOp { - return func(s *v1beta1.TaskRunStatus) { - s.TaskRunResults = append(s.TaskRunResults, v1beta1.TaskRunResult{ - Name: name, - Value: value, - }) - } -} - -// Retry adds a RetriesStatus (TaskRunStatus) to the TaskRunStatus. -func Retry(retry v1beta1.TaskRunStatus) TaskRunStatusOp { - return func(s *v1beta1.TaskRunStatus) { - s.RetriesStatus = append(s.RetriesStatus, retry) - } -} - -// StepState adds a StepState to the TaskRunStatus. -func StepState(ops ...StepStateOp) TaskRunStatusOp { - return func(s *v1beta1.TaskRunStatus) { - state := &v1beta1.StepState{} - for _, op := range ops { - op(state) - } - s.Steps = append(s.Steps, *state) - } -} - -// SidecarState adds a SidecarState to the TaskRunStatus. -func SidecarState(ops ...SidecarStateOp) TaskRunStatusOp { - return func(s *v1beta1.TaskRunStatus) { - state := &v1beta1.SidecarState{} - for _, op := range ops { - op(state) - } - s.Sidecars = append(s.Sidecars, *state) - } -} - -// TaskRunStartTime sets the start time to the TaskRunStatus. -func TaskRunStartTime(startTime time.Time) TaskRunStatusOp { - return func(s *v1beta1.TaskRunStatus) { - s.StartTime = &metav1.Time{Time: startTime} - } -} - -// TaskRunCompletionTime sets the start time to the TaskRunStatus. -func TaskRunCompletionTime(completionTime time.Time) TaskRunStatusOp { - return func(s *v1beta1.TaskRunStatus) { - s.CompletionTime = &metav1.Time{Time: completionTime} - } -} - -// TaskRunCloudEvent adds an event to the TaskRunStatus. -func TaskRunCloudEvent(target, error string, retryCount int32, condition v1beta1.CloudEventCondition) TaskRunStatusOp { - return func(s *v1beta1.TaskRunStatus) { - if len(s.CloudEvents) == 0 { - s.CloudEvents = make([]v1beta1.CloudEventDelivery, 0) - } - cloudEvent := v1beta1.CloudEventDelivery{ - Target: target, - Status: v1beta1.CloudEventDeliveryState{ - Condition: condition, - RetryCount: retryCount, - Error: error, - }, - } - s.CloudEvents = append(s.CloudEvents, cloudEvent) - } -} - -// TaskRunTimeout sets the timeout duration to the TaskRunSpec. -func TaskRunTimeout(d time.Duration) TaskRunSpecOp { - return func(spec *v1beta1.TaskRunSpec) { - spec.Timeout = &metav1.Duration{Duration: d} - } -} - -// TaskRunNilTimeout sets the timeout duration to nil on the TaskRunSpec. -func TaskRunNilTimeout(spec *v1beta1.TaskRunSpec) { - spec.Timeout = nil -} - -// TaskRunNodeSelector sets the NodeSelector to the TaskRunSpec. -func TaskRunNodeSelector(values map[string]string) TaskRunSpecOp { - return func(spec *v1beta1.TaskRunSpec) { - if spec.PodTemplate == nil { - spec.PodTemplate = &pod.Template{} - } - spec.PodTemplate.NodeSelector = values - } -} - -// StateTerminated sets Terminated to the StepState. -func StateTerminated(exitcode int) StepStateOp { - return func(s *v1beta1.StepState) { - s.ContainerState = corev1.ContainerState{ - Terminated: &corev1.ContainerStateTerminated{ExitCode: int32(exitcode)}, - } - } -} - -// SetStepStateTerminated sets Terminated state of a step. -func SetStepStateTerminated(terminated corev1.ContainerStateTerminated) StepStateOp { - return func(s *v1beta1.StepState) { - s.ContainerState = corev1.ContainerState{ - Terminated: &terminated, - } - } -} - -// SetStepStateRunning sets Running state of a step. -func SetStepStateRunning(running corev1.ContainerStateRunning) StepStateOp { - return func(s *v1beta1.StepState) { - s.ContainerState = corev1.ContainerState{ - Running: &running, - } - } -} - -// SetStepStateWaiting sets Waiting state of a step. -func SetStepStateWaiting(waiting corev1.ContainerStateWaiting) StepStateOp { - return func(s *v1beta1.StepState) { - s.ContainerState = corev1.ContainerState{ - Waiting: &waiting, - } - } -} - -// TaskRunOwnerReference sets the OwnerReference, with specified kind and name, to the TaskRun. -func TaskRunOwnerReference(kind, name string, ops ...OwnerReferenceOp) TaskRunOp { - return func(tr *v1beta1.TaskRun) { - o := &metav1.OwnerReference{ - Kind: kind, - Name: name, - } - for _, op := range ops { - op(o) - } - tr.ObjectMeta.OwnerReferences = append(tr.ObjectMeta.OwnerReferences, *o) - } -} - -// TaskRunLabels add the specified labels to the TaskRun. -func TaskRunLabels(labels map[string]string) TaskRunOp { - return func(tr *v1beta1.TaskRun) { - if tr.ObjectMeta.Labels == nil { - tr.ObjectMeta.Labels = map[string]string{} - } - for key, value := range labels { - tr.ObjectMeta.Labels[key] = value - } - } -} - -// TaskRunLabel adds a label with the specified key and value to the TaskRun. -func TaskRunLabel(key, value string) TaskRunOp { - return func(tr *v1beta1.TaskRun) { - if tr.ObjectMeta.Labels == nil { - tr.ObjectMeta.Labels = map[string]string{} - } - tr.ObjectMeta.Labels[key] = value - } -} - -// TaskRunAnnotations adds the specified annotations to the TaskRun. -func TaskRunAnnotations(annotations map[string]string) TaskRunOp { - return func(tr *v1beta1.TaskRun) { - if tr.ObjectMeta.Annotations == nil { - tr.ObjectMeta.Annotations = map[string]string{} - } - for key, value := range annotations { - tr.ObjectMeta.Annotations[key] = value - } - } -} - -// TaskRunAnnotation adds an annotation with the specified key and value to the TaskRun. -func TaskRunAnnotation(key, value string) TaskRunOp { - return func(tr *v1beta1.TaskRun) { - if tr.ObjectMeta.Annotations == nil { - tr.ObjectMeta.Annotations = map[string]string{} - } - tr.ObjectMeta.Annotations[key] = value - } -} - -// TaskRunSelfLink adds a SelfLink -func TaskRunSelfLink(selflink string) TaskRunOp { - return func(tr *v1beta1.TaskRun) { - tr.ObjectMeta.SelfLink = selflink - } -} - -// TaskRunSpec sets the specified spec of the TaskRun. -// Any number of TaskRunSpec modifier can be passed to transform it. -func TaskRunSpec(ops ...TaskRunSpecOp) TaskRunOp { - return func(tr *v1beta1.TaskRun) { - spec := &tr.Spec - spec.Resources = &v1beta1.TaskRunResources{} - // Set a default timeout - spec.Timeout = &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute} - for _, op := range ops { - op(spec) - } - tr.Spec = *spec - } -} - -// TaskRunCancelled sets the status to cancel to the TaskRunSpec. -func TaskRunCancelled(spec *v1beta1.TaskRunSpec) { - spec.Status = v1beta1.TaskRunSpecStatusCancelled -} - -// TaskRunTaskRef sets the specified Task reference to the TaskRunSpec. -// Any number of TaskRef modifier can be passed to transform it. -func TaskRunTaskRef(name string, ops ...TaskRefOp) TaskRunSpecOp { - return func(spec *v1beta1.TaskRunSpec) { - ref := &v1beta1.TaskRef{Name: name} - for _, op := range ops { - op(ref) - } - spec.TaskRef = ref - } -} - -// TaskRunSpecStatus sets the Status in the Spec, used for operations -// such as cancelling executing TaskRuns. -func TaskRunSpecStatus(status v1beta1.TaskRunSpecStatus) TaskRunSpecOp { - return func(spec *v1beta1.TaskRunSpec) { - spec.Status = status - } -} - -// TaskRefKind set the specified kind to the TaskRef. -func TaskRefKind(kind v1beta1.TaskKind) TaskRefOp { - return func(ref *v1beta1.TaskRef) { - ref.Kind = kind - } -} - -// TaskRefAPIVersion sets the specified api version to the TaskRef. -func TaskRefAPIVersion(version string) TaskRefOp { - return func(ref *v1beta1.TaskRef) { - ref.APIVersion = version - } -} - -// TaskRefBundle sets the specified ref to the TaskRef's bundle. -func TaskRefBundle(url string) TaskRefOp { - return func(ref *v1beta1.TaskRef) { - ref.Bundle = url - } -} - -// TaskRunTaskSpec sets the specified TaskRunSpec reference to the TaskRunSpec. -// Any number of TaskRunSpec modifier can be passed to transform it. -func TaskRunTaskSpec(ops ...TaskSpecOp) TaskRunSpecOp { - return func(spec *v1beta1.TaskRunSpec) { - taskSpec := &v1beta1.TaskSpec{} - for _, op := range ops { - op(taskSpec) - } - spec.TaskSpec = taskSpec - } -} - -// TaskRunServiceAccountName sets the serviceAccount to the TaskRunSpec. -func TaskRunServiceAccountName(sa string) TaskRunSpecOp { - return func(trs *v1beta1.TaskRunSpec) { - trs.ServiceAccountName = sa - } -} - -// TaskRunParam sets the Params to the TaskSpec -func TaskRunParam(name, value string, additionalValues ...string) TaskRunSpecOp { - return func(spec *v1beta1.TaskRunSpec) { - spec.Params = append(spec.Params, v1beta1.Param{ - Name: name, - Value: *v1beta1.NewArrayOrString(value, additionalValues...), - }) - } -} - -// TaskRunResources sets the TaskRunResources to the TaskRunSpec -func TaskRunResources(ops ...TaskRunResourcesOp) TaskRunSpecOp { - return func(spec *v1beta1.TaskRunSpec) { - r := &v1beta1.TaskRunResources{} - for _, op := range ops { - op(r) - } - spec.Resources = r - } -} - -// TaskRunResourcesInput adds a TaskRunResource as Inputs to the TaskRunResources -func TaskRunResourcesInput(name string, ops ...TaskResourceBindingOp) TaskRunResourcesOp { - return func(r *v1beta1.TaskRunResources) { - binding := &v1beta1.TaskResourceBinding{ - PipelineResourceBinding: v1beta1.PipelineResourceBinding{ - Name: name, - }, - } - for _, op := range ops { - op(binding) - } - r.Inputs = append(r.Inputs, *binding) - } -} - -// TaskRunResourcesOutput adds a TaskRunResource as Outputs to the TaskRunResources -func TaskRunResourcesOutput(name string, ops ...TaskResourceBindingOp) TaskRunResourcesOp { - return func(r *v1beta1.TaskRunResources) { - binding := &v1beta1.TaskResourceBinding{ - PipelineResourceBinding: v1beta1.PipelineResourceBinding{ - Name: name, - }, - } - for _, op := range ops { - op(binding) - } - r.Outputs = append(r.Outputs, *binding) - } -} - -// TaskResourceBindingRef set the PipelineResourceRef name to the TaskResourceBinding. -func TaskResourceBindingRef(name string) TaskResourceBindingOp { - return func(b *v1beta1.TaskResourceBinding) { - b.ResourceRef = &v1beta1.PipelineResourceRef{ - Name: name, - } - } -} - -// TaskResourceBindingResourceSpec set the PipelineResourceResourceSpec to the TaskResourceBinding. -func TaskResourceBindingResourceSpec(spec *resource.PipelineResourceSpec) TaskResourceBindingOp { - return func(b *v1beta1.TaskResourceBinding) { - b.ResourceSpec = spec - } -} - -// TaskResourceBindingRefAPIVersion set the PipelineResourceRef APIVersion to the TaskResourceBinding. -func TaskResourceBindingRefAPIVersion(version string) TaskResourceBindingOp { - return func(b *v1beta1.TaskResourceBinding) { - b.ResourceRef.APIVersion = version - } -} - -// TaskResourceBindingPaths add any number of path to the TaskResourceBinding. -func TaskResourceBindingPaths(paths ...string) TaskResourceBindingOp { - return func(b *v1beta1.TaskResourceBinding) { - b.Paths = paths - } -} - -// TaskRunPodTemplate add a custom PodTemplate to the TaskRun -func TaskRunPodTemplate(podTemplate *pod.Template) TaskRunSpecOp { - return func(spec *v1beta1.TaskRunSpec) { - spec.PodTemplate = podTemplate - } -} - -// TaskRunWorkspaceEmptyDir adds a workspace binding to an empty dir volume source. -func TaskRunWorkspaceEmptyDir(name, subPath string) TaskRunSpecOp { - return func(spec *v1beta1.TaskRunSpec) { - spec.Workspaces = append(spec.Workspaces, v1beta1.WorkspaceBinding{ - Name: name, - SubPath: subPath, - EmptyDir: &corev1.EmptyDirVolumeSource{}, - }) - } -} - -// TaskRunWorkspacePVC adds a workspace binding to a PVC volume source. -func TaskRunWorkspacePVC(name, subPath, claimName string) TaskRunSpecOp { - return func(spec *v1beta1.TaskRunSpec) { - spec.Workspaces = append(spec.Workspaces, v1beta1.WorkspaceBinding{ - Name: name, - SubPath: subPath, - PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ - ClaimName: claimName, - }, - }) - } -} - -// TaskRunWorkspaceVolumeClaimTemplate adds a workspace binding with a VolumeClaimTemplate volume source. -func TaskRunWorkspaceVolumeClaimTemplate(name, subPath string, volumeClaimTemplate *corev1.PersistentVolumeClaim) TaskRunSpecOp { - return func(spec *v1beta1.TaskRunSpec) { - spec.Workspaces = append(spec.Workspaces, v1beta1.WorkspaceBinding{ - Name: name, - SubPath: subPath, - VolumeClaimTemplate: volumeClaimTemplate, - }) - } -} diff --git a/internal/builder/v1beta1/task_test.go b/internal/builder/v1beta1/task_test.go deleted file mode 100644 index 9d25276f2b1..00000000000 --- a/internal/builder/v1beta1/task_test.go +++ /dev/null @@ -1,419 +0,0 @@ -/* -Copyright 2019 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 builder_test - -import ( - "testing" - "time" - - "github.com/google/go-cmp/cmp" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" - "github.com/tektoncd/pipeline/pkg/apis/config" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - resource "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "knative.dev/pkg/apis" - duckv1beta1 "knative.dev/pkg/apis/duck/v1beta1" -) - -var ( - gitResource = tb.PipelineResource("git-resource", tb.PipelineResourceNamespace("foo"), tb.PipelineResourceSpec( - resource.PipelineResourceTypeGit, tb.PipelineResourceSpecParam("URL", "https://foo.git"), - )) - anotherGitResource = tb.PipelineResource("another-git-resource", tb.PipelineResourceNamespace("foo"), tb.PipelineResourceSpec( - resource.PipelineResourceTypeGit, tb.PipelineResourceSpecParam("URL", "https://foobar.git"), - )) -) - -func TestTask(t *testing.T) { - task := tb.Task("test-task", tb.TaskType, tb.TaskSpec( - tb.TaskParam("param", v1beta1.ParamTypeString, tb.ParamSpecDescription("mydesc"), tb.ParamSpecDefault("default")), - tb.TaskParam("array-param", v1beta1.ParamTypeString, tb.ParamSpecDescription("desc"), tb.ParamSpecDefault("array", "values")), - tb.TaskResources( - tb.TaskResourcesInput("workspace", resource.PipelineResourceTypeGit, tb.ResourceTargetPath("/foo/bar")), - tb.TaskResourcesInput("optional_workspace", resource.PipelineResourceTypeGit, tb.ResourceOptional(true)), - tb.TaskResourcesOutput("myotherimage", resource.PipelineResourceTypeImage), - tb.TaskResourcesOutput("myoptionalimage", resource.PipelineResourceTypeImage, tb.ResourceOptional(true)), - ), - tb.TaskDescription("Test Task"), - tb.Step("myimage", tb.StepName("mycontainer"), tb.StepCommand("/mycmd"), tb.StepArgs( - "--my-other-arg=$(inputs.resources.workspace.url)", - )), - tb.Step("myimage2", tb.StepScript("echo foo")), - tb.TaskVolume("foo", tb.VolumeSource(corev1.VolumeSource{ - HostPath: &corev1.HostPathVolumeSource{Path: "/foo/bar"}, - })), - tb.TaskStepTemplate( - tb.EnvVar("FRUIT", "BANANA"), - ), - tb.TaskWorkspace("bread", "kind of bread", "/bread/path", false), - ), tb.TaskNamespace("foo")) - expectedTask := &v1beta1.Task{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "tekton.dev/v1beta1", - Kind: "Task", - }, - ObjectMeta: metav1.ObjectMeta{Name: "test-task", Namespace: "foo"}, - Spec: v1beta1.TaskSpec{ - Description: "Test Task", - Steps: []v1beta1.Step{{Container: corev1.Container{ - Name: "mycontainer", - Image: "myimage", - Command: []string{"/mycmd"}, - Args: []string{"--my-other-arg=$(inputs.resources.workspace.url)"}, - }}, {Script: "echo foo", Container: corev1.Container{ - Image: "myimage2", - }}}, - Volumes: []corev1.Volume{{ - Name: "foo", - VolumeSource: corev1.VolumeSource{ - HostPath: &corev1.HostPathVolumeSource{Path: "/foo/bar"}, - }, - }}, - StepTemplate: &corev1.Container{ - Env: []corev1.EnvVar{{ - Name: "FRUIT", - Value: "BANANA", - }}, - }, - Workspaces: []v1beta1.WorkspaceDeclaration{{ - Name: "bread", - Description: "kind of bread", - MountPath: "/bread/path", - ReadOnly: false, - }}, - Params: []v1beta1.ParamSpec{{ - Name: "param", - Type: v1beta1.ParamTypeString, - Description: "mydesc", - Default: v1beta1.NewArrayOrString("default"), - }, { - Name: "array-param", - Type: v1beta1.ParamTypeString, - Description: "desc", - Default: v1beta1.NewArrayOrString("array", "values"), - }}, - Resources: &v1beta1.TaskResources{ - Inputs: []v1beta1.TaskResource{{ - ResourceDeclaration: v1beta1.ResourceDeclaration{ - Name: "workspace", - Type: resource.PipelineResourceTypeGit, - TargetPath: "/foo/bar", - }}, { - ResourceDeclaration: v1beta1.ResourceDeclaration{ - Name: "optional_workspace", - Type: resource.PipelineResourceTypeGit, - TargetPath: "", - Optional: true, - }}, - }, - Outputs: []v1beta1.TaskResource{{ - ResourceDeclaration: v1beta1.ResourceDeclaration{ - Name: "myotherimage", - Type: resource.PipelineResourceTypeImage, - }}, { - ResourceDeclaration: v1beta1.ResourceDeclaration{ - Name: "myoptionalimage", - Type: resource.PipelineResourceTypeImage, - TargetPath: "", - Optional: true, - }}, - }, - }, - }, - } - if d := cmp.Diff(expectedTask, task); d != "" { - t.Fatalf("Task diff -want, +got: %v", d) - } -} - -func TestClusterTask(t *testing.T) { - task := tb.ClusterTask("test-clustertask", tb.ClusterTaskType, tb.ClusterTaskSpec( - tb.Step("myimage", tb.StepCommand("/mycmd"), tb.StepArgs( - "--my-other-arg=$(inputs.resources.workspace.url)", - )), - )) - expectedTask := &v1beta1.ClusterTask{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "tekton.dev/v1beta1", - Kind: "ClusterTask", - }, - ObjectMeta: metav1.ObjectMeta{Name: "test-clustertask"}, - Spec: v1beta1.TaskSpec{ - Steps: []v1beta1.Step{{Container: corev1.Container{ - Image: "myimage", - Command: []string{"/mycmd"}, - Args: []string{"--my-other-arg=$(inputs.resources.workspace.url)"}, - }}}, - }, - } - if d := cmp.Diff(expectedTask, task); d != "" { - t.Fatalf("Task diff -want, +got: %v", d) - } -} - -func TestTaskRunWithTaskRef(t *testing.T) { - var trueB = true - terminatedState := corev1.ContainerStateTerminated{Reason: "Completed"} - - taskRun := tb.TaskRun("test-taskrun", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test", - tb.OwnerReferenceAPIVersion("a1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabels(map[string]string{"label-2": "label-value-2", "label-3": "label-value-3"}), - tb.TaskRunLabel("label", "label-value"), - tb.TaskRunAnnotations(map[string]string{"annotation-1": "annotation-value-1", "annotation-2": "annotation-value-2"}), - tb.TaskRunSpec( - tb.TaskRunTaskRef("task-output", - tb.TaskRefKind(v1beta1.ClusterTaskKind), - tb.TaskRefAPIVersion("a1"), - tb.TaskRefBundle("some/bundle/url"), - ), - tb.TaskRunParam("iparam", "ivalue"), - tb.TaskRunParam("arrayparam", "array", "values"), - tb.TaskRunResources( - tb.TaskRunResourcesInput(gitResource.Name, - tb.TaskResourceBindingRef("my-git"), - tb.TaskResourceBindingPaths("source-folder"), - tb.TaskResourceBindingRefAPIVersion("a1"), - ), - tb.TaskRunResourcesInput(anotherGitResource.Name, - tb.TaskResourceBindingPaths("source-folder"), - tb.TaskResourceBindingResourceSpec(&resource.PipelineResourceSpec{Type: resource.PipelineResourceTypeCluster}), - ), - tb.TaskRunResourcesOutput(gitResource.Name, - tb.TaskResourceBindingRef(gitResource.Name), - tb.TaskResourceBindingPaths("output-folder"), - ), - ), - tb.TaskRunWorkspaceEmptyDir("bread", "path"), - tb.TaskRunWorkspacePVC("pizza", "", "pool-party"), - ), - tb.TaskRunStatus( - tb.PodName("my-pod-name"), - tb.StatusCondition(apis.Condition{Type: apis.ConditionSucceeded}), - tb.StepState(tb.StateTerminated(127)), - tb.SidecarState( - tb.SidecarStateName("sidecar"), - tb.SidecarStateImageID("ImageID"), - tb.SidecarStateContainerName("ContainerName"), - tb.SetSidecarStateTerminated(terminatedState), - ), - ), - ) - expectedTaskRun := &v1beta1.TaskRun{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-taskrun", Namespace: "foo", - OwnerReferences: []metav1.OwnerReference{{ - Name: "test", - Kind: "PipelineRun", - APIVersion: "a1", - Controller: &trueB, - BlockOwnerDeletion: &trueB, - }}, - Labels: map[string]string{ - "label": "label-value", - "label-2": "label-value-2", - "label-3": "label-value-3", - }, - Annotations: map[string]string{ - "annotation-1": "annotation-value-1", - "annotation-2": "annotation-value-2", - }, - }, - Spec: v1beta1.TaskRunSpec{ - Params: []v1beta1.Param{{ - Name: "iparam", - Value: *v1beta1.NewArrayOrString("ivalue"), - }, { - Name: "arrayparam", - Value: *v1beta1.NewArrayOrString("array", "values"), - }}, - Resources: &v1beta1.TaskRunResources{ - Inputs: []v1beta1.TaskResourceBinding{{ - PipelineResourceBinding: v1beta1.PipelineResourceBinding{ - Name: "git-resource", - ResourceRef: &v1beta1.PipelineResourceRef{ - Name: "my-git", - APIVersion: "a1", - }, - }, - Paths: []string{"source-folder"}, - }, { - PipelineResourceBinding: v1beta1.PipelineResourceBinding{ - Name: "another-git-resource", - ResourceSpec: &resource.PipelineResourceSpec{Type: resource.PipelineResourceType("cluster")}, - }, - Paths: []string{"source-folder"}, - }}, - Outputs: []v1beta1.TaskResourceBinding{{ - PipelineResourceBinding: v1beta1.PipelineResourceBinding{ - Name: "git-resource", - ResourceRef: &v1beta1.PipelineResourceRef{ - Name: "git-resource", - }, - }, - Paths: []string{"output-folder"}, - }}, - }, - Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, - TaskRef: &v1beta1.TaskRef{ - Name: "task-output", - Kind: v1beta1.ClusterTaskKind, - APIVersion: "a1", - Bundle: "some/bundle/url", - }, - Workspaces: []v1beta1.WorkspaceBinding{{ - Name: "bread", - SubPath: "path", - EmptyDir: &corev1.EmptyDirVolumeSource{}, - }, { - Name: "pizza", - SubPath: "", - PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ - ClaimName: "pool-party", - }, - }}, - }, - Status: v1beta1.TaskRunStatus{ - Status: duckv1beta1.Status{ - Conditions: []apis.Condition{{Type: apis.ConditionSucceeded}}, - }, - TaskRunStatusFields: v1beta1.TaskRunStatusFields{ - PodName: "my-pod-name", - Sidecars: []v1beta1.SidecarState{{ - Name: "sidecar", - ImageID: "ImageID", - ContainerName: "ContainerName", - ContainerState: corev1.ContainerState{ - Terminated: &corev1.ContainerStateTerminated{ - Reason: "Completed", - }, - }, - }}, - Steps: []v1beta1.StepState{{ContainerState: corev1.ContainerState{ - Terminated: &corev1.ContainerStateTerminated{ExitCode: 127}, - }}}, - }, - }, - } - if d := cmp.Diff(expectedTaskRun, taskRun); d != "" { - t.Fatalf("TaskRun diff -want, +got: %v", d) - } -} - -func TestTaskRunWithTaskSpec(t *testing.T) { - taskRun := tb.TaskRun("test-taskrun", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec( - tb.TaskRunTaskSpec( - tb.Step("image", tb.StepCommand("/mycmd")), - tb.TaskResources( - tb.TaskResourcesInput("workspace", resource.PipelineResourceTypeGit, tb.ResourceOptional(true)), - ), - ), - tb.TaskRunServiceAccountName("sa"), - tb.TaskRunTimeout(2*time.Minute), - tb.TaskRunSpecStatus(v1beta1.TaskRunSpecStatusCancelled), - )) - expectedTaskRun := &v1beta1.TaskRun{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-taskrun", Namespace: "foo", - Annotations: map[string]string{}, - }, - Spec: v1beta1.TaskRunSpec{ - TaskSpec: &v1beta1.TaskSpec{ - Steps: []v1beta1.Step{{Container: corev1.Container{ - Image: "image", - Command: []string{"/mycmd"}, - }}}, - Resources: &v1beta1.TaskResources{ - Inputs: []v1beta1.TaskResource{{ - ResourceDeclaration: v1beta1.ResourceDeclaration{ - Name: "workspace", - Type: resource.PipelineResourceTypeGit, - Optional: true, - }}}, - }, - }, - Resources: &v1beta1.TaskRunResources{}, - ServiceAccountName: "sa", - Status: v1beta1.TaskRunSpecStatusCancelled, - Timeout: &metav1.Duration{Duration: 2 * time.Minute}, - }, - } - if d := cmp.Diff(expectedTaskRun, taskRun); d != "" { - t.Fatalf("TaskRun diff -want, +got: %v", d) - } -} - -func TestTaskRunWithPodTemplate(t *testing.T) { - taskRun := tb.TaskRun("test-taskrun", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec( - tb.TaskRunTaskSpec( - tb.Step("image", tb.StepCommand("/mycmd")), - tb.TaskResources( - tb.TaskResourcesInput("workspace", resource.PipelineResourceTypeGit, tb.ResourceOptional(true)), - ), - ), - tb.TaskRunServiceAccountName("sa"), - tb.TaskRunTimeout(2*time.Minute), - tb.TaskRunSpecStatus(v1beta1.TaskRunSpecStatusCancelled), - tb.TaskRunNodeSelector(map[string]string{ - "label": "value", - }), - )) - expectedTaskRun := &v1beta1.TaskRun{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-taskrun", Namespace: "foo", - Annotations: map[string]string{}, - }, - Spec: v1beta1.TaskRunSpec{ - TaskSpec: &v1beta1.TaskSpec{ - Steps: []v1beta1.Step{{Container: corev1.Container{ - Image: "image", - Command: []string{"/mycmd"}, - }}}, - Resources: &v1beta1.TaskResources{ - Inputs: []v1beta1.TaskResource{{ - ResourceDeclaration: v1beta1.ResourceDeclaration{ - Name: "workspace", - Type: resource.PipelineResourceTypeGit, - Optional: true, - }}}, - }, - }, - PodTemplate: &pod.Template{ - NodeSelector: map[string]string{ - "label": "value", - }, - }, - Resources: &v1beta1.TaskRunResources{}, - ServiceAccountName: "sa", - Status: v1beta1.TaskRunSpecStatusCancelled, - Timeout: &metav1.Duration{Duration: 2 * time.Minute}, - }, - } - if d := cmp.Diff(expectedTaskRun, taskRun); d != "" { - t.Fatalf("TaskRun diff -want, +got: %v", d) - } -} diff --git a/pkg/apis/resource/v1alpha1/cloudevent/cloud_event_resource_test.go b/pkg/apis/resource/v1alpha1/cloudevent/cloud_event_resource_test.go index a2916df0196..389c8dbfe12 100644 --- a/pkg/apis/resource/v1alpha1/cloudevent/cloud_event_resource_test.go +++ b/pkg/apis/resource/v1alpha1/cloudevent/cloud_event_resource_test.go @@ -19,8 +19,9 @@ package cloudevent_test import ( "testing" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/google/go-cmp/cmp" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" resourcev1alpha1 "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/cloudevent" @@ -33,16 +34,34 @@ func TestNewResource_Invalid(t *testing.T) { pipelineResource *resourcev1alpha1.PipelineResource }{{ name: "create resource with no parameter", - pipelineResource: tb.PipelineResource("cloud-event-resource-no-uri", tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeCloudEvent, - )), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "cloud-event-resource-no-uri", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeCloudEvent, + }, + }, }, { name: "create resource with invalid type", - pipelineResource: tb.PipelineResource("git-resource", tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("URL", "git://fake/repo"), - tb.PipelineResourceSpecParam("Revision", "fake_rev"), - )), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "git-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "URL", + Value: "git://fake/repo", + }, + { + Name: "Revision", + Value: "fake_rev", + }, + }, + }, + }, }} for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { @@ -55,10 +74,18 @@ func TestNewResource_Invalid(t *testing.T) { } func TestNewResource_Valid(t *testing.T) { - pr := tb.PipelineResource("cloud-event-resource-uri", tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeCloudEvent, - tb.PipelineResourceSpecParam("TargetURI", "http://fake-sink"), - )) + pr := &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "cloud-event-resource-uri", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeCloudEvent, + Params: []resourcev1alpha1.ResourceParam{{ + Name: "TargetURI", + Value: "http://fake-sink", + }}, + }, + } expectedResource := &cloudevent.Resource{ Name: "test-resource", TargetURI: "http://fake-sink", diff --git a/pkg/apis/resource/v1alpha1/cluster/cluster_resource_test.go b/pkg/apis/resource/v1alpha1/cluster/cluster_resource_test.go index 1d8fa3f5897..1c01366cf0e 100644 --- a/pkg/apis/resource/v1alpha1/cluster/cluster_resource_test.go +++ b/pkg/apis/resource/v1alpha1/cluster/cluster_resource_test.go @@ -19,8 +19,9 @@ package cluster_test import ( "testing" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/google/go-cmp/cmp" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" resourcev1alpha1 "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/cluster" @@ -36,12 +37,28 @@ func TestNewClusterResource(t *testing.T) { want *cluster.Resource }{{ desc: "basic cluster resource", - resource: tb.PipelineResource("test-resource", tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeCluster, - tb.PipelineResourceSpecParam("url", "http://10.10.10.10"), - tb.PipelineResourceSpecParam("cadata", "bXktY2x1c3Rlci1jZXJ0Cg"), - tb.PipelineResourceSpecParam("token", "my-token"), - )), + resource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeCluster, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "url", + Value: "http://10.10.10.10", + }, + { + Name: "cadata", + Value: "bXktY2x1c3Rlci1jZXJ0Cg", + }, + { + Name: "token", + Value: "my-token", + }, + }, + }, + }, want: &cluster.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeCluster, @@ -52,13 +69,32 @@ func TestNewClusterResource(t *testing.T) { }, }, { desc: "resource with password instead of token", - resource: tb.PipelineResource("test-resource", tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeCluster, - tb.PipelineResourceSpecParam("url", "http://10.10.10.10"), - tb.PipelineResourceSpecParam("cadata", "bXktY2x1c3Rlci1jZXJ0Cg"), - tb.PipelineResourceSpecParam("username", "user"), - tb.PipelineResourceSpecParam("password", "pass"), - )), + resource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeCluster, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "url", + Value: "http://10.10.10.10", + }, + { + Name: "cadata", + Value: "bXktY2x1c3Rlci1jZXJ0Cg", + }, + { + Name: "username", + Value: "user", + }, + { + Name: "password", + Value: "pass", + }, + }, + }, + }, want: &cluster.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeCluster, @@ -70,14 +106,36 @@ func TestNewClusterResource(t *testing.T) { }, }, { desc: "resource with clientKeyData and clientCertificateData instead of token or password", - resource: tb.PipelineResource("test-resource", tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeCluster, - tb.PipelineResourceSpecParam("url", "http://10.10.10.10"), - tb.PipelineResourceSpecParam("username", "user"), - tb.PipelineResourceSpecParam("cadata", "bXktY2x1c3Rlci1jZXJ0Cg"), - tb.PipelineResourceSpecParam("clientKeyData", "Y2xpZW50LWtleS1kYXRh"), - tb.PipelineResourceSpecParam("clientCertificateData", "Y2xpZW50LWNlcnRpZmljYXRlLWRhdGE="), - )), + resource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeCluster, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "url", + Value: "http://10.10.10.10", + }, + { + Name: "cadata", + Value: "bXktY2x1c3Rlci1jZXJ0Cg", + }, + { + Name: "username", + Value: "user", + }, + { + Name: "clientKeyData", + Value: "Y2xpZW50LWtleS1kYXRh", + }, + { + Name: "clientCertificateData", + Value: "Y2xpZW50LWNlcnRpZmljYXRlLWRhdGE=", + }, + }, + }, + }, want: &cluster.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeCluster, @@ -90,11 +148,24 @@ func TestNewClusterResource(t *testing.T) { }, }, { desc: "set insecure flag to true when there is no cert", - resource: tb.PipelineResource("test-resource", tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeCluster, - tb.PipelineResourceSpecParam("url", "http://10.10.10.10"), - tb.PipelineResourceSpecParam("token", "my-token"), - )), + resource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeCluster, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "url", + Value: "http://10.10.10.10", + }, + { + Name: "token", + Value: "my-token", + }, + }, + }, + }, want: &cluster.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeCluster, @@ -105,13 +176,32 @@ func TestNewClusterResource(t *testing.T) { }, }, { desc: "basic cluster resource with namespace", - resource: tb.PipelineResource("test-resource", tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeCluster, - tb.PipelineResourceSpecParam("url", "http://10.10.10.10"), - tb.PipelineResourceSpecParam("cadata", "bXktY2x1c3Rlci1jZXJ0Cg"), - tb.PipelineResourceSpecParam("token", "my-token"), - tb.PipelineResourceSpecParam("namespace", "my-namespace"), - )), + resource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeCluster, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "url", + Value: "http://10.10.10.10", + }, + { + Name: "cadata", + Value: "bXktY2x1c3Rlci1jZXJ0Cg", + }, + { + Name: "token", + Value: "my-token", + }, + { + Name: "namespace", + Value: "my-namespace", + }, + }, + }, + }, want: &cluster.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeCluster, @@ -123,12 +213,32 @@ func TestNewClusterResource(t *testing.T) { }, }, { desc: "basic resource with secrets", - resource: tb.PipelineResource("test-resource", tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeCluster, - tb.PipelineResourceSpecParam("url", "http://10.10.10.10"), - tb.PipelineResourceSpecSecretParam("cadata", "secret1", "cadatakey"), - tb.PipelineResourceSpecSecretParam("token", "secret1", "tokenkey"), - )), + resource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeCluster, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "url", + Value: "http://10.10.10.10", + }, + }, + SecretParams: []resourcev1alpha1.SecretParam{ + { + FieldName: "cadata", + SecretName: "secret1", + SecretKey: "cadatakey", + }, + { + FieldName: "token", + SecretName: "secret1", + SecretKey: "tokenkey", + }, + }, + }, + }, want: &cluster.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeCluster, diff --git a/pkg/apis/resource/v1alpha1/git/git_resource_test.go b/pkg/apis/resource/v1alpha1/git/git_resource_test.go index 125ae924586..8c95292763b 100644 --- a/pkg/apis/resource/v1alpha1/git/git_resource_test.go +++ b/pkg/apis/resource/v1alpha1/git/git_resource_test.go @@ -19,8 +19,9 @@ package git_test import ( "testing" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/google/go-cmp/cmp" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" pipeline "github.com/tektoncd/pipeline/pkg/apis/pipeline" resourcev1alpha1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" @@ -31,7 +32,15 @@ import ( ) func TestNewGitResource_Invalid(t *testing.T) { - if _, err := git.NewResource("test-resource", "override-with-git:latest", tb.PipelineResource("git-resource", tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGCS))); err == nil { + if _, err := git.NewResource("test-resource", "override-with-git:latest", + &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "git-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGCS, + }, + }); err == nil { t.Error("Expected error creating Git resource") } } @@ -43,12 +52,24 @@ func TestNewGitResource_Valid(t *testing.T) { want *git.Resource }{{ desc: "With Revision", - pipelineResource: tb.PipelineResource("git-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("URL", "git@github.com:test/test.git"), - tb.PipelineResourceSpecParam("Revision", "test"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "git-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "URL", + Value: "git@github.com:test/test.git", + }, + { + Name: "Revision", + Value: "test", + }, + }, + }, + }, want: &git.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeGit, @@ -65,11 +86,18 @@ func TestNewGitResource_Valid(t *testing.T) { }, }, { desc: "Without Revision", - pipelineResource: tb.PipelineResource("test-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("URL", "git@github.com:test/test.git"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{{ + Name: "URL", + Value: "git@github.com:test/test.git", + }}, + }, + }, want: &git.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeGit, @@ -86,12 +114,24 @@ func TestNewGitResource_Valid(t *testing.T) { }, }, { desc: "With Refspec", - pipelineResource: tb.PipelineResource("test-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("URL", "git@github.com:test/test.git"), - tb.PipelineResourceSpecParam("Refspec", "refs/changes/22/222134"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "URL", + Value: "git@github.com:test/test.git", + }, + { + Name: "Refspec", + Value: "refs/changes/22/222134", + }, + }, + }, + }, want: &git.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeGit, @@ -108,11 +148,18 @@ func TestNewGitResource_Valid(t *testing.T) { }, }, { desc: "Without Refspec", - pipelineResource: tb.PipelineResource("test-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("URL", "git@github.com:test/test.git"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{{ + Name: "URL", + Value: "git@github.com:test/test.git", + }}, + }, + }, want: &git.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeGit, @@ -129,12 +176,24 @@ func TestNewGitResource_Valid(t *testing.T) { }, }, { desc: "With Submodules", - pipelineResource: tb.PipelineResource("test-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("URL", "git@github.com:test/test.git"), - tb.PipelineResourceSpecParam("Revision", "test"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "URL", + Value: "git@github.com:test/test.git", + }, + { + Name: "Revision", + Value: "test", + }, + }, + }, + }, want: &git.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeGit, @@ -151,13 +210,28 @@ func TestNewGitResource_Valid(t *testing.T) { }, }, { desc: "Without Submodules", - pipelineResource: tb.PipelineResource("test-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("URL", "git@github.com:test/test.git"), - tb.PipelineResourceSpecParam("Revision", "test"), - tb.PipelineResourceSpecParam("Submodules", "false"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "URL", + Value: "git@github.com:test/test.git", + }, + { + Name: "Revision", + Value: "test", + }, + { + Name: "Submodules", + Value: "false", + }, + }, + }, + }, want: &git.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeGit, @@ -174,13 +248,28 @@ func TestNewGitResource_Valid(t *testing.T) { }, }, { desc: "With positive depth", - pipelineResource: tb.PipelineResource("test-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("URL", "git@github.com:test/test.git"), - tb.PipelineResourceSpecParam("Revision", "test"), - tb.PipelineResourceSpecParam("Depth", "8"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "URL", + Value: "git@github.com:test/test.git", + }, + { + Name: "Revision", + Value: "test", + }, + { + Name: "Depth", + Value: "8", + }, + }, + }, + }, want: &git.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeGit, @@ -197,13 +286,28 @@ func TestNewGitResource_Valid(t *testing.T) { }, }, { desc: "With zero depth", - pipelineResource: tb.PipelineResource("test-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("URL", "git@github.com:test/test.git"), - tb.PipelineResourceSpecParam("Revision", "test"), - tb.PipelineResourceSpecParam("Depth", "0"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "URL", + Value: "git@github.com:test/test.git", + }, + { + Name: "Revision", + Value: "test", + }, + { + Name: "Depth", + Value: "0", + }, + }, + }, + }, want: &git.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeGit, @@ -220,14 +324,32 @@ func TestNewGitResource_Valid(t *testing.T) { }, }, { desc: "Without SSLVerify", - pipelineResource: tb.PipelineResource("test-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("URL", "git@github.com:test/test.git"), - tb.PipelineResourceSpecParam("Revision", "test"), - tb.PipelineResourceSpecParam("Depth", "0"), - tb.PipelineResourceSpecParam("SSLVerify", "false"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "URL", + Value: "git@github.com:test/test.git", + }, + { + Name: "Revision", + Value: "test", + }, + { + Name: "Depth", + Value: "0", + }, + { + Name: "SSLVerify", + Value: "false", + }, + }, + }, + }, want: &git.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeGit, @@ -244,14 +366,32 @@ func TestNewGitResource_Valid(t *testing.T) { }, }, { desc: "With HTTPProxy", - pipelineResource: tb.PipelineResource("test-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("URL", "git@github.com:test/test.git"), - tb.PipelineResourceSpecParam("Revision", "test"), - tb.PipelineResourceSpecParam("Depth", "0"), - tb.PipelineResourceSpecParam("HTTPProxy", "http-proxy.git.com"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "URL", + Value: "git@github.com:test/test.git", + }, + { + Name: "Revision", + Value: "test", + }, + { + Name: "Depth", + Value: "0", + }, + { + Name: "HTTPProxy", + Value: "http-proxy.git.com", + }, + }, + }, + }, want: &git.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeGit, @@ -268,14 +408,32 @@ func TestNewGitResource_Valid(t *testing.T) { }, }, { desc: "With HTTPSProxy", - pipelineResource: tb.PipelineResource("test-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("URL", "git@github.com:test/test.git"), - tb.PipelineResourceSpecParam("Revision", "test"), - tb.PipelineResourceSpecParam("Depth", "0"), - tb.PipelineResourceSpecParam("HTTPSProxy", "https-proxy.git.com"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "URL", + Value: "git@github.com:test/test.git", + }, + { + Name: "Revision", + Value: "test", + }, + { + Name: "Depth", + Value: "0", + }, + { + Name: "HTTPSProxy", + Value: "https-proxy.git.com", + }, + }, + }, + }, want: &git.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeGit, @@ -292,14 +450,32 @@ func TestNewGitResource_Valid(t *testing.T) { }, }, { desc: "With NOProxy", - pipelineResource: tb.PipelineResource("test-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("URL", "git@github.com:test/test.git"), - tb.PipelineResourceSpecParam("Revision", "test"), - tb.PipelineResourceSpecParam("Depth", "0"), - tb.PipelineResourceSpecParam("NOProxy", "*"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "URL", + Value: "git@github.com:test/test.git", + }, + { + Name: "Revision", + Value: "test", + }, + { + Name: "Depth", + Value: "0", + }, + { + Name: "NOProxy", + Value: "*", + }, + }, + }, + }, want: &git.Resource{ Name: "test-resource", Type: resourcev1alpha1.PipelineResourceTypeGit, diff --git a/pkg/apis/resource/v1alpha1/image/image_resource_test.go b/pkg/apis/resource/v1alpha1/image/image_resource_test.go index 2b8be922d45..c3a8bf9da67 100644 --- a/pkg/apis/resource/v1alpha1/image/image_resource_test.go +++ b/pkg/apis/resource/v1alpha1/image/image_resource_test.go @@ -19,16 +19,24 @@ package image_test import ( "testing" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/google/go-cmp/cmp" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/image" "github.com/tektoncd/pipeline/test/diff" ) func TestNewImageResource_Invalid(t *testing.T) { - r := tb.PipelineResource("test-resource", tb.PipelineResourceSpec(v1alpha1.PipelineResourceTypeGit)) + r := &v1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-resource", + }, + Spec: v1alpha1.PipelineResourceSpec{ + Type: v1alpha1.PipelineResourceTypeGit, + }, + } _, err := image.NewResource("test-resource", r) if err == nil { @@ -44,14 +52,24 @@ func TestNewImageResource_Valid(t *testing.T) { Digest: "test", } - r := tb.PipelineResource( - "image-resource", - tb.PipelineResourceSpec( - v1alpha1.PipelineResourceTypeImage, - tb.PipelineResourceSpecParam("URL", "https://test.com/test/test"), - tb.PipelineResourceSpecParam("Digest", "test"), - ), - ) + r := &v1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "image-resource", + }, + Spec: v1alpha1.PipelineResourceSpec{ + Type: v1alpha1.PipelineResourceTypeImage, + Params: []v1alpha1.ResourceParam{ + { + Name: "URL", + Value: "https://test.com/test/test", + }, + { + Name: "Digest", + Value: "test", + }, + }, + }, + } got, err := image.NewResource("image-resource", r) if err != nil { diff --git a/pkg/apis/resource/v1alpha1/pullrequest/pull_request_resource_test.go b/pkg/apis/resource/v1alpha1/pullrequest/pull_request_resource_test.go index 1da04f1727b..44aa0288a3b 100644 --- a/pkg/apis/resource/v1alpha1/pullrequest/pull_request_resource_test.go +++ b/pkg/apis/resource/v1alpha1/pullrequest/pull_request_resource_test.go @@ -19,8 +19,9 @@ package pullrequest_test import ( "testing" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/google/go-cmp/cmp" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/pipeline" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" resourcev1alpha1 "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" @@ -32,13 +33,33 @@ import ( func TestPullRequest_NewResource(t *testing.T) { url := "https://github.com/tektoncd/pipeline/pulls/1" - pr := tb.PipelineResource("foo", tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypePullRequest, - tb.PipelineResourceSpecParam("url", url), - tb.PipelineResourceSpecParam("provider", "github"), - tb.PipelineResourceSpecSecretParam("authToken", "test-secret-key", "test-secret-name"), - tb.PipelineResourceSpecParam("disable-strict-json-comments", "true"), - )) + pr := &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypePullRequest, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "url", + Value: url, + }, + { + Name: "provider", + Value: "github", + }, + { + Name: "disable-strict-json-comments", + Value: "true", + }, + }, + SecretParams: []resourcev1alpha1.SecretParam{{ + FieldName: "authToken", + SecretKey: "test-secret-key", + SecretName: "test-secret-name", + }}, + }, + } got, err := pullrequest.NewResource("test-resource", "override-with-pr:latest", pr) if err != nil { t.Fatalf("Error creating storage resource: %s", err.Error()) @@ -60,7 +81,14 @@ func TestPullRequest_NewResource(t *testing.T) { } func TestPullRequest_NewResource_error(t *testing.T) { - pr := tb.PipelineResource("foo", tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit)) + pr := &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + }, + } if _, err := pullrequest.NewResource("test-resource", "override-with-pr:latest", pr); err == nil { t.Error("NewPullRequestResource() want error, got nil") } diff --git a/pkg/apis/resource/v1alpha1/storage/gcs_test.go b/pkg/apis/resource/v1alpha1/storage/gcs_test.go index df5f3deaa18..b4678ee6420 100644 --- a/pkg/apis/resource/v1alpha1/storage/gcs_test.go +++ b/pkg/apis/resource/v1alpha1/storage/gcs_test.go @@ -19,8 +19,9 @@ package storage_test import ( "testing" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/google/go-cmp/cmp" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/pipeline" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" resourcev1alpha1 "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" @@ -47,40 +48,88 @@ func TestInvalidNewStorageResource(t *testing.T) { pipelineResource *resourcev1alpha1.PipelineResource }{{ name: "wrong-resource-type", - pipelineResource: tb.PipelineResource("gcs-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "gcs-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + }, + }, }, { name: "unimplemented type", - pipelineResource: tb.PipelineResource("gcs-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeStorage, - tb.PipelineResourceSpecParam("Location", "gs://fake-bucket"), - tb.PipelineResourceSpecParam("type", "non-existent-type"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "gcs-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeStorage, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "Location", + Value: "gs://fake-bucket", + }, + { + Name: "type", + Value: "non-existent-type", + }, + }, + }, + }, }, { name: "no type", - pipelineResource: tb.PipelineResource("gcs-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeStorage, - tb.PipelineResourceSpecParam("Location", "gs://fake-bucket"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "gcs-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeStorage, + Params: []resourcev1alpha1.ResourceParam{{ + Name: "Location", + Value: "gs://fake-bucket", + }}, + }, + }, }, { name: "no location params", - pipelineResource: tb.PipelineResource("gcs-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeStorage, - tb.PipelineResourceSpecParam("NotLocation", "doesntmatter"), - tb.PipelineResourceSpecParam("type", "gcs"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "gcs-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeStorage, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "NotLocation", + Value: "doesntmatter", + }, + { + Name: "type", + Value: "gcs", + }, + }, + }, + }, }, { name: "location param with empty value", - pipelineResource: tb.PipelineResource("gcs-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeStorage, - tb.PipelineResourceSpecParam("Location", ""), - tb.PipelineResourceSpecParam("type", "gcs"), - ), - ), + pipelineResource: &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "gcs-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeStorage, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "Location", + Value: "", + }, + { + Name: "type", + Value: "gcs", + }, + }, + }, + }, }} { t.Run(tc.name, func(t *testing.T) { _, err := storage.NewResource("test-resource", images, tc.pipelineResource) @@ -92,13 +141,33 @@ func TestInvalidNewStorageResource(t *testing.T) { } func TestValidNewGCSResource(t *testing.T) { - pr := tb.PipelineResource("gcs-resource", tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeStorage, - tb.PipelineResourceSpecParam("Location", "gs://fake-bucket"), - tb.PipelineResourceSpecParam("type", "gcs"), - tb.PipelineResourceSpecParam("dir", "anything"), - tb.PipelineResourceSpecSecretParam("GOOGLE_APPLICATION_CREDENTIALS", "secretName", "secretKey"), - )) + pr := &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "gcs-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeStorage, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "Location", + Value: "gs://fake-bucket", + }, + { + Name: "type", + Value: "gcs", + }, + { + Name: "dir", + Value: "anything", + }, + }, + SecretParams: []resourcev1alpha1.SecretParam{{ + FieldName: "GOOGLE_APPLICATION_CREDENTIALS", + SecretKey: "secretKey", + SecretName: "secretName", + }}, + }, + } expectedGCSResource := &storage.GCSResource{ Name: "test-resource", Location: "gs://fake-bucket", @@ -139,12 +208,33 @@ func TestGCSGetReplacements(t *testing.T) { } func TestGetParams(t *testing.T) { - pr := tb.PipelineResource("gcs-resource", tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeStorage, - tb.PipelineResourceSpecParam("Location", "gcs://some-bucket.zip"), - tb.PipelineResourceSpecParam("type", "gcs"), - tb.PipelineResourceSpecSecretParam("test-field-name", "test-secret-name", "test-secret-key"), - )) + pr := &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "gcs-resource", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeStorage, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "Location", + Value: "gs://some-bucket.zip", + }, + { + Name: "type", + Value: "gcs", + }, + { + Name: "dir", + Value: "anything", + }, + }, + SecretParams: []resourcev1alpha1.SecretParam{{ + FieldName: "test-field-name", + SecretKey: "test-secret-key", + SecretName: "test-secret-name", + }}, + }, + } gcsResource, err := storage.NewResource("test-resource", images, pr) if err != nil { t.Fatalf("Error creating storage resource: %s", err.Error()) diff --git a/pkg/reconciler/events/cloudevent/cloud_event_controller_test.go b/pkg/reconciler/events/cloudevent/cloud_event_controller_test.go index b51ff5a85e3..f312298dc8b 100644 --- a/pkg/reconciler/events/cloudevent/cloud_event_controller_test.go +++ b/pkg/reconciler/events/cloudevent/cloud_event_controller_test.go @@ -24,7 +24,6 @@ import ( "time" "github.com/google/go-cmp/cmp" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" resourcev1alpha1 "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" "github.com/tektoncd/pipeline/test/diff" @@ -92,45 +91,138 @@ func TestSendCloudEvents(t *testing.T) { wantTaskRun *v1beta1.TaskRun }{{ name: "testWithMultipleMixedCloudEvents", - taskRun: tb.TaskRun("test-taskrun-multiple-cloudeventdelivery", - tb.TaskRunNamespace("foo"), - tb.TaskRunSelfLink("/task/1234"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("fakeTaskName"), - ), - tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - Reason: "somethingelse", - }), - tb.TaskRunCloudEvent("http//notattemptedunknown", "", 0, v1beta1.CloudEventConditionUnknown), - tb.TaskRunCloudEvent("http//notattemptedfailed", "somehow", 0, v1beta1.CloudEventConditionFailed), - tb.TaskRunCloudEvent("http//notattemptedsucceeded", "", 0, v1beta1.CloudEventConditionSent), - tb.TaskRunCloudEvent("http//attemptedunknown", "", 1, v1beta1.CloudEventConditionUnknown), - tb.TaskRunCloudEvent("http//attemptedfailed", "iknewit", 1, v1beta1.CloudEventConditionFailed), - tb.TaskRunCloudEvent("http//attemptedsucceeded", "", 1, v1beta1.CloudEventConditionSent), - ), - ), - wantTaskRun: tb.TaskRun("test-taskrun-multiple-cloudeventdelivery", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("fakeTaskName"), - ), - tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - Reason: "somethingelse", - }), - tb.TaskRunCloudEvent("http//notattemptedunknown", "", 1, v1beta1.CloudEventConditionSent), - tb.TaskRunCloudEvent("http//notattemptedfailed", "somehow", 0, v1beta1.CloudEventConditionFailed), - tb.TaskRunCloudEvent("http//notattemptedsucceeded", "", 0, v1beta1.CloudEventConditionSent), - tb.TaskRunCloudEvent("http//attemptedunknown", "", 1, v1beta1.CloudEventConditionUnknown), - tb.TaskRunCloudEvent("http//attemptedfailed", "iknewit", 1, v1beta1.CloudEventConditionFailed), - tb.TaskRunCloudEvent("http//attemptedsucceeded", "", 1, v1beta1.CloudEventConditionSent), - ), - ), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-taskrun-multiple-cloudeventdelivery", + Namespace: "foo", + SelfLink: "/task/1234", + }, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "fakeTaskName", + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + Reason: "somethingelse", + }}, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + CloudEvents: []v1beta1.CloudEventDelivery{ + { + Target: "http//notattemptedunknown", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + }, + }, + { + Target: "http//notattemptedfailed", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionFailed, + Error: "somehow", + }, + }, + { + Target: "http//notattemptedsucceeded", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionSent, + }, + }, + { + Target: "http//attemptedunknown", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + RetryCount: 1, + }, + }, + { + Target: "http//attemptedfailed", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionFailed, + Error: "iknewit", + RetryCount: 1, + }, + }, + { + Target: "http//attemptedsucceeded", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionSent, + RetryCount: 1, + }, + }, + }, + }, + }, + }, + wantTaskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-taskrun-multiple-cloudeventdelivery", + Namespace: "foo", + }, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "fakeTaskName", + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + Reason: "somethingelse", + }}, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + CloudEvents: []v1beta1.CloudEventDelivery{ + { + Target: "http//notattemptedunknown", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionSent, + RetryCount: 1, + }, + }, + { + Target: "http//notattemptedfailed", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionFailed, + Error: "somehow", + }, + }, + { + Target: "http//notattemptedsucceeded", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionSent, + }, + }, + { + Target: "http//attemptedunknown", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + RetryCount: 1, + }, + }, + { + Target: "http//attemptedfailed", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionFailed, + Error: "iknewit", + RetryCount: 1, + }, + }, + { + Target: "http//attemptedsucceeded", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionSent, + RetryCount: 1, + }, + }, + }, + }, + }, + }, }} for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { @@ -157,38 +249,81 @@ func TestSendCloudEventsErrors(t *testing.T) { wantTaskRun *v1beta1.TaskRun }{{ name: "testWithMultipleMixedCloudEvents", - taskRun: tb.TaskRun("test-taskrun-multiple-cloudeventdelivery", - tb.TaskRunNamespace("foo"), - tb.TaskRunSelfLink("/task/1234"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("fakeTaskName"), - ), - tb.TaskRunStatus( - tb.TaskRunCloudEvent("http//sink1", "", 0, v1beta1.CloudEventConditionUnknown), - tb.TaskRunCloudEvent("http//sink2", "", 0, v1beta1.CloudEventConditionUnknown), - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - Reason: "somethingelse", - }), - ), - ), - wantTaskRun: tb.TaskRun("test-taskrun-multiple-cloudeventdelivery", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("fakeTaskName"), - ), - tb.TaskRunStatus( - // Error message is not checked in the Diff below - tb.TaskRunCloudEvent("http//sink1", "", 1, v1beta1.CloudEventConditionFailed), - tb.TaskRunCloudEvent("http//sink2", "", 1, v1beta1.CloudEventConditionFailed), - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - Reason: "somethingelse", - }), - ), - ), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-taskrun-multiple-cloudeventdelivery", + Namespace: "foo", + SelfLink: "/task/1234", + }, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "fakeTaskName", + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + Reason: "somethingelse", + }}, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + CloudEvents: []v1beta1.CloudEventDelivery{ + { + Target: "http//sink1", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + }, + }, + { + Target: "http//sink2", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + }, + }, + }, + }, + }, + }, + wantTaskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-taskrun-multiple-cloudeventdelivery", + Namespace: "foo", + }, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "fakeTaskName", + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + Reason: "somethingelse", + }}, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + CloudEvents: []v1beta1.CloudEventDelivery{ + { + Target: "http//sink1", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionFailed, + RetryCount: 1, + }, + }, + { + Target: "http//sink2", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionFailed, + RetryCount: 1, + }, + }, + }, + }, + }, + }, }} for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { @@ -216,67 +351,179 @@ func TestInitializeCloudEvents(t *testing.T) { wantTaskRun *v1beta1.TaskRun }{{ name: "testWithMultipleMixedResources", - taskRun: tb.TaskRun("test-taskrun-multiple-mixed-resources", - tb.TaskRunNamespace("foo"), - tb.TaskRunSelfLink("/task/1234"), tb.TaskRunSpec( - tb.TaskRunTaskRef("fakeTaskName"), - tb.TaskRunResources( - tb.TaskRunResourcesOutput("ce1", tb.TaskResourceBindingRef("ce1")), - tb.TaskRunResourcesOutput("git", tb.TaskResourceBindingRef("git")), - tb.TaskRunResourcesOutput("ce2", tb.TaskResourceBindingRef("ce2")), - ), - ), - ), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-taskrun-multiple-mixed-resources", + Namespace: "foo", + SelfLink: "/task/1234", + }, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "fakeTaskName", + }, + Resources: &v1beta1.TaskRunResources{ + Outputs: []v1beta1.TaskResourceBinding{ + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: "ce1", + ResourceRef: &v1beta1.PipelineResourceRef{ + Name: "ce1", + }, + }, + }, + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: "git", + ResourceRef: &v1beta1.PipelineResourceRef{ + Name: "git", + }, + }, + }, + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: "ce2", + ResourceRef: &v1beta1.PipelineResourceRef{ + Name: "ce2", + }, + }, + }, + }, + }, + }, + }, pipelineResources: []*resourcev1alpha1.PipelineResource{ - tb.PipelineResource("ce1", tb.PipelineResourceNamespace("foo"), tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeCloudEvent, - tb.PipelineResourceSpecParam("TargetURI", "http://foosink"), - )), - tb.PipelineResource("ce2", tb.PipelineResourceNamespace("foo"), tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeCloudEvent, - tb.PipelineResourceSpecParam("TargetURI", "http://barsink"), - )), - tb.PipelineResource("git", tb.PipelineResourceNamespace("foo"), tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("URL", "http://git.fake"), - tb.PipelineResourceSpecParam("Revision", "abcd"), - )), + { + ObjectMeta: metav1.ObjectMeta{ + Name: "ce1", + Namespace: "foo", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeCloudEvent, + Params: []resourcev1alpha1.ResourceParam{{ + Name: "TargetURI", + Value: "http://foosink", + }}, + }, + }, + { + ObjectMeta: metav1.ObjectMeta{ + Name: "ce2", + Namespace: "foo", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeCloudEvent, + Params: []resourcev1alpha1.ResourceParam{{ + Name: "TargetURI", + Value: "http://barsink", + }}, + }, + }, + { + ObjectMeta: metav1.ObjectMeta{ + Name: "git", + Namespace: "foo", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "URL", + Value: "http://git.fake", + }, + { + Name: "Revision", + Value: "abcd", + }, + }, + }, + }, + }, + wantTaskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-taskrun-multiple-mixed-resources", + Namespace: "foo", + }, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "fakeTaskName", + }, + }, + Status: v1beta1.TaskRunStatus{ + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + CloudEvents: []v1beta1.CloudEventDelivery{ + { + Target: "http://barsink", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + }, + }, + { + Target: "http://foosink", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + }, + }, + }, + }, + }, }, - wantTaskRun: tb.TaskRun("test-taskrun-multiple-mixed-resources", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("fakeTaskName"), - ), - tb.TaskRunStatus( - tb.TaskRunCloudEvent("http://barsink", "", 0, v1beta1.CloudEventConditionUnknown), - tb.TaskRunCloudEvent("http://foosink", "", 0, v1beta1.CloudEventConditionUnknown), - ), - ), }, { name: "testWithNoCloudEventResources", - taskRun: tb.TaskRun("test-taskrun-no-cloudevent-resources", - tb.TaskRunNamespace("foo"), - tb.TaskRunSelfLink("/task/1234"), tb.TaskRunSpec( - tb.TaskRunTaskRef("fakeTaskName"), - tb.TaskRunResources( - tb.TaskRunResourcesOutput("git", tb.TaskResourceBindingRef("git")), - ), - ), - ), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-taskrun-no-cloudevent-resources", + Namespace: "foo", + SelfLink: "/task/1234", + }, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "fakeTaskName", + }, + Resources: &v1beta1.TaskRunResources{ + Outputs: []v1beta1.TaskResourceBinding{{ + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: "git", + ResourceRef: &v1beta1.PipelineResourceRef{ + Name: "git", + }, + }, + }}, + }, + }, + }, pipelineResources: []*resourcev1alpha1.PipelineResource{ - tb.PipelineResource("git", tb.PipelineResourceNamespace("foo"), tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("URL", "http://git.fake"), - tb.PipelineResourceSpecParam("Revision", "abcd"), - )), + { + ObjectMeta: metav1.ObjectMeta{ + Name: "git", + Namespace: "foo", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "URL", + Value: "http://git.fake", + }, + { + Name: "Revision", + Value: "abcd", + }, + }, + }, + }, + }, + wantTaskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-taskrun-no-cloudevent-resources", + Namespace: "foo", + }, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "fakeTaskName", + }, + }, + Status: v1beta1.TaskRunStatus{}, }, - wantTaskRun: tb.TaskRun("test-taskrun-no-cloudevent-resources", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("fakeTaskName"), - ), - tb.TaskRunStatus(), - ), }} for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { diff --git a/pkg/reconciler/pipelinerun/pipelinerun_test.go b/pkg/reconciler/pipelinerun/pipelinerun_test.go index fa9f935de5e..d4ba94a2b11 100644 --- a/pkg/reconciler/pipelinerun/pipelinerun_test.go +++ b/pkg/reconciler/pipelinerun/pipelinerun_test.go @@ -30,7 +30,6 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/go-containerregistry/pkg/registry" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/config" "github.com/tektoncd/pipeline/pkg/apis/pipeline" "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod" @@ -81,8 +80,21 @@ var ( ImageDigestExporterImage: "override-with-imagedigest-exporter-image:latest", } - ignoreResourceVersion = cmpopts.IgnoreFields(metav1.ObjectMeta{}, "ResourceVersion") - trueb = true + ignoreResourceVersion = cmpopts.IgnoreFields(metav1.ObjectMeta{}, "ResourceVersion") + trueb = true + simpleHelloWorldTask = &v1beta1.Task{ObjectMeta: baseObjectMeta("hello-world", "foo")} + simpleSomeTask = &v1beta1.Task{ObjectMeta: baseObjectMeta("some-task", "foo")} + simpleHelloWorldPipeline = &v1beta1.Pipeline{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }}, + }, + } ) const ( @@ -283,106 +295,324 @@ func TestReconcile(t *testing.T) { // It verifies that the TaskRun is created, it checks the resulting API actions, status and events. names.TestingSeed() const pipelineRunName = "test-pipeline-run-success" - prs := []*v1beta1.PipelineRun{ - tb.PipelineRun(pipelineRunName, - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunResourceBinding("git-repo", tb.PipelineResourceBindingRef("some-repo")), - tb.PipelineRunResourceBinding("best-image", tb.PipelineResourceBindingResourceSpec( - &resourcev1alpha1.PipelineResourceSpec{ + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta(pipelineRunName, "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{ + Name: "test-pipeline", + }, + ServiceAccountName: "test-sa", + Resources: []v1beta1.PipelineResourceBinding{ + { + Name: "git-repo", + ResourceRef: &v1beta1.PipelineResourceRef{ + Name: "some-repo", + }, + }, + { + Name: "best-image", + ResourceSpec: &resourcev1alpha1.PipelineResourceSpec{ Type: resourcev1alpha1.PipelineResourceTypeImage, Params: []resourcev1alpha1.ResourceParam{{ Name: "url", Value: "gcr.io/sven", }}, }, - )), - tb.PipelineRunParam("bar", "somethingmorefun"), - ), - ), + }, + }, + Params: []v1beta1.Param{{ + Name: "bar", + Value: *v1beta1.NewArrayOrString("somethingmorefun"), + }}, + }, + }} + funParam := v1beta1.Param{ + Name: "foo", + Value: *v1beta1.NewArrayOrString("somethingfun"), } - funParam := tb.PipelineTaskParam("foo", "somethingfun") - moreFunParam := tb.PipelineTaskParam("bar", "$(params.bar)") - templatedParam := tb.PipelineTaskParam("templatedparam", "$(inputs.workspace.$(params.rev-param))") - contextRunParam := tb.PipelineTaskParam("contextRunParam", "$(context.pipelineRun.name)") - contextPipelineParam := tb.PipelineTaskParam("contextPipelineParam", "$(context.pipeline.name)") - retriesParam := tb.PipelineTaskParam("contextRetriesParam", "$(context.pipelineTask.retries)") - const pipelineName = "test-pipeline" - ps := []*v1beta1.Pipeline{ - tb.Pipeline(pipelineName, - tb.PipelineNamespace("foo"), - tb.PipelineSpec( - tb.PipelineDeclaredResource("git-repo", "git"), - tb.PipelineDeclaredResource("best-image", "image"), - tb.PipelineParamSpec("pipeline-param", v1beta1.ParamTypeString, tb.ParamSpecDefault("somethingdifferent")), - tb.PipelineParamSpec("rev-param", v1beta1.ParamTypeString, tb.ParamSpecDefault("revision")), - tb.PipelineParamSpec("bar", v1beta1.ParamTypeString), - // unit-test-3 uses runAfter to indicate it should run last - tb.PipelineTask("unit-test-3", "unit-test-task", - funParam, moreFunParam, templatedParam, contextRunParam, contextPipelineParam, retriesParam, - tb.RunAfter("unit-test-2"), - tb.PipelineTaskInputResource("workspace", "git-repo"), - tb.PipelineTaskOutputResource("image-to-use", "best-image"), - tb.PipelineTaskOutputResource("workspace", "git-repo"), - ), - // unit-test-1 can run right away because it has no dependencies - tb.PipelineTask("unit-test-1", "unit-test-task", - funParam, moreFunParam, templatedParam, contextRunParam, contextPipelineParam, retriesParam, - tb.PipelineTaskInputResource("workspace", "git-repo"), - tb.PipelineTaskOutputResource("image-to-use", "best-image"), - tb.PipelineTaskOutputResource("workspace", "git-repo"), - tb.Retries(5), - ), - // unit-test-2 uses `from` to indicate it should run after `unit-test-1` - tb.PipelineTask("unit-test-2", "unit-test-followup-task", - tb.PipelineTaskInputResource("workspace", "git-repo", tb.From("unit-test-1")), - ), - // unit-test-cluster-task can run right away because it has no dependencies - tb.PipelineTask("unit-test-cluster-task", "unit-test-cluster-task", - tb.PipelineTaskRefKind(v1beta1.ClusterTaskKind), - funParam, moreFunParam, templatedParam, contextRunParam, contextPipelineParam, - tb.PipelineTaskInputResource("workspace", "git-repo"), - tb.PipelineTaskOutputResource("image-to-use", "best-image"), - tb.PipelineTaskOutputResource("workspace", "git-repo"), - ), - ), - ), + moreFunParam := v1beta1.Param{ + Name: "bar", + Value: *v1beta1.NewArrayOrString("$(params.bar)"), + } + templatedParam := v1beta1.Param{ + Name: "templatedparam", + Value: *v1beta1.NewArrayOrString("$(inputs.workspace.$(params.rev-param))"), + } + contextRunParam := v1beta1.Param{ + Name: "contextRunParam", + Value: *v1beta1.NewArrayOrString("$(context.pipelineRun.name)"), + } + contextPipelineParam := v1beta1.Param{ + Name: "contextPipelineParam", + Value: *v1beta1.NewArrayOrString("$(context.pipeline.name)"), } + retriesParam := v1beta1.Param{ + Name: "contextRetriesParam", + Value: *v1beta1.NewArrayOrString("$(context.pipelineTask.retries)"), + } + const pipelineName = "test-pipeline" + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta(pipelineName, "foo"), + Spec: v1beta1.PipelineSpec{ + Resources: []v1beta1.PipelineDeclaredResource{ + { + Name: "git-repo", + Type: resourcev1alpha1.PipelineResourceTypeGit, + }, + { + Name: "best-image", + Type: resourcev1alpha1.PipelineResourceTypeImage, + }, + }, + Params: []v1beta1.ParamSpec{ + { + Name: "pipeline-param", + Type: v1beta1.ParamTypeString, + Default: v1beta1.NewArrayOrString("somethingdifferent"), + }, + { + Name: "rev-param", + Type: v1beta1.ParamTypeString, + Default: v1beta1.NewArrayOrString("revision"), + }, + { + Name: "bar", + Type: v1beta1.ParamTypeString, + }, + }, + Tasks: []v1beta1.PipelineTask{ + { + // unit-test-3 uses runAfter to indicate it should run last + Name: "unit-test-3", + TaskRef: &v1beta1.TaskRef{ + Name: "unit-test-task", + }, + Params: []v1beta1.Param{funParam, moreFunParam, templatedParam, contextRunParam, contextPipelineParam, retriesParam}, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "workspace", + Resource: "git-repo", + }}, + Outputs: []v1beta1.PipelineTaskOutputResource{ + { + Name: "image-to-use", + Resource: "best-image", + }, + { + Name: "workspace", + Resource: "git-repo", + }, + }, + }, + RunAfter: []string{"unit-test-2"}, + }, + { + // unit-test-1 can run right away because it has no dependencies + Name: "unit-test-1", + TaskRef: &v1beta1.TaskRef{ + Name: "unit-test-task", + }, + Params: []v1beta1.Param{funParam, moreFunParam, templatedParam, contextRunParam, contextPipelineParam, retriesParam}, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "workspace", + Resource: "git-repo", + }}, + Outputs: []v1beta1.PipelineTaskOutputResource{ + { + Name: "image-to-use", + Resource: "best-image", + }, + { + Name: "workspace", + Resource: "git-repo", + }, + }, + }, + Retries: 5, + }, + { + Name: "unit-test-2", + TaskRef: &v1beta1.TaskRef{ + Name: "unit-test-followup-task", + }, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "workspace", + Resource: "git-repo", + From: []string{"unit-test-1"}, + }}, + }, + }, + { + Name: "unit-test-cluster-task", + TaskRef: &v1beta1.TaskRef{ + Name: "unit-test-cluster-task", + Kind: v1beta1.ClusterTaskKind, + }, + Params: []v1beta1.Param{funParam, moreFunParam, templatedParam, contextRunParam, contextPipelineParam}, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "workspace", + Resource: "git-repo", + }}, + Outputs: []v1beta1.PipelineTaskOutputResource{ + { + Name: "image-to-use", + Resource: "best-image", + }, + { + Name: "workspace", + Resource: "git-repo", + }, + }, + }, + }, + }, + }, + }} ts := []*v1beta1.Task{ - tb.Task("unit-test-task", tb.TaskSpec( - tb.TaskParam("foo", v1beta1.ParamTypeString), tb.TaskParam("bar", v1beta1.ParamTypeString), tb.TaskParam("templatedparam", v1beta1.ParamTypeString), - tb.TaskParam("contextRunParam", v1beta1.ParamTypeString), tb.TaskParam("contextPipelineParam", v1beta1.ParamTypeString), tb.TaskParam("contextRetriesParam", v1beta1.ParamTypeString), - tb.TaskResources( - tb.TaskResourcesInput("workspace", resourcev1alpha1.PipelineResourceTypeGit), - tb.TaskResourcesOutput("image-to-use", resourcev1alpha1.PipelineResourceTypeImage), - tb.TaskResourcesOutput("workspace", resourcev1alpha1.PipelineResourceTypeGit), - ), - ), tb.TaskNamespace("foo")), - tb.Task("unit-test-followup-task", tb.TaskSpec( - tb.TaskResources(tb.TaskResourcesInput("workspace", resourcev1alpha1.PipelineResourceTypeGit)), - ), tb.TaskNamespace("foo")), + { + ObjectMeta: baseObjectMeta("unit-test-task", "foo"), + Spec: v1beta1.TaskSpec{ + Params: []v1beta1.ParamSpec{ + { + Name: "foo", + Type: v1beta1.ParamTypeString, + }, + { + Name: "bar", + Type: v1beta1.ParamTypeString, + }, + { + Name: "templatedparam", + Type: v1beta1.ParamTypeString, + }, + { + Name: "contextRunParam", + Type: v1beta1.ParamTypeString, + }, + { + Name: "contextPipelineParam", + Type: v1beta1.ParamTypeString, + }, + { + Name: "contextRetriesParam", + Type: v1beta1.ParamTypeString, + }, + }, + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "workspace", + Type: v1beta1.PipelineResourceTypeGit, + }, + }}, + Outputs: []v1beta1.TaskResource{ + { + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "image-to-use", + Type: v1beta1.PipelineResourceTypeImage, + }, + }, + { + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "workspace", + Type: v1beta1.PipelineResourceTypeGit, + }, + }, + }, + }, + }, + }, + { + ObjectMeta: baseObjectMeta("unit-test-followup-task", "foo"), + Spec: v1beta1.TaskSpec{ + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "workspace", + Type: v1beta1.PipelineResourceTypeGit, + }, + }}, + }, + }, + }, } clusterTasks := []*v1beta1.ClusterTask{ - tb.ClusterTask("unit-test-cluster-task", tb.ClusterTaskSpec( - tb.TaskParam("foo", v1beta1.ParamTypeString), tb.TaskParam("bar", v1beta1.ParamTypeString), tb.TaskParam("templatedparam", v1beta1.ParamTypeString), - tb.TaskParam("contextRunParam", v1beta1.ParamTypeString), tb.TaskParam("contextPipelineParam", v1beta1.ParamTypeString), - tb.TaskResources( - tb.TaskResourcesInput("workspace", resourcev1alpha1.PipelineResourceTypeGit), - tb.TaskResourcesOutput("image-to-use", resourcev1alpha1.PipelineResourceTypeImage), - tb.TaskResourcesOutput("workspace", resourcev1alpha1.PipelineResourceTypeGit), - ), - )), - tb.ClusterTask("unit-test-followup-task", tb.ClusterTaskSpec( - tb.TaskResources(tb.TaskResourcesInput("workspace", resourcev1alpha1.PipelineResourceTypeGit)), - )), - } - rs := []*resourcev1alpha1.PipelineResource{ - tb.PipelineResource("some-repo", tb.PipelineResourceNamespace("foo"), tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("url", "https://github.com/kristoff/reindeer"), - )), + { + ObjectMeta: metav1.ObjectMeta{Name: "unit-test-cluster-task"}, + Spec: v1beta1.TaskSpec{ + Params: []v1beta1.ParamSpec{ + { + Name: "foo", + Type: v1beta1.ParamTypeString, + }, + { + Name: "bar", + Type: v1beta1.ParamTypeString, + }, + { + Name: "templatedparam", + Type: v1beta1.ParamTypeString, + }, + { + Name: "contextRunParam", + Type: v1beta1.ParamTypeString, + }, + { + Name: "contextPipelineParam", + Type: v1beta1.ParamTypeString, + }, + }, + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "workspace", + Type: v1beta1.PipelineResourceTypeGit, + }, + }}, + Outputs: []v1beta1.TaskResource{ + { + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "image-to-use", + Type: v1beta1.PipelineResourceTypeImage, + }, + }, + { + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "workspace", + Type: v1beta1.PipelineResourceTypeGit, + }, + }, + }, + }, + }, + }, + { + ObjectMeta: metav1.ObjectMeta{Name: "unit-test-followup-task"}, + Spec: v1beta1.TaskSpec{ + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "workspace", + Type: v1beta1.PipelineResourceTypeGit, + }, + }}, + }, + }, + }, } + rs := []*resourcev1alpha1.PipelineResource{{ + ObjectMeta: baseObjectMeta("some-repo", "foo"), + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{{ + Name: "url", + Value: "https://github.com/kristoff/reindeer", + }}, + }, + }} // When PipelineResources are created in the cluster, Kubernetes will add a SelfLink. We // are using this to differentiate between Resources that we are referencing by Spec or by Ref @@ -412,45 +642,76 @@ func TestReconcile(t *testing.T) { // Check that the expected TaskRun was created actual := getTaskRunCreations(t, actions)[0] - expectedTaskRun := tb.TaskRun("test-pipeline-run-success-unit-test-1-mz4c7", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run-success", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel("tekton.dev/pipeline", "test-pipeline"), - tb.TaskRunLabel("tekton.dev/pipelineRun", "test-pipeline-run-success"), - tb.TaskRunLabel(pipeline.PipelineTaskLabelKey, "unit-test-1"), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineTasks), - tb.TaskRunSpec( - tb.TaskRunTaskRef("unit-test-task"), - tb.TaskRunServiceAccountName("test-sa"), - tb.TaskRunParam("foo", "somethingfun"), - tb.TaskRunParam("bar", "somethingmorefun"), - tb.TaskRunParam("templatedparam", "$(inputs.workspace.revision)"), - tb.TaskRunParam("contextRunParam", pipelineRunName), - tb.TaskRunParam("contextPipelineParam", pipelineName), - tb.TaskRunParam("contextRetriesParam", "5"), - tb.TaskRunResources( - tb.TaskRunResourcesInput("workspace", tb.TaskResourceBindingRef("some-repo")), - tb.TaskRunResourcesOutput("image-to-use", - tb.TaskResourceBindingResourceSpec( - &resourcev1alpha1.PipelineResourceSpec{ - Type: resourcev1alpha1.PipelineResourceTypeImage, - Params: []resourcev1alpha1.ResourceParam{{ - Name: "url", - Value: "gcr.io/sven", - }}, + expectedTaskRun := &v1beta1.TaskRun{ + ObjectMeta: taskRunObjectMeta("test-pipeline-run-success-unit-test-1-mz4c7", "foo", "test-pipeline-run-success", "test-pipeline", "unit-test-1", false), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "unit-test-task", + }, + ServiceAccountName: "test-sa", + Params: []v1beta1.Param{ + { + Name: "foo", + Value: *v1beta1.NewArrayOrString("somethingfun"), + }, + { + Name: "bar", + Value: *v1beta1.NewArrayOrString("somethingmorefun"), + }, + { + Name: "templatedparam", + Value: *v1beta1.NewArrayOrString("$(inputs.workspace.revision)"), + }, + { + Name: "contextRunParam", + Value: *v1beta1.NewArrayOrString(pipelineRunName), + }, + { + Name: "contextPipelineParam", + Value: *v1beta1.NewArrayOrString(pipelineName), + }, + { + Name: "contextRetriesParam", + Value: *v1beta1.NewArrayOrString("5"), + }, + }, + Resources: &v1beta1.TaskRunResources{ + Inputs: []v1beta1.TaskResourceBinding{{ + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: "workspace", + ResourceRef: &v1beta1.PipelineResourceRef{ + Name: "some-repo", }, - ), - tb.TaskResourceBindingPaths("/pvc/unit-test-1/image-to-use"), - ), - tb.TaskRunResourcesOutput("workspace", tb.TaskResourceBindingRef("some-repo"), - tb.TaskResourceBindingPaths("/pvc/unit-test-1/workspace"), - ), - ), - ), - ) + }, + }}, + Outputs: []v1beta1.TaskResourceBinding{ + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: "image-to-use", + ResourceSpec: &resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeImage, + Params: []resourcev1alpha1.ResourceParam{{ + Name: "url", + Value: "gcr.io/sven", + }}, + }, + }, + Paths: []string{"/pvc/unit-test-1/image-to-use"}, + }, + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: "workspace", + ResourceRef: &v1beta1.PipelineResourceRef{ + Name: "some-repo", + }, + }, + Paths: []string{"/pvc/unit-test-1/workspace"}, + }, + }, + }, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + } // ignore IgnoreUnexported ignore both after and before steps fields if d := cmp.Diff(expectedTaskRun, actual, cmpopts.SortSlices(func(x, y v1beta1.TaskResourceBinding) bool { return x.Name < y.Name })); d != "" { @@ -751,24 +1012,29 @@ func TestReconcile_PipelineSpecTaskSpec(t *testing.T) { // It verifies that a TaskRun is created, it checks the resulting API actions, status and events. names.TestingSeed() - prs := []*v1beta1.PipelineRun{ - tb.PipelineRun("test-pipeline-run-success", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline"), - ), - } - ps := []*v1beta1.Pipeline{ - tb.Pipeline("test-pipeline", - tb.PipelineNamespace("foo"), - tb.PipelineSpec( - tb.PipelineTask("unit-test-task-spec", "", tb.PipelineTaskSpec(v1beta1.TaskSpec{ - Steps: []v1beta1.Step{{Container: corev1.Container{ - Name: "mystep", - Image: "myimage"}}}, - })), - ), - ), - } + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-success", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{ + Name: "test-pipeline", + }, + }, + }} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "unit-test-task-spec", + TaskSpec: &v1beta1.EmbeddedTask{ + TaskSpec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{Container: corev1.Container{ + Name: "mystep", + Image: "myimage"}}}, + }, + }, + }}, + }, + }} d := test.Data{ PipelineRuns: prs, @@ -790,19 +1056,22 @@ func TestReconcile_PipelineSpecTaskSpec(t *testing.T) { // Check that the expected TaskRun was created actual := getTaskRunCreations(t, actions)[0] - expectedTaskRun := tb.TaskRun("test-pipeline-run-success-unit-test-task-spec-9l9zj", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run-success", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel("tekton.dev/pipeline", "test-pipeline"), - tb.TaskRunLabel("tekton.dev/pipelineRun", "test-pipeline-run-success"), - tb.TaskRunLabel(pipeline.PipelineTaskLabelKey, "unit-test-task-spec"), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineTasks), - tb.TaskRunSpec(tb.TaskRunTaskSpec(tb.Step("myimage", tb.StepName("mystep"))), - tb.TaskRunServiceAccountName(config.DefaultServiceAccountValue)), - ) + expectedTaskRun := &v1beta1.TaskRun{ + ObjectMeta: taskRunObjectMeta("test-pipeline-run-success-unit-test-task-spec-9l9zj", "foo", "test-pipeline-run-success", "test-pipeline", "unit-test-task-spec", false), + Spec: v1beta1.TaskRunSpec{ + TaskSpec: &v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Name: "mystep", + Image: "myimage", + }, + }}, + }, + ServiceAccountName: config.DefaultServiceAccountValue, + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + } // ignore IgnoreUnexported ignore both after and before steps fields if d := cmp.Diff(expectedTaskRun, actual, cmpopts.SortSlices(func(x, y v1beta1.TaskSpec) bool { return len(x.Steps) == len(y.Steps) })); d != "" { @@ -823,60 +1092,160 @@ func TestReconcile_PipelineSpecTaskSpec(t *testing.T) { } } +func getInvalidPipelineRun(prName, pName string) *v1beta1.PipelineRun { + return &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: pName}, + }, + } +} + // TestReconcile_InvalidPipelineRuns runs "Reconcile" on several PipelineRuns that are invalid in different ways. // It verifies that reconcile fails, how it fails and which events are triggered. func TestReconcile_InvalidPipelineRuns(t *testing.T) { ts := []*v1beta1.Task{ - tb.Task("a-task-that-exists", tb.TaskNamespace("foo")), - tb.Task("a-task-that-needs-params", tb.TaskSpec( - tb.TaskParam("some-param", v1beta1.ParamTypeString), - ), tb.TaskNamespace("foo")), - tb.Task("a-task-that-needs-array-params", tb.TaskSpec( - tb.TaskParam("some-param", v1beta1.ParamTypeArray), - ), tb.TaskNamespace("foo")), - tb.Task("a-task-that-needs-a-resource", tb.TaskSpec( - tb.TaskResources(tb.TaskResourcesInput("workspace", "git")), - ), tb.TaskNamespace("foo")), + { + ObjectMeta: baseObjectMeta("a-task-that-exists", "foo"), + }, + { + ObjectMeta: baseObjectMeta("a-task-that-needs-params", "foo"), + Spec: v1beta1.TaskSpec{ + Params: []v1beta1.ParamSpec{{ + Name: "some-param", + Type: v1beta1.ParamTypeString, + }}, + }, + }, + { + ObjectMeta: baseObjectMeta("a-task-that-needs-array-params", "foo"), + Spec: v1beta1.TaskSpec{ + Params: []v1beta1.ParamSpec{{ + Name: "some-param", + Type: v1beta1.ParamTypeArray, + }}, + }, + }, + { + ObjectMeta: baseObjectMeta("a-task-that-needs-a-resource", "foo"), + Spec: v1beta1.TaskSpec{ + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "workspace", + Type: resourcev1alpha1.PipelineResourceTypeGit, + }, + }}, + }, + }, + }, } ps := []*v1beta1.Pipeline{ - tb.Pipeline("pipeline-missing-tasks", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("myspecialtask", "sometask"), - )), - tb.Pipeline("a-pipeline-without-params", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("some-task", "a-task-that-needs-params"))), - tb.Pipeline("a-fine-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineDeclaredResource("a-resource", resourcev1alpha1.PipelineResourceTypeGit), - tb.PipelineTask("some-task", "a-task-that-exists", - tb.PipelineTaskInputResource("needed-resource", "a-resource")))), - tb.Pipeline("a-pipeline-that-should-be-caught-by-admission-control", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("some-task", "a-task-that-exists", - tb.PipelineTaskInputResource("needed-resource", "a-resource")))), - tb.Pipeline("a-pipeline-with-array-params", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineParamSpec("some-param", v1beta1.ParamTypeArray), - tb.PipelineTask("some-task", "a-task-that-needs-array-params"))), - tb.Pipeline("a-pipeline-with-missing-conditions", tb.PipelineNamespace("foo"), tb.PipelineSpec(tb.PipelineTask("some-task", "a-task-that-exists", tb.PipelineTaskCondition("condition-does-not-exist")))), - } - - for _, tc := range []struct { - name string - pipelineRun *v1beta1.PipelineRun - reason string - hasNoDefaultLabels bool - permanentError bool - wantEvents []string - }{{ - name: "invalid-pipeline-shd-be-stop-reconciling", - pipelineRun: tb.PipelineRun("invalid-pipeline", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("pipeline-not-exist")), - reason: ReasonCouldntGetPipeline, - hasNoDefaultLabels: true, - permanentError: true, - wantEvents: []string{ - "Normal Started", - "Warning Failed Error retrieving pipeline for pipelinerun", + { + ObjectMeta: baseObjectMeta("pipeline-missing-tasks", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "myspecialtask", + TaskRef: &v1beta1.TaskRef{Name: "sometask"}, + }}, + }, + }, + { + ObjectMeta: baseObjectMeta("a-pipeline-without-params", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "some-task", + TaskRef: &v1beta1.TaskRef{Name: "a-task-that-needs-params"}, + }}, + }, + }, + { + ObjectMeta: baseObjectMeta("a-fine-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "some-task", + TaskRef: &v1beta1.TaskRef{Name: "a-task-that-exists"}, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "needed-resource", + Resource: "a-resource", + }}, + }, + }}, + Resources: []v1beta1.PipelineDeclaredResource{{ + Name: "a-resource", + Type: resourcev1alpha1.PipelineResourceTypeGit, + }}, + }, + }, + { + ObjectMeta: baseObjectMeta("a-pipeline-that-should-be-caught-by-admission-control", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "some-task", + TaskRef: &v1beta1.TaskRef{ + Name: "a-task-that-exists", + }, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "needed-resource", + Resource: "a-resource", + }}, + }, + }}, + }, + }, + { + ObjectMeta: baseObjectMeta("a-pipeline-with-array-params", "foo"), + Spec: v1beta1.PipelineSpec{ + Params: []v1beta1.ParamSpec{{ + Name: "some-param", + Type: v1beta1.ParamTypeArray, + }}, + Tasks: []v1beta1.PipelineTask{{ + Name: "some-task", + TaskRef: &v1beta1.TaskRef{ + Name: "a-task-that-needs-array-params", + }, + }}, + }, + }, + { + ObjectMeta: baseObjectMeta("a-pipeline-with-missing-conditions", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "some-task", + TaskRef: &v1beta1.TaskRef{ + Name: "a-task-that-exists", + }, + Conditions: []v1beta1.PipelineTaskCondition{{ + ConditionRef: "condition-does-not-exist", + }}, + }}, + }, + }, + } + + for _, tc := range []struct { + name string + pipelineRun *v1beta1.PipelineRun + reason string + hasNoDefaultLabels bool + permanentError bool + wantEvents []string + }{{ + name: "invalid-pipeline-shd-be-stop-reconciling", + pipelineRun: getInvalidPipelineRun("invalid-pipeline", "pipeline-not-exist"), + reason: ReasonCouldntGetPipeline, + hasNoDefaultLabels: true, + permanentError: true, + wantEvents: []string{ + "Normal Started", + "Warning Failed Error retrieving pipeline for pipelinerun", }, }, { name: "invalid-pipeline-run-missing-tasks-shd-stop-reconciling", - pipelineRun: tb.PipelineRun("pipelinerun-missing-tasks", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("pipeline-missing-tasks")), + pipelineRun: getInvalidPipelineRun("pipelinerun-missing-tasks", "pipeline-missing-tasks"), reason: ReasonCouldntGetTask, permanentError: true, wantEvents: []string{ @@ -885,7 +1254,7 @@ func TestReconcile_InvalidPipelineRuns(t *testing.T) { }, }, { name: "invalid-pipeline-run-params-dont-exist-shd-stop-reconciling", - pipelineRun: tb.PipelineRun("pipeline-params-dont-exist", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("a-pipeline-without-params")), + pipelineRun: getInvalidPipelineRun("pipeline-params-dont-exist", "a-pipeline-without-params"), reason: ReasonFailedValidation, permanentError: true, wantEvents: []string{ @@ -894,7 +1263,7 @@ func TestReconcile_InvalidPipelineRuns(t *testing.T) { }, }, { name: "invalid-pipeline-run-resources-not-bound-shd-stop-reconciling", - pipelineRun: tb.PipelineRun("pipeline-resources-not-bound", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("a-fine-pipeline")), + pipelineRun: getInvalidPipelineRun("pipeline-resources-not-bound", "a-fine-pipeline"), reason: ReasonInvalidBindings, permanentError: true, wantEvents: []string{ @@ -903,8 +1272,16 @@ func TestReconcile_InvalidPipelineRuns(t *testing.T) { }, }, { name: "invalid-pipeline-run-missing-resource-shd-stop-reconciling", - pipelineRun: tb.PipelineRun("pipeline-resources-dont-exist", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("a-fine-pipeline", - tb.PipelineRunResourceBinding("a-resource", tb.PipelineResourceBindingRef("missing-resource")))), + pipelineRun: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta("pipeline-resources-dont-exist", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "a-fine-pipeline"}, + Resources: []v1beta1.PipelineResourceBinding{{ + Name: "a-resource", + ResourceRef: &v1beta1.PipelineResourceRef{Name: "missing-resource"}, + }}, + }, + }, reason: ReasonCouldntGetResource, permanentError: true, wantEvents: []string{ @@ -913,7 +1290,7 @@ func TestReconcile_InvalidPipelineRuns(t *testing.T) { }, }, { name: "invalid-pipeline-missing-declared-resource-shd-stop-reconciling", - pipelineRun: tb.PipelineRun("pipeline-resources-not-declared", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("a-pipeline-that-should-be-caught-by-admission-control")), + pipelineRun: getInvalidPipelineRun("pipeline-resources-not-declared", "a-pipeline-that-should-be-caught-by-admission-control"), reason: ReasonFailedValidation, permanentError: true, wantEvents: []string{ @@ -921,8 +1298,17 @@ func TestReconcile_InvalidPipelineRuns(t *testing.T) { "Warning Failed Pipeline foo/a-pipeline-that-should-be-caught-by-admission-control can't be Run; it has an invalid spec", }, }, { - name: "invalid-pipeline-mismatching-parameter-types", - pipelineRun: tb.PipelineRun("pipeline-mismatching-param-type", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("a-pipeline-with-array-params", tb.PipelineRunParam("some-param", "stringval"))), + name: "invalid-pipeline-mismatching-parameter-types", + pipelineRun: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta("pipeline-mismatching-param-type", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "a-pipeline-with-array-params"}, + Params: []v1beta1.Param{{ + Name: "some-param", + Value: *v1beta1.NewArrayOrString("stringval"), + }}, + }, + }, reason: ReasonParameterTypeMismatch, permanentError: true, wantEvents: []string{ @@ -931,7 +1317,7 @@ func TestReconcile_InvalidPipelineRuns(t *testing.T) { }, }, { name: "invalid-pipeline-missing-conditions-shd-stop-reconciling", - pipelineRun: tb.PipelineRun("pipeline-conditions-missing", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("a-pipeline-with-missing-conditions")), + pipelineRun: getInvalidPipelineRun("pipeline-conditions-missing", "a-pipeline-with-missing-conditions"), reason: ReasonCouldntGetCondition, permanentError: true, wantEvents: []string{ @@ -940,10 +1326,21 @@ func TestReconcile_InvalidPipelineRuns(t *testing.T) { }, }, { name: "invalid-embedded-pipeline-resources-bot-bound-shd-stop-reconciling", - pipelineRun: tb.PipelineRun("embedded-pipeline-resources-not-bound", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("", tb.PipelineRunPipelineSpec( - tb.PipelineTask("some-task", "a-task-that-needs-a-resource"), - tb.PipelineDeclaredResource("workspace", "git"), - ))), + pipelineRun: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta("embedded-pipeline-resources-not-bound", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineSpec: &v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "some-task", + TaskRef: &v1beta1.TaskRef{Name: "a-task-that-needs-a-resource"}, + }}, + Resources: []v1beta1.PipelineDeclaredResource{{ + Name: "workspace", + Type: resourcev1alpha1.PipelineResourceTypeGit, + }}, + }, + }, + }, reason: ReasonInvalidBindings, permanentError: true, wantEvents: []string{ @@ -952,9 +1349,17 @@ func TestReconcile_InvalidPipelineRuns(t *testing.T) { }, }, { name: "invalid-embedded-pipeline-bad-name-shd-stop-reconciling", - pipelineRun: tb.PipelineRun("embedded-pipeline-invalid", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("", tb.PipelineRunPipelineSpec( - tb.PipelineTask("bad-t@$k", "b@d-t@$k"), - ))), + pipelineRun: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta("embedded-pipeline-invalid", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineSpec: &v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "bad-t@$k", + TaskRef: &v1beta1.TaskRef{Name: "b@d-t@$k"}, + }}, + }, + }, + }, reason: ReasonFailedValidation, permanentError: true, wantEvents: []string{ @@ -963,11 +1368,25 @@ func TestReconcile_InvalidPipelineRuns(t *testing.T) { }, }, { name: "invalid-embedded-pipeline-mismatching-parameter-types", - pipelineRun: tb.PipelineRun("embedded-pipeline-mismatching-param-type", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("", tb.PipelineRunPipelineSpec( - tb.PipelineParamSpec("some-param", v1beta1.ParamTypeArray), - tb.PipelineTask("some-task", "a-task-that-needs-array-params")), - tb.PipelineRunParam("some-param", "stringval"), - )), + pipelineRun: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta("embedded-pipeline-mismatching-param-type", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineSpec: &v1beta1.PipelineSpec{ + Params: []v1beta1.ParamSpec{{ + Name: "some-param", + Type: v1beta1.ParamTypeArray, + }}, + Tasks: []v1beta1.PipelineTask{{ + Name: "some-task", + TaskRef: &v1beta1.TaskRef{Name: "a-task-that-needs-array-params"}, + }}, + }, + Params: []v1beta1.Param{{ + Name: "some-param", + Value: *v1beta1.NewArrayOrString("stringval"), + }}, + }, + }, reason: ReasonParameterTypeMismatch, permanentError: true, wantEvents: []string{ @@ -976,10 +1395,21 @@ func TestReconcile_InvalidPipelineRuns(t *testing.T) { }, }, { name: "invalid-pipeline-run-missing-params-shd-stop-reconciling", - pipelineRun: tb.PipelineRun("pipelinerun-missing-params", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("", tb.PipelineRunPipelineSpec( - tb.PipelineParamSpec("some-param", v1beta1.ParamTypeString), - tb.PipelineTask("some-task", "a-task-that-needs-params")), - )), + pipelineRun: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta("pipelinerun-missing-params", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineSpec: &v1beta1.PipelineSpec{ + Params: []v1beta1.ParamSpec{{ + Name: "some-param", + Type: v1beta1.ParamTypeString, + }}, + Tasks: []v1beta1.PipelineTask{{ + Name: "some-task", + TaskRef: &v1beta1.TaskRef{Name: "a-task-that-needs-params"}, + }}, + }, + }, + }, reason: ReasonParameterMissing, permanentError: true, wantEvents: []string{ @@ -988,9 +1418,18 @@ func TestReconcile_InvalidPipelineRuns(t *testing.T) { }, }, { name: "invalid-pipeline-with-invalid-dag-graph", - pipelineRun: tb.PipelineRun("pipeline-invalid-dag-graph", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("", tb.PipelineRunPipelineSpec( - tb.PipelineTask("dag-task-1", "dag-task-1", tb.RunAfter("dag-task-1")), - ))), + pipelineRun: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta("pipeline-invalid-dag-graph", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineSpec: &v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "dag-task-1", + TaskRef: &v1beta1.TaskRef{Name: "dag-task-1"}, + RunAfter: []string{"dag-task-1"}, + }}, + }, + }, + }, reason: ReasonInvalidGraph, permanentError: true, wantEvents: []string{ @@ -999,10 +1438,27 @@ func TestReconcile_InvalidPipelineRuns(t *testing.T) { }, }, { name: "invalid-pipeline-with-invalid-final-tasks-graph", - pipelineRun: tb.PipelineRun("pipeline-invalid-final-graph", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("", tb.PipelineRunPipelineSpec( - tb.PipelineTask("dag-task-1", "taskName"), - tb.FinalPipelineTask("final-task-1", "taskName"), - tb.FinalPipelineTask("final-task-1", "taskName")))), + pipelineRun: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta("pipeline-invalid-final-graph", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineSpec: &v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "dag-task-1", + TaskRef: &v1beta1.TaskRef{Name: "taskName"}, + }}, + Finally: []v1beta1.PipelineTask{ + { + Name: "final-task-1", + TaskRef: &v1beta1.TaskRef{Name: "taskName"}, + }, + { + Name: "final-task-1", + TaskRef: &v1beta1.TaskRef{Name: "taskName"}, + }, + }, + }, + }, + }, reason: ReasonInvalidGraph, permanentError: true, wantEvents: []string{ @@ -1097,7 +1553,12 @@ func TestReconcile_InvalidPipelineRunNames(t *testing.T) { func TestUpdateTaskRunsState(t *testing.T) { // TestUpdateTaskRunsState runs "getTaskRunsStatus" and verifies how it updates a PipelineRun status // from a TaskRun associated to the PipelineRun - pr := tb.PipelineRun("test-pipeline-run", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("test-pipeline")) + pr := &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta("test-pipeline-run", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + }, + } pipelineTask := v1beta1.PipelineTask{ Name: "unit-test-1", WhenExpressions: []v1beta1.WhenExpression{{ @@ -1107,18 +1568,44 @@ func TestUpdateTaskRunsState(t *testing.T) { }}, TaskRef: &v1beta1.TaskRef{Name: "unit-test-task"}, } - task := tb.Task("unit-test-task", tb.TaskSpec( - tb.TaskResources(tb.TaskResourcesInput("workspace", resourcev1alpha1.PipelineResourceTypeGit)), - ), tb.TaskNamespace("foo")) - taskrun := tb.TaskRun("test-pipeline-run-success-unit-test-1", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("unit-test-task"), - tb.TaskRunServiceAccountName("test-sa"), - ), tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{Type: apis.ConditionSucceeded}), - tb.StepState(tb.StateTerminated(0)), - )) + task := &v1beta1.Task{ + ObjectMeta: baseObjectMeta("unit-test-task", "foo"), + Spec: v1beta1.TaskSpec{ + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "workspace", + Type: resourcev1alpha1.PipelineResourceTypeGit, + }, + }}, + }, + }, + } + taskrun := &v1beta1.TaskRun{ + ObjectMeta: baseObjectMeta("test-pipeline-run-success-unit-test-1", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{Name: "unit-test-task"}, + ServiceAccountName: "test-sa", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + Steps: []v1beta1.StepState{{ + ContainerState: corev1.ContainerState{ + Terminated: &corev1.ContainerStateTerminated{ExitCode: int32(0)}, + }, + }}, + }, + }, + } expectedTaskRunsStatus := make(map[string]*v1beta1.PipelineRunTaskRunStatus) expectedTaskRunsStatus["test-pipeline-run-success-unit-test-1"] = &v1beta1.PipelineRunTaskRunStatus{ @@ -1165,7 +1652,12 @@ func TestUpdateTaskRunsState(t *testing.T) { func TestUpdateRunsState(t *testing.T) { // TestUpdateRunsState runs "getRunsStatus" and verifies how it updates a PipelineRun status // from a Run associated to the PipelineRun - pr := tb.PipelineRun("test-pipeline-run", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("test-pipeline")) + pr := &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta("test-pipeline-run", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + }, + } pipelineTask := v1beta1.PipelineTask{ Name: "unit-test-1", WhenExpressions: []v1beta1.WhenExpression{{ @@ -1264,24 +1756,46 @@ func TestUpdateTaskRunStateWithConditionChecks(t *testing.T) { }}, } - successConditionCheck := conditionCheckFromTaskRun(tb.TaskRun(successConditionCheckName, - tb.TaskRunNamespace("foo"), - tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionTrue, - }), - tb.StepState(tb.StateTerminated(0)), - ))) - failingConditionCheck := conditionCheckFromTaskRun(tb.TaskRun(failingConditionCheckName, - tb.TaskRunNamespace("foo"), - tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionFalse, - }), - tb.StepState(tb.StateTerminated(127)), - ))) + successConditionCheck := conditionCheckFromTaskRun(&v1beta1.TaskRun{ + ObjectMeta: baseObjectMeta(successConditionCheckName, "foo"), + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionTrue, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + Steps: []v1beta1.StepState{{ + ContainerState: corev1.ContainerState{ + Terminated: &corev1.ContainerStateTerminated{ExitCode: int32(0)}, + }, + }}, + }, + }, + }) + failingConditionCheck := conditionCheckFromTaskRun(&v1beta1.TaskRun{ + ObjectMeta: baseObjectMeta(failingConditionCheckName, "foo"), + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionFalse, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + Steps: []v1beta1.StepState{{ + ContainerState: corev1.ContainerState{ + Terminated: &corev1.ContainerStateTerminated{ExitCode: int32(127)}, + }, + }}, + }, + }, + }) successrcc := resources.ResolvedConditionCheck{ ConditionRegisterName: successCondition.Name + "-0", @@ -1369,7 +1883,12 @@ func TestUpdateTaskRunStateWithConditionChecks(t *testing.T) { for _, tc := range tcs { t.Run(tc.name, func(t *testing.T) { - pr := tb.PipelineRun("test-pipeline-run", tb.PipelineRunNamespace("foo"), tb.PipelineRunSpec("test-pipeline")) + pr := &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta("test-pipeline-run", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + }, + } state := resources.PipelineRunState{{ PipelineTask: &pipelineTask, @@ -1394,38 +1913,40 @@ func TestReconcileOnCompletedPipelineRun(t *testing.T) { // in the PipelineRun status, that the completion status is not altered, that not error is returned and // a successful event is triggered taskRunName := "test-pipeline-run-completed-hello-world" - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-completed", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", tb.PipelineRunServiceAccountName("test-sa")), - tb.PipelineRunStatus(tb.PipelineRunStatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionTrue, - Reason: v1beta1.PipelineRunReasonSuccessful.String(), - Message: "All Tasks have completed executing", - }), - tb.PipelineRunTaskRunsStatus(taskRunName, &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: "hello-world-1", - Status: &v1beta1.TaskRunStatus{}, - }), - ), - )} - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world")))} - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} - trs := []*v1beta1.TaskRun{ - tb.TaskRun(taskRunName, - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("kind", "name"), - tb.TaskRunLabel(pipeline.PipelineLabelKey, "test-pipeline-run-completed"), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, "test-pipeline"), - tb.TaskRunSpec(tb.TaskRunTaskRef("hello-world")), - tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - }), - ), - ), - } + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-completed", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + }, + Status: v1beta1.PipelineRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionTrue, + Reason: v1beta1.PipelineRunReasonSuccessful.String(), + Message: "All Tasks have completed executing", + }, + }, + }, + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ + taskRunName: { + PipelineTaskName: "hello-world-1", + Status: &v1beta1.TaskRunStatus{}, + }, + }, + }, + }, + }} + ps := []*v1beta1.Pipeline{simpleHelloWorldPipeline} + ts := []*v1beta1.Task{simpleHelloWorldTask} + trs := []*v1beta1.TaskRun{createHelloWorldTaskRunWithStatus(taskRunName, "foo", + "test-pipeline-run-completed", "test-pipeline", "", + apis.Condition{ + Type: apis.ConditionSucceeded, + })} d := test.Data{ PipelineRuns: prs, @@ -1489,28 +2010,11 @@ func TestReconcileOnCancelledPipelineRunDeprecated(t *testing.T) { // TestReconcileOnCancelledPipelineRunDeprecated runs "Reconcile" on a PipelineRun that has been cancelled. // It verifies that reconcile is successful, the pipeline status updated and events generated. // This test uses the deprecated status "PipelineRunCancelled" in PipelineRunSpec. - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-cancelled", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunCancelledDeprecated, - ), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - )} - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world"), - ))} - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} - trs := []*v1beta1.TaskRun{ - tb.TaskRun("test-pipeline-run-cancelled-hello-world", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("kind", "name"), - tb.TaskRunLabel(pipeline.PipelineLabelKey, "test-pipeline-run-cancelled"), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, "test-pipeline"), - tb.TaskRunSpec(tb.TaskRunTaskRef("hello-world"), - tb.TaskRunServiceAccountName("test-sa"), - ), - ), - } + prs := []*v1beta1.PipelineRun{createCancelledPipelineRun("test-pipeline-run-cancelled", v1beta1.PipelineRunSpecStatusCancelledDeprecated)} + ps := []*v1beta1.Pipeline{simpleHelloWorldPipeline} + ts := []*v1beta1.Task{simpleHelloWorldTask} + trs := []*v1beta1.TaskRun{createHelloWorldTaskRun("test-pipeline-run-cancelled-hello-world", "foo", + "test-pipeline-run-cancelled", "test-pipeline")} d := test.Data{ PipelineRuns: prs, @@ -1551,28 +2055,11 @@ func getConfigMapsWithEnabledAlphaAPIFields() []*corev1.ConfigMap { func TestReconcileOnCancelledPipelineRun(t *testing.T) { // TestReconcileOnCancelledPipelineRun runs "Reconcile" on a PipelineRun that has been cancelled. // It verifies that reconcile is successful, the pipeline status updated and events generated. - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-cancelled", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunCancelled, - ), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - )} - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world"), - ))} - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} - trs := []*v1beta1.TaskRun{ - tb.TaskRun("test-pipeline-run-cancelled-hello-world", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("kind", "name"), - tb.TaskRunLabel(pipeline.PipelineLabelKey, "test-pipeline-run-cancelled"), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, "test-pipeline"), - tb.TaskRunSpec(tb.TaskRunTaskRef("hello-world"), - tb.TaskRunServiceAccountName("test-sa"), - ), - ), - } + prs := []*v1beta1.PipelineRun{createCancelledPipelineRun("test-pipeline-run-cancelled", v1beta1.PipelineRunSpecStatusCancelled)} + ps := []*v1beta1.Pipeline{simpleHelloWorldPipeline} + ts := []*v1beta1.Task{simpleHelloWorldTask} + trs := []*v1beta1.TaskRun{createHelloWorldTaskRun("test-pipeline-run-cancelled-hello-world", "foo", + "test-pipeline-run-cancelled", "test-pipeline")} cms := getConfigMapsWithEnabledAlphaAPIFields() d := test.Data{ @@ -1605,16 +2092,25 @@ func TestReconcileForCustomTaskWithPipelineTaskTimedOut(t *testing.T) { // TestReconcileForCustomTaskWithPipelineTaskTimedOut runs "Reconcile" on a PipelineRun. // It verifies that reconcile is successful, and the individual // custom task which has timed out, is patched as cancelled. - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("test"), - tb.PipelineSpec(tb.PipelineTask("hello-world-1", "hello-world"))), - } + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "test"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }}, + }, + }} prName := "test-pipeline-run-custom-task-with-timeout" - prs := []*v1beta1.PipelineRun{tb.PipelineRun(prName, - tb.PipelineRunNamespace("test"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa"), - ), - )} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta(prName, "test"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + }, + }} ps[0].Spec.Tasks[0].TaskRef = &v1beta1.TaskRef{APIVersion: "example.dev/v0", Kind: "Example"} startedRun := &v1alpha1.Run{ ObjectMeta: metav1.ObjectMeta{ @@ -1711,23 +2207,30 @@ func TestReconcileForCustomTaskWithPipelineRunTimedOut(t *testing.T) { // PipelineRun that has timed out. // It verifies that reconcile is successful, and the custom task has also timed // out and patched as cancelled. - pipelineName := "test-pipeline" - ps := []*v1beta1.Pipeline{tb.Pipeline(pipelineName, - tb.PipelineNamespace("test"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world"), - ))} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "test"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{APIVersion: "example.dev/v0", Kind: "Example"}, + }}, + }, + }} prName := "test-pipeline-run-custom-task" - prs := []*v1beta1.PipelineRun{tb.PipelineRun(prName, - tb.PipelineRunNamespace("test"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunTimeout(12*time.Hour), - ), - tb.PipelineRunStatus( - tb.PipelineRunStartTime(time.Now().AddDate(0, 0, -1))), - )} - ps[0].Spec.Tasks[0].TaskRef = &v1beta1.TaskRef{APIVersion: "example.dev/v0", Kind: "Example"} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta(prName, "test"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + Timeout: &metav1.Duration{Duration: 12 * time.Hour}, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now().AddDate(0, 0, -1)}, + }, + }, + }} cms := []*corev1.ConfigMap{ { @@ -1806,22 +2309,30 @@ func TestReconcileForCustomTaskWithPipelineRunTimedOut(t *testing.T) { func TestReconcileOnCancelledRunFinallyPipelineRun(t *testing.T) { // TestReconcileOnCancelledRunFinallyPipelineRun runs "Reconcile" on a PipelineRun that has been gracefully cancelled. // It verifies that reconcile is successful, the pipeline status updated and events generated. - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-cancelled-run-finally", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunCancelledRunFinally, - ), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - )} - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world"), - tb.PipelineTask("hello-world-2", "hello-world", - tb.RunAfter("hello-world-1"), - ), - ))} - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} - cms := getConfigMapsWithEnabledAlphaAPIFields() - + prs := []*v1beta1.PipelineRun{createCancelledPipelineRun("test-pipeline-run-cancelled-run-finally", v1beta1.PipelineRunSpecStatusCancelledRunFinally)} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + { + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }, + { + Name: "hello-world-2", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + RunAfter: []string{"hello-world-1"}, + }, + }, + }, + }} + ts := []*v1beta1.Task{simpleHelloWorldTask} + cms := getConfigMapsWithEnabledAlphaAPIFields() + d := test.Data{ PipelineRuns: prs, Pipelines: ps, @@ -1865,23 +2376,36 @@ func TestReconcileOnCancelledRunFinallyPipelineRun(t *testing.T) { func TestReconcileOnCancelledRunFinallyPipelineRunWithFinalTask(t *testing.T) { // TestReconcileOnCancelledRunFinallyPipelineRunWithFinalTask runs "Reconcile" on a PipelineRun that has been gracefully cancelled. // It verifies that reconcile is successful, final tasks run, the pipeline status updated and events generated. - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-cancelled-run-finally", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunCancelledRunFinally, - ), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - )} - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world"), - tb.PipelineTask("hello-world-2", "hello-world", - tb.RunAfter("hello-world-1"), - ), - tb.FinalPipelineTask("final-task-1", "some-task"), - ))} + prs := []*v1beta1.PipelineRun{createCancelledPipelineRun("test-pipeline-run-cancelled-run-finally", v1beta1.PipelineRunSpecStatusCancelledRunFinally)} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + { + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }, + { + Name: "hello-world-2", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + RunAfter: []string{"hello-world-1"}, + }, + }, + Finally: []v1beta1.PipelineTask{{ + Name: "final-task-1", + TaskRef: &v1beta1.TaskRef{ + Name: "some-task", + }, + }}, + }, + }} ts := []*v1beta1.Task{ - tb.Task("hello-world", tb.TaskNamespace("foo")), - tb.Task("some-task", tb.TaskNamespace("foo")), + simpleHelloWorldTask, + simpleSomeTask, } cms := getConfigMapsWithEnabledAlphaAPIFields() @@ -1927,63 +2451,66 @@ func TestReconcileOnCancelledRunFinallyPipelineRunWithFinalTask(t *testing.T) { func TestReconcileOnCancelledRunFinallyPipelineRunWithRunningFinalTask(t *testing.T) { // TestReconcileOnCancelledRunFinallyPipelineRunWithRunningFinalTask runs "Reconcile" on a PipelineRun that has been gracefully cancelled. // It verifies that reconcile is successful and completed tasks and running final tasks are left untouched. - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-cancelled-run-finally", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunCancelledRunFinally, - ), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now()), - tb.PipelineRunTaskRunsStatus("test-pipeline-run-cancelled-run-finally-hello-world", &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: "hello-world-1", - Status: &v1beta1.TaskRunStatus{ - Status: duckv1beta1.Status{ - Conditions: []apis.Condition{{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionTrue, - }}, + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-cancelled-run-finally", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + Status: v1beta1.PipelineRunSpecStatusCancelledRunFinally, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ + "test-pipeline-run-cancelled-run-finally-hello-world": { + PipelineTaskName: "hello-world-1", + Status: &v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: []apis.Condition{{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionTrue, + }}, + }, + }, + }, + "test-pipeline-run-cancelled-run-finally-final-task": { + PipelineTaskName: "final-task-1", + Status: &v1beta1.TaskRunStatus{}, }, }, - }), - tb.PipelineRunTaskRunsStatus("test-pipeline-run-cancelled-run-finally-final-task", &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: "final-task-1", - Status: &v1beta1.TaskRunStatus{}, - }), - ), - )} - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world"), - tb.FinalPipelineTask("final-task-1", "some-task"), - ))} + }, + }, + }} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }}, + Finally: []v1beta1.PipelineTask{{ + Name: "final-task-1", + TaskRef: &v1beta1.TaskRef{ + Name: "some-task", + }, + }}, + }, + }} ts := []*v1beta1.Task{ - tb.Task("hello-world", tb.TaskNamespace("foo")), - tb.Task("some-task", tb.TaskNamespace("foo")), + simpleHelloWorldTask, + simpleSomeTask, } trs := []*v1beta1.TaskRun{ - tb.TaskRun("test-pipeline-run-cancelled-run-finally-hello-world", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("kind", "name"), - tb.TaskRunLabel(pipeline.PipelineLabelKey, "test-pipeline-run-cancelled-run-finally"), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, "test-pipeline"), - tb.TaskRunSpec(tb.TaskRunTaskRef("hello-world"), - tb.TaskRunServiceAccountName("test-sa"), - ), - tb.TaskRunStatus( - tb.PodName("my-pod-name"), - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionTrue, - }), - ), - ), - tb.TaskRun("test-pipeline-run-cancelled-run-finally-final-task", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("kind", "name"), - tb.TaskRunLabel(pipeline.PipelineLabelKey, "test-pipeline-run-cancelled-run-finally"), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, "test-pipeline"), - tb.TaskRunSpec(tb.TaskRunTaskRef("some-task"), - tb.TaskRunServiceAccountName("test-sa"), - ), - ), + createHelloWorldTaskRunWithStatus("test-pipeline-run-cancelled-run-finally-hello-world", "foo", + "test-pipeline-run-cancelled-run-finally", "test-pipeline", "my-pod-name", + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionTrue, + }), + createHelloWorldTaskRun("test-pipeline-run-cancelled-run-finally-final-task", "foo", + "test-pipeline-run-cancelled-run-finally", "test-pipeline"), } cms := getConfigMapsWithEnabledAlphaAPIFields() @@ -2033,56 +2560,64 @@ func TestReconcileOnCancelledRunFinallyPipelineRunWithFinalTaskAndRetries(t *tes // been gracefully cancelled. It verifies that reconcile is successful, the pipeline status updated and events generated. // Pipeline has a DAG task "hello-world-1" and Finally task "hello-world-2" - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world", tb.Retries(2)), - tb.FinalPipelineTask("hello-world-2", "hello-world"), - ))} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + Retries: 2, + }}, + Finally: []v1beta1.PipelineTask{{ + Name: "hello-world-2", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }}, + }, + }} // PipelineRun has been gracefully cancelled, and it has a TaskRun for DAG task "hello-world-1" that has failed // with reason of cancellation - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-cancelled-run-finally", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunCancelledRunFinally, - ), - tb.PipelineRunStatus( - tb.PipelineRunTaskRunsStatus("test-pipeline-run-cancelled-run-finally-hello-world", &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: "hello-world-1", - Status: &v1beta1.TaskRunStatus{ - Status: duckv1beta1.Status{ - Conditions: []apis.Condition{{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionFalse, - Reason: v1beta1.TaskRunReasonCancelled.String(), - }}, + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-cancelled-run-finally", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + Status: v1beta1.PipelineRunSpecStatusCancelledRunFinally, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ + "test-pipeline-run-cancelled-run-finally-hello-world": { + PipelineTaskName: "hello-world-1", + Status: &v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: []apis.Condition{{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionFalse, + Reason: v1beta1.TaskRunReasonCancelled.String(), + }}, + }, + }, }, }, - }), - ), - )} + }, + }, + }} // TaskRun exists for DAG task "hello-world-1" that has failed with reason of cancellation - trs := []*v1beta1.TaskRun{ - tb.TaskRun("test-pipeline-run-cancelled-run-finally-hello-world", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("kind", "name"), - tb.TaskRunLabel(pipeline.PipelineLabelKey, "test-pipeline-run-cancelled-run-finally"), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, "test-pipeline"), - tb.TaskRunSpec(tb.TaskRunTaskRef("hello-world"), - tb.TaskRunServiceAccountName("test-sa"), - ), - tb.TaskRunStatus( - tb.PodName("my-pod-name"), - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionFalse, - Reason: v1beta1.TaskRunSpecStatusCancelled, - }), - ), - ), - } - - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + trs := []*v1beta1.TaskRun{createHelloWorldTaskRunWithStatus("test-pipeline-run-cancelled-run-finally-hello-world", "foo", + "test-pipeline-run-cancelled-run-finally", "test-pipeline", "my-pod-name", + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionFalse, + Reason: v1beta1.TaskRunSpecStatusCancelled, + })} + + ts := []*v1beta1.Task{simpleHelloWorldTask} cms := getConfigMapsWithEnabledAlphaAPIFields() d := test.Data{ @@ -2121,31 +2656,37 @@ func TestReconcileCancelledRunFinallyFailsTaskRunCancellation(t *testing.T) { names.TestingSeed() ptName := "hello-world-1" prName := "test-pipeline-fails-to-cancel" - prs := []*v1beta1.PipelineRun{tb.PipelineRun(prName, tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunCancelledRunFinally, - ), - // The reconciler uses the presence of this TaskRun in the status to determine that a TaskRun - // is already running. The TaskRun will not be retrieved at all so we do not need to seed one. - tb.PipelineRunStatus( - tb.PipelineRunStatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - Reason: v1beta1.PipelineRunReasonRunning.String(), - Message: "running...", - }), - tb.PipelineRunTaskRunsStatus(prName+ptName, &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: ptName, - Status: &v1beta1.TaskRunStatus{}, - }), - tb.PipelineRunStartTime(time.Now()), - ), - )} - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world"), - ))} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta(prName, "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + Status: v1beta1.PipelineRunSpecStatusCancelledRunFinally, + }, + Status: v1beta1.PipelineRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + Reason: v1beta1.PipelineRunReasonRunning.String(), + Message: "running...", + }, + }, + }, + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ + prName + ptName: { + PipelineTaskName: ptName, + Status: &v1beta1.TaskRunStatus{}, + }, + }, + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }} + ps := []*v1beta1.Pipeline{simpleHelloWorldPipeline} ts := []*v1beta1.Task{ - tb.Task("hello-world", tb.TaskNamespace("foo")), + simpleHelloWorldTask, } trs := []*v1beta1.TaskRun{ getTaskRun( @@ -2224,17 +2765,21 @@ func TestReconcileOnStoppedRunFinallyPipelineRun(t *testing.T) { // TestReconcileOnStoppedRunFinallyPipelineRun runs "Reconcile" on a PipelineRun that has been gracefully stopped // and waits for all running tasks to be completed, before cancelling the run. // It verifies that reconcile is successful, final tasks run, the pipeline status updated and events generated. - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-stopped-run-finally", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunStoppedRunFinally, - ), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - )} - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world"), - ))} - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-stopped-run-finally", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + Status: v1beta1.PipelineRunSpecStatusStoppedRunFinally, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }} + ps := []*v1beta1.Pipeline{simpleHelloWorldPipeline} + ts := []*v1beta1.Task{simpleHelloWorldTask} cms := getConfigMapsWithEnabledAlphaAPIFields() d := test.Data{ @@ -2278,22 +2823,27 @@ func TestReconcileOnStoppedRunFinallyPipelineRunWithRunningTask(t *testing.T) { // TestReconcileOnStoppedRunFinallyPipelineRunWithRunningTask runs "Reconcile" on a PipelineRun that has been gracefully stopped // and waits for all running tasks to be completed, before cancelling the run. // It verifies that reconcile is successful, final tasks run, the pipeline status updated and events generated. - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-stopped-run-finally", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunStoppedRunFinally, - ), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now()), - tb.PipelineRunTaskRunsStatus("test-pipeline-run-stopped-run-finally-hello-world", &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: "hello-world-1", - Status: &v1beta1.TaskRunStatus{}, - }), - ), - )} - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world"), - ))} - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-stopped-run-finally", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + Status: v1beta1.PipelineRunSpecStatusStoppedRunFinally, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ + "test-pipeline-run-stopped-run-finally-hello-world": { + PipelineTaskName: "hello-world-1", + Status: &v1beta1.TaskRunStatus{}, + }, + }, + }, + }, + }} + ps := []*v1beta1.Pipeline{simpleHelloWorldPipeline} + ts := []*v1beta1.Task{simpleHelloWorldTask} trs := []*v1beta1.TaskRun{ getTaskRun( "test-pipeline-run-stopped-run-finally-hello-world", @@ -2349,25 +2899,46 @@ func TestReconcileOnStoppedPipelineRunWithCompletedTask(t *testing.T) { // TestReconcileOnStoppedPipelineRunWithCompletedTask runs "Reconcile" on a PipelineRun that has been gracefully stopped // and waits for all running tasks to be completed, before stopping the run. // It verifies that reconcile is successful, final tasks run, the pipeline status updated and events generated. - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-stopped", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunStoppedRunFinally, - ), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now()), - tb.PipelineRunTaskRunsStatus("test-pipeline-run-stopped-hello-world", &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: "hello-world-1", - Status: &v1beta1.TaskRunStatus{}, - }), - ), - )} - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world"), - tb.PipelineTask("hello-world-2", "hello-world", - tb.RunAfter("hello-world-1"), - ), - ))} - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-stopped", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + Status: v1beta1.PipelineRunSpecStatusStoppedRunFinally, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ + "test-pipeline-run-stopped-hello-world": { + PipelineTaskName: "hello-world-1", + Status: &v1beta1.TaskRunStatus{}, + }, + }, + }, + }, + }} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + { + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }, + { + Name: "hello-world-2", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + RunAfter: []string{"hello-world-1"}, + }, + }, + }, + }} + ts := []*v1beta1.Task{simpleHelloWorldTask} trs := []*v1beta1.TaskRun{ getTaskRun( "test-pipeline-run-stopped-hello-world", @@ -2430,15 +3001,15 @@ func TestReconcileOnStoppedPipelineRunWithCompletedTask(t *testing.T) { func TestReconcileOnPendingPipelineRun(t *testing.T) { // TestReconcileOnPendingPipelineRun runs "Reconcile" on a PipelineRun that is pending. // It verifies that reconcile is successful, the pipeline status updated and events generated. - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-pending", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunPending, - ), - )} - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world", "hello-world"), - ))} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-pending", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + Status: v1beta1.PipelineRunSpecStatusPending, + }, + }} + ps := []*v1beta1.Pipeline{simpleHelloWorldPipeline} ts := []*v1beta1.Task{} trs := []*v1beta1.TaskRun{} @@ -2467,19 +3038,21 @@ func TestReconcileOnPendingPipelineRun(t *testing.T) { func TestReconcileWithTimeout(t *testing.T) { // TestReconcileWithTimeout runs "Reconcile" on a PipelineRun that has timed out. // It verifies that reconcile is successful, the pipeline status updated and events generated. - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world"), - ))} - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-with-timeout", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunTimeout(12*time.Hour), - ), - tb.PipelineRunStatus( - tb.PipelineRunStartTime(time.Now().AddDate(0, 0, -1))), - )} - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + ps := []*v1beta1.Pipeline{simpleHelloWorldPipeline} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-with-timeout", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + Timeout: &metav1.Duration{Duration: 12 * time.Hour}, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now().AddDate(0, 0, -1)}, + }, + }, + }} + ts := []*v1beta1.Task{simpleHelloWorldTask} d := test.Data{ PipelineRuns: prs, @@ -2520,15 +3093,33 @@ func TestReconcileWithTimeout(t *testing.T) { func TestReconcileWithoutPVC(t *testing.T) { // TestReconcileWithoutPVC runs "Reconcile" on a PipelineRun that has two unrelated tasks. // It verifies that reconcile is successful and that no PVC is created - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world"), - tb.PipelineTask("hello-world-2", "hello-world"), - ))} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + { + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }, + { + Name: "hello-world-2", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }, + }, + }, + }} - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run", tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline")), - } - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + }, + }} + ts := []*v1beta1.Task{simpleHelloWorldTask} d := test.Data{ PipelineRuns: prs, @@ -2563,30 +3154,53 @@ func TestReconcileCancelledFailsTaskRunCancellation(t *testing.T) { names.TestingSeed() ptName := "hello-world-1" prName := "test-pipeline-fails-to-cancel" - prs := []*v1beta1.PipelineRun{tb.PipelineRun(prName, tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunCancelled, - ), - // The reconciler uses the presence of this TaskRun in the status to determine that a TaskRun - // is already running. The TaskRun will not be retrieved at all so we do not need to seed one. - tb.PipelineRunStatus( - tb.PipelineRunStatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - Reason: v1beta1.PipelineRunReasonRunning.String(), - Message: "running...", - }), - tb.PipelineRunTaskRunsStatus(prName+ptName, &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: ptName, - Status: &v1beta1.TaskRunStatus{}, - }), - tb.PipelineRunStartTime(time.Now()), - ), - )} - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world"), - tb.PipelineTask("hello-world-2", "hello-world"), - ))} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta(prName, "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + Status: v1beta1.PipelineRunSpecStatusCancelled, + }, + Status: v1beta1.PipelineRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + Reason: v1beta1.PipelineRunReasonRunning.String(), + Message: "running...", + }, + }, + }, + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ + prName + ptName: { + PipelineTaskName: ptName, + Status: &v1beta1.TaskRunStatus{}, + }, + }, + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + { + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }, + { + Name: "hello-world-2", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }, + }, + }, + }} d := test.Data{ PipelineRuns: prs, @@ -2646,16 +3260,31 @@ func TestReconcileCancelledPipelineRun(t *testing.T) { // TestReconcileCancelledPipelineRun runs "Reconcile" on a PipelineRun that has been cancelled. // The PipelineRun had no TaskRun associated yet, and no TaskRun should have been created. // It verifies that reconcile is successful, the pipeline status updated and events generated. - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world", tb.Retries(1)), - ))} - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-cancelled", tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunCancelled, - ), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - )} - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + Retries: 1, + }}, + }, + }} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-cancelled", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + Status: v1beta1.PipelineRunSpecStatusCancelled, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }} + ts := []*v1beta1.Task{simpleHelloWorldTask} d := test.Data{ PipelineRuns: prs, @@ -2687,36 +3316,37 @@ func TestReconcileCancelledPipelineRun(t *testing.T) { func TestReconcilePropagateLabels(t *testing.T) { names.TestingSeed() - taskName := "hello-world-1" - - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask(taskName, "hello-world"), - ))} - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-with-labels", tb.PipelineRunNamespace("foo"), - tb.PipelineRunLabel("PipelineRunLabel", "PipelineRunValue"), - tb.PipelineRunLabel("tekton.dev/pipeline", "WillNotBeUsed"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa"), - ), - )} - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} - - expected := tb.TaskRun("test-pipeline-run-with-labels-hello-world-1-9l9zj", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run-with-labels", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel("tekton.dev/pipeline", "test-pipeline"), - tb.TaskRunLabel(pipeline.PipelineTaskLabelKey, "hello-world-1"), - tb.TaskRunLabel("tekton.dev/pipelineRun", "test-pipeline-run-with-labels"), - tb.TaskRunLabel("PipelineRunLabel", "PipelineRunValue"), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineTasks), - tb.TaskRunSpec( - tb.TaskRunTaskRef("hello-world"), - tb.TaskRunServiceAccountName("test-sa"), - ), - ) + + ps := []*v1beta1.Pipeline{simpleHelloWorldPipeline} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-pipeline-run-with-labels", + Namespace: "foo", + Labels: map[string]string{ + "PipelineRunLabel": "PipelineRunValue", + pipeline.PipelineLabelKey: "WillNotBeUsed", + }, + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + }, + }} + ts := []*v1beta1.Task{simpleHelloWorldTask} + + expectedObjectMeta := taskRunObjectMeta("test-pipeline-run-with-labels-hello-world-1-9l9zj", "foo", "test-pipeline-run-with-labels", "test-pipeline", "hello-world-1", false) + expectedObjectMeta.Labels["PipelineRunLabel"] = "PipelineRunValue" + expected := &v1beta1.TaskRun{ + ObjectMeta: expectedObjectMeta, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + ServiceAccountName: "test-sa", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + } d := test.Data{ PipelineRuns: prs, @@ -2741,19 +3371,24 @@ func TestReconcilePropagateLabels(t *testing.T) { func TestReconcilePropagateLabelsPending(t *testing.T) { names.TestingSeed() - taskName := "hello-world-1" - - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask(taskName, "hello-world"), - ))} - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-with-labels", tb.PipelineRunNamespace("foo"), - tb.PipelineRunLabel("PipelineRunLabel", "PipelineRunValue"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunPending, - ), - )} - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + + ps := []*v1beta1.Pipeline{simpleHelloWorldPipeline} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-pipeline-run-with-labels", + Namespace: "foo", + Labels: map[string]string{ + "PipelineRunLabel": "PipelineRunValue", + pipeline.PipelineLabelKey: "WillNotBeUsed", + }, + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + Status: v1beta1.PipelineRunSpecStatusPending, + }, + }} + ts := []*v1beta1.Task{simpleHelloWorldTask} d := test.Data{ PipelineRuns: prs, @@ -2779,19 +3414,24 @@ func TestReconcilePropagateLabelsPending(t *testing.T) { func TestReconcilePropagateLabelsCancelled(t *testing.T) { names.TestingSeed() - taskName := "hello-world-1" - - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask(taskName, "hello-world"), - ))} - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-with-labels", tb.PipelineRunNamespace("foo"), - tb.PipelineRunLabel("PipelineRunLabel", "PipelineRunValue"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunCancelled, - ), - )} - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + + ps := []*v1beta1.Pipeline{simpleHelloWorldPipeline} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-pipeline-run-with-labels", + Namespace: "foo", + Labels: map[string]string{ + "PipelineRunLabel": "PipelineRunValue", + pipeline.PipelineLabelKey: "WillNotBeUsed", + }, + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + Status: v1beta1.PipelineRunSpecStatusCancelled, + }, + }} + ts := []*v1beta1.Task{simpleHelloWorldTask} d := test.Data{ PipelineRuns: prs, @@ -2818,18 +3458,38 @@ func TestReconcilePropagateLabelsCancelled(t *testing.T) { func TestReconcileWithDifferentServiceAccounts(t *testing.T) { names.TestingSeed() - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-0", "hello-world-task"), - tb.PipelineTask("hello-world-1", "hello-world-task"), - ))} - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-different-service-accs", tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa-0"), - tb.PipelineRunServiceAccountNameTask("hello-world-1", "test-sa-1"), - ), - )} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + { + Name: "hello-world-0", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world-task", + }, + }, + { + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world-task", + }, + }, + }, + }, + }} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-different-service-accs", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa-0", + ServiceAccountNames: []v1beta1.PipelineRunSpecServiceAccountName{{ + TaskName: "hello-world-1", + ServiceAccountName: "test-sa-1", + }}, + }, + }} ts := []*v1beta1.Task{ - tb.Task("hello-world-task", tb.TaskNamespace("foo")), + {ObjectMeta: baseObjectMeta("hello-world-task", "foo")}, } d := test.Data{ @@ -2845,36 +3505,28 @@ func TestReconcileWithDifferentServiceAccounts(t *testing.T) { taskRunNames := []string{"test-pipeline-run-different-service-accs-hello-world-0-9l9zj", "test-pipeline-run-different-service-accs-hello-world-1-mz4c7"} expectedTaskRuns := []*v1beta1.TaskRun{ - tb.TaskRun(taskRunNames[0], - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run-different-service-accs", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunSpec( - tb.TaskRunTaskRef("hello-world-task"), - tb.TaskRunServiceAccountName("test-sa-0"), - ), - tb.TaskRunLabel("tekton.dev/pipeline", "test-pipeline"), - tb.TaskRunLabel("tekton.dev/pipelineRun", "test-pipeline-run-different-service-accs"), - tb.TaskRunLabel("tekton.dev/pipelineTask", "hello-world-0"), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineTasks), - ), - tb.TaskRun(taskRunNames[1], - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run-different-service-accs", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunSpec( - tb.TaskRunTaskRef("hello-world-task"), - tb.TaskRunServiceAccountName("test-sa-1"), - ), - tb.TaskRunLabel("tekton.dev/pipeline", "test-pipeline"), - tb.TaskRunLabel("tekton.dev/pipelineRun", "test-pipeline-run-different-service-accs"), - tb.TaskRunLabel("tekton.dev/pipelineTask", "hello-world-1"), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineTasks), - ), + { + ObjectMeta: taskRunObjectMeta(taskRunNames[0], "foo", "test-pipeline-run-different-service-accs", "test-pipeline", "hello-world-0", false), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world-task", + }, + ServiceAccountName: "test-sa-0", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + }, + { + ObjectMeta: taskRunObjectMeta(taskRunNames[1], "foo", "test-pipeline-run-different-service-accs", "test-pipeline", "hello-world-1", false), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world-task", + }, + ServiceAccountName: "test-sa-1", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + }, } for i := range ps[0].Spec.Tasks { // Check that the expected TaskRun was created @@ -2892,20 +3544,33 @@ func TestReconcileWithDifferentServiceAccounts(t *testing.T) { func TestReconcileCustomTasksWithDifferentServiceAccounts(t *testing.T) { names.TestingSeed() - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-0", ""), - tb.PipelineTask("hello-world-1", ""), - ))} - // Update the pipeline tasks to be custom tasks (builder does not support this case). - ps[0].Spec.Tasks[0].TaskRef = &v1beta1.TaskRef{APIVersion: "example.dev/v0", Kind: "Example"} - ps[0].Spec.Tasks[1].TaskRef = &v1beta1.TaskRef{APIVersion: "example.dev/v0", Kind: "Example"} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + { + Name: "hello-world-0", + TaskRef: &v1beta1.TaskRef{APIVersion: "example.dev/v0", Kind: "Example"}, + }, + { + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{APIVersion: "example.dev/v0", Kind: "Example"}, + }, + }, + }, + }} - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-different-service-accs", tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa-0"), - tb.PipelineRunServiceAccountNameTask("hello-world-1", "test-sa-1"), - ), - )} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-different-service-accs", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa-0", + ServiceAccountNames: []v1beta1.PipelineRunSpecServiceAccountName{{ + TaskName: "hello-world-1", + ServiceAccountName: "test-sa-1", + }}, + }, + }} cms := []*corev1.ConfigMap{ { @@ -2967,40 +3632,59 @@ func TestReconcileWithTimeoutAndRetry(t *testing.T) { }, }} { t.Run(tc.name, func(t *testing.T) { - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline-retry", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world", tb.Retries(tc.retries)), - ))} - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-retry-run-with-timeout", tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline-retry", - tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunTimeout(12*time.Hour), - ), - tb.PipelineRunStatus( - tb.PipelineRunStartTime(time.Now().AddDate(0, 0, -1))), - )} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline-retry", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + Retries: tc.retries, + }}, + }, + }} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-retry-run-with-timeout", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline-retry"}, + ServiceAccountName: "test-sa", + Timeout: &metav1.Duration{Duration: 12 * time.Hour}, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now().AddDate(0, 0, -1)}, + }, + }, + }} ts := []*v1beta1.Task{ - tb.Task("hello-world", tb.TaskNamespace("foo")), + simpleHelloWorldTask, } - trs := []*v1beta1.TaskRun{ - tb.TaskRun("hello-world-1", - tb.TaskRunNamespace("foo"), - tb.TaskRunStatus( - tb.PodName("my-pod-name"), - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionFalse, - }), - tb.Retry(v1beta1.TaskRunStatus{ + trs := []*v1beta1.TaskRun{{ + ObjectMeta: baseObjectMeta("hello-world-1", "foo"), + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionFalse, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + PodName: "my-pod-name", + RetriesStatus: []v1beta1.TaskRunStatus{{ Status: duckv1beta1.Status{ Conditions: []apis.Condition{{ Type: apis.ConditionSucceeded, Status: corev1.ConditionFalse, }}, }, - }), - )), - } + }}, + }, + }, + }} prtrs := &v1beta1.PipelineRunTaskRunStatus{ PipelineTaskName: "hello-world-1", @@ -3034,16 +3718,19 @@ func TestReconcileWithTimeoutAndRetry(t *testing.T) { func TestReconcilePropagateAnnotations(t *testing.T) { names.TestingSeed() - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world"), - ))} - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-with-annotations", tb.PipelineRunNamespace("foo"), - tb.PipelineRunAnnotation("PipelineRunAnnotation", "PipelineRunValue"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa"), - ), - )} - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + ps := []*v1beta1.Pipeline{simpleHelloWorldPipeline} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-pipeline-run-with-annotations", + Namespace: "foo", + Annotations: map[string]string{"PipelineRunAnnotation": "PipelineRunValue"}, + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + }, + }} + ts := []*v1beta1.Task{simpleHelloWorldTask} d := test.Data{ PipelineRuns: prs, @@ -3062,22 +3749,19 @@ func TestReconcilePropagateAnnotations(t *testing.T) { // Check that the expected TaskRun was created actual := getTaskRunCreations(t, actions)[0] - expectedTaskRun := tb.TaskRun("test-pipeline-run-with-annotations-hello-world-1-9l9zj", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run-with-annotations", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel("tekton.dev/pipeline", "test-pipeline"), - tb.TaskRunLabel(pipeline.PipelineTaskLabelKey, "hello-world-1"), - tb.TaskRunLabel("tekton.dev/pipelineRun", "test-pipeline-run-with-annotations"), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineTasks), - tb.TaskRunAnnotation("PipelineRunAnnotation", "PipelineRunValue"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("hello-world"), - tb.TaskRunServiceAccountName("test-sa"), - ), - ) + expectedTaskRunObjectMeta := taskRunObjectMeta("test-pipeline-run-with-annotations-hello-world-1-9l9zj", "foo", "test-pipeline-run-with-annotations", "test-pipeline", "hello-world-1", false) + expectedTaskRunObjectMeta.Annotations["PipelineRunAnnotation"] = "PipelineRunValue" + expectedTaskRun := &v1beta1.TaskRun{ + ObjectMeta: expectedTaskRunObjectMeta, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + ServiceAccountName: "test-sa", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + } if d := cmp.Diff(actual, expectedTaskRun); d != "" { t.Errorf("expected to see TaskRun %v created. Diff %s", expectedTaskRun, diff.PrintWantGot(d)) @@ -3096,10 +3780,17 @@ func TestGetTaskRunTimeout(t *testing.T) { expected *metav1.Duration }{{ name: "nil timeout duration", - pr: tb.PipelineRun(prName, tb.PipelineRunNamespace(ns), - tb.PipelineRunSpec(p, tb.PipelineRunNilTimeout), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - ), + pr: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, ns), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: p}, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }, rprt: &resources.ResolvedPipelineRunTask{ PipelineTask: &v1beta1.PipelineTask{ Timeout: nil, @@ -3108,10 +3799,18 @@ func TestGetTaskRunTimeout(t *testing.T) { expected: &metav1.Duration{Duration: 60 * time.Minute}, }, { name: "timeout specified in pr", - pr: tb.PipelineRun(prName, tb.PipelineRunNamespace(ns), - tb.PipelineRunSpec(p, tb.PipelineRunTimeout(20*time.Minute)), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - ), + pr: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, ns), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: p}, + Timeout: &metav1.Duration{Duration: 20 * time.Minute}, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }, rprt: &resources.ResolvedPipelineRunTask{ PipelineTask: &v1beta1.PipelineTask{ Timeout: nil, @@ -3120,10 +3819,18 @@ func TestGetTaskRunTimeout(t *testing.T) { expected: &metav1.Duration{Duration: 20 * time.Minute}, }, { name: "0 timeout duration", - pr: tb.PipelineRun(prName, tb.PipelineRunNamespace(ns), - tb.PipelineRunSpec(p, tb.PipelineRunTimeout(0*time.Minute)), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - ), + pr: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, ns), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: p}, + Timeout: &metav1.Duration{Duration: 0 * time.Minute}, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }, rprt: &resources.ResolvedPipelineRunTask{ PipelineTask: &v1beta1.PipelineTask{ Timeout: nil, @@ -3132,9 +3839,18 @@ func TestGetTaskRunTimeout(t *testing.T) { expected: &metav1.Duration{Duration: 0 * time.Minute}, }, { name: "taskrun being created after timeout expired", - pr: tb.PipelineRun(prName, tb.PipelineRunNamespace(ns), - tb.PipelineRunSpec(p, tb.PipelineRunTimeout(1*time.Minute)), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now().Add(-2*time.Minute)))), + pr: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, ns), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: p}, + Timeout: &metav1.Duration{Duration: 1 * time.Minute}, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now().Add(-2 * time.Minute)}, + }, + }, + }, rprt: &resources.ResolvedPipelineRunTask{ PipelineTask: &v1beta1.PipelineTask{ Timeout: nil, @@ -3143,10 +3859,18 @@ func TestGetTaskRunTimeout(t *testing.T) { expected: &metav1.Duration{Duration: 1 * time.Second}, }, { name: "taskrun being created with timeout for PipelineTask", - pr: tb.PipelineRun(prName, tb.PipelineRunNamespace(ns), - tb.PipelineRunSpec(p, tb.PipelineRunTimeout(20*time.Minute)), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - ), + pr: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, ns), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: p}, + Timeout: &metav1.Duration{Duration: 20 * time.Minute}, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }, rprt: &resources.ResolvedPipelineRunTask{ PipelineTask: &v1beta1.PipelineTask{ Timeout: &metav1.Duration{Duration: 2 * time.Minute}, @@ -3155,10 +3879,18 @@ func TestGetTaskRunTimeout(t *testing.T) { expected: &metav1.Duration{Duration: 2 * time.Minute}, }, { name: "0 timeout duration for PipelineRun, PipelineTask timeout still applied", - pr: tb.PipelineRun(prName, tb.PipelineRunNamespace(ns), - tb.PipelineRunSpec(p, tb.PipelineRunTimeout(0*time.Minute)), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - ), + pr: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, ns), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: p}, + Timeout: &metav1.Duration{Duration: 0 * time.Minute}, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }, rprt: &resources.ResolvedPipelineRunTask{ PipelineTask: &v1beta1.PipelineTask{ Timeout: &metav1.Duration{Duration: 2 * time.Minute}, @@ -3167,10 +3899,20 @@ func TestGetTaskRunTimeout(t *testing.T) { expected: &metav1.Duration{Duration: 2 * time.Minute}, }, { name: "taskstimeout specified in pr", - pr: tb.PipelineRun(prName, tb.PipelineRunNamespace(ns), - tb.PipelineRunSpec(p, tb.PipelineRunTasksTimeout(20*time.Minute), tb.PipelineRunNilTimeout), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - ), + pr: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, ns), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: p}, + Timeouts: &v1beta1.TimeoutFields{ + Tasks: &metav1.Duration{Duration: 20 * time.Minute}, + }, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }, rprt: &resources.ResolvedPipelineRunTask{ PipelineTask: &v1beta1.PipelineTask{ Timeout: nil, @@ -3179,10 +3921,21 @@ func TestGetTaskRunTimeout(t *testing.T) { expected: &metav1.Duration{Duration: 20 * time.Minute}, }, { name: "40m timeout duration, 20m taskstimeout duration", - pr: tb.PipelineRun(prName, tb.PipelineRunNamespace(ns), - tb.PipelineRunSpec(p, tb.PipelineRunPipelineTimeout(40*time.Minute), tb.PipelineRunTasksTimeout(20*time.Minute), tb.PipelineRunNilTimeout), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - ), + pr: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, ns), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: p}, + Timeouts: &v1beta1.TimeoutFields{ + Pipeline: &metav1.Duration{Duration: 40 * time.Minute}, + Tasks: &metav1.Duration{Duration: 20 * time.Minute}, + }, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }, rprt: &resources.ResolvedPipelineRunTask{ PipelineTask: &v1beta1.PipelineTask{ Timeout: nil, @@ -3191,10 +3944,20 @@ func TestGetTaskRunTimeout(t *testing.T) { expected: &metav1.Duration{Duration: 20 * time.Minute}, }, { name: "taskrun being created with taskstimeout for PipelineTask", - pr: tb.PipelineRun(prName, tb.PipelineRunNamespace(ns), - tb.PipelineRunSpec(p, tb.PipelineRunTasksTimeout(20*time.Minute)), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - ), + pr: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, ns), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: p}, + Timeouts: &v1beta1.TimeoutFields{ + Tasks: &metav1.Duration{Duration: 20 * time.Minute}, + }, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }, rprt: &resources.ResolvedPipelineRunTask{ PipelineTask: &v1beta1.PipelineTask{ Timeout: &metav1.Duration{Duration: 2 * time.Minute}, @@ -3225,49 +3988,97 @@ func TestGetFinallyTaskRunTimeout(t *testing.T) { expected *metav1.Duration }{{ name: "nil timeout duration", - pr: tb.PipelineRun(prName, tb.PipelineRunNamespace(ns), - tb.PipelineRunSpec(p, tb.PipelineRunNilTimeout), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - ), + pr: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, ns), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: p}, + Timeout: nil, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }, rprt: &resources.ResolvedPipelineRunTask{ PipelineTask: &v1beta1.PipelineTask{}, }, expected: &metav1.Duration{Duration: 60 * time.Minute}, }, { name: "timeout specified in pr", - pr: tb.PipelineRun(prName, tb.PipelineRunNamespace(ns), - tb.PipelineRunSpec(p, tb.PipelineRunTimeout(20*time.Minute)), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - ), + pr: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, ns), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: p}, + Timeout: &metav1.Duration{Duration: 20 * time.Minute}, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }, rprt: &resources.ResolvedPipelineRunTask{ PipelineTask: &v1beta1.PipelineTask{}, }, expected: &metav1.Duration{Duration: 20 * time.Minute}, }, { name: "taskrun being created after timeout expired", - pr: tb.PipelineRun(prName, tb.PipelineRunNamespace(ns), - tb.PipelineRunSpec(p, tb.PipelineRunTimeout(1*time.Minute)), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now().Add(-2*time.Minute)))), + pr: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, ns), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: p}, + Timeout: &metav1.Duration{Duration: time.Minute}, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now().Add(-2 * time.Minute)}, + }, + }, + }, rprt: &resources.ResolvedPipelineRunTask{ PipelineTask: &v1beta1.PipelineTask{}, }, expected: &metav1.Duration{Duration: 1 * time.Second}, }, { name: "40m timeout duration, 20m taskstimeout duration", - pr: tb.PipelineRun(prName, tb.PipelineRunNamespace(ns), - tb.PipelineRunSpec(p, tb.PipelineRunPipelineTimeout(40*time.Minute), tb.PipelineRunTasksTimeout(20*time.Minute), tb.PipelineRunNilTimeout), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - ), + pr: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, ns), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: p}, + Timeouts: &v1beta1.TimeoutFields{ + Pipeline: &metav1.Duration{Duration: 40 * time.Minute}, + Tasks: &metav1.Duration{Duration: 20 * time.Minute}, + }, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }, rprt: &resources.ResolvedPipelineRunTask{ PipelineTask: &v1beta1.PipelineTask{}, }, expected: &metav1.Duration{Duration: 20 * time.Minute}, }, { name: "40m timeout duration, 20m taskstimeout duration, 20m finallytimeout duration", - pr: tb.PipelineRun(prName, tb.PipelineRunNamespace(ns), - tb.PipelineRunSpec(p, tb.PipelineRunPipelineTimeout(40*time.Minute), tb.PipelineRunTasksTimeout(20*time.Minute), tb.PipelineRunFinallyTimeout(20*time.Minute), tb.PipelineRunNilTimeout), - tb.PipelineRunStatus(tb.PipelineRunStartTime(time.Now())), - ), + pr: &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, ns), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: p}, + Timeouts: &v1beta1.TimeoutFields{ + Pipeline: &metav1.Duration{Duration: 40 * time.Minute}, + Tasks: &metav1.Duration{Duration: 20 * time.Minute}, + Finally: &metav1.Duration{Duration: 20 * time.Minute}, + }, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + }, rprt: &resources.ResolvedPipelineRunTask{ PipelineTask: &v1beta1.PipelineTask{}, }, @@ -3289,14 +4100,17 @@ func TestGetFinallyTaskRunTimeout(t *testing.T) { func TestReconcileAndPropagateCustomPipelineTaskRunSpec(t *testing.T) { names.TestingSeed() prName := "test-pipeline-run" - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world"), - ))} - prs := []*v1beta1.PipelineRun{tb.PipelineRun(prName, tb.PipelineRunNamespace("foo"), - tb.PipelineRunAnnotation("PipelineRunAnnotation", "PipelineRunValue"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineTaskRunSpecs([]v1beta1.PipelineTaskRunSpec{{ + ps := []*v1beta1.Pipeline{simpleHelloWorldPipeline} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: metav1.ObjectMeta{ + Name: prName, + Namespace: "foo", + Annotations: map[string]string{"PipelineRunAnnotation": "PipelineRunValue"}, + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + TaskRunSpecs: []v1beta1.PipelineTaskRunSpec{{ PipelineTaskName: "hello-world-1", TaskServiceAccountName: "custom-sa", TaskPodTemplate: &pod.Template{ @@ -3304,10 +4118,10 @@ func TestReconcileAndPropagateCustomPipelineTaskRunSpec(t *testing.T) { "workloadtype": "tekton", }, }, - }}), - ), - )} - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + }}, + }, + }} + ts := []*v1beta1.Task{simpleHelloWorldTask} d := test.Data{ PipelineRuns: prs, @@ -3326,27 +4140,24 @@ func TestReconcileAndPropagateCustomPipelineTaskRunSpec(t *testing.T) { // Check that the expected TaskRun was created actual := getTaskRunCreations(t, actions)[0] - expectedTaskRun := tb.TaskRun("test-pipeline-run-hello-world-1-9l9zj", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel(pipeline.PipelineLabelKey, "test-pipeline"), - tb.TaskRunLabel(pipeline.PipelineTaskLabelKey, "hello-world-1"), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, "test-pipeline-run"), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineTasks), - tb.TaskRunAnnotation("PipelineRunAnnotation", "PipelineRunValue"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("hello-world"), - tb.TaskRunServiceAccountName("custom-sa"), - tb.TaskRunPodTemplate(&pod.Template{ + expectedTaskRunObjectMeta := taskRunObjectMeta("test-pipeline-run-hello-world-1-9l9zj", "foo", "test-pipeline-run", "test-pipeline", "hello-world-1", false) + expectedTaskRunObjectMeta.Annotations["PipelineRunAnnotation"] = "PipelineRunValue" + expectedTaskRun := &v1beta1.TaskRun{ + ObjectMeta: expectedTaskRunObjectMeta, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + ServiceAccountName: "custom-sa", + PodTemplate: &pod.Template{ NodeSelector: map[string]string{ "workloadtype": "tekton", }, - }), - ), - ) + }, + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + } if d := cmp.Diff(actual, expectedTaskRun); d != "" { t.Errorf("expected to see propagated custom ServiceAccountName and PodTemplate in TaskRun %v created. Diff %s", expectedTaskRun, diff.PrintWantGot(d)) @@ -3356,11 +4167,15 @@ func TestReconcileAndPropagateCustomPipelineTaskRunSpec(t *testing.T) { func TestReconcileCustomTasksWithTaskRunSpec(t *testing.T) { names.TestingSeed() prName := "test-pipeline-run" - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", ""), - ))} - // Update the pipeline tasks to be custom tasks (builder does not support this case). - ps[0].Spec.Tasks[0].TaskRef = &v1beta1.TaskRef{APIVersion: "example.dev/v0", Kind: "Example"} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{APIVersion: "example.dev/v0", Kind: "Example"}, + }}, + }, + }} serviceAccount := "custom-sa" podTemplate := &pod.Template{ @@ -3368,16 +4183,18 @@ func TestReconcileCustomTasksWithTaskRunSpec(t *testing.T) { "workloadtype": "tekton", }, } - prs := []*v1beta1.PipelineRun{tb.PipelineRun(prName, tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineTaskRunSpecs([]v1beta1.PipelineTaskRunSpec{{ + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta(prName, "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + TaskRunSpecs: []v1beta1.PipelineTaskRunSpec{{ PipelineTaskName: "hello-world-1", TaskServiceAccountName: serviceAccount, TaskPodTemplate: podTemplate, - }}), - ), - )} + }}, + }, + }} cms := []*corev1.ConfigMap{ { @@ -3460,18 +4277,37 @@ func TestReconcileWithConditionChecks(t *testing.T) { }, }, } - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world", - tb.PipelineTaskCondition("cond-1"), - tb.PipelineTaskCondition("cond-2")), - ))} - prs := []*v1beta1.PipelineRun{tb.PipelineRun(prName, tb.PipelineRunNamespace("foo"), - tb.PipelineRunAnnotation("PipelineRunAnnotation", "PipelineRunValue"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa"), - ), - )} - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + Conditions: []v1beta1.PipelineTaskCondition{ + { + ConditionRef: "cond-1", + }, + { + ConditionRef: "cond-2", + }, + }, + }}, + }, + }} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: metav1.ObjectMeta{ + Name: prName, + Namespace: "foo", + Annotations: map[string]string{"PipelineRunAnnotation": "PipelineRunValue"}, + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + }, + }} + ts := []*v1beta1.Task{simpleHelloWorldTask} d := test.Data{ PipelineRuns: prs, @@ -3537,61 +4373,132 @@ func TestReconcileWithFailingConditionChecks(t *testing.T) { ConditionName: "always-false-0", Status: &v1beta1.ConditionCheckStatus{}, } - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("task-1", "hello-world"), - tb.PipelineTask("task-2", "hello-world", tb.PipelineTaskCondition("always-false")), - tb.PipelineTask("task-3", "hello-world", tb.RunAfter("task-1")), - ))} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + { + Name: "task-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }, + { + Name: "task-2", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + Conditions: []v1beta1.PipelineTaskCondition{{ + ConditionRef: "always-false", + }}, + }, + { + Name: "task-3", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + RunAfter: []string{"task-1"}, + }, + }, + }, + }} - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-with-conditions", tb.PipelineRunNamespace("foo"), - tb.PipelineRunAnnotation("PipelineRunAnnotation", "PipelineRunValue"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa"), - ), - tb.PipelineRunStatus(tb.PipelineRunStatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - Reason: v1beta1.PipelineRunReasonRunning.String(), - Message: "Not all Tasks in the Pipeline have finished executing", - }), tb.PipelineRunTaskRunsStatus(pipelineRunName+"task-1", &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: "task-1", - Status: &v1beta1.TaskRunStatus{}, - }), tb.PipelineRunTaskRunsStatus(pipelineRunName+"task-2", &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: "task-2", - Status: &v1beta1.TaskRunStatus{}, - ConditionChecks: prccs, - })), - )} - - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-pipeline-run-with-conditions", + Namespace: "foo", + Annotations: map[string]string{"PipelineRunAnnotation": "PipelineRunValue"}, + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + }, + Status: v1beta1.PipelineRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + Reason: v1beta1.PipelineRunReasonRunning.String(), + Message: "Not all Tasks in the Pipeline have finished executing", + }, + }, + }, + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ + pipelineRunName + "task-1": { + PipelineTaskName: "task-1", + Status: &v1beta1.TaskRunStatus{}, + }, + pipelineRunName + "task-2": { + PipelineTaskName: "task-2", + Status: &v1beta1.TaskRunStatus{}, + ConditionChecks: prccs, + }, + }, + }, + }, + }} + + ts := []*v1beta1.Task{simpleHelloWorldTask} trs := []*v1beta1.TaskRun{ - tb.TaskRun(pipelineRunName+"task-1", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("kind", "name"), - tb.TaskRunLabel(pipeline.PipelineLabelKey, "test-pipeline-run-with-conditions"), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, "test-pipeline"), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineTasks), - tb.TaskRunSpec(tb.TaskRunTaskRef("hello-world")), - tb.TaskRunStatus(tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionTrue, - }), - ), - ), - tb.TaskRun(conditionCheckName, - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("kind", "name"), - tb.TaskRunLabel(pipeline.PipelineLabelKey, "test-pipeline-run-with-conditions"), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, "test-pipeline"), - tb.TaskRunLabel(pipeline.ConditionCheckKey, conditionCheckName), - tb.TaskRunLabel(pipeline.ConditionNameKey, "always-false"), - tb.TaskRunSpec(tb.TaskRunTaskSpec()), - tb.TaskRunStatus(tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionFalse, - }), - ), - ), + { + ObjectMeta: metav1.ObjectMeta{ + Name: pipelineRunName + "task-1", + OwnerReferences: []metav1.OwnerReference{{ + Kind: "kind", + Name: "name", + }}, + Namespace: "foo", + Labels: map[string]string{ + pipeline.PipelineLabelKey: "test-pipeine-run-with-conditions", + pipeline.PipelineRunLabelKey: "test-pipeline", + pipeline.MemberOfLabelKey: v1beta1.PipelineTasks, + }, + }, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionTrue, + }, + }, + }, + }, + }, + { + ObjectMeta: metav1.ObjectMeta{ + Name: conditionCheckName, + OwnerReferences: []metav1.OwnerReference{{ + Kind: "kind", + Name: "name", + }}, + Namespace: "foo", + Labels: map[string]string{ + pipeline.PipelineLabelKey: "test-pipeine-run-with-conditions", + pipeline.PipelineRunLabelKey: "test-pipeline", + pipeline.ConditionCheckKey: conditionCheckName, + pipeline.ConditionNameKey: "always-false", + }, + }, + Spec: v1beta1.TaskRunSpec{TaskSpec: &v1beta1.TaskSpec{}}, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionFalse, + }, + }, + }, + }, + }, } d := test.Data{ @@ -3617,22 +4524,19 @@ func TestReconcileWithFailingConditionChecks(t *testing.T) { // Check that the expected TaskRun was created actual := getTaskRunCreations(t, actions)[0] - expectedTaskRun := tb.TaskRun("test-pipeline-run-with-conditions-task-3-9l9zj", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run-with-conditions", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel(pipeline.PipelineLabelKey, "test-pipeline"), - tb.TaskRunLabel(pipeline.PipelineTaskLabelKey, "task-3"), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, "test-pipeline-run-with-conditions"), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineTasks), - tb.TaskRunAnnotation("PipelineRunAnnotation", "PipelineRunValue"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("hello-world"), - tb.TaskRunServiceAccountName("test-sa"), - ), - ) + expectedTaskRunObjectMeta := taskRunObjectMeta("test-pipeline-run-with-conditions-task-3-9l9zj", "foo", "test-pipeline-run-with-conditions", "test-pipeline", "task-3", false) + expectedTaskRunObjectMeta.Annotations["PipelineRunAnnotation"] = "PipelineRunValue" + expectedTaskRun := &v1beta1.TaskRun{ + ObjectMeta: expectedTaskRunObjectMeta, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + ServiceAccountName: "test-sa", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + } if d := cmp.Diff(actual, expectedTaskRun); d != "" { t.Errorf("expected to see ConditionCheck TaskRun %v created. Diff %s", expectedTaskRun, diff.PrintWantGot(d)) @@ -3640,28 +4544,37 @@ func TestReconcileWithFailingConditionChecks(t *testing.T) { } func makeExpectedTr(condName, ccName string, labels, annotations map[string]string) *v1beta1.TaskRun { - return tb.TaskRun(ccName, - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel(pipeline.PipelineLabelKey, "test-pipeline"), - tb.TaskRunLabel(pipeline.PipelineTaskLabelKey, "hello-world-1"), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, "test-pipeline-run"), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineTasks), - tb.TaskRunLabel(pipeline.ConditionCheckKey, ccName), - tb.TaskRunLabel(pipeline.ConditionNameKey, condName), - tb.TaskRunLabels(labels), - tb.TaskRunAnnotation("PipelineRunAnnotation", "PipelineRunValue"), - tb.TaskRunAnnotations(annotations), - tb.TaskRunSpec( - tb.TaskRunTaskSpec( - tb.Step("foo", tb.StepName("condition-check-"+condName), tb.StepArgs("bar")), - ), - tb.TaskRunServiceAccountName("test-sa"), - ), - ) + om := taskRunObjectMeta(ccName, "foo", "test-pipeline-run", "test-pipeline", "hello-world-1", false) + for k, v := range labels { + om.Labels[k] = v + } + om.Labels[pipeline.ConditionCheckKey] = ccName + om.Labels[pipeline.ConditionNameKey] = condName + if len(om.Annotations) == 0 { + om.Annotations = map[string]string{} + } + for k, v := range annotations { + om.Annotations[k] = v + } + om.Annotations["PipelineRunAnnotation"] = "PipelineRunValue" + + return &v1beta1.TaskRun{ + ObjectMeta: om, + Spec: v1beta1.TaskRunSpec{ + TaskSpec: &v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Name: "condition-check-" + condName, + Image: "foo", + Args: []string{"bar"}, + }, + }}, + }, + ServiceAccountName: "test-sa", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + } } func ensurePVCCreated(ctx context.Context, t *testing.T, clients test.Clients, name, namespace string) { @@ -3684,24 +4597,60 @@ func ensurePVCCreated(ctx context.Context, t *testing.T, clients test.Clients, n func TestReconcileWithWhenExpressionsWithParameters(t *testing.T) { names.TestingSeed() prName := "test-pipeline-run" - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineParamSpec("run", v1beta1.ParamTypeString), - tb.PipelineTask("hello-world-1", "hello-world-1", - tb.PipelineTaskWhenExpression("foo", selection.NotIn, []string{"bar"}), - tb.PipelineTaskWhenExpression("$(params.run)", selection.In, []string{"yes"})), - tb.PipelineTask("hello-world-2", "hello-world-2", - tb.PipelineTaskWhenExpression("$(params.run)", selection.NotIn, []string{"yes"})), - ))} - prs := []*v1beta1.PipelineRun{tb.PipelineRun(prName, tb.PipelineRunNamespace("foo"), - tb.PipelineRunAnnotation("PipelineRunAnnotation", "PipelineRunValue"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa"), - tb.PipelineRunParam("run", "yes"), - ), - )} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Params: []v1beta1.ParamSpec{{ + Name: "run", + Type: v1beta1.ParamTypeString, + }}, + Tasks: []v1beta1.PipelineTask{ + { + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{Name: "hello-world-1"}, + WhenExpressions: []v1beta1.WhenExpression{ + { + Input: "foo", + Operator: selection.NotIn, + Values: []string{"bar"}, + }, + { + Input: "$(params.run)", + Operator: selection.In, + Values: []string{"yes"}, + }, + }, + }, + { + Name: "hello-world-2", + TaskRef: &v1beta1.TaskRef{Name: "hello-world-2"}, + WhenExpressions: []v1beta1.WhenExpression{{ + Input: "$(params.run)", + Operator: selection.NotIn, + Values: []string{"yes"}, + }}, + }, + }, + }, + }} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: metav1.ObjectMeta{ + Name: prName, + Namespace: "foo", + Annotations: map[string]string{"PipelineRunAnnotation": "PipelineRunValue"}, + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + Params: []v1beta1.Param{{ + Name: "run", + Value: *v1beta1.NewArrayOrString("yes"), + }}, + }, + }} ts := []*v1beta1.Task{ - tb.Task("hello-world-1", tb.TaskNamespace("foo")), - tb.Task("hello-world-2", tb.TaskNamespace("foo")), + {ObjectMeta: baseObjectMeta("hello-world-1", "foo")}, + {ObjectMeta: baseObjectMeta("hello-world-2", "foo")}, } d := test.Data{ @@ -3730,22 +4679,17 @@ func TestReconcileWithWhenExpressionsWithParameters(t *testing.T) { t.Fatalf("Expected 1 TaskRun got %d", len(actual.Items)) } expectedTaskRunName := "test-pipeline-run-hello-world-1-9l9zj" - expectedTaskRun := tb.TaskRun(expectedTaskRunName, - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel(pipeline.PipelineLabelKey, "test-pipeline"), - tb.TaskRunLabel(pipeline.PipelineTaskLabelKey, "hello-world-1"), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, "test-pipeline-run"), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineTasks), - tb.TaskRunAnnotation("PipelineRunAnnotation", "PipelineRunValue"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("hello-world-1"), - tb.TaskRunServiceAccountName("test-sa"), - ), - ) + expectedTaskRunObjectMeta := taskRunObjectMeta(expectedTaskRunName, "foo", "test-pipeline-run", "test-pipeline", "hello-world-1", false) + expectedTaskRunObjectMeta.Annotations["PipelineRunAnnotation"] = "PipelineRunValue" + expectedTaskRun := &v1beta1.TaskRun{ + ObjectMeta: expectedTaskRunObjectMeta, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{Name: "hello-world-1"}, + ServiceAccountName: "test-sa", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + } actualTaskRun := actual.Items[0] if d := cmp.Diff(&actualTaskRun, expectedTaskRun, ignoreResourceVersion); d != "" { t.Errorf("expected to see TaskRun %v created. Diff %s", expectedTaskRunName, diff.PrintWantGot(d)) @@ -3796,53 +4740,87 @@ func TestReconcileWithWhenExpressionsWithParameters(t *testing.T) { func TestReconcileWithWhenExpressionsWithTaskResults(t *testing.T) { names.TestingSeed() - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("a-task", "a-task"), - tb.PipelineTask("b-task", "b-task", - tb.PipelineTaskWhenExpression("$(tasks.a-task.results.aResult)", selection.In, []string{"aResultValue"}), - tb.PipelineTaskWhenExpression("aResultValue", selection.In, []string{"$(tasks.a-task.results.aResult)"}), - ), - tb.PipelineTask("c-task", "c-task", - tb.PipelineTaskWhenExpression("$(tasks.a-task.results.aResult)", selection.In, []string{"missing"}), - ), - tb.PipelineTask("d-task", "d-task", tb.RunAfter("c-task")), - ))} - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-different-service-accs", tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa-0"), - ), - )} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + { + Name: "a-task", + TaskRef: &v1beta1.TaskRef{Name: "a-task"}, + }, + { + Name: "b-task", + TaskRef: &v1beta1.TaskRef{Name: "b-task"}, + WhenExpressions: []v1beta1.WhenExpression{ + { + Input: "$(tasks.a-task.results.aResult)", + Operator: selection.In, + Values: []string{"aResultValue"}, + }, + { + Input: "aResultValue", + Operator: selection.In, + Values: []string{"$(tasks.a-task.results.aResult)"}, + }, + }, + }, + { + Name: "c-task", + TaskRef: &v1beta1.TaskRef{Name: "c-task"}, + WhenExpressions: []v1beta1.WhenExpression{{ + Input: "$(tasks.a-task.results.aResult)", + Operator: selection.In, + Values: []string{"missing"}, + }}, + }, + { + Name: "d-task", + TaskRef: &v1beta1.TaskRef{Name: "d-task"}, + RunAfter: []string{"c-task"}, + }, + }, + }, + }} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-different-service-accs", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa-0", + }, + }} ts := []*v1beta1.Task{ - tb.Task("a-task", tb.TaskNamespace("foo")), - tb.Task("b-task", tb.TaskNamespace("foo")), - tb.Task("c-task", tb.TaskNamespace("foo")), - tb.Task("d-task", tb.TaskNamespace("foo")), + {ObjectMeta: baseObjectMeta("a-task", "foo")}, + {ObjectMeta: baseObjectMeta("b-task", "foo")}, + {ObjectMeta: baseObjectMeta("c-task", "foo")}, + {ObjectMeta: baseObjectMeta("d-task", "foo")}, } - trs := []*v1beta1.TaskRun{ - tb.TaskRun("test-pipeline-run-different-service-accs-a-task-xxyyy", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run-different-service-accs", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel("tekton.dev/pipeline", "test-pipeline"), - tb.TaskRunLabel("tekton.dev/pipelineRun", "test-pipeline-run-different-service-accs"), - tb.TaskRunLabel("tekton.dev/pipelineTask", "a-task"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("hello-world"), - tb.TaskRunServiceAccountName("test-sa"), - ), - tb.TaskRunStatus( - tb.StatusCondition( + trs := []*v1beta1.TaskRun{{ + ObjectMeta: taskRunObjectMeta("test-pipeline-run-different-service-accs-a-task-xxyyy", "foo", + "test-pipeline-run-different-service-accs", "test-pipeline", "a-task", + true), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{Name: "hello-world"}, + ServiceAccountName: "test-sa", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ apis.Condition{ Type: apis.ConditionSucceeded, Status: corev1.ConditionTrue, }, - ), - tb.TaskRunResult("aResult", "aResultValue"), - ), - ), - } + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + TaskRunResults: []v1beta1.TaskRunResult{{ + Name: "aResult", + Value: "aResultValue", + }}, + }, + }, + }} d := test.Data{ PipelineRuns: prs, @@ -3860,27 +4838,21 @@ func TestReconcileWithWhenExpressionsWithTaskResults(t *testing.T) { pipelineRun, clients := prt.reconcileRun("foo", "test-pipeline-run-different-service-accs", wantEvents, false) expectedTaskRunName := "test-pipeline-run-different-service-accs-b-task-9l9zj" - expectedTaskRun := tb.TaskRun(expectedTaskRunName, - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run-different-service-accs", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel("tekton.dev/pipeline", "test-pipeline"), - tb.TaskRunLabel("tekton.dev/pipelineRun", "test-pipeline-run-different-service-accs"), - tb.TaskRunLabel("tekton.dev/pipelineTask", "b-task"), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineTasks), - tb.TaskRunSpec( - tb.TaskRunTaskRef("b-task"), - tb.TaskRunServiceAccountName("test-sa-0"), - ), - ) - // Check that the expected TaskRun was created - actual, err := clients.Pipeline.TektonV1beta1().TaskRuns("foo").List(prt.TestAssets.Ctx, metav1.ListOptions{ - LabelSelector: "tekton.dev/pipelineTask=b-task,tekton.dev/pipelineRun=test-pipeline-run-different-service-accs", - Limit: 1, - }) - + expectedTaskRun := &v1beta1.TaskRun{ + ObjectMeta: taskRunObjectMeta(expectedTaskRunName, "foo", "test-pipeline-run-different-service-accs", "test-pipeline", "b-task", false), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{Name: "b-task"}, + ServiceAccountName: "test-sa-0", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + } + // Check that the expected TaskRun was created + actual, err := clients.Pipeline.TektonV1beta1().TaskRuns("foo").List(prt.TestAssets.Ctx, metav1.ListOptions{ + LabelSelector: "tekton.dev/pipelineTask=b-task,tekton.dev/pipelineRun=test-pipeline-run-different-service-accs", + Limit: 1, + }) + if err != nil { t.Fatalf("Failure to list TaskRun's %s", err) } @@ -3944,40 +4916,71 @@ func TestReconcileWithWhenExpressionsScopedToTask(t *testing.T) { // \ // (e) ———— (f) names.TestingSeed() - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - // a-task is skipped because its when expressions evaluate to false - tb.PipelineTask("a-task", "a-task", - tb.PipelineTaskWhenExpression("foo", selection.In, []string{"bar"}), - ), - // b-task is executed regardless of running after skipped a-task because when expressions are scoped to task - tb.PipelineTask("b-task", "b-task", - tb.RunAfter("a-task"), - ), - // c-task is skipped because its when expressions evaluate to false (not because it's parent a-task is skipped) - tb.PipelineTask("c-task", "c-task", - tb.PipelineTaskWhenExpression("foo", selection.In, []string{"bar"}), - tb.RunAfter("a-task"), - ), - // d-task is executed regardless of running after skipped parent c-task (and skipped grandparent a-task) - // because when expressions are scoped to task - tb.PipelineTask("d-task", "d-task", - tb.RunAfter("c-task"), - ), - // e-task is attempted regardless of running after skipped a-task because when expressions are scoped to task - // but then get skipped because of missing result references from a-task - tb.PipelineTask("e-task", "e-task", - tb.PipelineTaskWhenExpression("$(tasks.a-task.results.aResult)", selection.In, []string{"aResultValue"}), - ), - // f-task is skipped because its parent task e-task is skipped because of missing result reference from a-task - tb.PipelineTask("f-task", "f-task", - tb.RunAfter("e-task"), - ), - ))} - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-different-service-accs", tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa-0"), - ), - )} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + // a-task is skipped because its when expressions evaluate to false + { + Name: "a-task", + TaskRef: &v1beta1.TaskRef{Name: "a-task"}, + WhenExpressions: []v1beta1.WhenExpression{{ + Input: "foo", + Operator: selection.In, + Values: []string{"bar"}, + }}, + }, + // b-task is executed regardless of running after skipped a-task because when expressions are scoped to task + { + Name: "b-task", + TaskRef: &v1beta1.TaskRef{Name: "b-task"}, + RunAfter: []string{"a-task"}, + }, + // c-task is skipped because its when expressions evaluate to false (not because it's parent a-task is skipped) + { + Name: "c-task", + TaskRef: &v1beta1.TaskRef{Name: "c-task"}, + WhenExpressions: []v1beta1.WhenExpression{{ + Input: "foo", + Operator: selection.In, + Values: []string{"bar"}, + }}, + RunAfter: []string{"a-task"}, + }, + // d-task is executed regardless of running after skipped parent c-task (and skipped grandparent a-task) + // because when expressions are scoped to task + { + Name: "d-task", + TaskRef: &v1beta1.TaskRef{Name: "d-task"}, + RunAfter: []string{"c-task"}, + }, + // e-task is attempted regardless of running after skipped a-task because when expressions are scoped to task + // but then get skipped because of missing result references from a-task + { + Name: "e-task", + TaskRef: &v1beta1.TaskRef{Name: "e-task"}, + WhenExpressions: []v1beta1.WhenExpression{{ + Input: "$(tasks.a-task.results.aResult)", + Operator: selection.In, + Values: []string{"aResultValue"}, + }}, + }, + // f-task is skipped because its parent task e-task is skipped because of missing result reference from a-task + { + Name: "f-task", + TaskRef: &v1beta1.TaskRef{Name: "f-task"}, + RunAfter: []string{"e-task"}, + }, + }, + }, + }} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-different-service-accs", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa-0", + }, + }} // initialize the pipelinerun with the skipped a-task prs[0].Status.SkippedTasks = append(prs[0].Status.SkippedTasks, v1beta1.SkippedTask{ Name: "a-task", @@ -3989,14 +4992,20 @@ func TestReconcileWithWhenExpressionsScopedToTask(t *testing.T) { }) // initialize the tasks used in the pipeline ts := []*v1beta1.Task{ - tb.Task("a-task", tb.TaskNamespace("foo"), - tb.TaskSpec(tb.TaskResults("aResult", "a result")), - ), - tb.Task("b-task", tb.TaskNamespace("foo")), - tb.Task("c-task", tb.TaskNamespace("foo")), - tb.Task("d-task", tb.TaskNamespace("foo")), - tb.Task("e-task", tb.TaskNamespace("foo")), - tb.Task("f-task", tb.TaskNamespace("foo")), + { + ObjectMeta: baseObjectMeta("a-task", "foo"), + Spec: v1beta1.TaskSpec{ + Results: []v1beta1.TaskResult{{ + Name: "aResult", + Description: "a result", + }}, + }, + }, + {ObjectMeta: baseObjectMeta("b-task", "foo")}, + {ObjectMeta: baseObjectMeta("c-task", "foo")}, + {ObjectMeta: baseObjectMeta("d-task", "foo")}, + {ObjectMeta: baseObjectMeta("e-task", "foo")}, + {ObjectMeta: baseObjectMeta("f-task", "foo")}, } // set the scope of when expressions to task -- execution of dependent tasks is unblocked @@ -4025,21 +5034,16 @@ func TestReconcileWithWhenExpressionsScopedToTask(t *testing.T) { pipelineRun, clients := prt.reconcileRun("foo", "test-pipeline-run-different-service-accs", wantEvents, false) taskRunExists := func(taskName string, taskRunName string) { - expectedTaskRun := tb.TaskRun(taskRunName, - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run-different-service-accs", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel("tekton.dev/memberOf", "tasks"), - tb.TaskRunLabel("tekton.dev/pipeline", "test-pipeline"), - tb.TaskRunLabel("tekton.dev/pipelineRun", "test-pipeline-run-different-service-accs"), - tb.TaskRunLabel("tekton.dev/pipelineTask", taskName), - tb.TaskRunSpec( - tb.TaskRunTaskRef(taskName), - tb.TaskRunServiceAccountName("test-sa-0"), - ), - ) + expectedTaskRun := &v1beta1.TaskRun{ + ObjectMeta: taskRunObjectMeta(taskRunName, "foo", "test-pipeline-run-different-service-accs", + "test-pipeline", taskName, false), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{Name: taskName}, + ServiceAccountName: "test-sa-0", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + } actual, err := clients.Pipeline.TektonV1beta1().TaskRuns("foo").List(prt.TestAssets.Ctx, metav1.ListOptions{ LabelSelector: fmt.Sprintf("tekton.dev/pipelineTask=%s,tekton.dev/pipelineRun=test-pipeline-run-different-service-accs", taskName), @@ -4112,55 +5116,81 @@ func TestReconcileWithWhenExpressionsScopedToTask(t *testing.T) { func TestReconcileWithWhenExpressionsScopedToTaskWitResultRefs(t *testing.T) { names.TestingSeed() - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - // a-task is executed and produces a result aResult with value aResultValue - tb.PipelineTask("a-task", "a-task"), - // b-task is skipped because it has when expressions, with result reference to a-task, that evaluate to false - tb.PipelineTask("b-task", "b-task", - tb.PipelineTaskWhenExpression("$(tasks.a-task.results.aResult)", selection.In, []string{"notResultValue"}), - ), - // c-task is executed regardless of running after skipped b-task because when expressions are scoped to task - tb.PipelineTask("c-task", "c-task", - tb.RunAfter("b-task"), - ), - ))} - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-different-service-accs", tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa-0"), - ), - )} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + // a-task is executed and produces a result aResult with value aResultValue + { + Name: "a-task", + TaskRef: &v1beta1.TaskRef{Name: "a-task"}, + }, + // b-task is skipped because it has when expressions, with result reference to a-task, that evaluate to false + { + Name: "b-task", + TaskRef: &v1beta1.TaskRef{Name: "b-task"}, + WhenExpressions: []v1beta1.WhenExpression{{ + Input: "$(tasks.a-task.results.aResult)", + Operator: selection.In, + Values: []string{"notResultValue"}, + }}, + }, + // c-task is executed regardless of running after skipped b-task because when expressions are scoped to task + { + Name: "c-task", + TaskRef: &v1beta1.TaskRef{Name: "c-task"}, + RunAfter: []string{"b-task"}, + }, + }, + }, + }} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-different-service-accs", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa-0", + }, + }} ts := []*v1beta1.Task{ - tb.Task("a-task", tb.TaskNamespace("foo"), - tb.TaskSpec(tb.TaskResults("aResult", "a result")), - ), - tb.Task("b-task", tb.TaskNamespace("foo")), - tb.Task("c-task", tb.TaskNamespace("foo")), + { + ObjectMeta: baseObjectMeta("a-task", "foo"), + Spec: v1beta1.TaskSpec{ + Results: []v1beta1.TaskResult{{ + Name: "aResult", + Description: "a result", + }}, + }, + }, + {ObjectMeta: baseObjectMeta("b-task", "foo")}, + {ObjectMeta: baseObjectMeta("c-task", "foo")}, } - trs := []*v1beta1.TaskRun{ - tb.TaskRun("test-pipeline-run-different-service-accs-a-task-xxyyy", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run-different-service-accs", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel("tekton.dev/pipeline", "test-pipeline"), - tb.TaskRunLabel("tekton.dev/pipelineRun", "test-pipeline-run-different-service-accs"), - tb.TaskRunLabel("tekton.dev/pipelineTask", "a-task"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("hello-world"), - tb.TaskRunServiceAccountName("test-sa"), - ), - tb.TaskRunStatus( - tb.StatusCondition( + trs := []*v1beta1.TaskRun{{ + ObjectMeta: taskRunObjectMeta("test-pipeline-run-different-service-accs-a-task-xxyyy", "foo", + "test-pipeline-run-different-service-accs", "test-pipeline", "a-task", + true), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{Name: "hello-world"}, + ServiceAccountName: "test-sa", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ apis.Condition{ Type: apis.ConditionSucceeded, Status: corev1.ConditionTrue, }, - ), - tb.TaskRunResult("aResult", "aResultValue"), - ), - ), - } + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + TaskRunResults: []v1beta1.TaskRunResult{{ + Name: "aResult", + Value: "aResultValue", + }}, + }, + }, + }} // set the scope of when expressions to task -- execution of dependent tasks is unblocked cms := []*corev1.ConfigMap{ { @@ -4238,21 +5268,80 @@ func TestReconcileWithAffinityAssistantStatefulSet(t *testing.T) { workspaceName2 := "ws2" emptyDirWorkspace := "emptyDirWorkspace" pipelineRunName := "test-pipeline-run" - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world", tb.PipelineTaskWorkspaceBinding("taskWorkspaceName", workspaceName, "")), - tb.PipelineTask("hello-world-2", "hello-world", tb.PipelineTaskWorkspaceBinding("taskWorkspaceName", workspaceName2, "")), - tb.PipelineTask("hello-world-3", "hello-world", tb.PipelineTaskWorkspaceBinding("taskWorkspaceName", emptyDirWorkspace, "")), - tb.PipelineWorkspaceDeclaration(workspaceName, workspaceName2, emptyDirWorkspace), - ))} - - prs := []*v1beta1.PipelineRun{tb.PipelineRun(pipelineRunName, tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunWorkspaceBindingVolumeClaimTemplate(workspaceName, "myclaim", ""), - tb.PipelineRunWorkspaceBindingVolumeClaimTemplate(workspaceName2, "myclaim2", ""), - tb.PipelineRunWorkspaceBindingEmptyDir(emptyDirWorkspace), - )), - } - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Workspaces: []v1beta1.PipelineWorkspaceDeclaration{ + {Name: workspaceName}, + {Name: workspaceName2}, + {Name: emptyDirWorkspace}, + }, + Tasks: []v1beta1.PipelineTask{ + { + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + Workspaces: []v1beta1.WorkspacePipelineTaskBinding{{ + Name: "taskWorkspaceName", + Workspace: workspaceName, + }}, + }, + { + Name: "hello-world-2", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + Workspaces: []v1beta1.WorkspacePipelineTaskBinding{{ + Name: "taskWorkspaceName", + Workspace: workspaceName2, + }}, + }, + { + Name: "hello-world-3", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + Workspaces: []v1beta1.WorkspacePipelineTaskBinding{{ + Name: "taskWorkspaceName", + Workspace: emptyDirWorkspace, + }}, + }, + }, + }, + }} + + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta(pipelineRunName, "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + Workspaces: []v1beta1.WorkspaceBinding{ + { + Name: workspaceName, + VolumeClaimTemplate: &corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "myclaim", + }, + Spec: corev1.PersistentVolumeClaimSpec{}, + }, + }, + { + Name: workspaceName2, + VolumeClaimTemplate: &corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "myclaim2", + }, + Spec: corev1.PersistentVolumeClaimSpec{}, + }, + }, + { + Name: emptyDirWorkspace, + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }, + }, + }} + ts := []*v1beta1.Task{simpleHelloWorldTask} d := test.Data{ PipelineRuns: prs, @@ -4335,16 +5424,49 @@ func TestReconcileWithVolumeClaimTemplateWorkspace(t *testing.T) { workspaceName := "ws1" claimName := "myclaim" pipelineRunName := "test-pipeline-run" - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world", tb.PipelineTaskWorkspaceBinding("taskWorkspaceName", workspaceName, "")), - tb.PipelineTask("hello-world-2", "hello-world"), - tb.PipelineWorkspaceDeclaration(workspaceName), - ))} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + { + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + Workspaces: []v1beta1.WorkspacePipelineTaskBinding{{ + Name: "taskWorkspaceName", + Workspace: workspaceName, + }}, + }, + { + Name: "hello-world-2", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }, + }, + Workspaces: []v1beta1.PipelineWorkspaceDeclaration{{ + Name: workspaceName, + }}, + }, + }} - prs := []*v1beta1.PipelineRun{tb.PipelineRun(pipelineRunName, tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", tb.PipelineRunWorkspaceBindingVolumeClaimTemplate(workspaceName, claimName, ""))), - } - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta(pipelineRunName, "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + Workspaces: []v1beta1.WorkspaceBinding{{ + Name: workspaceName, + VolumeClaimTemplate: &corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: claimName, + }, + Spec: corev1.PersistentVolumeClaimSpec{}, + }, + }}, + }, + }} + ts := []*v1beta1.Task{simpleHelloWorldTask} d := test.Data{ PipelineRuns: prs, @@ -4415,21 +5537,99 @@ func TestReconcileWithVolumeClaimTemplateWorkspaceUsingSubPaths(t *testing.T) { subPath1 := "customdirectory" subPath2 := "otherdirecory" pipelineRunWsSubPath := "mypath" - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", "hello-world", tb.PipelineTaskWorkspaceBinding("taskWorkspaceName", workspaceName, subPath1)), - tb.PipelineTask("hello-world-2", "hello-world", tb.PipelineTaskWorkspaceBinding("taskWorkspaceName", workspaceName, subPath2)), - tb.PipelineTask("hello-world-3", "hello-world", tb.PipelineTaskWorkspaceBinding("taskWorkspaceName", workspaceName, "")), - tb.PipelineTask("hello-world-4", "hello-world", tb.PipelineTaskWorkspaceBinding("taskWorkspaceName", workspaceNameWithSubPath, "")), - tb.PipelineTask("hello-world-5", "hello-world", tb.PipelineTaskWorkspaceBinding("taskWorkspaceName", workspaceNameWithSubPath, subPath1)), - tb.PipelineWorkspaceDeclaration(workspaceName, workspaceNameWithSubPath), - ))} - - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run", tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunWorkspaceBindingVolumeClaimTemplate(workspaceName, "myclaim", ""), - tb.PipelineRunWorkspaceBindingVolumeClaimTemplate(workspaceNameWithSubPath, "myclaim", pipelineRunWsSubPath))), - } - ts := []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Workspaces: []v1beta1.PipelineWorkspaceDeclaration{ + {Name: workspaceName}, + {Name: workspaceNameWithSubPath}, + }, + Tasks: []v1beta1.PipelineTask{ + { + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + Workspaces: []v1beta1.WorkspacePipelineTaskBinding{{ + Name: "taskWorkspaceName", + Workspace: workspaceName, + SubPath: subPath1, + }}, + }, + { + Name: "hello-world-2", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + Workspaces: []v1beta1.WorkspacePipelineTaskBinding{{ + Name: "taskWorkspaceName", + Workspace: workspaceName, + SubPath: subPath2, + }}, + }, + { + Name: "hello-world-3", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + Workspaces: []v1beta1.WorkspacePipelineTaskBinding{{ + Name: "taskWorkspaceName", + Workspace: workspaceName, + }}, + }, + { + Name: "hello-world-4", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + Workspaces: []v1beta1.WorkspacePipelineTaskBinding{{ + Name: "taskWorkspaceName", + Workspace: workspaceNameWithSubPath, + }}, + }, + { + Name: "hello-world-5", + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + Workspaces: []v1beta1.WorkspacePipelineTaskBinding{{ + Name: "taskWorkspaceName", + Workspace: workspaceNameWithSubPath, + SubPath: subPath1, + }}, + }, + }, + }, + }} + + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + Workspaces: []v1beta1.WorkspaceBinding{ + { + Name: workspaceName, + VolumeClaimTemplate: &corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "myclaim", + }, + Spec: corev1.PersistentVolumeClaimSpec{}, + }, + }, + { + Name: workspaceNameWithSubPath, + SubPath: pipelineRunWsSubPath, + VolumeClaimTemplate: &corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "myclaim", + }, + Spec: corev1.PersistentVolumeClaimSpec{}, + }, + }, + }, + }, + }} + ts := []*v1beta1.Task{simpleHelloWorldTask} d := test.Data{ PipelineRuns: prs, @@ -4511,50 +5711,75 @@ func TestReconcileWithVolumeClaimTemplateWorkspaceUsingSubPaths(t *testing.T) { func TestReconcileWithTaskResults(t *testing.T) { names.TestingSeed() - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("a-task", "a-task"), - tb.PipelineTask("b-task", "b-task", - tb.PipelineTaskParam("bParam", "$(tasks.a-task.results.aResult)"), - ), - ))} - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-different-service-accs", tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa-0"), - ), - )} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + { + Name: "a-task", + TaskRef: &v1beta1.TaskRef{ + Name: "a-task", + }, + }, + { + Name: "b-task", + TaskRef: &v1beta1.TaskRef{ + Name: "b-task", + }, + Params: []v1beta1.Param{{ + Name: "bParam", + Value: *v1beta1.NewArrayOrString("$(tasks.a-task.results.aResult)"), + }}, + }, + }, + }, + }} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-different-service-accs", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa-0", + }, + }} ts := []*v1beta1.Task{ - tb.Task("a-task", tb.TaskNamespace("foo")), - tb.Task("b-task", tb.TaskNamespace("foo"), - tb.TaskSpec( - tb.TaskParam("bParam", v1beta1.ParamTypeString), - ), - ), + {ObjectMeta: baseObjectMeta("a-task", "foo")}, + { + ObjectMeta: baseObjectMeta("b-task", "foo"), + Spec: v1beta1.TaskSpec{ + Params: []v1beta1.ParamSpec{{ + Name: "bParam", + Type: v1beta1.ParamTypeString, + }}, + }, + }, } - trs := []*v1beta1.TaskRun{ - tb.TaskRun("test-pipeline-run-different-service-accs-a-task-xxyyy", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run-different-service-accs", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel("tekton.dev/pipeline", "test-pipeline"), - tb.TaskRunLabel("tekton.dev/pipelineRun", "test-pipeline-run-different-service-accs"), - tb.TaskRunLabel("tekton.dev/pipelineTask", "a-task"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("hello-world"), - tb.TaskRunServiceAccountName("test-sa"), - ), - tb.TaskRunStatus( - tb.StatusCondition( + trs := []*v1beta1.TaskRun{{ + ObjectMeta: taskRunObjectMeta("test-pipeline-run-different-service-accs-a-task-xxyyy", "foo", + "test-pipeline-run-different-service-accs", "test-pipeline", "a-task", + true), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{Name: "hello-world"}, + ServiceAccountName: "test-sa", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ apis.Condition{ Type: apis.ConditionSucceeded, Status: corev1.ConditionTrue, }, - ), - tb.TaskRunResult("aResult", "aResultValue"), - ), - ), - } + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + TaskRunResults: []v1beta1.TaskRunResult{{ + Name: "aResult", + Value: "aResultValue", + }}, + }, + }, + }} d := test.Data{ PipelineRuns: prs, @@ -4568,22 +5793,20 @@ func TestReconcileWithTaskResults(t *testing.T) { _, clients := prt.reconcileRun("foo", "test-pipeline-run-different-service-accs", []string{}, false) expectedTaskRunName := "test-pipeline-run-different-service-accs-b-task-9l9zj" - expectedTaskRun := tb.TaskRun(expectedTaskRunName, - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run-different-service-accs", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel("tekton.dev/pipeline", "test-pipeline"), - tb.TaskRunLabel("tekton.dev/pipelineRun", "test-pipeline-run-different-service-accs"), - tb.TaskRunLabel("tekton.dev/pipelineTask", "b-task"), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineTasks), - tb.TaskRunSpec( - tb.TaskRunTaskRef("b-task"), - tb.TaskRunServiceAccountName("test-sa-0"), - tb.TaskRunParam("bParam", "aResultValue"), - ), - ) + expectedTaskRun := &v1beta1.TaskRun{ + ObjectMeta: taskRunObjectMeta(expectedTaskRunName, "foo", "test-pipeline-run-different-service-accs", + "test-pipeline", "b-task", false), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{Name: "b-task"}, + ServiceAccountName: "test-sa-0", + Params: []v1beta1.Param{{ + Name: "bParam", + Value: *v1beta1.NewArrayOrString("aResultValue"), + }}, + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + } // Check that the expected TaskRun was created actual, err := clients.Pipeline.TektonV1beta1().TaskRuns("foo").List(prt.TestAssets.Ctx, metav1.ListOptions{ LabelSelector: "tekton.dev/pipelineTask=b-task,tekton.dev/pipelineRun=test-pipeline-run-different-service-accs", @@ -4604,30 +5827,54 @@ func TestReconcileWithTaskResults(t *testing.T) { func TestReconcileWithTaskResultsEmbeddedNoneStarted(t *testing.T) { names.TestingSeed() - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-different-service-accs", tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunPipelineSpec( - tb.PipelineParamSpec("foo", v1beta1.ParamTypeString), - tb.PipelineTask("a-task", "a-task"), - tb.PipelineTask("b-task", "b-task", - tb.PipelineTaskParam("bParam", "$(params.foo)/baz@$(tasks.a-task.results.A_RESULT)"), - ), - ), - tb.PipelineRunParam("foo", "bar"), - tb.PipelineRunServiceAccountName("test-sa-0"), - ), - )} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-different-service-accs", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineSpec: &v1beta1.PipelineSpec{ + Params: []v1beta1.ParamSpec{{ + Name: "foo", + Type: v1beta1.ParamTypeString, + }}, + Tasks: []v1beta1.PipelineTask{ + { + Name: "a-task", + TaskRef: &v1beta1.TaskRef{Name: "a-task"}, + }, + { + Name: "b-task", + TaskRef: &v1beta1.TaskRef{Name: "b-task"}, + Params: []v1beta1.Param{{ + Name: "bParam", + Value: *v1beta1.NewArrayOrString("$(params.foo)/baz@$(tasks.a-task.results.A_RESULT)"), + }}, + }, + }, + }, + Params: []v1beta1.Param{{ + Name: "foo", + Value: *v1beta1.NewArrayOrString("bar"), + }}, + ServiceAccountName: "test-sa-0", + }, + }} ts := []*v1beta1.Task{ - tb.Task("a-task", tb.TaskNamespace("foo"), - tb.TaskSpec( - tb.TaskResults("A_RESULT", ""), - ), - ), - tb.Task("b-task", tb.TaskNamespace("foo"), - tb.TaskSpec( - tb.TaskParam("bParam", v1beta1.ParamTypeString), - ), - ), + { + ObjectMeta: baseObjectMeta("a-task", "foo"), + Spec: v1beta1.TaskSpec{ + Results: []v1beta1.TaskResult{{ + Name: "A_RESULT", + }}, + }, + }, + { + ObjectMeta: baseObjectMeta("b-task", "foo"), + Spec: v1beta1.TaskSpec{ + Params: []v1beta1.ParamSpec{{ + Name: "bParam", + Type: v1beta1.ParamTypeString, + }}, + }, + }, } d := test.Data{ @@ -4645,21 +5892,19 @@ func TestReconcileWithTaskResultsEmbeddedNoneStarted(t *testing.T) { // Since b-task is dependent on a-task, via the results, only a-task should run expectedTaskRunName := "test-pipeline-run-different-service-accs-a-task-9l9zj" - expectedTaskRun := tb.TaskRun(expectedTaskRunName, - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run-different-service-accs", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel("tekton.dev/pipeline", "test-pipeline-run-different-service-accs"), - tb.TaskRunLabel("tekton.dev/pipelineRun", "test-pipeline-run-different-service-accs"), - tb.TaskRunLabel("tekton.dev/pipelineTask", "a-task"), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineTasks), - tb.TaskRunSpec( - tb.TaskRunTaskRef("a-task", tb.TaskRefKind(v1beta1.NamespacedTaskKind)), - tb.TaskRunServiceAccountName("test-sa-0"), - ), - ) + expectedTaskRun := &v1beta1.TaskRun{ + ObjectMeta: taskRunObjectMeta(expectedTaskRunName, "foo", "test-pipeline-run-different-service-accs", + "test-pipeline-run-different-service-accs", "a-task", false), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "a-task", + Kind: v1beta1.NamespacedTaskKind, + }, + ServiceAccountName: "test-sa-0", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + } // Check that the expected TaskRun was created (only) actual, err := clients.Pipeline.TektonV1beta1().TaskRuns("foo").List(prt.TestAssets.Ctx, metav1.ListOptions{}) if err != nil { @@ -4676,65 +5921,105 @@ func TestReconcileWithTaskResultsEmbeddedNoneStarted(t *testing.T) { func TestReconcileWithPipelineResults(t *testing.T) { names.TestingSeed() - ps := []*v1beta1.Pipeline{tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("a-task", "a-task"), - tb.PipelineTask("b-task", "b-task", - tb.PipelineTaskParam("bParam", "$(tasks.a-task.results.aResult)"), - ), - tb.PipelineResult("result", "$(tasks.a-task.results.aResult)", "pipeline result"), - ))} - trs := []*v1beta1.TaskRun{ - tb.TaskRun("test-pipeline-run-different-service-accs-a-task-9l9zj", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test-pipeline-run-different-service-accs", - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel("tekton.dev/pipeline", "test-pipeline"), - tb.TaskRunLabel("tekton.dev/pipelineRun", "test-pipeline-run-different-service-accs"), - tb.TaskRunLabel("tekton.dev/pipelineTask", "a-task"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("hello-world"), - tb.TaskRunServiceAccountName("test-sa"), - ), - tb.TaskRunStatus( - tb.StatusCondition( + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + { + Name: "a-task", + TaskRef: &v1beta1.TaskRef{ + Name: "a-task", + }, + }, + { + Name: "b-task", + TaskRef: &v1beta1.TaskRef{ + Name: "b-task", + }, + Params: []v1beta1.Param{{ + Name: "bParam", + Value: *v1beta1.NewArrayOrString("$(tasks.a-task.results.aResult)"), + }}, + }, + }, + Results: []v1beta1.PipelineResult{{ + Name: "result", + Value: "$(tasks.a-task.results.aResult)", + Description: "pipeline result", + }}, + }, + }} + trs := []*v1beta1.TaskRun{{ + ObjectMeta: taskRunObjectMeta("test-pipeline-run-different-service-accs-a-task-9l9zj", "foo", + "test-pipeline-run-different-service-accs", "test-pipeline", "a-task", + true), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{Name: "hello-world"}, + ServiceAccountName: "test-sa", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ apis.Condition{ Type: apis.ConditionSucceeded, Status: corev1.ConditionTrue, }, - ), - tb.TaskRunResult("aResult", "aResultValue"), - ), - ), - } - prs := []*v1beta1.PipelineRun{tb.PipelineRun("test-pipeline-run-different-service-accs", tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline", - tb.PipelineRunServiceAccountName("test-sa-0"), - ), - tb.PipelineRunStatus( - tb.PipelineRunResult("result", "aResultValue"), - tb.PipelineRunStatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionTrue, - Reason: v1beta1.PipelineRunReasonSuccessful.String(), - Message: "All Tasks have completed executing", - }), - tb.PipelineRunTaskRunsStatus(trs[0].Name, &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: "a-task", - Status: &trs[0].Status, - }), - tb.PipelineRunStartTime(time.Now().AddDate(0, 0, -1)), - tb.PipelineRunCompletionTime(time.Now()), - ), - )} + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + TaskRunResults: []v1beta1.TaskRunResult{{ + Name: "aResult", + Value: "aResultValue", + }}, + }, + }, + }} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-different-service-accs", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa-0", + }, + Status: v1beta1.PipelineRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionTrue, + Reason: v1beta1.PipelineRunReasonSuccessful.String(), + Message: "All Tasks have completed executing", + }, + }, + }, + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + PipelineResults: []v1beta1.PipelineRunResult{{ + Name: "result", + Value: "aResultValue", + }}, + TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ + trs[0].Name: { + PipelineTaskName: "a-task", + Status: &trs[0].Status, + }, + }, + StartTime: &metav1.Time{Time: time.Now().AddDate(0, 0, -1)}, + CompletionTime: &metav1.Time{Time: time.Now()}, + }, + }, + }} ts := []*v1beta1.Task{ - tb.Task("a-task", tb.TaskNamespace("foo")), - tb.Task("b-task", tb.TaskNamespace("foo"), - tb.TaskSpec( - tb.TaskParam("bParam", v1beta1.ParamTypeString), - ), - ), + {ObjectMeta: baseObjectMeta("a-task", "foo")}, + { + ObjectMeta: baseObjectMeta("b-task", "foo"), + Spec: v1beta1.TaskSpec{ + Params: []v1beta1.ParamSpec{{ + Name: "bParam", + Type: v1beta1.ParamTypeString, + }}, + }, + }, } d := test.Data{ @@ -4755,10 +6040,10 @@ func TestReconcileWithPipelineResults(t *testing.T) { func Test_storePipelineSpec(t *testing.T) { ctx := context.Background() - pr := tb.PipelineRun("foo") + pr := &v1beta1.PipelineRun{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} - ps := tb.Pipeline("some-pipeline", tb.PipelineSpec(tb.PipelineDescription("foo-pipeline"))).Spec - ps1 := tb.Pipeline("some-pipeline", tb.PipelineSpec(tb.PipelineDescription("bar-pipeline"))).Spec + ps := v1beta1.PipelineSpec{Description: "foo-pipeline"} + ps1 := v1beta1.PipelineSpec{Description: "bar-pipeline"} want := ps.DeepCopy() // The first time we set it, it should get copied. @@ -4785,7 +6070,7 @@ func TestReconcileOutOfSyncPipelineRun(t *testing.T) { // TaskRuns back in the PipelineRun status. // For more details, see https://github.com/tektoncd/pipeline/issues/2558 prOutOfSyncName := "test-pipeline-run-out-of-sync" - helloWorldTask := tb.Task("hello-world", tb.TaskNamespace("foo")) + helloWorldTask := simpleHelloWorldTask // Condition checks for the third task prccs3 := make(map[string]*v1beta1.PipelineRunConditionCheckStatus) @@ -4819,103 +6104,157 @@ func TestReconcileOutOfSyncPipelineRun(t *testing.T) { }, }, } - testPipeline := tb.Pipeline("test-pipeline", tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("hello-world-1", helloWorldTask.Name), - tb.PipelineTask("hello-world-2", helloWorldTask.Name), - tb.PipelineTask("hello-world-3", helloWorldTask.Name, tb.PipelineTaskCondition("always-true")), - tb.PipelineTask("hello-world-4", helloWorldTask.Name, tb.PipelineTaskCondition("always-true")), - tb.PipelineTask("hello-world-5", helloWorldTask.Name), // custom task (corrected below) - )) - - // Update the fifth pipeline task to be a custom task (builder does not support this case). - testPipeline.Spec.Tasks[4].TaskRef = &v1beta1.TaskRef{APIVersion: "example.dev/v0", Kind: "Example"} + testPipeline := &v1beta1.Pipeline{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + { + Name: "hello-world-1", + TaskRef: &v1beta1.TaskRef{ + Name: helloWorldTask.Name, + }, + }, + { + Name: "hello-world-2", + TaskRef: &v1beta1.TaskRef{ + Name: helloWorldTask.Name, + }, + }, + { + Name: "hello-world-3", + TaskRef: &v1beta1.TaskRef{ + Name: helloWorldTask.Name, + }, + Conditions: []v1beta1.PipelineTaskCondition{{ + ConditionRef: "always-true", + }}, + }, + { + Name: "hello-world-4", + TaskRef: &v1beta1.TaskRef{ + Name: helloWorldTask.Name, + }, + Conditions: []v1beta1.PipelineTaskCondition{{ + ConditionRef: "always-true", + }}, + }, + { + Name: "hello-world-5", + TaskRef: &v1beta1.TaskRef{APIVersion: "example.dev/v0", Kind: "Example"}, + }, + }, + }, + } // This taskrun is in the pipelinerun status. It completed successfully. - taskRunDone := tb.TaskRun("test-pipeline-run-out-of-sync-hello-world-1", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", prOutOfSyncName), - tb.TaskRunLabel(pipeline.PipelineLabelKey, testPipeline.Name), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, prOutOfSyncName), - tb.TaskRunLabel(pipeline.PipelineTaskLabelKey, "hello-world-1"), - tb.TaskRunSpec(tb.TaskRunTaskRef("hello-world")), - tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionTrue, - }), - ), - ) + taskRunDone := &v1beta1.TaskRun{ + ObjectMeta: taskRunObjectMeta("test-pipeline-run-out-of-sync-hello-world-1", "foo", prOutOfSyncName, testPipeline.Name, "hello-world-1", false), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionTrue, + }, + }, + }, + }, + } // This taskrun is *not* in the pipelinerun status. It's still running. - taskRunOrphaned := tb.TaskRun("test-pipeline-run-out-of-sync-hello-world-2", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", prOutOfSyncName), - tb.TaskRunLabel(pipeline.PipelineLabelKey, testPipeline.Name), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, prOutOfSyncName), - tb.TaskRunLabel(pipeline.PipelineTaskLabelKey, "hello-world-2"), - tb.TaskRunSpec(tb.TaskRunTaskRef("hello-world")), - tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - }), - ), - ) + taskRunOrphaned := &v1beta1.TaskRun{ + ObjectMeta: taskRunObjectMeta("test-pipeline-run-out-of-sync-hello-world-2", "foo", prOutOfSyncName, testPipeline.Name, "hello-world-2", false), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + }, + }, + }, + }, + } // This taskrun has a condition attached. The condition is in the pipelinerun, but the taskrun // itself is *not* in the pipelinerun status. It's still running. - taskRunWithCondition := tb.TaskRun("test-pipeline-run-out-of-sync-hello-world-3", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", prOutOfSyncName), - tb.TaskRunLabel(pipeline.PipelineLabelKey, testPipeline.Name), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, prOutOfSyncName), - tb.TaskRunLabel(pipeline.PipelineTaskLabelKey, "hello-world-3"), - tb.TaskRunSpec(tb.TaskRunTaskRef("hello-world")), - tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - }), - ), - ) + taskRunWithCondition := &v1beta1.TaskRun{ + ObjectMeta: taskRunObjectMeta("test-pipeline-run-out-of-sync-hello-world-3", "foo", prOutOfSyncName, testPipeline.Name, "hello-world-3", false), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + }, + }, + }, + }, + } - taskRunForConditionOfOrphanedTaskRun := tb.TaskRun(conditionCheckName3, - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", prOutOfSyncName), - tb.TaskRunLabel(pipeline.PipelineLabelKey, testPipeline.Name), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, prOutOfSyncName), - tb.TaskRunLabel(pipeline.PipelineTaskLabelKey, "hello-world-3"), - tb.TaskRunLabel(pipeline.ConditionCheckKey, conditionCheckName3), - tb.TaskRunLabel(pipeline.ConditionNameKey, "always-true"), - tb.TaskRunSpec(tb.TaskRunTaskRef("always-true-0")), - tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - }), - ), - ) + taskRunForConditionOfOrphanedTaskRunObjectMeta := taskRunObjectMeta(conditionCheckName3, "foo", prOutOfSyncName, testPipeline.Name, "hello-world-3", false) + taskRunForConditionOfOrphanedTaskRunObjectMeta.Labels[pipeline.ConditionCheckKey] = conditionCheckName3 + taskRunForConditionOfOrphanedTaskRunObjectMeta.Labels[pipeline.ConditionNameKey] = "always-true" + + taskRunForConditionOfOrphanedTaskRun := &v1beta1.TaskRun{ + ObjectMeta: taskRunForConditionOfOrphanedTaskRunObjectMeta, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "always-true-0", + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + }, + }, + }, + }, + } // This taskrun has a condition attached. The condition is *not* the in pipelinerun, and it's still // running. The taskrun itself was not created yet. taskRunWithOrphanedConditionName := "test-pipeline-run-out-of-sync-hello-world-4" + taskRunForOrphanedConditionObjectMeta := taskRunObjectMeta(conditionCheckName4, "foo", prOutOfSyncName, testPipeline.Name, "hello-world-4", false) + taskRunForOrphanedConditionObjectMeta.Labels[pipeline.ConditionCheckKey] = conditionCheckName4 + taskRunForOrphanedConditionObjectMeta.Labels[pipeline.ConditionNameKey] = "always-true" - taskRunForOrphanedCondition := tb.TaskRun(conditionCheckName4, - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", prOutOfSyncName), - tb.TaskRunLabel(pipeline.PipelineLabelKey, testPipeline.Name), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, prOutOfSyncName), - tb.TaskRunLabel(pipeline.PipelineTaskLabelKey, "hello-world-4"), - tb.TaskRunLabel(pipeline.ConditionCheckKey, conditionCheckName4), - tb.TaskRunLabel(pipeline.ConditionNameKey, "always-true"), - tb.TaskRunSpec(tb.TaskRunTaskRef("always-true-0")), - tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - }), - ), - ) + taskRunForOrphanedCondition := &v1beta1.TaskRun{ + ObjectMeta: taskRunForOrphanedConditionObjectMeta, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "always-true-0", + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + }, + }, + }, + }, + } orphanedRun := &v1alpha1.Run{ ObjectMeta: metav1.ObjectMeta{ @@ -4950,26 +6289,38 @@ func TestReconcileOutOfSyncPipelineRun(t *testing.T) { }, } - prOutOfSync := tb.PipelineRun(prOutOfSyncName, - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec(testPipeline.Name, tb.PipelineRunServiceAccountName("test-sa")), - tb.PipelineRunStatus(tb.PipelineRunStatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - Reason: "", - Message: "", - }), - tb.PipelineRunTaskRunsStatus(taskRunDone.Name, &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: "hello-world-1", - Status: &v1beta1.TaskRunStatus{}, - }), - tb.PipelineRunTaskRunsStatus(taskRunWithCondition.Name, &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: "hello-world-3", - Status: nil, - ConditionChecks: prccs3, - }), - ), - ) + prOutOfSync := &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prOutOfSyncName, "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: testPipeline.Name}, + ServiceAccountName: "test-sa", + }, + Status: v1beta1.PipelineRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + Reason: "", + Message: "", + }, + }, + }, + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{ + taskRunDone.Name: { + PipelineTaskName: "hello-world-1", + Status: &v1beta1.TaskRunStatus{}, + }, + taskRunWithCondition.Name: { + PipelineTaskName: "hello-world-3", + Status: nil, + ConditionChecks: prccs3, + }, + }, + }, + }, + } prs := []*v1beta1.PipelineRun{prOutOfSync} ps := []*v1beta1.Pipeline{testPipeline} ts := []*v1beta1.Task{helloWorldTask} @@ -5136,17 +6487,27 @@ func TestReconcileOutOfSyncPipelineRun(t *testing.T) { func TestUpdatePipelineRunStatusFromInformer(t *testing.T) { names.TestingSeed() - pr := tb.PipelineRun("test-pipeline-run", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunLabel("mylabel", "myvalue"), - tb.PipelineRunSpec("", tb.PipelineRunPipelineSpec( - tb.PipelineTask("unit-test-task-spec", "", tb.PipelineTaskSpec(v1beta1.TaskSpec{ - Steps: []v1beta1.Step{{Container: corev1.Container{ - Name: "mystep", - Image: "myimage"}}}, - })), - )), - ) + pr := &v1beta1.PipelineRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-pipeline-run", + Namespace: "foo", + Labels: map[string]string{"mylabel": "myvale"}, + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineSpec: &v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "unit-test-task-spec", + TaskSpec: &v1beta1.EmbeddedTask{ + TaskSpec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{Container: corev1.Container{ + Name: "mystep", + Image: "myimage"}}}, + }, + }, + }}, + }, + }, + } d := test.Data{ PipelineRuns: []*v1beta1.PipelineRun{pr}, @@ -5583,13 +6944,18 @@ func TestReconcilePipeline_FinalTasks(t *testing.T) { ps: getPipeline( "pipeline-dag-task-failing", - []tb.PipelineSpecOp{ - tb.PipelineTask("dag-task-1", "hello-world"), - tb.FinalPipelineTask("final-task-1", "hello-world"), - }, - ), + v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "dag-task-1", + TaskRef: &v1beta1.TaskRef{Name: "hello-world"}, + }}, + Finally: []v1beta1.PipelineTask{{ + Name: "final-task-1", + TaskRef: &v1beta1.TaskRef{Name: "hello-world"}, + }}, + }), - ts: []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))}, + ts: []*v1beta1.Task{simpleHelloWorldTask}, trs: []*v1beta1.TaskRun{ getTaskRun( @@ -5642,13 +7008,18 @@ func TestReconcilePipeline_FinalTasks(t *testing.T) { ps: getPipeline( "pipeline-with-dag-successful-but-final-failing", - []tb.PipelineSpecOp{ - tb.PipelineTask("dag-task-1", "hello-world"), - tb.FinalPipelineTask("final-task-1", "hello-world"), - }, - ), + v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "dag-task-1", + TaskRef: &v1beta1.TaskRef{Name: "hello-world"}, + }}, + Finally: []v1beta1.PipelineTask{{ + Name: "final-task-1", + TaskRef: &v1beta1.TaskRef{Name: "hello-world"}, + }}, + }), - ts: []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))}, + ts: []*v1beta1.Task{simpleHelloWorldTask}, trs: []*v1beta1.TaskRun{ getTaskRun( @@ -5701,13 +7072,18 @@ func TestReconcilePipeline_FinalTasks(t *testing.T) { ps: getPipeline( "pipeline-with-dag-and-final-failing", - []tb.PipelineSpecOp{ - tb.PipelineTask("dag-task-1", "hello-world"), - tb.FinalPipelineTask("final-task-1", "hello-world"), - }, - ), + v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "dag-task-1", + TaskRef: &v1beta1.TaskRef{Name: "hello-world"}, + }}, + Finally: []v1beta1.PipelineTask{{ + Name: "final-task-1", + TaskRef: &v1beta1.TaskRef{Name: "hello-world"}, + }}, + }), - ts: []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))}, + ts: []*v1beta1.Task{simpleHelloWorldTask}, trs: []*v1beta1.TaskRun{ getTaskRun( @@ -5761,14 +7137,24 @@ func TestReconcilePipeline_FinalTasks(t *testing.T) { ps: getPipeline( "pipeline-with-dag-running", - []tb.PipelineSpecOp{ - tb.PipelineTask("dag-task-1", "hello-world"), - tb.PipelineTask("dag-task-2", "hello-world"), - tb.FinalPipelineTask("final-task-1", "hello-world"), - }, - ), + v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + { + Name: "dag-task-1", + TaskRef: &v1beta1.TaskRef{Name: "hello-world"}, + }, + { + Name: "dag-task-2", + TaskRef: &v1beta1.TaskRef{Name: "hello-world"}, + }, + }, + Finally: []v1beta1.PipelineTask{{ + Name: "final-task-1", + TaskRef: &v1beta1.TaskRef{Name: "hello-world"}, + }}, + }), - ts: []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))}, + ts: []*v1beta1.Task{simpleHelloWorldTask}, trs: []*v1beta1.TaskRun{ getTaskRun( @@ -5822,13 +7208,18 @@ func TestReconcilePipeline_FinalTasks(t *testing.T) { ps: getPipeline( "pipeline-dag-task-running", - []tb.PipelineSpecOp{ - tb.PipelineTask("dag-task-1", "hello-world"), - tb.FinalPipelineTask("final-task-1", "hello-world"), - }, - ), + v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "dag-task-1", + TaskRef: &v1beta1.TaskRef{Name: "hello-world"}, + }}, + Finally: []v1beta1.PipelineTask{{ + Name: "final-task-1", + TaskRef: &v1beta1.TaskRef{Name: "hello-world"}, + }}, + }), - ts: []*v1beta1.Task{tb.Task("hello-world", tb.TaskNamespace("foo"))}, + ts: []*v1beta1.Task{simpleHelloWorldTask}, trs: []*v1beta1.TaskRun{ getTaskRun( @@ -5910,48 +7301,46 @@ func TestReconcilePipeline_FinalTasks(t *testing.T) { } func getPipelineRun(pr, p string, status corev1.ConditionStatus, reason string, m string, tr map[string]string) []*v1beta1.PipelineRun { - var op []tb.PipelineRunStatusOp + pRun := &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(pr, "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: p}, + ServiceAccountName: "test-sa", + }, + Status: v1beta1.PipelineRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: status, + Reason: reason, + Message: m, + }, + }, + }, + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{TaskRuns: map[string]*v1beta1.PipelineRunTaskRunStatus{}}, + }, + } for k, v := range tr { - op = append(op, tb.PipelineRunTaskRunsStatus(v, - &v1beta1.PipelineRunTaskRunStatus{PipelineTaskName: k, Status: &v1beta1.TaskRunStatus{}}), - ) - } - op = append(op, tb.PipelineRunStatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: status, - Reason: reason, - Message: m, - })) - prs := []*v1beta1.PipelineRun{ - tb.PipelineRun(pr, - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec(p, tb.PipelineRunServiceAccountName("test-sa")), - tb.PipelineRunStatus(op...), - ), + pRun.Status.TaskRuns[v] = &v1beta1.PipelineRunTaskRunStatus{PipelineTaskName: k, Status: &v1beta1.TaskRunStatus{}} } - return prs + return []*v1beta1.PipelineRun{pRun} } -func getPipeline(p string, t []tb.PipelineSpecOp) []*v1beta1.Pipeline { - ps := []*v1beta1.Pipeline{tb.Pipeline(p, tb.PipelineNamespace("foo"), tb.PipelineSpec(t...))} +func getPipeline(p string, spec v1beta1.PipelineSpec) []*v1beta1.Pipeline { + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta(p, "foo"), + Spec: spec, + }} return ps } func getTaskRun(tr, pr, p, t string, status corev1.ConditionStatus) *v1beta1.TaskRun { - return tb.TaskRun(tr, - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("pipelineRun", pr), - tb.TaskRunLabel(pipeline.PipelineLabelKey, p), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, pr), - tb.TaskRunLabel(pipeline.PipelineTaskLabelKey, t), - tb.TaskRunSpec(tb.TaskRunTaskRef(t)), - tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: status, - }), - ), - ) + return createHelloWorldTaskRunWithStatusTaskLabel(tr, "foo", pr, p, "", t, + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: status, + }) } func getTaskRunStatus(t string, status corev1.ConditionStatus) *v1beta1.PipelineRunTaskRunStatus { @@ -5972,25 +7361,43 @@ func getTaskRunStatus(t string, status corev1.ConditionStatus) *v1beta1.Pipeline func TestReconcile_CloudEvents(t *testing.T) { names.TestingSeed() - prs := []*v1beta1.PipelineRun{ - tb.PipelineRun("test-pipelinerun", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSelfLink("/pipeline/1234"), - tb.PipelineRunSpec("test-pipeline"), - ), - } - ps := []*v1beta1.Pipeline{ - tb.Pipeline("test-pipeline", - tb.PipelineNamespace("foo"), - tb.PipelineSpec(tb.PipelineTask("test-1", "test-task")), - ), - } - ts := []*v1beta1.Task{ - tb.Task("test-task", tb.TaskNamespace("foo"), - tb.TaskSpec(tb.Step("foo", tb.StepName("simple-step"), - tb.StepCommand("/mycmd"), tb.StepEnvVar("foo", "bar"), - ))), - } + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-pipelinerun", + Namespace: "foo", + SelfLink: "/pipeline/1234", + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + }, + }} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "test-1", + TaskRef: &v1beta1.TaskRef{ + Name: "test-task", + }, + }}, + }, + }} + ts := []*v1beta1.Task{{ + ObjectMeta: baseObjectMeta("test-task", "foo"), + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "foo", + Name: "simple-step", + Command: []string{"/mycmd"}, + Env: []corev1.EnvVar{{ + Name: "foo", + Value: "bar", + }}, + }, + }}, + }, + }} cms := []*corev1.ConfigMap{ { ObjectMeta: metav1.ObjectMeta{Name: config.GetDefaultsConfigName(), Namespace: system.Namespace()}, @@ -6043,12 +7450,12 @@ func TestReconcile_CloudEvents(t *testing.T) { func TestReconcilePipeline_TaskSpecMetadata(t *testing.T) { names.TestingSeed() - prs := []*v1beta1.PipelineRun{ - tb.PipelineRun("test-pipeline-run-success", - tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec("test-pipeline"), - ), - } + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta("test-pipeline-run-success", "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + }, + }} ts := v1beta1.TaskSpec{ Steps: []v1beta1.Step{{Container: corev1.Container{ @@ -6059,19 +7466,29 @@ func TestReconcilePipeline_TaskSpecMetadata(t *testing.T) { labels := map[string]string{"label1": "labelvalue1", "label2": "labelvalue2"} annotations := map[string]string{"annotation1": "value1", "annotation2": "value2"} - ps := []*v1beta1.Pipeline{ - tb.Pipeline("test-pipeline", - tb.PipelineNamespace("foo"), - tb.PipelineSpec( - tb.PipelineTask("task-without-metadata", "", tb.PipelineTaskSpec(ts)), - tb.PipelineTask("task-with-metadata", "", tb.PipelineTaskSpec(ts), - tb.TaskSpecMetadata(v1beta1.PipelineTaskMetadata{ - Labels: labels, - Annotations: annotations}), - ), - ), - ), - } + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta("test-pipeline", "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{ + { + Name: "task-without-metadata", + TaskSpec: &v1beta1.EmbeddedTask{ + TaskSpec: ts, + }, + }, + { + Name: "task-with-metadata", + TaskSpec: &v1beta1.EmbeddedTask{ + TaskSpec: ts, + Metadata: v1beta1.PipelineTaskMetadata{ + Labels: labels, + Annotations: annotations, + }, + }, + }, + }, + }, + }} d := test.Data{ PipelineRuns: prs, @@ -6134,51 +7551,71 @@ func TestReconciler_ReconcileKind_PipelineTaskContext(t *testing.T) { pipelineName := "p-pipelinetask-status" pipelineRunName := "pr-pipelinetask-status" - ps := []*v1beta1.Pipeline{tb.Pipeline(pipelineName, tb.PipelineNamespace("foo"), tb.PipelineSpec( - tb.PipelineTask("task1", "mytask"), - tb.FinalPipelineTask("finaltask", "finaltask", - tb.PipelineTaskParam("pipelineRun-tasks-task1", "$(tasks.task1.status)"), - ), - ))} + ps := []*v1beta1.Pipeline{{ + ObjectMeta: baseObjectMeta(pipelineName, "foo"), + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "task1", + TaskRef: &v1beta1.TaskRef{ + Name: "mytask", + }, + }}, + Finally: []v1beta1.PipelineTask{{ + Name: "finaltask", + TaskRef: &v1beta1.TaskRef{ + Name: "finaltask", + }, + Params: []v1beta1.Param{{ + Name: "pipelineRun-tasks-task1", + Value: *v1beta1.NewArrayOrString("$(tasks.task1.status)"), + }}, + }}, + }, + }} - prs := []*v1beta1.PipelineRun{tb.PipelineRun(pipelineRunName, tb.PipelineRunNamespace("foo"), - tb.PipelineRunSpec(pipelineName, tb.PipelineRunServiceAccountName("test-sa")), - )} + prs := []*v1beta1.PipelineRun{{ + ObjectMeta: baseObjectMeta(pipelineRunName, "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: pipelineName}, + ServiceAccountName: "test-sa", + }, + }} ts := []*v1beta1.Task{ - tb.Task("mytask", tb.TaskNamespace("foo")), - tb.Task("finaltask", tb.TaskNamespace("foo"), - tb.TaskSpec( - tb.TaskParam("pipelineRun-tasks-task1", v1beta1.ParamTypeString), - ), - ), + {ObjectMeta: baseObjectMeta("mytask", "foo")}, + { + ObjectMeta: baseObjectMeta("finaltask", "foo"), + Spec: v1beta1.TaskSpec{ + Params: []v1beta1.ParamSpec{{ + Name: "pipelineRun-tasks-task1", + Type: v1beta1.ParamTypeString, + }}, + }, + }, } - trs := []*v1beta1.TaskRun{ - tb.TaskRun(pipelineRunName+"-task1-xxyyy", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", pipelineRunName, - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel("tekton.dev/pipeline", pipelineName), - tb.TaskRunLabel("tekton.dev/pipelineRun", pipelineRunName), - tb.TaskRunLabel("tekton.dev/pipelineTask", "task1"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("mytask"), - tb.TaskRunServiceAccountName("test-sa"), - ), - tb.TaskRunStatus( - tb.StatusCondition( + trs := []*v1beta1.TaskRun{{ + ObjectMeta: taskRunObjectMeta(pipelineRunName+"-task1-xxyy", "foo", pipelineRunName, pipelineName, "task1", false), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "mytask", + }, + ServiceAccountName: "test-sa", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ apis.Condition{ Type: apis.ConditionSucceeded, Status: corev1.ConditionFalse, Reason: v1beta1.TaskRunReasonFailed.String(), }, - ), - ), - ), - } + }, + }, + }, + }} d := test.Data{ PipelineRuns: prs, @@ -6192,22 +7629,23 @@ func TestReconciler_ReconcileKind_PipelineTaskContext(t *testing.T) { _, clients := prt.reconcileRun("foo", pipelineRunName, []string{}, false) expectedTaskRunName := pipelineRunName + "-finaltask-9l9zj" - expectedTaskRun := tb.TaskRun(expectedTaskRunName, - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", pipelineRunName, - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion, - ), - tb.TaskRunLabel("tekton.dev/pipeline", pipelineName), - tb.TaskRunLabel("tekton.dev/pipelineRun", pipelineRunName), - tb.TaskRunLabel("tekton.dev/pipelineTask", "finaltask"), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineFinallyTasks), - tb.TaskRunSpec( - tb.TaskRunTaskRef("finaltask"), - tb.TaskRunServiceAccountName("test-sa"), - tb.TaskRunParam("pipelineRun-tasks-task1", "Failed"), - ), - ) + expectedTaskRunObjectMeta := taskRunObjectMeta(expectedTaskRunName, "foo", pipelineRunName, pipelineName, "finaltask", false) + expectedTaskRunObjectMeta.Labels[pipeline.MemberOfLabelKey] = v1beta1.PipelineFinallyTasks + expectedTaskRun := &v1beta1.TaskRun{ + ObjectMeta: expectedTaskRunObjectMeta, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "finaltask", + }, + ServiceAccountName: "test-sa", + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + Params: []v1beta1.Param{{ + Name: "pipelineRun-tasks-task1", + Value: *v1beta1.NewArrayOrString("Failed"), + }}, + }, + } // Check that the expected TaskRun was created actual, err := clients.Pipeline.TektonV1beta1().TaskRuns("foo").List(prt.TestAssets.Ctx, metav1.ListOptions{ LabelSelector: "tekton.dev/pipelineTask=finaltask,tekton.dev/pipelineRun=" + pipelineRunName, @@ -6584,7 +8022,14 @@ func TestReconcile_RemotePipelineRef(t *testing.T) { } // This task will be uploaded along with the pipeline definition. - remoteTask := tb.Task("unit-test-task", tb.TaskType, tb.TaskSpec(), tb.TaskNamespace("foo")) + remoteTask := &v1beta1.Task{ + ObjectMeta: baseObjectMeta("unit-test-task", "foo"), + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + Spec: v1beta1.TaskSpec{}, + } // Create a bundle from our pipeline and tasks. if _, err := test.CreateImage(ref, ps, remoteTask); err != nil { @@ -7069,18 +8514,118 @@ func TestDisableResolutionFlag_ProceedsWithStatusPipelineSpec(t *testing.T) { } func getTaskRunWithTaskSpec(tr, pr, p, t string, labels, annotations map[string]string) *v1beta1.TaskRun { - return tb.TaskRun(tr, - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", pr, - tb.OwnerReferenceAPIVersion("tekton.dev/v1beta1"), - tb.Controller, tb.BlockOwnerDeletion), - tb.TaskRunLabel(pipeline.PipelineLabelKey, p), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, pr), - tb.TaskRunLabel(pipeline.PipelineTaskLabelKey, t), - tb.TaskRunLabel(pipeline.MemberOfLabelKey, v1beta1.PipelineTasks), - tb.TaskRunLabels(labels), - tb.TaskRunAnnotations(annotations), - tb.TaskRunSpec(tb.TaskRunTaskSpec(tb.Step("myimage", tb.StepName("mystep"))), - tb.TaskRunServiceAccountName(config.DefaultServiceAccountValue), - )) + om := taskRunObjectMeta(tr, "foo", pr, p, t, false) + for k, v := range labels { + om.Labels[k] = v + } + om.Annotations = annotations + + return &v1beta1.TaskRun{ + ObjectMeta: om, + Spec: v1beta1.TaskRunSpec{ + TaskSpec: &v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Name: "mystep", + Image: "myimage", + }, + }}, + }, + ServiceAccountName: config.DefaultServiceAccountValue, + Resources: &v1beta1.TaskRunResources{}, + Timeout: &metav1.Duration{Duration: config.DefaultTimeoutMinutes * time.Minute}, + }, + } +} + +func baseObjectMeta(name, ns string) metav1.ObjectMeta { + return metav1.ObjectMeta{ + Name: name, + Namespace: ns, + Labels: map[string]string{}, + Annotations: map[string]string{}, + } +} + +func taskRunObjectMeta(trName, ns, prName, pipelineName, pipelineTaskName string, skipMemberOfLabel bool) metav1.ObjectMeta { + om := metav1.ObjectMeta{ + Name: trName, + Namespace: ns, + OwnerReferences: []metav1.OwnerReference{{ + Kind: "PipelineRun", + Name: prName, + APIVersion: "tekton.dev/v1beta1", + Controller: &trueb, + BlockOwnerDeletion: &trueb, + }}, + Labels: map[string]string{ + pipeline.PipelineLabelKey: pipelineName, + pipeline.PipelineRunLabelKey: prName, + pipeline.PipelineTaskLabelKey: pipelineTaskName, + }, + Annotations: map[string]string{}, + } + if !skipMemberOfLabel { + om.Labels[pipeline.MemberOfLabelKey] = v1beta1.PipelineTasks + } + return om +} + +func createHelloWorldTaskRunWithStatus(trName, ns, prName, pName, podName string, condition apis.Condition) *v1beta1.TaskRun { + p := createHelloWorldTaskRun(trName, ns, prName, pName) + p.Status = v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{condition}, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + PodName: podName, + }, + } + return p +} + +func createHelloWorldTaskRunWithStatusTaskLabel(trName, ns, prName, pName, podName, taskLabel string, condition apis.Condition) *v1beta1.TaskRun { + p := createHelloWorldTaskRunWithStatus(trName, ns, prName, pName, podName, condition) + p.Labels[pipeline.PipelineTaskLabelKey] = taskLabel + + return p +} + +func createHelloWorldTaskRun(trName, ns, prName, pName string) *v1beta1.TaskRun { + return &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: trName, + Namespace: ns, + OwnerReferences: []metav1.OwnerReference{{ + Kind: "kind", + Name: "name", + }}, + Labels: map[string]string{ + pipeline.PipelineLabelKey: pName, + pipeline.PipelineRunLabelKey: prName, + }, + }, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "hello-world", + }, + ServiceAccountName: "test-sa", + }, + } +} + +func createCancelledPipelineRun(prName string, specStatus v1beta1.PipelineRunSpecStatus) *v1beta1.PipelineRun { + return &v1beta1.PipelineRun{ + ObjectMeta: baseObjectMeta(prName, "foo"), + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "test-pipeline"}, + ServiceAccountName: "test-sa", + Status: specStatus, + }, + Status: v1beta1.PipelineRunStatus{ + PipelineRunStatusFields: v1beta1.PipelineRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + } } diff --git a/pkg/reconciler/pipelinerun/resources/pipelinerunresolution_test.go b/pkg/reconciler/pipelinerun/resources/pipelinerunresolution_test.go index 4a5c86d8bcc..78edd734bf1 100644 --- a/pkg/reconciler/pipelinerun/resources/pipelinerunresolution_test.go +++ b/pkg/reconciler/pipelinerun/resources/pipelinerunresolution_test.go @@ -24,7 +24,6 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/config" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" @@ -194,6 +193,16 @@ var conditionChecks = []v1beta1.TaskRun{{ }, }} +var gitDeclaredResource = v1beta1.PipelineDeclaredResource{ + Name: "git-resource", + Type: resourcev1alpha1.PipelineResourceTypeGit, +} + +var gitSweetResourceBinding = v1beta1.PipelineResourceBinding{ + Name: "git-resource", + ResourceRef: &v1beta1.PipelineResourceRef{Name: "sweet-resource"}, +} + func makeStarted(tr v1beta1.TaskRun) *v1beta1.TaskRun { newTr := newTaskRun(tr) newTr.Status.Conditions[0].Status = corev1.ConditionUnknown @@ -1626,19 +1635,28 @@ func getExpectedMessage(runName string, specStatus v1beta1.PipelineRunSpecStatus } func TestGetResourcesFromBindings(t *testing.T) { - pr := tb.PipelineRun("pipelinerun", tb.PipelineRunSpec("pipeline", - tb.PipelineRunResourceBinding("git-resource", tb.PipelineResourceBindingRef("sweet-resource")), - tb.PipelineRunResourceBinding("image-resource", tb.PipelineResourceBindingResourceSpec( - &resourcev1alpha1.PipelineResourceSpec{ - Type: resourcev1alpha1.PipelineResourceTypeImage, - Params: []v1beta1.ResourceParam{{ - Name: "url", - Value: "gcr.io/sven", - }}, - }), - ), - )) - r := tb.PipelineResource("sweet-resource") + pr := &v1beta1.PipelineRun{ + ObjectMeta: metav1.ObjectMeta{Name: "pipelinerun"}, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{ + Name: "pipeline", + }, + Resources: []v1beta1.PipelineResourceBinding{ + gitSweetResourceBinding, + { + Name: "image-resource", + ResourceSpec: &resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeImage, + Params: []v1beta1.ResourceParam{{ + Name: "url", + Value: "gcr.io/sven", + }}, + }, + }, + }, + }, + } + r := &resourcev1alpha1.PipelineResource{ObjectMeta: metav1.ObjectMeta{Name: "sweet-resource"}} getResource := func(name string) (*resourcev1alpha1.PipelineResource, error) { if name != "sweet-resource" { return nil, fmt.Errorf("request for unexpected resource %s", name) @@ -1669,9 +1687,15 @@ func TestGetResourcesFromBindings(t *testing.T) { } func TestGetResourcesFromBindings_Missing(t *testing.T) { - pr := tb.PipelineRun("pipelinerun", tb.PipelineRunSpec("pipeline", - tb.PipelineRunResourceBinding("git-resource", tb.PipelineResourceBindingRef("sweet-resource")), - )) + pr := &v1beta1.PipelineRun{ + ObjectMeta: metav1.ObjectMeta{Name: "pipelinerun"}, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{ + Name: "pipeline", + }, + Resources: []v1beta1.PipelineResourceBinding{gitSweetResourceBinding}, + }, + } getResource := func(name string) (*resourcev1alpha1.PipelineResource, error) { return nil, kerrors.NewNotFound(resourcev1alpha1.Resource("pipelineresources"), name) } @@ -1684,9 +1708,15 @@ func TestGetResourcesFromBindings_Missing(t *testing.T) { } func TestGetResourcesFromBindings_ErrorGettingResource(t *testing.T) { - pr := tb.PipelineRun("pipelinerun", tb.PipelineRunSpec("pipeline", - tb.PipelineRunResourceBinding("git-resource", tb.PipelineResourceBindingRef("sweet-resource")), - )) + pr := &v1beta1.PipelineRun{ + ObjectMeta: metav1.ObjectMeta{Name: "pipelinerun"}, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{ + Name: "pipeline", + }, + Resources: []v1beta1.PipelineResourceBinding{gitSweetResourceBinding}, + }, + } getResource := func(name string) (*resourcev1alpha1.PipelineResource, error) { return nil, fmt.Errorf("iT HAS ALL GONE WRONG") } @@ -1699,24 +1729,54 @@ func TestGetResourcesFromBindings_ErrorGettingResource(t *testing.T) { func TestResolvePipelineRun(t *testing.T) { names.TestingSeed() - p := tb.Pipeline("pipelines", tb.PipelineSpec( - tb.PipelineDeclaredResource("git-resource", "git"), - tb.PipelineTask("mytask1", "task", - tb.PipelineTaskInputResource("input1", "git-resource"), - ), - tb.PipelineTask("mytask2", "task", - tb.PipelineTaskOutputResource("output1", "git-resource"), - ), - tb.PipelineTask("mytask3", "task", - tb.PipelineTaskOutputResource("output1", "git-resource"), - ), - tb.PipelineTask("mytask4", "", - tb.PipelineTaskSpec(v1beta1.TaskSpec{ - Steps: []v1beta1.Step{{Container: corev1.Container{ - Name: "step1", - }}}, - })), - )) + p := &v1beta1.Pipeline{ + ObjectMeta: metav1.ObjectMeta{Name: "pipelines"}, + Spec: v1beta1.PipelineSpec{ + Resources: []v1beta1.PipelineDeclaredResource{gitDeclaredResource}, + Tasks: []v1beta1.PipelineTask{ + { + Name: "mytask1", + TaskRef: &v1beta1.TaskRef{Name: "task"}, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "input1", + Resource: "git-resource", + }}, + }, + }, + { + Name: "mytask2", + TaskRef: &v1beta1.TaskRef{Name: "task"}, + Resources: &v1beta1.PipelineTaskResources{ + Outputs: []v1beta1.PipelineTaskOutputResource{{ + Name: "output1", + Resource: "git-resource", + }}, + }, + }, + { + Name: "mytask3", + TaskRef: &v1beta1.TaskRef{Name: "task"}, + Resources: &v1beta1.PipelineTaskResources{ + Outputs: []v1beta1.PipelineTaskOutputResource{{ + Name: "output1", + Resource: "git-resource", + }}, + }, + }, + { + Name: "mytask4", + TaskSpec: &v1beta1.EmbeddedTask{ + TaskSpec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{Name: "step1"}, + }}, + }, + }, + }, + }, + }, + } r := &resourcev1alpha1.PipelineResource{ ObjectMeta: metav1.ObjectMeta{ @@ -1951,18 +2011,42 @@ func TestResolvePipelineRun_ResourceBindingsDontExist(t *testing.T) { p *v1beta1.Pipeline }{{ name: "input doesnt exist", - p: tb.Pipeline("pipelines", tb.PipelineSpec( - tb.PipelineTask("mytask1", "task", - tb.PipelineTaskInputResource("input1", "git-resource"), - ), - )), + p: &v1beta1.Pipeline{ + ObjectMeta: metav1.ObjectMeta{Name: "pipelines"}, + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "mytask1", + TaskRef: &v1beta1.TaskRef{ + Name: "task", + }, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "input1", + Resource: "git-resource", + }}, + }, + }}, + }, + }, }, { name: "output doesnt exist", - p: tb.Pipeline("pipelines", tb.PipelineSpec( - tb.PipelineTask("mytask1", "task", - tb.PipelineTaskOutputResource("input1", "git-resource"), - ), - )), + p: &v1beta1.Pipeline{ + ObjectMeta: metav1.ObjectMeta{Name: "pipelines"}, + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "mytask1", + TaskRef: &v1beta1.TaskRef{ + Name: "task", + }, + Resources: &v1beta1.PipelineTaskResources{ + Outputs: []v1beta1.PipelineTaskOutputResource{{ + Name: "input1", + Resource: "git-resource", + }}, + }, + }}, + }, + }, }} providedResources := map[string]*resourcev1alpha1.PipelineResource{} @@ -1992,12 +2076,24 @@ func TestResolvePipelineRun_ResourceBindingsDontExist(t *testing.T) { func TestResolvePipelineRun_withExistingTaskRuns(t *testing.T) { names.TestingSeed() - p := tb.Pipeline("pipelines", tb.PipelineSpec( - tb.PipelineDeclaredResource("git-resource", "git"), - tb.PipelineTask("mytask-with-a-really-long-name-to-trigger-truncation", "task", - tb.PipelineTaskInputResource("input1", "git-resource"), - ), - )) + p := &v1beta1.Pipeline{ + ObjectMeta: metav1.ObjectMeta{Name: "pipelines"}, + Spec: v1beta1.PipelineSpec{ + Resources: []v1beta1.PipelineDeclaredResource{gitDeclaredResource}, + Tasks: []v1beta1.PipelineTask{{ + Name: "mytask-with-a-really-long-name-to-trigger-truncation", + TaskRef: &v1beta1.TaskRef{ + Name: "task", + }, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "input1", + Resource: "git-resource", + }}, + }, + }}, + }, + } r := &resourcev1alpha1.PipelineResource{ ObjectMeta: metav1.ObjectMeta{ @@ -2055,13 +2151,27 @@ func TestResolvePipelineRun_withExistingTaskRuns(t *testing.T) { func TestResolvedPipelineRun_PipelineTaskHasOptionalResources(t *testing.T) { names.TestingSeed() - p := tb.Pipeline("pipelines", tb.PipelineSpec( - tb.PipelineDeclaredResource("git-resource", "git"), - tb.PipelineTask("mytask1", "task", - tb.PipelineTaskInputResource("required-input", "git-resource"), - tb.PipelineTaskOutputResource("required-output", "git-resource"), - ), - )) + p := &v1beta1.Pipeline{ + ObjectMeta: metav1.ObjectMeta{Name: "pipelines"}, + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "mytask1", + TaskRef: &v1beta1.TaskRef{ + Name: "task", + }, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "required-input", + Resource: "git-resource", + }}, + Outputs: []v1beta1.PipelineTaskOutputResource{{ + Name: "required-output", + Resource: "git-resource", + }}, + }, + }}, + }, + } r := &resourcev1alpha1.PipelineResource{ ObjectMeta: metav1.ObjectMeta{ @@ -2415,8 +2525,13 @@ func TestResolvedConditionCheck_WithResources(t *testing.T) { }, } - gitResource := tb.PipelineResource("some-repo", tb.PipelineResourceNamespace("foo"), tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeGit)) + gitResource := &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "some-repo", + Namespace: "foo", + }, + Spec: resourcev1alpha1.PipelineResourceSpec{Type: resourcev1alpha1.PipelineResourceTypeGit}, + } ptc := v1beta1.PipelineTaskCondition{ ConditionRef: "always-true", @@ -2490,12 +2605,19 @@ func TestResolvedConditionCheck_WithResources(t *testing.T) { } func TestValidateResourceBindings(t *testing.T) { - p := tb.Pipeline("pipelines", tb.PipelineSpec( - tb.PipelineDeclaredResource("git-resource", "git"), - )) - pr := tb.PipelineRun("pipelinerun", tb.PipelineRunSpec("pipeline", - tb.PipelineRunResourceBinding("git-resource", tb.PipelineResourceBindingRef("sweet-resource")), - )) + p := &v1beta1.Pipeline{ + ObjectMeta: metav1.ObjectMeta{Name: "pipelines"}, + Spec: v1beta1.PipelineSpec{ + Resources: []v1beta1.PipelineDeclaredResource{gitDeclaredResource}, + }, + } + pr := &v1beta1.PipelineRun{ + ObjectMeta: metav1.ObjectMeta{Name: "pipelinerun"}, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "pipeline"}, + Resources: []v1beta1.PipelineResourceBinding{gitSweetResourceBinding}, + }, + } err := ValidateResourceBindings(&p.Spec, pr) if err != nil { t.Fatalf("didn't expect error getting resources from bindings but got: %v", err) @@ -2503,13 +2625,25 @@ func TestValidateResourceBindings(t *testing.T) { } func TestValidateResourceBindings_Missing(t *testing.T) { - p := tb.Pipeline("pipelines", tb.PipelineSpec( - tb.PipelineDeclaredResource("git-resource", "git"), - tb.PipelineDeclaredResource("image-resource", "image"), - )) - pr := tb.PipelineRun("pipelinerun", tb.PipelineRunSpec("pipeline", - tb.PipelineRunResourceBinding("git-resource", tb.PipelineResourceBindingRef("sweet-resource")), - )) + p := &v1beta1.Pipeline{ + ObjectMeta: metav1.ObjectMeta{Name: "pipelines"}, + Spec: v1beta1.PipelineSpec{ + Resources: []v1beta1.PipelineDeclaredResource{ + gitDeclaredResource, + { + Name: "image-resource", + Type: resourcev1alpha1.PipelineResourceTypeImage, + }, + }, + }, + } + pr := &v1beta1.PipelineRun{ + ObjectMeta: metav1.ObjectMeta{Name: "pipelinerun"}, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "pipeline"}, + Resources: []v1beta1.PipelineResourceBinding{gitSweetResourceBinding}, + }, + } err := ValidateResourceBindings(&p.Spec, pr) if err == nil { t.Fatalf("Expected error indicating `image-resource` was missing but got no error") @@ -2517,13 +2651,25 @@ func TestValidateResourceBindings_Missing(t *testing.T) { } func TestGetResourcesFromBindings_Extra(t *testing.T) { - p := tb.Pipeline("pipelines", tb.PipelineSpec( - tb.PipelineDeclaredResource("git-resource", "git"), - )) - pr := tb.PipelineRun("pipelinerun", tb.PipelineRunSpec("pipeline", - tb.PipelineRunResourceBinding("git-resource", tb.PipelineResourceBindingRef("sweet-resource")), - tb.PipelineRunResourceBinding("image-resource", tb.PipelineResourceBindingRef("sweet-resource2")), - )) + p := &v1beta1.Pipeline{ + ObjectMeta: metav1.ObjectMeta{Name: "pipelines"}, + Spec: v1beta1.PipelineSpec{ + Resources: []v1beta1.PipelineDeclaredResource{gitDeclaredResource}, + }, + } + pr := &v1beta1.PipelineRun{ + ObjectMeta: metav1.ObjectMeta{Name: "pipelinerun"}, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{Name: "pipeline"}, + Resources: []v1beta1.PipelineResourceBinding{ + gitSweetResourceBinding, + { + Name: "image-resource", + ResourceRef: &v1beta1.PipelineResourceRef{Name: "sweet-resource2"}, + }, + }, + }, + } err := ValidateResourceBindings(&p.Spec, pr) if err == nil { t.Fatalf("Expected error indicating `image-resource` was extra but got no error") @@ -2608,50 +2754,123 @@ func TestValidateTaskRunSpecs(t *testing.T) { wantErr bool }{{ name: "valid task mapping", - p: tb.Pipeline("pipelines", tb.PipelineSpec( - tb.PipelineTask("mytask1", "task", - tb.PipelineTaskInputResource("input1", "git-resource")), - )), - run: tb.PipelineRun("pipelinerun", tb.PipelineRunSpec("pipeline", - tb.PipelineTaskRunSpecs( - []v1beta1.PipelineTaskRunSpec{{ + p: &v1beta1.Pipeline{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pipelines", + }, + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "mytask1", + TaskRef: &v1beta1.TaskRef{ + Name: "task", + }, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "input1", + Resource: "git-resource", + }}, + }, + }}, + }, + }, + run: &v1beta1.PipelineRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pipelinerun", + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{ + Name: "pipeline", + }, + TaskRunSpecs: []v1beta1.PipelineTaskRunSpec{{ PipelineTaskName: "mytask1", TaskServiceAccountName: "default", }}, - ), - )), + }, + }, wantErr: false, }, { name: "valid finally task mapping", - p: tb.Pipeline("pipelines", tb.PipelineSpec( - tb.PipelineTask("mytask1", "task", - tb.PipelineTaskInputResource("input1", "git-resource")), - tb.FinalPipelineTask("myfinaltask1", "finaltask"), - )), - run: tb.PipelineRun("pipelinerun", tb.PipelineRunSpec("pipeline", - tb.PipelineTaskRunSpecs( - []v1beta1.PipelineTaskRunSpec{{ + p: &v1beta1.Pipeline{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pipelines", + }, + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "mytask1", + TaskRef: &v1beta1.TaskRef{ + Name: "task", + }, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "input1", + Resource: "git-resource", + }}, + }, + }}, + Finally: []v1beta1.PipelineTask{{ + Name: "myfinaltask1", + TaskRef: &v1beta1.TaskRef{ + Name: "finaltask", + }, + }}, + }, + }, + run: &v1beta1.PipelineRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pipelinerun", + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{ + Name: "pipeline", + }, + TaskRunSpecs: []v1beta1.PipelineTaskRunSpec{{ PipelineTaskName: "myfinaltask1", TaskServiceAccountName: "default", }}, - ), - )), + }, + }, wantErr: false, }, { name: "invalid task mapping", - p: tb.Pipeline("pipelines", tb.PipelineSpec( - tb.PipelineTask("mytask1", "task", - tb.PipelineTaskInputResource("input1", "git-resource")), - tb.FinalPipelineTask("myfinaltask1", "finaltask"), - )), - run: tb.PipelineRun("pipelinerun", tb.PipelineRunSpec("pipeline", - tb.PipelineTaskRunSpecs( - []v1beta1.PipelineTaskRunSpec{{ + p: &v1beta1.Pipeline{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pipelines", + }, + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "mytask1", + TaskRef: &v1beta1.TaskRef{ + Name: "task", + }, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "input1", + Resource: "git-resource", + }}, + }, + }}, + Finally: []v1beta1.PipelineTask{{ + Name: "myfinaltask1", + TaskRef: &v1beta1.TaskRef{ + Name: "finaltask", + }, + }}, + }, + }, + run: &v1beta1.PipelineRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pipelinerun", + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{ + Name: "pipeline", + }, + TaskRunSpecs: []v1beta1.PipelineTaskRunSpec{{ PipelineTaskName: "wrongtask", TaskServiceAccountName: "default", }}, - ), - )), + }, + }, wantErr: true, }} { t.Run(tc.name, func(t *testing.T) { @@ -2678,35 +2897,123 @@ func TestValidateServiceaccountMapping(t *testing.T) { wantErr bool }{{ name: "valid task mapping", - p: tb.Pipeline("pipelines", tb.PipelineSpec( - tb.PipelineTask("mytask1", "task", - tb.PipelineTaskInputResource("input1", "git-resource")), - )), - run: tb.PipelineRun("pipelinerun", tb.PipelineRunSpec("pipeline", - tb.PipelineRunServiceAccountNameTask("mytask1", "default"), - )), + p: &v1beta1.Pipeline{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pipelines", + }, + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "mytask1", + TaskRef: &v1beta1.TaskRef{ + Name: "task", + }, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "input1", + Resource: "git-resource", + }}, + }, + }}, + }, + }, + run: &v1beta1.PipelineRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pipelinerun", + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{ + Name: "pipeline", + }, + ServiceAccountNames: []v1beta1.PipelineRunSpecServiceAccountName{{ + TaskName: "mytask1", + ServiceAccountName: "default", + }}, + }, + }, wantErr: false, }, { name: "valid finally task mapping", - p: tb.Pipeline("pipelines", tb.PipelineSpec( - tb.PipelineTask("mytask1", "task", - tb.PipelineTaskInputResource("input1", "git-resource")), - tb.FinalPipelineTask("myfinaltask1", "finaltask"), - )), - run: tb.PipelineRun("pipelinerun", tb.PipelineRunSpec("pipeline", - tb.PipelineRunServiceAccountNameTask("myfinaltask1", "default"), - )), + p: &v1beta1.Pipeline{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pipelines", + }, + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "mytask1", + TaskRef: &v1beta1.TaskRef{ + Name: "task", + }, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "input1", + Resource: "git-resource", + }}, + }, + }}, + Finally: []v1beta1.PipelineTask{{ + Name: "myfinaltask1", + TaskRef: &v1beta1.TaskRef{ + Name: "finaltask", + }, + }}, + }, + }, + run: &v1beta1.PipelineRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pipelinerun", + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{ + Name: "pipeline", + }, + ServiceAccountNames: []v1beta1.PipelineRunSpecServiceAccountName{{ + TaskName: "myfinaltask1", + ServiceAccountName: "default", + }}, + }, + }, wantErr: false, }, { name: "invalid task mapping", - p: tb.Pipeline("pipelines", tb.PipelineSpec( - tb.PipelineTask("mytask1", "task", - tb.PipelineTaskInputResource("input1", "git-resource")), - tb.FinalPipelineTask("myfinaltask1", "finaltask"), - )), - run: tb.PipelineRun("pipelinerun", tb.PipelineRunSpec("pipeline", - tb.PipelineRunServiceAccountNameTask("wrongtask", "default"), - )), + p: &v1beta1.Pipeline{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pipelines", + }, + Spec: v1beta1.PipelineSpec{ + Tasks: []v1beta1.PipelineTask{{ + Name: "mytask1", + TaskRef: &v1beta1.TaskRef{ + Name: "task", + }, + Resources: &v1beta1.PipelineTaskResources{ + Inputs: []v1beta1.PipelineTaskInputResource{{ + Name: "input1", + Resource: "git-resource", + }}, + }, + }}, + Finally: []v1beta1.PipelineTask{{ + Name: "myfinaltask1", + TaskRef: &v1beta1.TaskRef{ + Name: "finaltask", + }, + }}, + }, + }, + run: &v1beta1.PipelineRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pipelinerun", + }, + Spec: v1beta1.PipelineRunSpec{ + PipelineRef: &v1beta1.PipelineRef{ + Name: "pipeline", + }, + ServiceAccountNames: []v1beta1.PipelineRunSpecServiceAccountName{{ + TaskName: "wrongtask", + ServiceAccountName: "default", + }}, + }, + }, wantErr: true, }} { t.Run(tc.name, func(t *testing.T) { @@ -2903,13 +3210,27 @@ func TestIsCustomTask(t *testing.T) { } func TestResolvedPipelineRunTask_IsFinallySkipped(t *testing.T) { - tr := tb.TaskRun("dag-task", tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionTrue, - }), - tb.TaskRunResult("commit", "SHA2"), - )) + tr := &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dag-task", + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionTrue, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + TaskRunResults: []v1beta1.TaskRunResult{{ + Name: "commit", + Value: "SHA2", + }}, + }, + }, + } state := PipelineRunState{{ TaskRunName: "dag-task", @@ -3022,13 +3343,27 @@ func TestResolvedPipelineRunTask_IsFinallySkipped(t *testing.T) { } func TestResolvedPipelineRunTask_IsFinalTask(t *testing.T) { - tr := tb.TaskRun("dag-task", tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionTrue, - }), - tb.TaskRunResult("commit", "SHA2"), - )) + tr := &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dag-task", + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionTrue, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + TaskRunResults: []v1beta1.TaskRunResult{{ + Name: "commit", + Value: "SHA2", + }}, + }, + }, + } state := PipelineRunState{{ TaskRunName: "dag-task", diff --git a/pkg/reconciler/pipelinerun/resources/resultrefresolution_test.go b/pkg/reconciler/pipelinerun/resources/resultrefresolution_test.go index 5a9af8e2aff..810ab509cde 100644 --- a/pkg/reconciler/pipelinerun/resources/resultrefresolution_test.go +++ b/pkg/reconciler/pipelinerun/resources/resultrefresolution_test.go @@ -6,8 +6,9 @@ import ( "strings" "testing" + duckv1beta1 "knative.dev/pkg/apis/duck/v1beta1" + "github.com/google/go-cmp/cmp" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" "github.com/tektoncd/pipeline/test/diff" @@ -31,10 +32,22 @@ var ( var pipelineRunState = PipelineRunState{{ TaskRunName: "aTaskRun", - TaskRun: tb.TaskRun("aTaskRun", tb.TaskRunStatus( - tb.StatusCondition(successCondition), - tb.TaskRunResult("aResult", "aResultValue"), - )), + TaskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "aTaskRun", + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{successCondition}, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + TaskRunResults: []v1beta1.TaskRunResult{{ + Name: "aResult", + Value: "aResultValue", + }}, + }, + }, + }, PipelineTask: &v1beta1.PipelineTask{ Name: "aTask", TaskRef: &v1beta1.TaskRef{Name: "aTask"}, @@ -121,7 +134,7 @@ func TestTaskParamResolver_ResolveResultRefs(t *testing.T) { name: "successful resolution: param not using result reference", pipelineRunState: PipelineRunState{{ TaskRunName: "aTaskRun", - TaskRun: tb.TaskRun("aTaskRun"), + TaskRun: &v1beta1.TaskRun{ObjectMeta: metav1.ObjectMeta{Name: "aTaskRun"}}, PipelineTask: &v1beta1.PipelineTask{ Name: "aTask", TaskRef: &v1beta1.TaskRef{Name: "aTask"}, @@ -137,10 +150,20 @@ func TestTaskParamResolver_ResolveResultRefs(t *testing.T) { name: "successful resolution: using result reference", pipelineRunState: PipelineRunState{{ TaskRunName: "aTaskRun", - TaskRun: tb.TaskRun("aTaskRun", tb.TaskRunStatus( - tb.StatusCondition(successCondition), - tb.TaskRunResult("aResult", "aResultValue"), - )), + TaskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{Name: "aTaskRun"}, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{successCondition}, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + TaskRunResults: []v1beta1.TaskRunResult{{ + Name: "aResult", + Value: "aResultValue", + }}, + }, + }, + }, PipelineTask: &v1beta1.PipelineTask{ Name: "aTask", TaskRef: &v1beta1.TaskRef{Name: "aTask"}, @@ -163,20 +186,40 @@ func TestTaskParamResolver_ResolveResultRefs(t *testing.T) { name: "successful resolution: using multiple result reference", pipelineRunState: PipelineRunState{{ TaskRunName: "aTaskRun", - TaskRun: tb.TaskRun("aTaskRun", tb.TaskRunStatus( - tb.StatusCondition(successCondition), - tb.TaskRunResult("aResult", "aResultValue"), - )), + TaskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{Name: "aTaskRun"}, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{successCondition}, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + TaskRunResults: []v1beta1.TaskRunResult{{ + Name: "aResult", + Value: "aResultValue", + }}, + }, + }, + }, PipelineTask: &v1beta1.PipelineTask{ Name: "aTask", TaskRef: &v1beta1.TaskRef{Name: "aTask"}, }, }, { TaskRunName: "bTaskRun", - TaskRun: tb.TaskRun("bTaskRun", tb.TaskRunStatus( - tb.StatusCondition(successCondition), - tb.TaskRunResult("bResult", "bResultValue"), - )), + TaskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{Name: "bTaskRun"}, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{successCondition}, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + TaskRunResults: []v1beta1.TaskRunResult{{ + Name: "bResult", + Value: "bResultValue", + }}, + }, + }, + }, PipelineTask: &v1beta1.PipelineTask{ Name: "bTask", TaskRef: &v1beta1.TaskRef{Name: "bTask"}, @@ -206,10 +249,20 @@ func TestTaskParamResolver_ResolveResultRefs(t *testing.T) { name: "successful resolution: duplicate result references", pipelineRunState: PipelineRunState{{ TaskRunName: "aTaskRun", - TaskRun: tb.TaskRun("aTaskRun", tb.TaskRunStatus( - tb.StatusCondition(successCondition), - tb.TaskRunResult("aResult", "aResultValue"), - )), + TaskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{Name: "aTaskRun"}, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{successCondition}, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + TaskRunResults: []v1beta1.TaskRunResult{{ + Name: "aResult", + Value: "aResultValue", + }}, + }, + }, + }, PipelineTask: &v1beta1.PipelineTask{ Name: "aTask", TaskRef: &v1beta1.TaskRef{Name: "aTask"}, @@ -232,9 +285,14 @@ func TestTaskParamResolver_ResolveResultRefs(t *testing.T) { name: "unsuccessful resolution: referenced result doesn't exist in referenced task", pipelineRunState: PipelineRunState{{ TaskRunName: "aTaskRun", - TaskRun: tb.TaskRun("aTaskRun", tb.TaskRunStatus( - tb.StatusCondition(successCondition), - )), + TaskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{Name: "aTaskRun"}, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{successCondition}, + }, + }, + }, PipelineTask: &v1beta1.PipelineTask{ Name: "aTask", TaskRef: &v1beta1.TaskRef{Name: "aTask"}, @@ -273,9 +331,14 @@ func TestTaskParamResolver_ResolveResultRefs(t *testing.T) { name: "failed resolution: using result reference to a failed task", pipelineRunState: PipelineRunState{{ TaskRunName: "aTaskRun", - TaskRun: tb.TaskRun("aTaskRun", tb.TaskRunStatus( - tb.StatusCondition(failedCondition), - )), + TaskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{Name: "aTaskRun"}, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{failedCondition}, + }, + }, + }, PipelineTask: &v1beta1.PipelineTask{ Name: "aTask", TaskRef: &v1beta1.TaskRef{Name: "aTask"}, diff --git a/pkg/reconciler/taskrun/resources/taskref_test.go b/pkg/reconciler/taskrun/resources/taskref_test.go index e8f29d3116e..8f06538288f 100644 --- a/pkg/reconciler/taskrun/resources/taskref_test.go +++ b/pkg/reconciler/taskrun/resources/taskref_test.go @@ -24,7 +24,6 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-containerregistry/pkg/registry" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/config" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" @@ -40,6 +39,42 @@ import ( logtesting "knative.dev/pkg/logging/testing" ) +var ( + simpleNamespacedTask = &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "simple", + Namespace: "default", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "something", + }, + }}, + }, + } + simpleClusterTask = &v1beta1.ClusterTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "simple", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "ClusterTask", + }, + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "something", + }, + }}, + }, + } +) + func TestLocalTaskRef(t *testing.T) { testcases := []struct { name string @@ -51,27 +86,54 @@ func TestLocalTaskRef(t *testing.T) { { name: "local-task", tasks: []runtime.Object{ - tb.Task("simple", tb.TaskNamespace("default")), - tb.Task("dummy", tb.TaskNamespace("default")), + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "simple", + Namespace: "default", + }, + }, + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dummy", + Namespace: "default", + }, + }, }, ref: &v1beta1.TaskRef{ Name: "simple", }, - expected: tb.Task("simple", tb.TaskNamespace("default")), - wantErr: false, + expected: &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "simple", + Namespace: "default", + }, + }, + wantErr: false, }, { name: "local-clustertask", tasks: []runtime.Object{ - tb.ClusterTask("cluster-task"), - tb.ClusterTask("dummy-task"), + &v1beta1.ClusterTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "cluster-task", + }, + }, + &v1beta1.ClusterTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dummy-task", + }, + }, }, ref: &v1beta1.TaskRef{ Name: "cluster-task", Kind: "ClusterTask", }, - expected: tb.ClusterTask("cluster-task"), - wantErr: false, + expected: &v1beta1.ClusterTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "cluster-task", + }, + }, + wantErr: false, }, { name: "task-not-found", @@ -139,31 +201,92 @@ func TestGetTaskFunc(t *testing.T) { expectedKind v1beta1.TaskKind }{ { - name: "remote-task", - localTasks: []runtime.Object{ - tb.Task("simple", tb.TaskType, tb.TaskNamespace("default"), tb.TaskSpec(tb.Step("something"))), - }, + name: "remote-task", + localTasks: []runtime.Object{simpleNamespacedTask}, remoteTasks: []runtime.Object{ - tb.Task("simple", tb.TaskType), - tb.Task("dummy", tb.TaskType), + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "simple", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dummy", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, }, ref: &v1beta1.TaskRef{ Name: "simple", Bundle: u.Host + "/remote-task", }, - expected: tb.Task("simple", tb.TaskType), + expected: &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "simple", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, expectedKind: v1beta1.NamespacedTaskKind, }, { name: "remote-task-without-defaults", localTasks: []runtime.Object{}, remoteTasks: []runtime.Object{ - tb.Task("simple", tb.TaskType, tb.TaskNamespace("default"), tb.TaskSpec(tb.TaskParam("foo", ""), tb.Step("something"))), - }, + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "simple", + Namespace: "default", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "something", + }, + }}, + Params: []v1beta1.ParamSpec{{ + Name: "foo", + }, + }, + }, + }}, ref: &v1beta1.TaskRef{ Name: "simple", Bundle: u.Host + "/remote-task-without-defaults", }, - expected: tb.Task("simple", tb.TaskType, tb.TaskNamespace("default"), tb.TaskSpec(tb.TaskParam("foo", v1beta1.ParamTypeString), tb.Step("something"))), + expected: &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "simple", + Namespace: "default", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "something", + }, + }}, + Params: []v1beta1.ParamSpec{{ + Name: "foo", + Type: v1beta1.ParamTypeString, + }}, + }, + }, expectedKind: v1beta1.NamespacedTaskKind, }, { name: "remote-v1alpha1-task-without-defaults", @@ -196,21 +319,51 @@ func TestGetTaskFunc(t *testing.T) { Name: "simple", Bundle: u.Host + "/remote-v1alpha1-task-without-defaults", }, - expected: tb.Task("simple", tb.TaskNamespace("default"), tb.TaskSpec(tb.TaskParam("foo", v1alpha1.ParamTypeString), tb.Step("something"))), + expected: &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "simple", + Namespace: "default", + }, + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "something", + }, + }}, + Params: []v1beta1.ParamSpec{{ + Name: "foo", + Type: v1beta1.ParamTypeString, + }}, + }, + }, expectedKind: v1beta1.NamespacedTaskKind, }, { - name: "local-task", - localTasks: []runtime.Object{ - tb.Task("simple", tb.TaskType, tb.TaskNamespace("default"), tb.TaskSpec(tb.Step("something"))), - }, + name: "local-task", + localTasks: []runtime.Object{simpleNamespacedTask}, remoteTasks: []runtime.Object{ - tb.Task("simple", tb.TaskType), - tb.Task("dummy", tb.TaskType), + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "simple", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dummy", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, }, ref: &v1beta1.TaskRef{ Name: "simple", }, - expected: tb.Task("simple", tb.TaskType, tb.TaskNamespace("default"), tb.TaskSpec(tb.Step("something"))), + expected: simpleNamespacedTask, expectedKind: v1beta1.NamespacedTaskKind, }, { name: "remote-cluster-task", @@ -236,22 +389,26 @@ func TestGetTaskFunc(t *testing.T) { Kind: v1alpha1.ClusterTaskKind, Bundle: u.Host + "/remote-cluster-task", }, - expected: tb.ClusterTask("simple"), + expected: &v1beta1.ClusterTask{ObjectMeta: metav1.ObjectMeta{Name: "simple"}}, expectedKind: v1beta1.ClusterTaskKind, }, { - name: "local-cluster-task", - localTasks: []runtime.Object{ - tb.ClusterTask("simple", tb.ClusterTaskType, tb.ClusterTaskSpec(tb.Step("something"))), - }, + name: "local-cluster-task", + localTasks: []runtime.Object{simpleClusterTask}, remoteTasks: []runtime.Object{ - tb.ClusterTask("simple", tb.ClusterTaskType), - tb.ClusterTask("dummy", tb.ClusterTaskType), + &v1beta1.ClusterTask{ + TypeMeta: metav1.TypeMeta{APIVersion: "tekton.dev/v1alpha1", Kind: "ClusterTask"}, + ObjectMeta: metav1.ObjectMeta{Name: "simple"}, + }, + &v1beta1.ClusterTask{ + TypeMeta: metav1.TypeMeta{APIVersion: "tekton.dev/v1alpha1", Kind: "ClusterTask"}, + ObjectMeta: metav1.ObjectMeta{Name: "dummy"}, + }, }, ref: &v1alpha1.TaskRef{ Name: "simple", Kind: v1alpha1.ClusterTaskKind, }, - expected: tb.ClusterTask("simple", tb.ClusterTaskType, tb.ClusterTaskSpec(tb.Step("something"))), + expected: simpleClusterTask, expectedKind: v1beta1.ClusterTaskKind, }, } @@ -292,7 +449,7 @@ func TestGetTaskFuncFromTaskRunSpecAlreadyFetched(t *testing.T) { ctx := context.Background() ctx, cancel := context.WithCancel(ctx) defer cancel() - tektonclient := fake.NewSimpleClientset(tb.Task("simple", tb.TaskType, tb.TaskNamespace("default"), tb.TaskSpec(tb.Step("something")))) + tektonclient := fake.NewSimpleClientset(simpleNamespacedTask) kubeclient := fakek8s.NewSimpleClientset(&v1.ServiceAccount{ ObjectMeta: metav1.ObjectMeta{ Namespace: "default", diff --git a/pkg/reconciler/taskrun/taskrun_test.go b/pkg/reconciler/taskrun/taskrun_test.go index 0a6655b698a..e125104a1d5 100644 --- a/pkg/reconciler/taskrun/taskrun_test.go +++ b/pkg/reconciler/taskrun/taskrun_test.go @@ -28,10 +28,11 @@ import ( "testing" "time" + duckv1beta1 "knative.dev/pkg/apis/duck/v1beta1" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/go-containerregistry/pkg/registry" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/config" "github.com/tektoncd/pipeline/pkg/apis/pipeline" "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod" @@ -98,104 +99,312 @@ var ( resourceQuantityCmp = cmp.Comparer(func(x, y resource.Quantity) bool { return x.Cmp(y) == 0 }) + handleMapOrdering = cmpopts.SortMaps(func(x, y string) bool { return x < y }) cloudEventTarget1 = "https://foo" cloudEventTarget2 = "https://bar" - simpleStep = tb.Step("foo", tb.StepName("simple-step"), tb.StepCommand("/mycmd")) - simpleTask = tb.Task("test-task", tb.TaskSpec(simpleStep), tb.TaskNamespace("foo")) - simpleTypedTask = tb.Task("test-task", tb.TaskType, tb.TaskSpec(simpleStep), tb.TaskNamespace("foo")) - taskMultipleSteps = tb.Task("test-task-multi-steps", tb.TaskSpec( - tb.Step("foo", tb.StepName("z-step"), - tb.StepCommand("/mycmd"), - ), - tb.Step("foo", tb.StepName("v-step"), - tb.StepCommand("/mycmd"), - ), - tb.Step("foo", tb.StepName("x-step"), - tb.StepCommand("/mycmd"), - ), - ), tb.TaskNamespace("foo")) - - taskMultipleStepsIgnoreError = tb.Task("test-task-multi-steps-with-ignore-error", tb.TaskSpec( - tb.Step("foo", tb.StepName("step-0"), - tb.StepCommand("/mycmd"), - tb.StepOnError("continue"), - ), - tb.Step("foo", tb.StepName("step-1"), - tb.StepCommand("/mycmd"), - ), - ), tb.TaskNamespace("foo")) - - clustertask = tb.ClusterTask("test-cluster-task", tb.ClusterTaskSpec(simpleStep)) - taskSidecar = tb.Task("test-task-sidecar", tb.TaskSpec( - tb.Sidecar("sidecar", "image-id"), - ), tb.TaskNamespace("foo")) - taskMultipleSidecars = tb.Task("test-task-sidecar", tb.TaskSpec( - tb.Sidecar("sidecar", "image-id"), - tb.Sidecar("sidecar2", "image-id"), - ), tb.TaskNamespace("foo")) - - outputTask = tb.Task("test-output-task", tb.TaskSpec( - simpleStep, tb.TaskResources( - tb.TaskResourcesInput(gitResource.Name, resourcev1alpha1.PipelineResourceTypeGit), - tb.TaskResourcesInput(anotherGitResource.Name, resourcev1alpha1.PipelineResourceTypeGit), - ), - tb.TaskResources(tb.TaskResourcesOutput(gitResource.Name, resourcev1alpha1.PipelineResourceTypeGit)), - )) - - saTask = tb.Task("test-with-sa", tb.TaskSpec(tb.Step("foo", tb.StepName("sa-step"), tb.StepCommand("/mycmd"))), tb.TaskNamespace("foo")) - - templatedTask = tb.Task("test-task-with-substitution", tb.TaskSpec( - tb.TaskParam("myarg", v1beta1.ParamTypeString), - tb.TaskParam("myarghasdefault", v1beta1.ParamTypeString, tb.ParamSpecDefault("dont see me")), - tb.TaskParam("myarghasdefault2", v1beta1.ParamTypeString, tb.ParamSpecDefault("thedefault")), - tb.TaskParam("configmapname", v1beta1.ParamTypeString), - tb.TaskResources( - tb.TaskResourcesInput("workspace", resourcev1alpha1.PipelineResourceTypeGit), - tb.TaskResourcesOutput("myimage", resourcev1alpha1.PipelineResourceTypeImage), - ), - tb.Step("myimage", tb.StepName("mycontainer"), tb.StepCommand("/mycmd"), tb.StepArgs( - "--my-arg=$(inputs.params.myarg)", - "--my-arg-with-default=$(inputs.params.myarghasdefault)", - "--my-arg-with-default2=$(inputs.params.myarghasdefault2)", - "--my-additional-arg=$(outputs.resources.myimage.url)", - "--my-taskname-arg=$(context.task.name)", - "--my-taskrun-arg=$(context.taskRun.name)", - )), - tb.Step("myotherimage", tb.StepName("myothercontainer"), tb.StepCommand("/mycmd"), tb.StepArgs( - "--my-other-arg=$(inputs.resources.workspace.url)", - )), - tb.TaskVolume("volume-configmap", tb.VolumeSource(corev1.VolumeSource{ - ConfigMap: &corev1.ConfigMapVolumeSource{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: "$(inputs.params.configmapname)", - }, - }, - })), - ), tb.TaskNamespace("foo")) - - twoOutputsTask = tb.Task("test-two-output-task", tb.TaskSpec( - simpleStep, tb.TaskResources( - tb.TaskResourcesOutput(cloudEventResource.Name, resourcev1alpha1.PipelineResourceTypeCloudEvent), - tb.TaskResourcesOutput(anotherCloudEventResource.Name, resourcev1alpha1.PipelineResourceTypeCloudEvent), - ), - ), tb.TaskNamespace("foo")) - - gitResource = tb.PipelineResource("git-resource", tb.PipelineResourceNamespace("foo"), tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeGit, tb.PipelineResourceSpecParam("URL", "https://foo.git"), - )) - anotherGitResource = tb.PipelineResource("another-git-resource", tb.PipelineResourceNamespace("foo"), tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeGit, tb.PipelineResourceSpecParam("URL", "https://foobar.git"), - )) - imageResource = tb.PipelineResource("image-resource", tb.PipelineResourceNamespace("foo"), tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeImage, tb.PipelineResourceSpecParam("URL", "gcr.io/kristoff/sven"), - )) - cloudEventResource = tb.PipelineResource("cloud-event-resource", tb.PipelineResourceNamespace("foo"), tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeCloudEvent, tb.PipelineResourceSpecParam("TargetURI", cloudEventTarget1), - )) - anotherCloudEventResource = tb.PipelineResource("another-cloud-event-resource", tb.PipelineResourceNamespace("foo"), tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeCloudEvent, tb.PipelineResourceSpecParam("TargetURI", cloudEventTarget2), - )) + simpleStep = v1beta1.Step{ + Container: corev1.Container{ + Name: "simple-step", + Image: "foo", + Command: []string{"/mycmd"}, + }, + } + simpleTask = &v1beta1.Task{ + ObjectMeta: objectMeta("test-task", "foo"), + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{simpleStep}, + }, + } + simpleTypedTask = &v1beta1.Task{ + ObjectMeta: objectMeta("test-task", "foo"), + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{simpleStep}, + }, + } + taskMultipleSteps = &v1beta1.Task{ + ObjectMeta: objectMeta("test-task-multi-steps", "foo"), + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{ + { + Container: corev1.Container{ + Image: "foo", + Name: "z-step", + Command: []string{"/mycmd"}, + }, + }, + { + Container: corev1.Container{ + Image: "foo", + Name: "v-step", + Command: []string{"/mycmd"}, + }, + }, + { + Container: corev1.Container{ + Image: "foo", + Name: "x-step", + Command: []string{"/mycmd"}, + }, + }, + }, + }, + } + + taskMultipleStepsIgnoreError = &v1beta1.Task{ + ObjectMeta: objectMeta("test-task-multi-steps-with-ignore-error", "foo"), + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{ + { + Container: corev1.Container{ + Image: "foo", + Name: "step-0", + Command: []string{"/mycmd"}, + }, + OnError: "continue", + }, + { + Container: corev1.Container{ + Image: "foo", + Name: "step-1", + Command: []string{"/mycmd"}, + }, + }, + }, + }, + } + + clustertask = &v1beta1.ClusterTask{ + ObjectMeta: metav1.ObjectMeta{Name: "test-cluster-task"}, + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{simpleStep}, + }, + } + taskSidecar = &v1beta1.Task{ + ObjectMeta: objectMeta("test-task-sidecar", "foo"), + Spec: v1beta1.TaskSpec{ + Sidecars: []v1beta1.Sidecar{{ + Container: corev1.Container{ + Name: "sidecar", + Image: "image-id", + }, + }}, + }, + } + taskMultipleSidecars = &v1beta1.Task{ + ObjectMeta: objectMeta("test-task-sidecar", "foo"), + Spec: v1beta1.TaskSpec{ + Sidecars: []v1beta1.Sidecar{ + { + Container: corev1.Container{ + Name: "sidecar", + Image: "image-id", + }, + }, + { + Container: corev1.Container{ + Name: "sidecar2", + Image: "image-id", + }, + }, + }, + }, + } + + outputTask = &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{Name: "test-output-task"}, + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{simpleStep}, + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{ + { + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: gitResource.Name, + Type: resourcev1alpha1.PipelineResourceTypeGit, + }, + }, + { + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: anotherGitResource.Name, + Type: resourcev1alpha1.PipelineResourceTypeGit, + }, + }, + }, + Outputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: gitResource.Name, + Type: resourcev1alpha1.PipelineResourceTypeGit, + }, + }}, + }, + }, + } + + saTask = &v1beta1.Task{ + ObjectMeta: objectMeta("test-with-sa", "foo"), + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Name: "sa-step", + Image: "foo", + Command: []string{"/mycmd"}, + }, + }}, + }, + } + + templatedTask = &v1beta1.Task{ + ObjectMeta: objectMeta("test-task-with-substitution", "foo"), + Spec: v1beta1.TaskSpec{ + Params: []v1beta1.ParamSpec{ + { + Name: "myarg", + Type: v1beta1.ParamTypeString, + }, + { + Name: "myarghasdefault", + Type: v1beta1.ParamTypeString, + Default: v1beta1.NewArrayOrString("dont see me"), + }, + { + Name: "myarghasdefault2", + Type: v1beta1.ParamTypeString, + Default: v1beta1.NewArrayOrString("thedefault"), + }, + { + Name: "configmapname", + Type: v1beta1.ParamTypeString, + }, + }, + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "workspace", + Type: resourcev1alpha1.PipelineResourceTypeGit, + }, + }}, + Outputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "myimage", + Type: resourcev1alpha1.PipelineResourceTypeImage, + }, + }}, + }, + Steps: []v1beta1.Step{ + { + Container: corev1.Container{ + Image: "myimage", + Name: "mycontainer", + Command: []string{"/mycmd"}, + Args: []string{ + "--my-arg=$(inputs.params.myarg)", + "--my-arg-with-default=$(inputs.params.myarghasdefault)", + "--my-arg-with-default2=$(inputs.params.myarghasdefault2)", + "--my-additional-arg=$(outputs.resources.myimage.url)", + "--my-taskname-arg=$(context.task.name)", + "--my-taskrun-arg=$(context.taskRun.name)", + }, + }, + }, + { + Container: corev1.Container{ + Image: "myotherimage", + Name: "myothercontainer", + Command: []string{"/mycmd"}, + Args: []string{"--my-other-arg=$(inputs.resources.workspace.url)"}, + }, + }, + }, + Volumes: []corev1.Volume{{ + Name: "volume-configmap", + VolumeSource: corev1.VolumeSource{ + ConfigMap: &corev1.ConfigMapVolumeSource{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: "$(inputs.params.configmapname)", + }, + }, + }, + }}, + }, + } + + twoOutputsTask = &v1beta1.Task{ + ObjectMeta: objectMeta("test-two-output-task", "foo"), + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{simpleStep}, + Resources: &v1beta1.TaskResources{ + Outputs: []v1beta1.TaskResource{ + { + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: cloudEventResource.Name, + Type: resourcev1alpha1.PipelineResourceTypeCloudEvent, + }, + }, + { + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: anotherCloudEventResource.Name, + Type: resourcev1alpha1.PipelineResourceTypeCloudEvent, + }, + }, + }, + }, + }, + } + + gitResource = &resourcev1alpha1.PipelineResource{ + ObjectMeta: objectMeta("git-resource", "foo"), + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{{ + Name: "URL", + Value: "https://foo.git", + }}, + }, + } + anotherGitResource = &resourcev1alpha1.PipelineResource{ + ObjectMeta: objectMeta("another-git-resource", "foo"), + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{{ + Name: "URL", + Value: "https://foobar.git", + }}, + }, + } + imageResource = &resourcev1alpha1.PipelineResource{ + ObjectMeta: objectMeta("image-resource", "foo"), + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeImage, + Params: []resourcev1alpha1.ResourceParam{{ + Name: "URL", + Value: "gcr.io/kristoff/sven", + }}, + }, + } + cloudEventResource = &resourcev1alpha1.PipelineResource{ + ObjectMeta: objectMeta("cloud-event-resource", "foo"), + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeCloudEvent, + Params: []resourcev1alpha1.ResourceParam{{ + Name: "TargetURI", + Value: cloudEventTarget1, + }}, + }, + } + anotherCloudEventResource = &resourcev1alpha1.PipelineResource{ + ObjectMeta: objectMeta("another-cloud-event-resource", "foo"), + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeCloudEvent, + Params: []resourcev1alpha1.ResourceParam{{ + Name: "TargetURI", + Value: cloudEventTarget2, + }}, + }, + } binVolume = corev1.Volume{ Name: "tekton-internal-bin", @@ -247,15 +456,15 @@ var ( }, } - getPlaceToolsInitContainer = func(ops ...tb.ContainerOp) tb.PodSpecOp { - actualOps := []tb.ContainerOp{ - tb.Command("/ko-app/entrypoint", "cp", "/ko-app/entrypoint", entrypointLocation), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin"), - tb.WorkingDir("/"), - tb.Args(), - } - actualOps = append(actualOps, ops...) - return tb.PodInitContainer("place-tools", "override-with-entrypoint:latest", actualOps...) + placeToolsInitContainer = corev1.Container{ + Command: []string{"/ko-app/entrypoint", "cp", "/ko-app/entrypoint", entrypointLocation}, + VolumeMounts: []corev1.VolumeMount{{ + MountPath: "/tekton/bin", + Name: "tekton-internal-bin", + }}, + WorkingDir: "/", + Name: "place-tools", + Image: "override-with-entrypoint:latest", } fakeVersion string ) @@ -449,18 +658,26 @@ func eventFromChannelUnordered(c chan string, wantEvents []string) error { return fmt.Errorf("too many events received") } -func withActiveDeadlineSeconds(spec *corev1.PodSpec) { - spec.ActiveDeadlineSeconds = &defaultActiveDeadlineSeconds -} - func TestReconcile_ExplicitDefaultSA(t *testing.T) { - taskRunSuccess := tb.TaskRun("test-taskrun-run-success", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name, tb.TaskRefAPIVersion("a1")), - )) - taskRunWithSaSuccess := tb.TaskRun("test-taskrun-with-sa-run-success", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(saTask.Name, tb.TaskRefAPIVersion("a1")), - tb.TaskRunServiceAccountName("test-sa"), - )) + taskRunSuccess := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-run-success", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + APIVersion: "a1", + }, + }, + } + taskRunWithSaSuccess := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-with-sa-run-success", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: saTask.Name, + APIVersion: "a1", + }, + ServiceAccountName: "test-sa", + }, + } taskruns := []*v1beta1.TaskRun{taskRunSuccess, taskRunWithSaSuccess} defaultSAName := "pipelines" d := test.Data{ @@ -484,102 +701,19 @@ func TestReconcile_ExplicitDefaultSA(t *testing.T) { }{{ name: "success", taskRun: taskRunSuccess, - wantPod: tb.Pod("test-taskrun-run-success-pod-abcde", - tb.PodNamespace("foo"), - tb.PodAnnotation(podconvert.ReleaseAnnotation, fakeVersion), - tb.PodLabel(pipeline.TaskLabelKey, "test-task"), - tb.PodLabel(pipeline.TaskRunLabelKey, "test-taskrun-run-success"), - tb.PodLabel("app.kubernetes.io/managed-by", "tekton-pipelines"), - tb.PodOwnerReference("TaskRun", "test-taskrun-run-success", - tb.OwnerReferenceAPIVersion(currentAPIVersion)), - tb.PodSpec( - withActiveDeadlineSeconds, - tb.PodServiceAccountName(defaultSAName), - tb.PodVolumes(workspaceVolume, homeVolume, resultsVolume, stepsVolume, binVolume, runVolume, downwardVolume, corev1.Volume{ - Name: "tekton-creds-init-home-0", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }), - tb.PodRestartPolicy(corev1.RestartPolicyNever), - getPlaceToolsInitContainer(), - tb.PodContainer("step-simple-step", "foo", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/downward/ready", - "-wait_file_content", - "-post_file", - "/tekton/run/0", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-simple-step", - "-step_metadata_dir_link", - "/tekton/steps/0", - "-entrypoint", - "/mycmd", - "--", - ), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-internal-downward", "/tekton/downward", tb.VolumeMountRO), - tb.VolumeMount("tekton-creds-init-home-0", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - withActiveDeadlineSeconds, - ), - ), + wantPod: expectedPod("test-taskrun-run-success-pod-abcde", "test-task", "test-taskrun-run-success", "foo", defaultSAName, false, nil, []stepForExpectedPod{{ + image: "foo", + name: "simple-step", + cmd: "/mycmd", + }}), }, { name: "serviceaccount", taskRun: taskRunWithSaSuccess, - wantPod: tb.Pod("test-taskrun-with-sa-run-success-pod-abcde", - tb.PodNamespace("foo"), - tb.PodAnnotation(podconvert.ReleaseAnnotation, fakeVersion), - tb.PodLabel(pipeline.TaskLabelKey, "test-with-sa"), - tb.PodLabel(pipeline.TaskRunLabelKey, "test-taskrun-with-sa-run-success"), - tb.PodLabel("app.kubernetes.io/managed-by", "tekton-pipelines"), - tb.PodOwnerReference("TaskRun", "test-taskrun-with-sa-run-success", - tb.OwnerReferenceAPIVersion(currentAPIVersion)), - tb.PodSpec( - withActiveDeadlineSeconds, - tb.PodServiceAccountName("test-sa"), - tb.PodVolumes(workspaceVolume, homeVolume, resultsVolume, stepsVolume, binVolume, runVolume, downwardVolume, corev1.Volume{ - Name: "tekton-creds-init-home-0", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }), - tb.PodRestartPolicy(corev1.RestartPolicyNever), - getPlaceToolsInitContainer(), - tb.PodContainer("step-sa-step", "foo", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/downward/ready", - "-wait_file_content", - "-post_file", - "/tekton/run/0", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-sa-step", - "-step_metadata_dir_link", - "/tekton/steps/0", - "-entrypoint", - "/mycmd", - "--", - ), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-internal-downward", "/tekton/downward", tb.VolumeMountRO), - tb.VolumeMount("tekton-creds-init-home-0", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - ), - ), + wantPod: expectedPod("test-taskrun-with-sa-run-success-pod-abcde", "test-with-sa", "test-taskrun-with-sa-run-success", "foo", "test-sa", false, nil, []stepForExpectedPod{{ + image: "foo", + name: "sa-step", + cmd: "/mycmd", + }}), }} { t.Run(tc.name, func(t *testing.T) { saName := tc.taskRun.Spec.ServiceAccountName @@ -632,7 +766,7 @@ func TestReconcile_ExplicitDefaultSA(t *testing.T) { t.Errorf("Pod metadata doesn't match %s", diff.PrintWantGot(d)) } - if d := cmp.Diff(tc.wantPod.Spec, pod.Spec, resourceQuantityCmp); d != "" { + if d := cmp.Diff(tc.wantPod.Spec, pod.Spec, resourceQuantityCmp, handleMapOrdering); d != "" { t.Errorf("Pod spec doesn't match, %s", diff.PrintWantGot(d)) } if len(clients.Kube.Actions()) == 0 { @@ -646,20 +780,38 @@ func TestReconcile_ExplicitDefaultSA(t *testing.T) { // to ensure the 'feature-flags' config map can be used to disable the // corresponding behavior. func TestReconcile_FeatureFlags(t *testing.T) { - taskWithEnvVar := tb.Task("test-task-with-env-var", - tb.TaskSpec(tb.Step("foo", - tb.StepName("simple-step"), tb.StepCommand("/mycmd"), tb.StepEnvVar("foo", "bar"), - )), - tb.TaskNamespace("foo"), - ) - taskRunWithDisableHomeEnv := tb.TaskRun("test-taskrun-run-home-env", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec(tb.TaskRunTaskRef(taskWithEnvVar.Name)), - ) - taskRunWithDisableWorkingDirOverwrite := tb.TaskRun("test-taskrun-run-working-dir", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec(tb.TaskRunTaskRef(simpleTask.Name)), - ) + taskWithEnvVar := &v1beta1.Task{ + ObjectMeta: objectMeta("test-task-with-env-var", "foo"), + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "foo", + Name: "simple-step", + Command: []string{"/mycmd"}, + Env: []corev1.EnvVar{{ + Name: "foo", + Value: "bar", + }}, + }, + }}, + }, + } + taskRunWithDisableHomeEnv := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-run-home-env", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: taskWithEnvVar.Name, + }, + }, + } + taskRunWithDisableWorkingDirOverwrite := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-run-working-dir", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + }, + } d := test.Data{ TaskRuns: []*v1beta1.TaskRun{taskRunWithDisableHomeEnv, taskRunWithDisableWorkingDirOverwrite}, Tasks: []*v1beta1.Task{simpleTask, taskWithEnvVar}, @@ -673,105 +825,21 @@ func TestReconcile_FeatureFlags(t *testing.T) { name: "disable-home-env-overwrite", taskRun: taskRunWithDisableHomeEnv, featureFlag: "disable-home-env-overwrite", - wantPod: tb.Pod("test-taskrun-run-home-env-pod-abcde", - tb.PodNamespace("foo"), - tb.PodAnnotation(podconvert.ReleaseAnnotation, fakeVersion), - tb.PodLabel(pipeline.TaskLabelKey, "test-task-with-env-var"), - tb.PodLabel(pipeline.TaskRunLabelKey, "test-taskrun-run-home-env"), - tb.PodLabel("app.kubernetes.io/managed-by", "tekton-pipelines"), - tb.PodOwnerReference("TaskRun", "test-taskrun-run-home-env", - tb.OwnerReferenceAPIVersion(currentAPIVersion)), - tb.PodSpec( - withActiveDeadlineSeconds, - tb.PodServiceAccountName(config.DefaultServiceAccountValue), - tb.PodVolumes(workspaceVolume, homeVolume, resultsVolume, stepsVolume, binVolume, runVolume, downwardVolume, corev1.Volume{ - Name: "tekton-creds-init-home-0", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }), - tb.PodRestartPolicy(corev1.RestartPolicyNever), - getPlaceToolsInitContainer(), - tb.PodContainer("step-simple-step", "foo", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/downward/ready", - "-wait_file_content", - "-post_file", - "/tekton/run/0", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-simple-step", - "-step_metadata_dir_link", - "/tekton/steps/0", - "-entrypoint", - "/mycmd", - "--", - ), - tb.EnvVar("foo", "bar"), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-internal-downward", "/tekton/downward", tb.VolumeMountRO), - tb.VolumeMount("tekton-creds-init-home-0", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - withActiveDeadlineSeconds, - ), - ), + wantPod: expectedPod("test-taskrun-run-home-env-pod-abcde", "test-task-with-env-var", "test-taskrun-run-home-env", "foo", config.DefaultServiceAccountValue, false, nil, []stepForExpectedPod{{ + image: "foo", + name: "simple-step", + cmd: "/mycmd", + envVars: map[string]string{"foo": "bar"}, + }}), }, { name: "disable-working-dir-overwrite", taskRun: taskRunWithDisableWorkingDirOverwrite, featureFlag: "disable-working-directory-overwrite", - wantPod: tb.Pod("test-taskrun-run-working-dir-pod-abcde", - tb.PodNamespace("foo"), - tb.PodAnnotation(podconvert.ReleaseAnnotation, fakeVersion), - tb.PodLabel(pipeline.TaskLabelKey, "test-task"), - tb.PodLabel(pipeline.TaskRunLabelKey, "test-taskrun-run-working-dir"), - tb.PodLabel("app.kubernetes.io/managed-by", "tekton-pipelines"), - tb.PodOwnerReference("TaskRun", "test-taskrun-run-working-dir", - tb.OwnerReferenceAPIVersion(currentAPIVersion)), - tb.PodSpec( - withActiveDeadlineSeconds, - tb.PodServiceAccountName(config.DefaultServiceAccountValue), - tb.PodVolumes(workspaceVolume, homeVolume, resultsVolume, stepsVolume, binVolume, runVolume, downwardVolume, corev1.Volume{ - Name: "tekton-creds-init-home-0", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }), - tb.PodRestartPolicy(corev1.RestartPolicyNever), - getPlaceToolsInitContainer(), - tb.PodContainer("step-simple-step", "foo", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/downward/ready", - "-wait_file_content", - "-post_file", - "/tekton/run/0", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-simple-step", - "-step_metadata_dir_link", - "/tekton/steps/0", - "-entrypoint", - "/mycmd", - "--", - ), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-internal-downward", "/tekton/downward", tb.VolumeMountRO), - tb.VolumeMount("tekton-creds-init-home-0", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - withActiveDeadlineSeconds, - ), - ), + wantPod: expectedPod("test-taskrun-run-working-dir-pod-abcde", "test-task", "test-taskrun-run-working-dir", "foo", config.DefaultServiceAccountValue, false, nil, []stepForExpectedPod{{ + image: "foo", + name: "simple-step", + cmd: "/mycmd", + }}), }} { t.Run(tc.name, func(t *testing.T) { names.TestingSeed() @@ -846,20 +914,34 @@ func TestReconcile_FeatureFlags(t *testing.T) { // TestReconcile_CloudEvents runs reconcile with a cloud event sink configured // to ensure that events are sent in different cases func TestReconcile_CloudEvents(t *testing.T) { - simpleTask := tb.Task("test-task", - tb.TaskSpec(tb.Step("foo", - tb.StepName("simple-step"), tb.StepCommand("/mycmd"), tb.StepEnvVar("foo", "bar"), - )), - tb.TaskNamespace("foo"), - ) - taskRun := tb.TaskRun("test-taskrun-not-started", - tb.TaskRunSelfLink("/test/taskrun1"), - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec(tb.TaskRunTaskRef(simpleTask.Name)), - ) + task := &v1beta1.Task{ + ObjectMeta: objectMeta("test-task", "foo"), + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "foo", + Name: "simple-step", + Command: []string{"/mycmd"}, + Env: []corev1.EnvVar{{ + Name: "foo", + Value: "bar", + }}, + }, + }}, + }, + } + taskRun := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-not-started", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: task.Name, + }, + }, + } + taskRun.ObjectMeta.SelfLink = "/test/taskrun1" d := test.Data{ + Tasks: []*v1beta1.Task{task}, TaskRuns: []*v1beta1.TaskRun{taskRun}, - Tasks: []*v1beta1.Task{simpleTask}, } names.TestingSeed() @@ -928,142 +1010,279 @@ func TestReconcile_CloudEvents(t *testing.T) { } func TestReconcile(t *testing.T) { - taskRunSuccess := tb.TaskRun("test-taskrun-run-success", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name, tb.TaskRefAPIVersion("a1")), - )) - taskRunWithSaSuccess := tb.TaskRun("test-taskrun-with-sa-run-success", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(saTask.Name, tb.TaskRefAPIVersion("a1")), tb.TaskRunServiceAccountName("test-sa"), - )) - taskRunSubstitution := tb.TaskRun("test-taskrun-substitution", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(templatedTask.Name, tb.TaskRefAPIVersion("a1")), - tb.TaskRunParam("myarg", "foo"), - tb.TaskRunParam("myarghasdefault", "bar"), - tb.TaskRunParam("configmapname", "configbar"), - tb.TaskRunResources( - tb.TaskRunResourcesInput("workspace", tb.TaskResourceBindingRef(gitResource.Name)), - tb.TaskRunResourcesOutput("myimage", tb.TaskResourceBindingRef("image-resource")), - ), - )) - taskRunInputOutput := tb.TaskRun("test-taskrun-input-output", - tb.TaskRunNamespace("foo"), - tb.TaskRunOwnerReference("PipelineRun", "test"), - tb.TaskRunSpec( - tb.TaskRunTaskRef(outputTask.Name), - tb.TaskRunResources( - tb.TaskRunResourcesInput(gitResource.Name, - tb.TaskResourceBindingRef(gitResource.Name), - tb.TaskResourceBindingPaths("source-folder"), - ), - tb.TaskRunResourcesInput(anotherGitResource.Name, - tb.TaskResourceBindingRef(anotherGitResource.Name), - tb.TaskResourceBindingPaths("source-folder"), - ), - tb.TaskRunResourcesOutput(gitResource.Name, - tb.TaskResourceBindingRef(gitResource.Name), - tb.TaskResourceBindingPaths("output-folder"), - ), - ), - ), - ) - taskRunWithTaskSpec := tb.TaskRun("test-taskrun-with-taskspec", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunParam("myarg", "foo"), - tb.TaskRunResources( - tb.TaskRunResourcesInput("workspace", tb.TaskResourceBindingRef(gitResource.Name)), - ), - tb.TaskRunTaskSpec( - tb.TaskParam("myarg", v1beta1.ParamTypeString, tb.ParamSpecDefault("mydefault")), - tb.TaskResources( - tb.TaskResourcesInput("workspace", resourcev1alpha1.PipelineResourceTypeGit), - ), - tb.Step("myimage", tb.StepName("mycontainer"), tb.StepCommand("/mycmd"), - tb.StepArgs("--my-arg=$(inputs.params.myarg)"), - ), - ), - )) - - taskRunWithResourceSpecAndTaskSpec := tb.TaskRun("test-taskrun-with-resource-spec", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunResources( - tb.TaskRunResourcesInput("workspace", tb.TaskResourceBindingResourceSpec(&resourcev1alpha1.PipelineResourceSpec{ - Type: resourcev1alpha1.PipelineResourceTypeGit, - Params: []resourcev1alpha1.ResourceParam{{ - Name: "URL", - Value: "github.com/foo/bar.git", - }, { - Name: "revision", - Value: "rel-can", + taskRunSuccess := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-run-success", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + APIVersion: "a1", + }, + }, + } + taskRunWithSaSuccess := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-with-sa-run-success", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: saTask.Name, + APIVersion: "a1", + }, + ServiceAccountName: "test-sa", + }, + } + taskRunSubstitution := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-substitution", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: templatedTask.Name, + APIVersion: "a1", + }, + Params: []v1beta1.Param{ + { + Name: "myarg", + Value: *v1beta1.NewArrayOrString("foo"), + }, + { + Name: "myarghasdefault", + Value: *v1beta1.NewArrayOrString("bar"), + }, + { + Name: "configmapname", + Value: *v1beta1.NewArrayOrString("configbar"), + }, + }, + Resources: &v1beta1.TaskRunResources{ + Inputs: []v1beta1.TaskResourceBinding{{ + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: "workspace", + ResourceRef: &v1beta1.PipelineResourceRef{ + Name: gitResource.Name, + }, + }, }}, - })), - ), - tb.TaskRunTaskSpec( - tb.TaskResources( - tb.TaskResourcesInput("workspace", resourcev1alpha1.PipelineResourceTypeGit)), - tb.Step("ubuntu", tb.StepName("mystep"), tb.StepCommand("/mycmd")), - ), - )) - - taskRunWithClusterTask := tb.TaskRun("test-taskrun-with-cluster-task", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec(tb.TaskRunTaskRef(clustertask.Name, tb.TaskRefKind(v1beta1.ClusterTaskKind))), - ) - - taskRunWithLabels := tb.TaskRun("test-taskrun-with-labels", - tb.TaskRunNamespace("foo"), - tb.TaskRunLabel("TaskRunLabel", "TaskRunValue"), - tb.TaskRunLabel(pipeline.TaskRunLabelKey, "WillNotBeUsed"), - tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name), - ), - ) - - taskRunWithAnnotations := tb.TaskRun("test-taskrun-with-annotations", - tb.TaskRunNamespace("foo"), - tb.TaskRunAnnotation("TaskRunAnnotation", "TaskRunValue"), - tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name), - ), - ) - - taskRunWithPod := tb.TaskRun("test-taskrun-with-pod", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec(tb.TaskRunTaskRef(simpleTask.Name)), - tb.TaskRunStatus(tb.PodName("some-pod-abcdethat-no-longer-exists")), - ) - - taskRunWithCredentialsVariable := tb.TaskRun("test-taskrun-with-credentials-variable", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec(tb.TaskRunTaskSpec( - tb.Step("myimage", tb.StepName("mycontainer"), tb.StepCommand("/mycmd $(credentials.path)")), - ), - )) - - // Set up a fake registry to push an image to. - s := httptest.NewServer(registry.New()) - defer s.Close() - u, err := url.Parse(s.URL) - if err != nil { - t.Fatal(err) + Outputs: []v1beta1.TaskResourceBinding{{ + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: "myimage", + ResourceRef: &v1beta1.PipelineResourceRef{ + Name: imageResource.Name, + }, + }, + }}, + }, + }, } - - // Upload the simple task to the registry for our taskRunBundle TaskRun. - ref, err := test.CreateImage(u.Host+"/"+simpleTypedTask.Name, simpleTypedTask) - if err != nil { - t.Fatalf("failed to upload image with simple task: %s", err.Error()) + taskRunInputOutput := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-input-output", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: outputTask.Name, + }, + Resources: &v1beta1.TaskRunResources{ + Inputs: []v1beta1.TaskResourceBinding{ + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: gitResource.Name, + ResourceRef: &v1beta1.PipelineResourceRef{Name: gitResource.Name}, + }, + Paths: []string{"source-folder"}, + }, + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: anotherGitResource.Name, + ResourceRef: &v1beta1.PipelineResourceRef{Name: anotherGitResource.Name}, + }, + Paths: []string{"source-folder"}, + }, + }, + Outputs: []v1beta1.TaskResourceBinding{{ + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: gitResource.Name, + ResourceRef: &v1beta1.PipelineResourceRef{Name: gitResource.Name}, + }, + Paths: []string{"output-folder"}, + }}, + }, + }, } - - taskRunBundle := tb.TaskRun("test-taskrun-bundle", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec(tb.TaskRunTaskRef(simpleTypedTask.Name, tb.TaskRefBundle(ref))), - ) - - taskruns := []*v1beta1.TaskRun{ - taskRunSuccess, taskRunWithSaSuccess, - taskRunSubstitution, taskRunInputOutput, - taskRunWithTaskSpec, taskRunWithClusterTask, taskRunWithResourceSpecAndTaskSpec, - taskRunWithLabels, taskRunWithAnnotations, taskRunWithPod, - taskRunWithCredentialsVariable, taskRunBundle, + taskRunInputOutput.OwnerReferences = []metav1.OwnerReference{{ + Kind: "PipelineRun", + Name: "test", + }} + taskRunWithTaskSpec := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-with-taskspec", "foo"), + Spec: v1beta1.TaskRunSpec{ + Params: []v1beta1.Param{{ + Name: "myarg", + Value: *v1beta1.NewArrayOrString("foo"), + }}, + Resources: &v1beta1.TaskRunResources{ + Inputs: []v1beta1.TaskResourceBinding{{ + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: "workspace", + ResourceRef: &v1beta1.PipelineResourceRef{Name: gitResource.Name}, + }, + }}, + }, + TaskSpec: &v1beta1.TaskSpec{ + Params: []v1beta1.ParamSpec{{ + Name: "myarg", + Type: v1beta1.ParamTypeString, + Default: v1beta1.NewArrayOrString("mydefault"), + }}, + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "workspace", + Type: resourcev1alpha1.PipelineResourceTypeGit, + }, + }}, + }, + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "myimage", + Name: "mycontainer", + Command: []string{"/mycmd"}, + Args: []string{"--my-arg=$(inputs.params.myarg)"}, + }, + }}, + }, + }, } - d := test.Data{ + taskRunWithResourceSpecAndTaskSpec := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-with-resource-spec", "foo"), + Spec: v1beta1.TaskRunSpec{ + Resources: &v1beta1.TaskRunResources{ + Inputs: []v1beta1.TaskResourceBinding{{ + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: "workspace", + ResourceSpec: &resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{{ + Name: "URL", + Value: "github.com/foo/bar.git", + }, { + Name: "revision", + Value: "rel-can", + }}, + }, + }, + }}, + }, + TaskSpec: &v1beta1.TaskSpec{ + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "workspace", + Type: resourcev1alpha1.PipelineResourceTypeGit, + }, + }}, + }, + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "ubuntu", + Name: "mystep", + Command: []string{"/mycmd"}, + }, + }}, + }, + }, + } + + taskRunWithClusterTask := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-with-cluster-task", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: clustertask.Name, + Kind: v1beta1.ClusterTaskKind, + }, + }, + } + + taskRunWithLabels := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-with-labels", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + }, + } + taskRunWithLabels.Labels = map[string]string{ + "TaskRunLabel": "TaskRunValue", + pipeline.TaskRunLabelKey: "WillNotBeUsed", + } + + taskRunWithAnnotations := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-with-annotations", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + }, + } + taskRunWithAnnotations.Annotations = map[string]string{"TaskRunAnnotation": "TaskRunValue"} + + taskRunWithPod := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-with-pod", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + }, + Status: v1beta1.TaskRunStatus{ + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + PodName: "some-pod-abcdethat-no-longer-exists", + }, + }, + } + + taskRunWithCredentialsVariable := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-with-credentials-variable", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskSpec: &v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "myimage", + Name: "mycontainer", + Command: []string{"/mycmd $(credentials.path)"}, + }, + }}, + }, + }, + } + + // Set up a fake registry to push an image to. + s := httptest.NewServer(registry.New()) + defer s.Close() + u, err := url.Parse(s.URL) + if err != nil { + t.Fatal(err) + } + + // Upload the simple task to the registry for our taskRunBundle TaskRun. + ref, err := test.CreateImage(u.Host+"/"+simpleTypedTask.Name, simpleTypedTask) + if err != nil { + t.Fatalf("failed to upload image with simple task: %s", err.Error()) + } + + taskRunBundle := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-bundle", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTypedTask.Name, + Bundle: ref, + }, + }, + } + + taskruns := []*v1beta1.TaskRun{ + taskRunSuccess, taskRunWithSaSuccess, + taskRunSubstitution, taskRunInputOutput, + taskRunWithTaskSpec, taskRunWithClusterTask, taskRunWithResourceSpecAndTaskSpec, + taskRunWithLabels, taskRunWithAnnotations, taskRunWithPod, + taskRunWithCredentialsVariable, taskRunBundle, + } + + d := test.Data{ TaskRuns: taskruns, Tasks: []*v1beta1.Task{simpleTask, saTask, templatedTask, outputTask}, ClusterTasks: []*v1beta1.ClusterTask{clustertask}, @@ -1081,52 +1300,11 @@ func TestReconcile(t *testing.T) { "Normal Started ", "Normal Running Not all Steps", }, - wantPod: tb.Pod("test-taskrun-run-success-pod-abcde", - tb.PodNamespace("foo"), - tb.PodAnnotation(podconvert.ReleaseAnnotation, fakeVersion), - tb.PodLabel(pipeline.TaskLabelKey, "test-task"), - tb.PodLabel(pipeline.TaskRunLabelKey, "test-taskrun-run-success"), - tb.PodLabel("app.kubernetes.io/managed-by", "tekton-pipelines"), - tb.PodOwnerReference("TaskRun", "test-taskrun-run-success", - tb.OwnerReferenceAPIVersion(currentAPIVersion)), - tb.PodSpec( - withActiveDeadlineSeconds, - tb.PodServiceAccountName(config.DefaultServiceAccountValue), - tb.PodVolumes(workspaceVolume, homeVolume, resultsVolume, stepsVolume, binVolume, runVolume, downwardVolume, corev1.Volume{ - Name: "tekton-creds-init-home-0", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }), - tb.PodRestartPolicy(corev1.RestartPolicyNever), - getPlaceToolsInitContainer(), - tb.PodContainer("step-simple-step", "foo", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/downward/ready", - "-wait_file_content", - "-post_file", - "/tekton/run/0", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-simple-step", - "-step_metadata_dir_link", - "/tekton/steps/0", - "-entrypoint", - "/mycmd", - "--", - ), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-internal-downward", "/tekton/downward", tb.VolumeMountRO), - tb.VolumeMount("tekton-creds-init-home-0", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - ), - ), + wantPod: expectedPod("test-taskrun-run-success-pod-abcde", "test-task", "test-taskrun-run-success", "foo", config.DefaultServiceAccountValue, false, nil, []stepForExpectedPod{{ + image: "foo", + name: "simple-step", + cmd: "/mycmd", + }}), }, { name: "serviceaccount", taskRun: taskRunWithSaSuccess, @@ -1134,52 +1312,11 @@ func TestReconcile(t *testing.T) { "Normal Started ", "Normal Running Not all Steps", }, - wantPod: tb.Pod("test-taskrun-with-sa-run-success-pod-abcde", - tb.PodNamespace("foo"), - tb.PodAnnotation(podconvert.ReleaseAnnotation, fakeVersion), - tb.PodLabel(pipeline.TaskLabelKey, "test-with-sa"), - tb.PodLabel(pipeline.TaskRunLabelKey, "test-taskrun-with-sa-run-success"), - tb.PodLabel("app.kubernetes.io/managed-by", "tekton-pipelines"), - tb.PodOwnerReference("TaskRun", "test-taskrun-with-sa-run-success", - tb.OwnerReferenceAPIVersion(currentAPIVersion)), - tb.PodSpec( - withActiveDeadlineSeconds, - tb.PodServiceAccountName("test-sa"), - tb.PodVolumes(workspaceVolume, homeVolume, resultsVolume, stepsVolume, binVolume, runVolume, downwardVolume, corev1.Volume{ - Name: "tekton-creds-init-home-0", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }), - tb.PodRestartPolicy(corev1.RestartPolicyNever), - getPlaceToolsInitContainer(), - tb.PodContainer("step-sa-step", "foo", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/downward/ready", - "-wait_file_content", - "-post_file", - "/tekton/run/0", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-sa-step", - "-step_metadata_dir_link", - "/tekton/steps/0", - "-entrypoint", - "/mycmd", - "--", - ), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-internal-downward", "/tekton/downward", tb.VolumeMountRO), - tb.VolumeMount("tekton-creds-init-home-0", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - ), - ), + wantPod: expectedPod("test-taskrun-with-sa-run-success-pod-abcde", "test-with-sa", "test-taskrun-with-sa-run-success", "foo", "test-sa", false, nil, []stepForExpectedPod{{ + image: "foo", + name: "sa-step", + cmd: "/mycmd", + }}), }, { name: "params", taskRun: taskRunSubstitution, @@ -1187,189 +1324,63 @@ func TestReconcile(t *testing.T) { "Normal Started ", "Normal Running Not all Steps", }, - wantPod: tb.Pod("test-taskrun-substitution-pod-abcde", - tb.PodNamespace("foo"), - tb.PodAnnotation(podconvert.ReleaseAnnotation, fakeVersion), - tb.PodLabel(pipeline.TaskLabelKey, "test-task-with-substitution"), - tb.PodLabel(pipeline.TaskRunLabelKey, "test-taskrun-substitution"), - tb.PodLabel("app.kubernetes.io/managed-by", "tekton-pipelines"), - tb.PodOwnerReference("TaskRun", "test-taskrun-substitution", - tb.OwnerReferenceAPIVersion(currentAPIVersion)), - tb.PodSpec( - withActiveDeadlineSeconds, - tb.PodServiceAccountName(config.DefaultServiceAccountValue), - tb.PodVolumes( - workspaceVolume, homeVolume, resultsVolume, stepsVolume, binVolume, runVolume, downwardVolume, corev1.Volume{ - Name: "tekton-creds-init-home-0", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }, - corev1.Volume{ - Name: "tekton-creds-init-home-1", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }, - corev1.Volume{ - Name: "tekton-creds-init-home-2", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }, - corev1.Volume{ - Name: "tekton-creds-init-home-3", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }, - corev1.Volume{ - Name: "tekton-creds-init-home-4", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }, - corev1.Volume{ - Name: "volume-configmap", - VolumeSource: corev1.VolumeSource{ - ConfigMap: &corev1.ConfigMapVolumeSource{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: "configbar", - }, - }, - }, + wantPod: expectedPod("test-taskrun-substitution-pod-abcde", "test-task-with-substitution", "test-taskrun-substitution", "foo", config.DefaultServiceAccountValue, false, []corev1.Volume{{ + Name: "volume-configmap", + VolumeSource: corev1.VolumeSource{ + ConfigMap: &corev1.ConfigMapVolumeSource{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: "configbar", }, - ), - tb.PodRestartPolicy(corev1.RestartPolicyNever), - getPlaceToolsInitContainer(), - tb.PodContainer("step-create-dir-myimage-mssqb", "busybox", - tb.Command("/tekton/bin/entrypoint"), - tb.Args("-wait_file", - "/tekton/downward/ready", - "-wait_file_content", - "-post_file", - "/tekton/run/0", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-create-dir-myimage-mssqb", - "-step_metadata_dir_link", - "/tekton/steps/0", - "-entrypoint", - "mkdir", - "--", - "-p", - "/workspace/output/myimage"), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-internal-downward", "/tekton/downward", tb.VolumeMountRO), - tb.VolumeMount("tekton-creds-init-home-0", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - tb.PodContainer("step-git-source-workspace-mz4c7", "override-with-git:latest", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/run/0", - "-post_file", - "/tekton/run/1", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-git-source-workspace-mz4c7", - "-step_metadata_dir_link", - "/tekton/steps/1", - "-entrypoint", - "/ko-app/git-init", - "--", - "-url", "https://foo.git", - "-path", "/workspace/workspace"), - tb.EnvVar("TEKTON_RESOURCE_NAME", "workspace"), - tb.EnvVar("HOME", "/tekton/home"), - tb.WorkingDir(workspaceDir), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-creds-init-home-1", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - tb.PodContainer("step-mycontainer", "myimage", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/run/1", - "-post_file", - "/tekton/run/2", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-mycontainer", - "-step_metadata_dir_link", - "/tekton/steps/2", - "-entrypoint", - "/mycmd", - "--", - "--my-arg=foo", - "--my-arg-with-default=bar", - "--my-arg-with-default2=thedefault", - "--my-additional-arg=gcr.io/kristoff/sven", - "--my-taskname-arg=test-task-with-substitution", - "--my-taskrun-arg=test-taskrun-substitution"), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-creds-init-home-2", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - tb.PodContainer("step-myothercontainer", "myotherimage", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/run/2", - "-post_file", - "/tekton/run/3", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-myothercontainer", - "-step_metadata_dir_link", - "/tekton/steps/3", - "-entrypoint", - "/mycmd", - "--", - "--my-other-arg=https://foo.git"), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-creds-init-home-3", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - tb.PodContainer("step-image-digest-exporter-9l9zj", "override-with-imagedigest-exporter-image:latest", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/run/3", - "-post_file", - "/tekton/run/4", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-image-digest-exporter-9l9zj", - "-step_metadata_dir_link", - "/tekton/steps/4", - "-entrypoint", - "/ko-app/imagedigestexporter", "--", - "-images", "[{\"name\":\"myimage\",\"type\":\"image\",\"url\":\"gcr.io/kristoff/sven\",\"digest\":\"\",\"OutputImageDir\":\"/workspace/output/myimage\"}]"), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-creds-init-home-4", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - ), - ), + }, + }, + }}, []stepForExpectedPod{ + { + name: "create-dir-myimage-mssqb", + image: "busybox", + cmd: "mkdir", + args: []string{"-p", "/workspace/output/myimage"}, + }, + { + name: "git-source-workspace-mz4c7", + image: "override-with-git:latest", + cmd: "/ko-app/git-init", + args: []string{"-url", "https://foo.git", + "-path", "/workspace/workspace"}, + envVars: map[string]string{ + "TEKTON_RESOURCE_NAME": "workspace", + "HOME": "/tekton/home", + }, + workingDir: workspaceDir, + }, + { + name: "mycontainer", + image: "myimage", + cmd: "/mycmd", + args: []string{ + "--my-arg=foo", + "--my-arg-with-default=bar", + "--my-arg-with-default2=thedefault", + "--my-additional-arg=gcr.io/kristoff/sven", + "--my-taskname-arg=test-task-with-substitution", + "--my-taskrun-arg=test-taskrun-substitution", + }, + }, + { + name: "myothercontainer", + image: "myotherimage", + cmd: "/mycmd", + args: []string{"--my-other-arg=https://foo.git"}, + }, + { + name: "image-digest-exporter-9l9zj", + image: "override-with-imagedigest-exporter-image:latest", + cmd: "/ko-app/imagedigestexporter", + args: []string{ + "-images", + "[{\"name\":\"myimage\",\"type\":\"image\",\"url\":\"gcr.io/kristoff/sven\",\"digest\":\"\",\"OutputImageDir\":\"/workspace/output/myimage\"}]", + }, + }, + }), }, { name: "taskrun-with-taskspec", taskRun: taskRunWithTaskSpec, @@ -1377,85 +1388,28 @@ func TestReconcile(t *testing.T) { "Normal Started ", "Normal Running Not all Steps", }, - wantPod: tb.Pod("test-taskrun-with-taskspec-pod-abcde", - tb.PodNamespace("foo"), - tb.PodAnnotation(podconvert.ReleaseAnnotation, fakeVersion), - tb.PodLabel(pipeline.TaskRunLabelKey, "test-taskrun-with-taskspec"), - tb.PodLabel("app.kubernetes.io/managed-by", "tekton-pipelines"), - tb.PodOwnerReference("TaskRun", "test-taskrun-with-taskspec", - tb.OwnerReferenceAPIVersion(currentAPIVersion)), - tb.PodSpec( - withActiveDeadlineSeconds, - tb.PodServiceAccountName(config.DefaultServiceAccountValue), - tb.PodVolumes(workspaceVolume, homeVolume, resultsVolume, stepsVolume, binVolume, runVolume, downwardVolume, corev1.Volume{ - Name: "tekton-creds-init-home-0", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }, corev1.Volume{ - Name: "tekton-creds-init-home-1", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }), - tb.PodRestartPolicy(corev1.RestartPolicyNever), - getPlaceToolsInitContainer(), - tb.PodContainer("step-git-source-workspace-9l9zj", "override-with-git:latest", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/downward/ready", - "-wait_file_content", - "-post_file", - "/tekton/run/0", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-git-source-workspace-9l9zj", - "-step_metadata_dir_link", - "/tekton/steps/0", - "-entrypoint", - "/ko-app/git-init", - "--", - "-url", - "https://foo.git", - "-path", - "/workspace/workspace", - ), - tb.EnvVar("TEKTON_RESOURCE_NAME", "workspace"), - tb.EnvVar("HOME", "/tekton/home"), - tb.WorkingDir("/workspace"), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-internal-downward", "/tekton/downward", tb.VolumeMountRO), - tb.VolumeMount("tekton-creds-init-home-0", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - tb.PodContainer("step-mycontainer", "myimage", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/run/0", - "-post_file", - "/tekton/run/1", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-mycontainer", - "-step_metadata_dir_link", - "/tekton/steps/1", - "-entrypoint", - "/mycmd", - "--", "--my-arg=foo"), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-creds-init-home-1", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - ), - ), + wantPod: expectedPod("test-taskrun-with-taskspec-pod-abcde", "", "test-taskrun-with-taskspec", "foo", config.DefaultServiceAccountValue, false, nil, []stepForExpectedPod{ + { + name: "git-source-workspace-9l9zj", + image: "override-with-git:latest", + cmd: "/ko-app/git-init", + args: []string{"-url", "https://foo.git", + "-path", "/workspace/workspace"}, + envVars: map[string]string{ + "TEKTON_RESOURCE_NAME": "workspace", + "HOME": "/tekton/home", + }, + workingDir: workspaceDir, + }, + { + name: "mycontainer", + image: "myimage", + cmd: "/mycmd", + args: []string{ + "--my-arg=foo", + }, + }, + }), }, { name: "success-with-cluster-task", taskRun: taskRunWithClusterTask, @@ -1463,52 +1417,11 @@ func TestReconcile(t *testing.T) { "Normal Started ", "Normal Running Not all Steps", }, - wantPod: tb.Pod("test-taskrun-with-cluster-task-pod-abcde", - tb.PodNamespace("foo"), - tb.PodAnnotation(podconvert.ReleaseAnnotation, fakeVersion), - tb.PodLabel(pipeline.ClusterTaskLabelKey, "test-cluster-task"), - tb.PodLabel(pipeline.TaskRunLabelKey, "test-taskrun-with-cluster-task"), - tb.PodLabel("app.kubernetes.io/managed-by", "tekton-pipelines"), - tb.PodOwnerReference("TaskRun", "test-taskrun-with-cluster-task", - tb.OwnerReferenceAPIVersion(currentAPIVersion)), - tb.PodSpec( - withActiveDeadlineSeconds, - tb.PodServiceAccountName(config.DefaultServiceAccountValue), - tb.PodVolumes(workspaceVolume, homeVolume, resultsVolume, stepsVolume, binVolume, runVolume, downwardVolume, corev1.Volume{ - Name: "tekton-creds-init-home-0", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }), - tb.PodRestartPolicy(corev1.RestartPolicyNever), - getPlaceToolsInitContainer(), - tb.PodContainer("step-simple-step", "foo", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/downward/ready", - "-wait_file_content", - "-post_file", - "/tekton/run/0", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-simple-step", - "-step_metadata_dir_link", - "/tekton/steps/0", - "-entrypoint", - "/mycmd", - "--", - ), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-internal-downward", "/tekton/downward", tb.VolumeMountRO), - tb.VolumeMount("tekton-creds-init-home-0", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - ), - ), + wantPod: expectedPod("test-taskrun-with-cluster-task-pod-abcde", "test-cluster-task", "test-taskrun-with-cluster-task", "foo", config.DefaultServiceAccountValue, true, nil, []stepForExpectedPod{{ + name: "simple-step", + image: "foo", + cmd: "/mycmd", + }}), }, { name: "taskrun-with-resource-spec-task-spec", taskRun: taskRunWithResourceSpecAndTaskSpec, @@ -1516,85 +1429,27 @@ func TestReconcile(t *testing.T) { "Normal Started ", "Normal Running Not all Steps", }, - wantPod: tb.Pod("test-taskrun-with-resource-spec-pod-abcde", - tb.PodNamespace("foo"), - tb.PodAnnotation(podconvert.ReleaseAnnotation, fakeVersion), - tb.PodLabel(pipeline.TaskRunLabelKey, "test-taskrun-with-resource-spec"), - tb.PodLabel("app.kubernetes.io/managed-by", "tekton-pipelines"), - tb.PodOwnerReference("TaskRun", "test-taskrun-with-resource-spec", - tb.OwnerReferenceAPIVersion(currentAPIVersion)), - tb.PodSpec( - withActiveDeadlineSeconds, - tb.PodServiceAccountName(config.DefaultServiceAccountValue), - tb.PodVolumes(workspaceVolume, homeVolume, resultsVolume, stepsVolume, binVolume, runVolume, downwardVolume, corev1.Volume{ - Name: "tekton-creds-init-home-0", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }, corev1.Volume{ - Name: "tekton-creds-init-home-1", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }), - tb.PodRestartPolicy(corev1.RestartPolicyNever), - getPlaceToolsInitContainer(), - tb.PodContainer("step-git-source-workspace-9l9zj", "override-with-git:latest", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/downward/ready", - "-wait_file_content", - "-post_file", - "/tekton/run/0", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-git-source-workspace-9l9zj", - "-step_metadata_dir_link", - "/tekton/steps/0", - "-entrypoint", - "/ko-app/git-init", - "--", - "-url", - "github.com/foo/bar.git", - "-path", - "/workspace/workspace", - "-revision", - "rel-can"), - tb.EnvVar("TEKTON_RESOURCE_NAME", "workspace"), - tb.EnvVar("HOME", "/tekton/home"), - tb.WorkingDir("/workspace"), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-internal-downward", "/tekton/downward", tb.VolumeMountRO), - tb.VolumeMount("tekton-creds-init-home-0", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - tb.PodContainer("step-mystep", "ubuntu", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/run/0", - "-post_file", - "/tekton/run/1", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-mystep", - "-step_metadata_dir_link", - "/tekton/steps/1", - "-entrypoint", - "/mycmd", "--"), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-creds-init-home-1", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - ), - ), + wantPod: expectedPod("test-taskrun-with-resource-spec-pod-abcde", "", "test-taskrun-with-resource-spec", "foo", config.DefaultServiceAccountValue, false, nil, []stepForExpectedPod{ + { + name: "git-source-workspace-9l9zj", + image: "override-with-git:latest", + cmd: "/ko-app/git-init", + args: []string{"-url", "github.com/foo/bar.git", + "-path", "/workspace/workspace", + "-revision", "rel-can", + }, + envVars: map[string]string{ + "TEKTON_RESOURCE_NAME": "workspace", + "HOME": "/tekton/home", + }, + workingDir: workspaceDir, + }, + { + name: "mystep", + image: "ubuntu", + cmd: "/mycmd", + }, + }), }, { name: "taskrun-with-pod", taskRun: taskRunWithPod, @@ -1602,51 +1457,11 @@ func TestReconcile(t *testing.T) { "Normal Started ", "Normal Running Not all Steps", }, - wantPod: tb.Pod("test-taskrun-with-pod-pod-abcde", - tb.PodNamespace("foo"), - tb.PodAnnotation(podconvert.ReleaseAnnotation, fakeVersion), - tb.PodLabel(pipeline.TaskLabelKey, "test-task"), - tb.PodLabel(pipeline.TaskRunLabelKey, "test-taskrun-with-pod"), - tb.PodLabel("app.kubernetes.io/managed-by", "tekton-pipelines"), - tb.PodOwnerReference("TaskRun", "test-taskrun-with-pod", - tb.OwnerReferenceAPIVersion(currentAPIVersion)), - tb.PodSpec( - withActiveDeadlineSeconds, - tb.PodServiceAccountName(config.DefaultServiceAccountValue), - tb.PodVolumes(workspaceVolume, homeVolume, resultsVolume, stepsVolume, binVolume, runVolume, downwardVolume, corev1.Volume{ - Name: "tekton-creds-init-home-0", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }), - tb.PodRestartPolicy(corev1.RestartPolicyNever), - getPlaceToolsInitContainer(), - tb.PodContainer("step-simple-step", "foo", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/downward/ready", - "-wait_file_content", - "-post_file", - "/tekton/run/0", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-simple-step", - "-step_metadata_dir_link", - "/tekton/steps/0", - "-entrypoint", - "/mycmd", - "--"), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-internal-downward", "/tekton/downward", tb.VolumeMountRO), - tb.VolumeMount("tekton-creds-init-home-0", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - ), - ), + wantPod: expectedPod("test-taskrun-with-pod-pod-abcde", "test-task", "test-taskrun-with-pod", "foo", config.DefaultServiceAccountValue, false, nil, []stepForExpectedPod{{ + name: "simple-step", + image: "foo", + cmd: "/mycmd", + }}), }, { name: "taskrun-with-credentials-variable-default-tekton-creds", taskRun: taskRunWithCredentialsVariable, @@ -1654,51 +1469,11 @@ func TestReconcile(t *testing.T) { "Normal Started ", "Normal Running Not all Steps", }, - wantPod: tb.Pod("test-taskrun-with-credentials-variable-pod-9l9zj", - tb.PodNamespace("foo"), - tb.PodAnnotation(podconvert.ReleaseAnnotation, fakeVersion), - tb.PodLabel(pipeline.TaskRunLabelKey, "test-taskrun-with-credentials-variable"), - tb.PodLabel("app.kubernetes.io/managed-by", "tekton-pipelines"), - tb.PodOwnerReference("TaskRun", "test-taskrun-with-credentials-variable", - tb.OwnerReferenceAPIVersion(currentAPIVersion)), - tb.PodSpec( - withActiveDeadlineSeconds, - tb.PodServiceAccountName(config.DefaultServiceAccountValue), - tb.PodVolumes(workspaceVolume, homeVolume, resultsVolume, stepsVolume, binVolume, runVolume, downwardVolume, corev1.Volume{ - Name: "tekton-creds-init-home-0", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }), - tb.PodRestartPolicy(corev1.RestartPolicyNever), - getPlaceToolsInitContainer(), - tb.PodContainer("step-mycontainer", "myimage", - tb.Command("/tekton/bin/entrypoint"), - tb.Args("-wait_file", - "/tekton/downward/ready", - "-wait_file_content", - "-post_file", - "/tekton/run/0", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-mycontainer", - "-step_metadata_dir_link", - "/tekton/steps/0", - "-entrypoint", - // Important bit here: /tekton/creds - "/mycmd /tekton/creds", - "--"), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-internal-downward", "/tekton/downward", tb.VolumeMountRO), - tb.VolumeMount("tekton-creds-init-home-0", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - ), - ), + wantPod: expectedPod("test-taskrun-with-credentials-variable-pod-abcde", "", "test-taskrun-with-credentials-variable", "foo", config.DefaultServiceAccountValue, false, nil, []stepForExpectedPod{{ + name: "mycontainer", + image: "myimage", + cmd: "/mycmd /tekton/creds", + }}), }, { name: "remote-task", taskRun: taskRunBundle, @@ -1706,52 +1481,11 @@ func TestReconcile(t *testing.T) { "Normal Started ", "Normal Running Not all Steps", }, - wantPod: tb.Pod("test-taskrun-bundle-pod-abcde", - tb.PodNamespace("foo"), - tb.PodAnnotation(podconvert.ReleaseAnnotation, fakeVersion), - tb.PodLabel(pipeline.TaskLabelKey, "test-task"), - tb.PodLabel(pipeline.TaskRunLabelKey, "test-taskrun-bundle"), - tb.PodLabel("app.kubernetes.io/managed-by", "tekton-pipelines"), - tb.PodOwnerReference("TaskRun", "test-taskrun-bundle", - tb.OwnerReferenceAPIVersion(currentAPIVersion)), - tb.PodSpec( - withActiveDeadlineSeconds, - tb.PodServiceAccountName(config.DefaultServiceAccountValue), - tb.PodVolumes(workspaceVolume, homeVolume, resultsVolume, stepsVolume, binVolume, runVolume, downwardVolume, corev1.Volume{ - Name: "tekton-creds-init-home-0", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, - }), - tb.PodRestartPolicy(corev1.RestartPolicyNever), - getPlaceToolsInitContainer(), - tb.PodContainer("step-simple-step", "foo", - tb.Command(entrypointLocation), - tb.Args("-wait_file", - "/tekton/downward/ready", - "-wait_file_content", - "-post_file", - "/tekton/run/0", - "-termination_path", - "/tekton/termination", - "-step_metadata_dir", - "/tekton/steps/step-simple-step", - "-step_metadata_dir_link", - "/tekton/steps/0", - "-entrypoint", - "/mycmd", - "--", - ), - tb.VolumeMount("tekton-internal-bin", "/tekton/bin", tb.VolumeMountRO), - tb.VolumeMount("tekton-internal-run", "/tekton/run"), - tb.VolumeMount("tekton-internal-downward", "/tekton/downward", tb.VolumeMountRO), - tb.VolumeMount("tekton-creds-init-home-0", "/tekton/creds"), - tb.VolumeMount("tekton-internal-workspace", workspaceDir), - tb.VolumeMount("tekton-internal-home", "/tekton/home"), - tb.VolumeMount("tekton-internal-results", "/tekton/results"), - tb.VolumeMount("tekton-internal-steps", "/tekton/steps"), - tb.TerminationMessagePath("/tekton/termination"), - ), - ), - ), + wantPod: expectedPod("test-taskrun-bundle-pod-abcde", "test-task", "test-taskrun-bundle", "foo", config.DefaultServiceAccountValue, false, nil, []stepForExpectedPod{{ + name: "simple-step", + image: "foo", + cmd: "/mycmd", + }}), }} { t.Run(tc.name, func(t *testing.T) { names.TestingSeed() @@ -1807,7 +1541,7 @@ func TestReconcile(t *testing.T) { } pod.Name = tc.wantPod.Name // Ignore pod name differences, the pod name is generated and tested in pod_test.go - if d := cmp.Diff(tc.wantPod.Spec, pod.Spec, resourceQuantityCmp); d != "" { + if d := cmp.Diff(tc.wantPod.Spec, pod.Spec, resourceQuantityCmp, handleMapOrdering); d != "" { t.Errorf("Pod spec doesn't match %s", diff.PrintWantGot(d)) } if len(clients.Kube.Actions()) == 0 { @@ -1823,9 +1557,14 @@ func TestReconcile(t *testing.T) { } func TestReconcile_SetsStartTime(t *testing.T) { - taskRun := tb.TaskRun("test-taskrun", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name), - )) + taskRun := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + }, + } d := test.Data{ TaskRuns: []*v1beta1.TaskRun{taskRun}, Tasks: []*v1beta1.Task{simpleTask}, @@ -1861,13 +1600,20 @@ func TestReconcile_SetsStartTime(t *testing.T) { func TestReconcile_DoesntChangeStartTime(t *testing.T) { startTime := time.Date(2000, 1, 1, 1, 1, 1, 1, time.UTC) - taskRun := tb.TaskRun("test-taskrun", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name)), - tb.TaskRunStatus( - tb.TaskRunStartTime(startTime), - tb.PodName("the-pod"), - ), - ) + taskRun := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + }, + Status: v1beta1.TaskRunStatus{ + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + StartTime: &metav1.Time{Time: startTime}, + PodName: "the-pod", + }, + }, + } d := test.Data{ TaskRuns: []*v1beta1.TaskRun{taskRun}, Tasks: []*v1beta1.Task{simpleTask}, @@ -1891,10 +1637,23 @@ func TestReconcile_DoesntChangeStartTime(t *testing.T) { } func TestReconcileInvalidTaskRuns(t *testing.T) { - noTaskRun := tb.TaskRun("notaskrun", tb.TaskRunNamespace("foo"), tb.TaskRunSpec(tb.TaskRunTaskRef("notask"))) - withWrongRef := tb.TaskRun("taskrun-with-wrong-ref", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef("taskrun-with-wrong-ref", tb.TaskRefKind(v1beta1.ClusterTaskKind)), - )) + noTaskRun := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("notaskrun", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "notask", + }, + }, + } + withWrongRef := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("taskrun-with-wrong-ref", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "taskrun-with-wrong-ref", + Kind: v1beta1.ClusterTaskKind, + }, + }, + } taskRuns := []*v1beta1.TaskRun{noTaskRun, withWrongRef} tasks := []*v1beta1.Task{simpleTask} @@ -1975,14 +1734,29 @@ func TestReconcileInvalidTaskRuns(t *testing.T) { } func TestReconcileTaskRunWithPermanentError(t *testing.T) { - noTaskRun := tb.TaskRun("notaskrun", tb.TaskRunNamespace("foo"), tb.TaskRunSpec(tb.TaskRunTaskRef("notask")), - tb.TaskRunStatus(tb.TaskRunStartTime(time.Now()), - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionFalse, - Reason: podconvert.ReasonFailedResolution, - Message: "error when listing tasks for taskRun taskrun-failure: tasks.tekton.dev \"notask\" not found", - }))) + noTaskRun := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("notaskrun", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "notask", + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionFalse, + Reason: podconvert.ReasonFailedResolution, + Message: "error when listing tasks for taskRun taskrun-failure: tasks.tekton.dev \"notask\" not found", + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + } taskRuns := []*v1beta1.TaskRun{noTaskRun} @@ -2026,11 +1800,19 @@ func TestReconcileTaskRunWithPermanentError(t *testing.T) { } func TestReconcilePodFetchError(t *testing.T) { - taskRun := tb.TaskRun("test-taskrun-run-success", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec(tb.TaskRunTaskRef("test-task")), - tb.TaskRunStatus(tb.PodName("will-not-be-found")), - ) + taskRun := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-run-success", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "test-task", + }, + }, + Status: v1beta1.TaskRunStatus{ + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + PodName: "will-not-be-found", + }, + }, + } d := test.Data{ TaskRuns: []*v1beta1.TaskRun{taskRun}, Tasks: []*v1beta1.Task{simpleTask}, @@ -2081,7 +1863,14 @@ func makePod(taskRun *v1beta1.TaskRun, task *v1beta1.Task) (*corev1.Pod, error) func TestReconcilePodUpdateStatus(t *testing.T) { const taskLabel = "test-task" - taskRun := tb.TaskRun("test-taskrun-run-success", tb.TaskRunNamespace("foo"), tb.TaskRunSpec(tb.TaskRunTaskRef(taskLabel))) + taskRun := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-run-success", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: taskLabel, + }, + }, + } pod, err := makePod(taskRun, simpleTask) if err != nil { @@ -2178,9 +1967,21 @@ func TestReconcileOnCompletedTaskRun(t *testing.T) { Reason: "Build succeeded", Message: "Build succeeded", } - taskRun := tb.TaskRun("test-taskrun-run-success", tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name), - ), tb.TaskRunStatus(tb.StatusCondition(*taskSt))) + taskRun := &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{Name: "test-taskrun-run-success"}, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + *taskSt, + }, + }, + }, + } d := test.Data{ TaskRuns: []*v1beta1.TaskRun{ taskRun, @@ -2206,15 +2007,25 @@ func TestReconcileOnCompletedTaskRun(t *testing.T) { } func TestReconcileOnCancelledTaskRun(t *testing.T) { - taskRun := tb.TaskRun("test-taskrun-run-cancelled", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name), - tb.TaskRunCancelled, - ), tb.TaskRunStatus(tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - }))) + taskRun := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-run-cancelled", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + Status: v1beta1.TaskRunSpecStatusCancelled, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + }, + }, + }, + }, + } pod, err := makePod(taskRun, simpleTask) if err != nil { t.Fatalf("MakePod: %v", err) @@ -2285,16 +2096,28 @@ func TestReconcileTimeouts(t *testing.T) { testcases := []testCase{ { name: "taskrun with timeout", - taskRun: tb.TaskRun("test-taskrun-timeout", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name), - tb.TaskRunTimeout(10*time.Second), - ), - tb.TaskRunStatus(tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown}), - tb.TaskRunStartTime(time.Now().Add(-15*time.Second)))), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-timeout", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + Timeout: &metav1.Duration{Duration: 10 * time.Second}, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now().Add(-15 * time.Second)}, + }, + }, + }, expectedStatus: &apis.Condition{ Type: apis.ConditionSucceeded, @@ -2307,16 +2130,27 @@ func TestReconcileTimeouts(t *testing.T) { }, }, { name: "taskrun with default timeout", - taskRun: tb.TaskRun("test-taskrun-default-timeout-60-minutes", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name), - ), - tb.TaskRunStatus(tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown}), - tb.TaskRunStartTime(time.Now().Add(-61*time.Minute)))), - + taskRun: &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-default-timeout-60-minutes", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now().Add(-61 * time.Minute)}, + }, + }, + }, expectedStatus: &apis.Condition{ Type: apis.ConditionSucceeded, Status: corev1.ConditionFalse, @@ -2328,16 +2162,28 @@ func TestReconcileTimeouts(t *testing.T) { }, }, { name: "task run with nil timeout uses default", - taskRun: tb.TaskRun("test-taskrun-nil-timeout-default-60-minutes", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name), - tb.TaskRunNilTimeout, - ), - tb.TaskRunStatus(tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown}), - tb.TaskRunStartTime(time.Now().Add(-61*time.Minute)))), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-nil-timeout-default-60-minutes", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + Timeout: nil, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now().Add(-61 * time.Minute)}, + }, + }, + }, expectedStatus: &apis.Condition{ Type: apis.ConditionSucceeded, @@ -2384,26 +2230,52 @@ func TestExpandMountPath(t *testing.T) { expectedMountPath := "/temppath/replaced" expectedReplacedArgs := fmt.Sprintf("replacedArgs - %s", expectedMountPath) // The task's Workspace has a parameter variable - simpleTask := tb.Task("test-task", - tb.TaskSpec( - tb.TaskWorkspace("tr-workspace", "a test task workspace", "/temppath/$(params.source-path)", true), - tb.TaskParam("source-path", "string"), - tb.TaskParam("source-path-two", "string"), - tb.Step("foo", - tb.StepName("simple-step"), tb.StepCommand("echo"), tb.StepArgs("replacedArgs - $(workspaces.tr-workspace.path)"), - )), - - tb.TaskNamespace("foo"), - ) + simpleTask := &v1beta1.Task{ + ObjectMeta: objectMeta("test-task", "foo"), + Spec: v1beta1.TaskSpec{ + Workspaces: []v1beta1.WorkspaceDeclaration{{ + Name: "tr-workspace", + Description: "a test task workspace", + MountPath: "/temppath/$(params.source-path)", + ReadOnly: true, + }}, + Params: []v1beta1.ParamSpec{ + { + Name: "source-path", + Type: v1beta1.ParamTypeString, + }, + { + Name: "source-path-two", + Type: v1beta1.ParamTypeString, + }, + }, + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "foo", + Name: "simple-step", + Command: []string{"echo"}, + Args: []string{"replacedArgs - $(workspaces.tr-workspace.path)"}, + }, + }}, + }, + } - taskRun := tb.TaskRun("test-taskrun-not-started", - tb.TaskRunSelfLink("/test/taskrun1"), - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec(tb.TaskRunTaskRef(simpleTask.Name), - tb.TaskRunWorkspaceEmptyDir("tr-workspace", ""), - tb.TaskRunParam("source-path", "replaced"), - ), - ) + taskRun := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-not-started", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + Workspaces: []v1beta1.WorkspaceBinding{{ + Name: "tr-workspace", + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }}, + Params: []v1beta1.Param{{ + Name: "source-path", + Value: *v1beta1.NewArrayOrString("replaced"), + }}, + }, + } d := test.Data{ TaskRuns: []*v1beta1.TaskRun{taskRun}, Tasks: []*v1beta1.Task{simpleTask}, @@ -2473,30 +2345,76 @@ func TestExpandMountPath(t *testing.T) { func TestExpandMountPath_DuplicatePaths(t *testing.T) { expectedError := "workspace mount path \"/temppath/duplicate\" must be unique: workspaces[1].mountpath" // The task has two workspaces, with different mount path strings. - simpleTask := tb.Task("test-task", - tb.TaskSpec( - tb.TaskWorkspace("tr-workspace", "a test task workspace", "/temppath/$(params.source-path)", true), - tb.TaskWorkspace("tr-workspace-two", "a second task workspace", "/temppath/$(params.source-path-two)", true), - tb.TaskParam("source-path", "string"), - tb.TaskParam("source-path-two", "string"), - tb.Step("foo", - tb.StepName("simple-step"), tb.StepCommand("/mycmd"), tb.StepEnvVar("foo", "bar"), - )), - - tb.TaskNamespace("foo"), - ) + simpleTask := &v1beta1.Task{ + ObjectMeta: objectMeta("test-task", "foo"), + Spec: v1beta1.TaskSpec{ + Workspaces: []v1beta1.WorkspaceDeclaration{ + { + Name: "tr-workspace", + Description: "a test task workspace", + MountPath: "/temppath/$(params.source-path)", + ReadOnly: true, + }, + { + Name: "tr-workspace-two", + Description: "a second task workspace", + MountPath: "/temppath/$(params.source-path-two)", + ReadOnly: true, + }, + }, + Params: []v1beta1.ParamSpec{ + { + Name: "source-path", + Type: v1beta1.ParamTypeString, + }, + { + Name: "source-path-two", + Type: v1beta1.ParamTypeString, + }, + }, + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "foo", + Name: "simple-step", + Command: []string{"/mycmd"}, + Env: []corev1.EnvVar{{ + Name: "foo", + Value: "bar", + }}, + }, + }}, + }, + } // The parameter values will cause the two Workspaces to have duplicate mount path values after the parameters are expanded. - taskRun := tb.TaskRun("test-taskrun-not-started", - tb.TaskRunSelfLink("/test/taskrun1"), - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec(tb.TaskRunTaskRef(simpleTask.Name), - tb.TaskRunWorkspaceEmptyDir("tr-workspace", ""), - tb.TaskRunWorkspaceEmptyDir("tr-workspace-two", ""), - tb.TaskRunParam("source-path", "duplicate"), - tb.TaskRunParam("source-path-two", "duplicate"), - ), - ) + taskRun := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-not-started", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + Workspaces: []v1beta1.WorkspaceBinding{ + { + Name: "tr-workspace", + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + { + Name: "tr-workspace-two", + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }, + Params: []v1beta1.Param{ + { + Name: "source-path", + Value: *v1beta1.NewArrayOrString("duplicate"), + }, + { + Name: "source-path-two", + Value: *v1beta1.NewArrayOrString("duplicate"), + }, + }, + }, + } d := test.Data{ TaskRuns: []*v1beta1.TaskRun{taskRun}, Tasks: []*v1beta1.Task{simpleTask}, @@ -2553,15 +2471,27 @@ func TestExpandMountPath_DuplicatePaths(t *testing.T) { } func TestHandlePodCreationError(t *testing.T) { - taskRun := tb.TaskRun("test-taskrun-pod-creation-failed", tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name), - ), tb.TaskRunStatus( - tb.TaskRunStartTime(time.Now()), - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - }), - )) + taskRun := &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{Name: "test-taskrun-pod-creation-failed"}, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + }, + }, + } d := test.Data{ TaskRuns: []*v1beta1.TaskRun{taskRun}, Tasks: []*v1beta1.Task{simpleTask}, @@ -2628,92 +2558,256 @@ func TestHandlePodCreationError(t *testing.T) { func TestReconcileCloudEvents(t *testing.T) { - taskRunWithNoCEResources := tb.TaskRun("test-taskrun-no-ce-resources", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name, tb.TaskRefAPIVersion("a1")), - )) - taskRunWithTwoCEResourcesNoInit := tb.TaskRun("test-taskrun-two-ce-resources-no-init", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec( - tb.TaskRunTaskRef(twoOutputsTask.Name), - tb.TaskRunResources( - tb.TaskRunResourcesOutput(cloudEventResource.Name, tb.TaskResourceBindingRef(cloudEventResource.Name)), - tb.TaskRunResourcesOutput(anotherCloudEventResource.Name, tb.TaskResourceBindingRef(anotherCloudEventResource.Name)), - ), - ), - ) - taskRunWithTwoCEResourcesInit := tb.TaskRun("test-taskrun-two-ce-resources-init", - tb.TaskRunNamespace("foo"), - tb.TaskRunSpec( - tb.TaskRunTaskRef(twoOutputsTask.Name), - tb.TaskRunResources( - tb.TaskRunResourcesOutput(cloudEventResource.Name, tb.TaskResourceBindingRef(cloudEventResource.Name)), - tb.TaskRunResourcesOutput(anotherCloudEventResource.Name, tb.TaskResourceBindingRef(anotherCloudEventResource.Name)), - ), - ), - tb.TaskRunStatus( - tb.TaskRunCloudEvent(cloudEventTarget1, "", 0, v1beta1.CloudEventConditionUnknown), - tb.TaskRunCloudEvent(cloudEventTarget2, "", 0, v1beta1.CloudEventConditionUnknown), - ), - ) - taskRunWithCESucceded := tb.TaskRun("test-taskrun-ce-succeeded", - tb.TaskRunNamespace("foo"), - tb.TaskRunSelfLink("/task/1234"), - tb.TaskRunSpec( - tb.TaskRunTaskRef(twoOutputsTask.Name), - tb.TaskRunResources( - tb.TaskRunResourcesOutput(cloudEventResource.Name, tb.TaskResourceBindingRef(cloudEventResource.Name)), - tb.TaskRunResourcesOutput(anotherCloudEventResource.Name, tb.TaskResourceBindingRef(anotherCloudEventResource.Name)), - ), - ), - tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionTrue, - }), - tb.TaskRunCloudEvent(cloudEventTarget1, "", 0, v1beta1.CloudEventConditionUnknown), - tb.TaskRunCloudEvent(cloudEventTarget2, "", 0, v1beta1.CloudEventConditionUnknown), - ), - ) - taskRunWithCEFailed := tb.TaskRun("test-taskrun-ce-failed", - tb.TaskRunNamespace("foo"), - tb.TaskRunSelfLink("/task/1234"), - tb.TaskRunSpec( - tb.TaskRunTaskRef(twoOutputsTask.Name), - tb.TaskRunResources( - tb.TaskRunResourcesOutput(cloudEventResource.Name, tb.TaskResourceBindingRef(cloudEventResource.Name)), - tb.TaskRunResourcesOutput(anotherCloudEventResource.Name, tb.TaskResourceBindingRef(anotherCloudEventResource.Name)), - ), - ), - tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionFalse, - }), - tb.TaskRunCloudEvent(cloudEventTarget1, "", 0, v1beta1.CloudEventConditionUnknown), - tb.TaskRunCloudEvent(cloudEventTarget2, "", 0, v1beta1.CloudEventConditionUnknown), - ), - ) - taskRunWithCESuccededOneAttempt := tb.TaskRun("test-taskrun-ce-succeeded-one-attempt", - tb.TaskRunNamespace("foo"), - tb.TaskRunSelfLink("/task/1234"), - tb.TaskRunSpec( - tb.TaskRunTaskRef(twoOutputsTask.Name), - tb.TaskRunResources( - tb.TaskRunResourcesOutput(cloudEventResource.Name, tb.TaskResourceBindingRef(cloudEventResource.Name)), - tb.TaskRunResourcesOutput(anotherCloudEventResource.Name, tb.TaskResourceBindingRef(anotherCloudEventResource.Name)), - ), - ), - tb.TaskRunStatus( - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionTrue, - }), - tb.TaskRunCloudEvent(cloudEventTarget1, "", 1, v1beta1.CloudEventConditionUnknown), - tb.TaskRunCloudEvent(cloudEventTarget2, "fakemessage", 0, v1beta1.CloudEventConditionUnknown), - ), - ) + taskRunWithNoCEResources := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-no-ce-resources", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + APIVersion: "a1", + }, + }, + } + taskRunWithTwoCEResourcesNoInit := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-two-ce-resources-no-init", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: twoOutputsTask.Name, + }, + Resources: &v1beta1.TaskRunResources{ + Outputs: []v1beta1.TaskResourceBinding{ + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: cloudEventResource.Name, + ResourceRef: &resourcev1alpha1.PipelineResourceRef{ + Name: cloudEventResource.Name, + }, + }, + }, + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: anotherCloudEventResource.Name, + ResourceRef: &resourcev1alpha1.PipelineResourceRef{ + Name: anotherCloudEventResource.Name, + }, + }, + }, + }, + }, + }, + } + taskRunWithTwoCEResourcesInit := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-two-ce-resources-init", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: twoOutputsTask.Name, + }, + Resources: &v1beta1.TaskRunResources{ + Outputs: []v1beta1.TaskResourceBinding{ + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: cloudEventResource.Name, + ResourceRef: &resourcev1alpha1.PipelineResourceRef{ + Name: cloudEventResource.Name, + }, + }, + }, + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: anotherCloudEventResource.Name, + ResourceRef: &resourcev1alpha1.PipelineResourceRef{ + Name: anotherCloudEventResource.Name, + }, + }, + }, + }, + }, + }, + Status: v1beta1.TaskRunStatus{ + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + CloudEvents: []v1beta1.CloudEventDelivery{ + { + Target: cloudEventTarget1, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + }, + }, + { + Target: cloudEventTarget2, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + }, + }, + }, + }, + }, + } + taskRunWithCESucceded := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-ce-succeeded", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: twoOutputsTask.Name, + }, + Resources: &v1beta1.TaskRunResources{ + Outputs: []v1beta1.TaskResourceBinding{ + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: cloudEventResource.Name, + ResourceRef: &resourcev1alpha1.PipelineResourceRef{ + Name: cloudEventResource.Name, + }, + }, + }, + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: anotherCloudEventResource.Name, + ResourceRef: &resourcev1alpha1.PipelineResourceRef{ + Name: anotherCloudEventResource.Name, + }, + }, + }, + }, + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionTrue, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + CloudEvents: []v1beta1.CloudEventDelivery{ + { + Target: cloudEventTarget1, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + }, + }, + { + Target: cloudEventTarget2, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + }, + }, + }, + }, + }, + } + taskRunWithCESucceded.ObjectMeta.SelfLink = "/task/1234" + taskRunWithCEFailed := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-ce-failed", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: twoOutputsTask.Name, + }, + Resources: &v1beta1.TaskRunResources{ + Outputs: []v1beta1.TaskResourceBinding{ + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: cloudEventResource.Name, + ResourceRef: &resourcev1alpha1.PipelineResourceRef{ + Name: cloudEventResource.Name, + }, + }, + }, + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: anotherCloudEventResource.Name, + ResourceRef: &resourcev1alpha1.PipelineResourceRef{ + Name: anotherCloudEventResource.Name, + }, + }, + }, + }, + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionFalse, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + CloudEvents: []v1beta1.CloudEventDelivery{ + { + Target: cloudEventTarget1, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + }, + }, + { + Target: cloudEventTarget2, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + }, + }, + }, + }, + }, + } + taskRunWithCEFailed.ObjectMeta.SelfLink = "/task/1234" + taskRunWithCESuccededOneAttempt := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-ce-succeeded-one-attempt", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: twoOutputsTask.Name, + }, + Resources: &v1beta1.TaskRunResources{ + Outputs: []v1beta1.TaskResourceBinding{ + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: cloudEventResource.Name, + ResourceRef: &resourcev1alpha1.PipelineResourceRef{ + Name: cloudEventResource.Name, + }, + }, + }, + { + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: anotherCloudEventResource.Name, + ResourceRef: &resourcev1alpha1.PipelineResourceRef{ + Name: anotherCloudEventResource.Name, + }, + }, + }, + }, + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionTrue, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + CloudEvents: []v1beta1.CloudEventDelivery{ + { + Target: cloudEventTarget1, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + RetryCount: 1, + }, + }, + { + Target: cloudEventTarget2, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + Error: "fakemessage", + }, + }, + }, + }, + }, + } + taskRunWithCESuccededOneAttempt.ObjectMeta.SelfLink = "/task/1234" taskruns := []*v1beta1.TaskRun{ taskRunWithNoCEResources, taskRunWithTwoCEResourcesNoInit, taskRunWithTwoCEResourcesInit, taskRunWithCESucceded, taskRunWithCEFailed, @@ -2737,38 +2831,95 @@ func TestReconcileCloudEvents(t *testing.T) { }, { name: "ce-resources-no-init", taskRun: taskRunWithTwoCEResourcesNoInit, - wantCloudEvents: tb.TaskRun("want", tb.TaskRunStatus( - tb.TaskRunCloudEvent(cloudEventTarget1, "", 0, v1beta1.CloudEventConditionUnknown), - tb.TaskRunCloudEvent(cloudEventTarget2, "", 0, v1beta1.CloudEventConditionUnknown), - )).Status.CloudEvents, + wantCloudEvents: []v1beta1.CloudEventDelivery{ + { + Target: cloudEventTarget1, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + }, + }, + { + Target: cloudEventTarget2, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + }, + }, + }, }, { name: "ce-resources-init", taskRun: taskRunWithTwoCEResourcesInit, - wantCloudEvents: tb.TaskRun("want2", tb.TaskRunStatus( - tb.TaskRunCloudEvent(cloudEventTarget1, "", 0, v1beta1.CloudEventConditionUnknown), - tb.TaskRunCloudEvent(cloudEventTarget2, "", 0, v1beta1.CloudEventConditionUnknown), - )).Status.CloudEvents, + wantCloudEvents: []v1beta1.CloudEventDelivery{ + { + Target: cloudEventTarget1, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + }, + }, + { + Target: cloudEventTarget2, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + }, + }, + }, }, { name: "ce-resources-init-task-successful", taskRun: taskRunWithCESucceded, - wantCloudEvents: tb.TaskRun("want3", tb.TaskRunStatus( - tb.TaskRunCloudEvent(cloudEventTarget1, "", 1, v1beta1.CloudEventConditionSent), - tb.TaskRunCloudEvent(cloudEventTarget2, "", 1, v1beta1.CloudEventConditionSent), - )).Status.CloudEvents, + wantCloudEvents: []v1beta1.CloudEventDelivery{ + { + Target: cloudEventTarget1, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionSent, + RetryCount: 1, + }, + }, + { + Target: cloudEventTarget2, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionSent, + RetryCount: 1, + }, + }, + }, }, { name: "ce-resources-init-task-failed", taskRun: taskRunWithCEFailed, - wantCloudEvents: tb.TaskRun("want4", tb.TaskRunStatus( - tb.TaskRunCloudEvent(cloudEventTarget1, "", 1, v1beta1.CloudEventConditionSent), - tb.TaskRunCloudEvent(cloudEventTarget2, "", 1, v1beta1.CloudEventConditionSent), - )).Status.CloudEvents, + wantCloudEvents: []v1beta1.CloudEventDelivery{ + { + Target: cloudEventTarget1, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionSent, + RetryCount: 1, + }, + }, + { + Target: cloudEventTarget2, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionSent, + RetryCount: 1, + }, + }, + }, }, { name: "ce-resources-init-task-successful-one-attempt", taskRun: taskRunWithCESuccededOneAttempt, - wantCloudEvents: tb.TaskRun("want5", tb.TaskRunStatus( - tb.TaskRunCloudEvent(cloudEventTarget1, "", 1, v1beta1.CloudEventConditionUnknown), - tb.TaskRunCloudEvent(cloudEventTarget2, "fakemessage", 1, v1beta1.CloudEventConditionSent), - )).Status.CloudEvents, + wantCloudEvents: []v1beta1.CloudEventDelivery{ + { + Target: cloudEventTarget1, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionUnknown, + RetryCount: 1, + }, + }, + { + Target: cloudEventTarget2, + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionSent, + RetryCount: 1, + Error: "fakemessage", + }, + }, + }, }} { t.Run(tc.name, func(t *testing.T) { names.TestingSeed() @@ -2811,19 +2962,26 @@ func TestReconcileCloudEvents(t *testing.T) { func TestReconcile_Single_SidecarState(t *testing.T) { runningState := corev1.ContainerStateRunning{StartedAt: metav1.Time{Time: time.Now()}} - taskRun := tb.TaskRun("test-taskrun-sidecars", - tb.TaskRunSpec( - tb.TaskRunTaskRef(taskSidecar.Name), - ), - tb.TaskRunStatus( - tb.SidecarState( - tb.SidecarStateName("sidecar"), - tb.SidecarStateImageID("image-id"), - tb.SidecarStateContainerName("sidecar-sidecar"), - tb.SetSidecarStateRunning(runningState), - ), - ), - ) + taskRun := &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{Name: "test-taskrun-sidecars"}, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: taskSidecar.Name, + }, + }, + Status: v1beta1.TaskRunStatus{ + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + Sidecars: []v1beta1.SidecarState{{ + Name: "sidecar", + ImageID: "image-id", + ContainerName: "sidecar-sidecar", + ContainerState: corev1.ContainerState{ + Running: &runningState, + }, + }}, + }, + }, + } d := test.Data{ TaskRuns: []*v1beta1.TaskRun{taskRun}, @@ -2860,27 +3018,36 @@ func TestReconcile_Single_SidecarState(t *testing.T) { func TestReconcile_Multiple_SidecarStates(t *testing.T) { runningState := corev1.ContainerStateRunning{StartedAt: metav1.Time{Time: time.Now()}} waitingState := corev1.ContainerStateWaiting{Reason: "PodInitializing"} - taskRun := tb.TaskRun("test-taskrun-sidecars", - tb.TaskRunSpec( - tb.TaskRunTaskRef(taskMultipleSidecars.Name), - ), - tb.TaskRunStatus( - tb.SidecarState( - tb.SidecarStateName("sidecar1"), - tb.SidecarStateImageID("image-id"), - tb.SidecarStateContainerName("sidecar-sidecar1"), - tb.SetSidecarStateRunning(runningState), - ), - ), - tb.TaskRunStatus( - tb.SidecarState( - tb.SidecarStateName("sidecar2"), - tb.SidecarStateImageID("image-id"), - tb.SidecarStateContainerName("sidecar-sidecar2"), - tb.SetSidecarStateWaiting(waitingState), - ), - ), - ) + taskRun := &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{Name: "test-taskrun-sidecars"}, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: taskMultipleSidecars.Name, + }, + }, + Status: v1beta1.TaskRunStatus{ + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + Sidecars: []v1beta1.SidecarState{ + { + Name: "sidecar1", + ImageID: "image-id", + ContainerName: "sidecar-sidecar1", + ContainerState: corev1.ContainerState{ + Running: &runningState, + }, + }, + { + Name: "sidecar2", + ImageID: "image-id", + ContainerName: "sidecar-sidecar2", + ContainerState: corev1.ContainerState{ + Waiting: &waitingState, + }, + }, + }, + }, + }, + } d := test.Data{ TaskRuns: []*v1beta1.TaskRun{taskRun}, @@ -2929,13 +3096,25 @@ func TestReconcile_Multiple_SidecarStates(t *testing.T) { // TestReconcileWorkspaceMissing tests a reconcile of a TaskRun that does // not include a Workspace that the Task is expecting. func TestReconcileWorkspaceMissing(t *testing.T) { - taskWithWorkspace := tb.Task("test-task-with-workspace", - tb.TaskSpec( - tb.TaskWorkspace("ws1", "a test task workspace", "", true), - ), tb.TaskNamespace("foo")) - taskRun := tb.TaskRun("test-taskrun-missing-workspace", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(taskWithWorkspace.Name, tb.TaskRefAPIVersion("a1")), - )) + taskWithWorkspace := &v1beta1.Task{ + ObjectMeta: objectMeta("test-task-with-workspace", "foo"), + Spec: v1beta1.TaskSpec{ + Workspaces: []v1beta1.WorkspaceDeclaration{{ + Name: "ws1", + Description: "a test task workspace", + ReadOnly: true, + }}, + }, + } + taskRun := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-missing-workspace", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: taskWithWorkspace.Name, + APIVersion: "a1", + }, + }, + } d := test.Data{ Tasks: []*v1beta1.Task{taskWithWorkspace}, TaskRuns: []*v1beta1.TaskRun{taskRun}, @@ -2966,22 +3145,40 @@ func TestReconcileWorkspaceMissing(t *testing.T) { failedCorrectly = true } } - if !failedCorrectly { - t.Fatalf("Expected TaskRun to fail validation but it did not. Final conditions were:\n%#v", tr.Status.Conditions) + if !failedCorrectly { + t.Fatalf("Expected TaskRun to fail validation but it did not. Final conditions were:\n%#v", tr.Status.Conditions) + } +} + +// TestReconcileValidDefaultWorkspace tests a reconcile of a TaskRun that does +// not include a Workspace that the Task is expecting and it uses the default Workspace instead. +func TestReconcileValidDefaultWorkspace(t *testing.T) { + taskWithWorkspace := &v1beta1.Task{ + ObjectMeta: objectMeta("test-task-with-workspace", "foo"), + Spec: v1beta1.TaskSpec{ + Workspaces: []v1beta1.WorkspaceDeclaration{{ + Name: "ws1", + Description: "a test task workspace", + ReadOnly: true, + }}, + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "foo", + Name: "simple-step", + Command: []string{"/mycmd"}, + }, + }}, + }, + } + taskRun := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-default-workspace", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: taskWithWorkspace.Name, + APIVersion: "a1", + }, + }, } -} - -// TestReconcileValidDefaultWorkspace tests a reconcile of a TaskRun that does -// not include a Workspace that the Task is expecting and it uses the default Workspace instead. -func TestReconcileValidDefaultWorkspace(t *testing.T) { - taskWithWorkspace := tb.Task("test-task-with-workspace", tb.TaskNamespace("foo"), - tb.TaskSpec( - tb.TaskWorkspace("ws1", "a test task workspace", "", true), - tb.Step("foo", tb.StepName("simple-step"), tb.StepCommand("/mycmd")), - )) - taskRun := tb.TaskRun("test-taskrun-default-workspace", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(taskWithWorkspace.Name, tb.TaskRefAPIVersion("a1")), - )) d := test.Data{ Tasks: []*v1beta1.Task{taskWithWorkspace}, TaskRuns: []*v1beta1.TaskRun{taskRun}, @@ -3032,14 +3229,32 @@ func TestReconcileValidDefaultWorkspace(t *testing.T) { // not include a Workspace that the Task is expecting, and gets an error updating // the TaskRun with an invalid default workspace. func TestReconcileInvalidDefaultWorkspace(t *testing.T) { - taskWithWorkspace := tb.Task("test-task-with-workspace", tb.TaskNamespace("foo"), - tb.TaskSpec( - tb.TaskWorkspace("ws1", "a test task workspace", "", true), - tb.Step("foo", tb.StepName("simple-step"), tb.StepCommand("/mycmd")), - )) - taskRun := tb.TaskRun("test-taskrun-default-workspace", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(taskWithWorkspace.Name, tb.TaskRefAPIVersion("a1")), - )) + taskWithWorkspace := &v1beta1.Task{ + ObjectMeta: objectMeta("test-task-with-workspace", "foo"), + Spec: v1beta1.TaskSpec{ + Workspaces: []v1beta1.WorkspaceDeclaration{{ + Name: "ws1", + Description: "a test task workspace", + ReadOnly: true, + }}, + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "foo", + Name: "simple-step", + Command: []string{"/mycmd"}, + }, + }}, + }, + } + taskRun := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-default-workspace", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: taskWithWorkspace.Name, + APIVersion: "a1", + }, + }, + } d := test.Data{ Tasks: []*v1beta1.Task{taskWithWorkspace}, TaskRuns: []*v1beta1.TaskRun{taskRun}, @@ -3174,20 +3389,38 @@ func TestReconcileTaskResourceResolutionAndValidation(t *testing.T) { }{{ desc: "Fail ResolveTaskResources", d: test.Data{ - Tasks: []*v1beta1.Task{ - tb.Task("test-task-missing-resource", - tb.TaskSpec( - tb.TaskResources(tb.TaskResourcesInput("workspace", resourcev1alpha1.PipelineResourceTypeGit)), - ), tb.TaskNamespace("foo")), - }, - TaskRuns: []*v1beta1.TaskRun{ - tb.TaskRun("test-taskrun-missing-resource", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef("test-task-missing-resource", tb.TaskRefAPIVersion("a1")), - tb.TaskRunResources( - tb.TaskRunResourcesInput("workspace", tb.TaskResourceBindingRef("git")), - ), - )), - }, + Tasks: []*v1beta1.Task{{ + ObjectMeta: objectMeta("test-task-missing-resource", "foo"), + Spec: v1beta1.TaskSpec{ + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "workspace", + Type: resourcev1alpha1.PipelineResourceTypeGit, + }, + }}, + }, + }, + }}, + TaskRuns: []*v1beta1.TaskRun{{ + ObjectMeta: objectMeta("test-taskrun-missing-resource", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "test-task-missing-resource", + APIVersion: "a1", + }, + Resources: &v1beta1.TaskRunResources{ + Inputs: []v1beta1.TaskResourceBinding{{ + PipelineResourceBinding: v1beta1.PipelineResourceBinding{ + Name: "workspace", + ResourceRef: &v1beta1.PipelineResourceRef{ + Name: "git", + }, + }, + }}, + }, + }, + }}, ClusterTasks: nil, PipelineResources: nil, }, @@ -3200,17 +3433,28 @@ func TestReconcileTaskResourceResolutionAndValidation(t *testing.T) { }, { desc: "Fail ValidateResolvedTaskResources", d: test.Data{ - Tasks: []*v1beta1.Task{ - tb.Task("test-task-missing-resource", - tb.TaskSpec( - tb.TaskResources(tb.TaskResourcesInput("workspace", resourcev1alpha1.PipelineResourceTypeGit)), - ), tb.TaskNamespace("foo")), - }, - TaskRuns: []*v1beta1.TaskRun{ - tb.TaskRun("test-taskrun-missing-resource", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef("test-task-missing-resource", tb.TaskRefAPIVersion("a1")), - )), - }, + Tasks: []*v1beta1.Task{{ + ObjectMeta: objectMeta("test-task-missing-resource", "foo"), + Spec: v1beta1.TaskSpec{ + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "workspace", + Type: resourcev1alpha1.PipelineResourceTypeGit, + }, + }}, + }, + }, + }}, + TaskRuns: []*v1beta1.TaskRun{{ + ObjectMeta: objectMeta("test-taskrun-missing-resource", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "test-task-missing-resource", + APIVersion: "a1", + }, + }, + }}, ClusterTasks: nil, PipelineResources: nil, }, @@ -3263,21 +3507,49 @@ func TestReconcileTaskResourceResolutionAndValidation(t *testing.T) { // Affinity Assistant is validated and that the validation fails for a TaskRun that is incompatible with // Affinity Assistant; e.g. using more than one PVC-backed workspace. func TestReconcileWithWorkspacesIncompatibleWithAffinityAssistant(t *testing.T) { - taskWithTwoWorkspaces := tb.Task("test-task-two-workspaces", tb.TaskNamespace("foo"), - tb.TaskSpec( - tb.TaskWorkspace("ws1", "task workspace", "", true), - tb.TaskWorkspace("ws2", "another workspace", "", false), - )) - taskRun := tb.TaskRun("taskrun-with-two-workspaces", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(taskWithTwoWorkspaces.Name, tb.TaskRefAPIVersion("a1")), - tb.TaskRunWorkspacePVC("ws1", "", "pvc1"), - tb.TaskRunWorkspaceVolumeClaimTemplate("ws2", "", &corev1.PersistentVolumeClaim{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pvc2", + taskWithTwoWorkspaces := &v1beta1.Task{ + ObjectMeta: objectMeta("test-task-two-workspaces", "foo"), + Spec: v1beta1.TaskSpec{ + Workspaces: []v1beta1.WorkspaceDeclaration{ + { + Name: "ws1", + Description: "task workspace", + ReadOnly: true, + }, + { + Name: "ws2", + Description: "another workspace", + ReadOnly: false, + }, }, - Spec: corev1.PersistentVolumeClaimSpec{}, - }), - )) + }, + } + taskRun := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("taskrun-with-two-workspaces", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: taskWithTwoWorkspaces.Name, + APIVersion: "a1", + }, + Workspaces: []v1beta1.WorkspaceBinding{ + { + Name: "ws1", + PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ + ClaimName: "pvc1", + }, + }, + { + Name: "ws2", + VolumeClaimTemplate: &corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pvc2", + }, + Spec: corev1.PersistentVolumeClaimSpec{}, + }, + }, + }, + }, + } // associate the TaskRun with a dummy Affinity Assistant taskRun.Annotations[workspace.AnnotationAffinityAssistantName] = "dummy-affinity-assistant" @@ -3331,20 +3603,43 @@ func TestReconcileWithWorkspacesIncompatibleWithAffinityAssistant(t *testing.T) func TestReconcileWorkspaceWithVolumeClaimTemplate(t *testing.T) { workspaceName := "ws1" claimName := "mypvc" - taskWithWorkspace := tb.Task("test-task-with-workspace", tb.TaskNamespace("foo"), - tb.TaskSpec( - tb.TaskWorkspace(workspaceName, "a test task workspace", "", true), - tb.Step("foo", tb.StepName("simple-step"), tb.StepCommand("/mycmd")), - )) - taskRun := tb.TaskRun("test-taskrun-missing-workspace", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(taskWithWorkspace.Name, tb.TaskRefAPIVersion("a1")), - tb.TaskRunWorkspaceVolumeClaimTemplate(workspaceName, "", &corev1.PersistentVolumeClaim{ - ObjectMeta: metav1.ObjectMeta{ - Name: claimName, + taskWithWorkspace := &v1beta1.Task{ + ObjectMeta: objectMeta("test-task-with-workspace", "foo"), + Spec: v1beta1.TaskSpec{ + Workspaces: []v1beta1.WorkspaceDeclaration{{ + Name: workspaceName, + Description: "a test task workspace", + ReadOnly: true, + }}, + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "foo", + Name: "simple-step", + Command: []string{"/mycmd"}, + }, + }}, + }, + } + taskRun := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-missing-workspace", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: taskWithWorkspace.Name, + APIVersion: "a1", }, - Spec: corev1.PersistentVolumeClaimSpec{}, - }), - )) + Workspaces: []v1beta1.WorkspaceBinding{ + { + Name: workspaceName, + VolumeClaimTemplate: &corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: claimName, + }, + Spec: corev1.PersistentVolumeClaimSpec{}, + }, + }, + }, + }, + } d := test.Data{ Tasks: []*v1beta1.Task{taskWithWorkspace}, TaskRuns: []*v1beta1.TaskRun{taskRun}, @@ -3394,6 +3689,10 @@ func TestReconcileWorkspaceWithVolumeClaimTemplate(t *testing.T) { } func TestFailTaskRun(t *testing.T) { + runningState := corev1.ContainerStateRunning{StartedAt: metav1.Time{Time: time.Now()}} + terminatedState := corev1.ContainerStateTerminated{StartedAt: metav1.Time{Time: time.Now()}, FinishedAt: metav1.Time{Time: time.Now()}, Reason: "Completed"} + terminatedWithErrorState := corev1.ContainerStateTerminated{StartedAt: metav1.Time{Time: time.Now()}, FinishedAt: metav1.Time{Time: time.Now()}, Reason: "Completed", ExitCode: 12} + waitingState := corev1.ContainerStateWaiting{Reason: "PodInitializing"} testCases := []struct { name string taskRun *v1beta1.TaskRun @@ -3404,13 +3703,25 @@ func TestFailTaskRun(t *testing.T) { expectedStepStates []v1beta1.StepState }{{ name: "no-pod-scheduled", - taskRun: tb.TaskRun("test-taskrun-run-failed", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name), - tb.TaskRunCancelled, - ), tb.TaskRunStatus(tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - }))), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-run-failed", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + Status: v1beta1.TaskRunSpecStatusCancelled, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + }, + }, + }, + }, + }, reason: "some reason", message: "some message", expectedStatus: apis.Condition{ @@ -3421,13 +3732,28 @@ func TestFailTaskRun(t *testing.T) { }, }, { name: "pod-scheduled", - taskRun: tb.TaskRun("test-taskrun-run-failed", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name), - tb.TaskRunCancelled, - ), tb.TaskRunStatus(tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - }), tb.PodName("foo-is-bar"))), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-run-failed", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + Status: v1beta1.TaskRunSpecStatusCancelled, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + PodName: "foo-is-bar", + }, + }, + }, pod: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{ Namespace: "foo", Name: "foo-is-bar", @@ -3442,15 +3768,33 @@ func TestFailTaskRun(t *testing.T) { }, }, { name: "step-status-update-cancel", - taskRun: tb.TaskRun("test-taskrun-run-cancel", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name), - tb.TaskRunCancelled, - ), tb.TaskRunStatus(tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - }), tb.StepState( - tb.SetStepStateRunning(corev1.ContainerStateRunning{StartedAt: metav1.Time{Time: time.Now()}}), - ), tb.PodName("foo-is-bar"))), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-run-cancel", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + Status: v1beta1.TaskRunSpecStatusCancelled, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + PodName: "foo-is-bar", + Steps: []v1beta1.StepState{{ + ContainerState: corev1.ContainerState{ + Running: &runningState, + }, + }}, + }, + }, + }, pod: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{ Namespace: "foo", Name: "foo-is-bar", @@ -3475,15 +3819,33 @@ func TestFailTaskRun(t *testing.T) { }, }, { name: "step-status-update-timeout", - taskRun: tb.TaskRun("test-taskrun-run-timeout", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(simpleTask.Name), - tb.TaskRunTimeout(time.Duration(10*time.Second)), - ), tb.TaskRunStatus(tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - }), tb.StepState( - tb.SetStepStateRunning(corev1.ContainerStateRunning{StartedAt: metav1.Time{Time: time.Now()}}), - ), tb.PodName("foo-is-bar"))), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-run-timeout", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTask.Name, + }, + Timeout: &metav1.Duration{Duration: 10 * time.Second}, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + PodName: "foo-is-bar", + Steps: []v1beta1.StepState{{ + ContainerState: corev1.ContainerState{ + Running: &runningState, + }, + }}, + }, + }, + }, pod: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{ Namespace: "foo", Name: "foo-is-bar", @@ -3508,20 +3870,45 @@ func TestFailTaskRun(t *testing.T) { }, }, { name: "step-status-update-multiple-steps", - taskRun: tb.TaskRun("test-taskrun-run-timeout-multiple-steps", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(taskMultipleSteps.Name), - tb.TaskRunTimeout(time.Duration(10*time.Second)), - ), tb.TaskRunStatus(tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - }), tb.StepState( - tb.SetStepStateTerminated(corev1.ContainerStateTerminated{StartedAt: metav1.Time{Time: time.Now()}, FinishedAt: metav1.Time{Time: time.Now()}, Reason: "Completed"}), - ), tb.StepState( - tb.SetStepStateRunning(corev1.ContainerStateRunning{StartedAt: metav1.Time{Time: time.Now()}}), - ), tb.StepState( - tb.SetStepStateRunning(corev1.ContainerStateRunning{StartedAt: metav1.Time{Time: time.Now()}}), - ), - tb.PodName("foo-is-bar"))), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-run-timeout-multiple-steps", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: taskMultipleSteps.Name, + }, + Timeout: &metav1.Duration{Duration: 10 * time.Second}, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + PodName: "foo-is-bar", + Steps: []v1beta1.StepState{ + { + ContainerState: corev1.ContainerState{ + Terminated: &terminatedState, + }, + }, + { + ContainerState: corev1.ContainerState{ + Running: &runningState, + }, + }, + { + ContainerState: corev1.ContainerState{ + Running: &runningState, + }, + }, + }, + }, + }, + }, pod: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{ Namespace: "foo", Name: "foo-is-bar", @@ -3562,20 +3949,45 @@ func TestFailTaskRun(t *testing.T) { }, }, { name: "step-status-update-multiple-steps-waiting-state", - taskRun: tb.TaskRun("test-taskrun-run-timeout-multiple-steps-waiting", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(taskMultipleSteps.Name), - tb.TaskRunTimeout(time.Duration(10*time.Second)), - ), tb.TaskRunStatus(tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionUnknown, - }), tb.StepState( - tb.SetStepStateWaiting(corev1.ContainerStateWaiting{Reason: "PodInitializing"}), - ), tb.StepState( - tb.SetStepStateWaiting(corev1.ContainerStateWaiting{Reason: "PodInitializing"}), - ), tb.StepState( - tb.SetStepStateWaiting(corev1.ContainerStateWaiting{Reason: "PodInitializing"}), - ), - tb.PodName("foo-is-bar"))), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-run-timeout-multiple-steps-waiting", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: taskMultipleSteps.Name, + }, + Timeout: &metav1.Duration{Duration: 10 * time.Second}, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionUnknown, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + PodName: "foo-is-bar", + Steps: []v1beta1.StepState{ + { + ContainerState: corev1.ContainerState{ + Waiting: &waitingState, + }, + }, + { + ContainerState: corev1.ContainerState{ + Waiting: &waitingState, + }, + }, + { + ContainerState: corev1.ContainerState{ + Waiting: &waitingState, + }, + }, + }, + }, + }, + }, pod: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{ Namespace: "foo", Name: "foo-is-bar", @@ -3616,22 +4028,39 @@ func TestFailTaskRun(t *testing.T) { }, }, { name: "step-status-update-with-multiple-steps-and-some-continue-on-error", - taskRun: tb.TaskRun("test-taskrun-run-ignore-step-error", tb.TaskRunNamespace("foo"), tb.TaskRunSpec( - tb.TaskRunTaskRef(taskMultipleStepsIgnoreError.Name), - ), tb.TaskRunStatus(tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionTrue, - }), tb.StepState( - tb.SetStepStateTerminated(corev1.ContainerStateTerminated{ - StartedAt: metav1.Time{Time: time.Now()}, - FinishedAt: metav1.Time{Time: time.Now()}, - Reason: "Completed", - ExitCode: 12, - }), - ), tb.StepState( - tb.SetStepStateRunning(corev1.ContainerStateRunning{StartedAt: metav1.Time{Time: time.Now()}}), - ), - tb.PodName("foo-is-bar"))), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun-run-ignore-step-error", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: taskMultipleStepsIgnoreError.Name, + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{ + apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionTrue, + }, + }, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + PodName: "foo-is-bar", + Steps: []v1beta1.StepState{ + { + ContainerState: corev1.ContainerState{ + Terminated: &terminatedWithErrorState, + }, + }, + { + ContainerState: corev1.ContainerState{ + Running: &runningState, + }, + }, + }, + }, + }, + }, pod: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{ Namespace: "foo", Name: "foo-is-bar", @@ -3712,10 +4141,21 @@ func TestFailTaskRun(t *testing.T) { func Test_storeTaskSpec(t *testing.T) { ctx, _ := ttesting.SetupFakeContext(t) - tr := tb.TaskRun("foo", tb.TaskRunSpec(tb.TaskRunTaskRef("foo-task"))) + tr := &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "foo-task", + }, + }, + } - ts := tb.Task("some-task", tb.TaskSpec(tb.TaskDescription("foo-task"))).Spec - ts1 := tb.Task("some-task", tb.TaskSpec(tb.TaskDescription("foo-task"))).Spec + ts := v1beta1.TaskSpec{ + Description: "foo-task", + } + ts1 := v1beta1.TaskSpec{ + Description: "foo-task", + } want := ts.DeepCopy() // The first time we set it, it should get copied. @@ -3802,13 +4242,21 @@ func TestWillOverwritePodAffinity(t *testing.T) { func TestPodAdoption(t *testing.T) { - tr := tb.TaskRun("test-taskrun", - tb.TaskRunNamespace("foo"), - tb.TaskRunLabel("mylabel", "myvalue"), - tb.TaskRunSpec(tb.TaskRunTaskSpec( - tb.Step("myimage", tb.StepName("mycontainer"), tb.StepCommand("/mycmd")), - )), - ) + tr := &v1beta1.TaskRun{ + ObjectMeta: objectMeta("test-taskrun", "foo"), + Spec: v1beta1.TaskRunSpec{ + TaskSpec: &v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "myimage", + Name: "mycontainer", + Command: []string{"/mycmd"}, + }, + }}, + }, + }, + } + tr.ObjectMeta.Labels = map[string]string{"mylabel": "myvalue"} d := test.Data{ TaskRuns: []*v1beta1.TaskRun{tr}, @@ -3889,27 +4337,53 @@ func TestDisableResolutionFlag_PreventsResolution(t *testing.T) { tr *v1beta1.TaskRun }{{ description: "inline taskspec is not resolved", - tr: tb.TaskRun("test-taskrun", - tb.TaskRunNamespace("foo"), - tb.TaskRunLabel("mylabel", "myvalue"), - tb.TaskRunSpec(tb.TaskRunTaskSpec( - tb.Step("myimage", tb.StepName("mycontainer"), tb.StepCommand("/mycmd")), - )), - ), + tr: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-taskrun", + Namespace: "foo", + Labels: map[string]string{"mylabel": "myvalue"}, + }, + Spec: v1beta1.TaskRunSpec{ + TaskSpec: &v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "myimage", + Name: "mycontainer", + Command: []string{"/mycmd"}, + }, + }}, + }, + }, + }, }, { description: "taskref is not resolved", - tr: tb.TaskRun("test-taskrun", - tb.TaskRunNamespace("foo"), - tb.TaskRunLabel("mylabel", "myvalue"), - tb.TaskRunSpec(tb.TaskRunTaskRef("foo")), - ), + tr: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-taskrun", + Namespace: "foo", + Labels: map[string]string{"mylabel": "myvalue"}, + }, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "foo", + }, + }, + }, }, { description: "bundle is not resolved", - tr: tb.TaskRun("test-taskrun", - tb.TaskRunNamespace("foo"), - tb.TaskRunLabel("mylabel", "myvalue"), - tb.TaskRunSpec(tb.TaskRunTaskRef(simpleTypedTask.Name, tb.TaskRefBundle("foobar.bundle.url"))), - ), + tr: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-taskrun", + Namespace: "foo", + Labels: map[string]string{"mylabel": "myvalue"}, + }, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: simpleTypedTask.Name, + Bundle: "foobar.bundle.url", + }, + }, + }, }} { tr := tc.tr @@ -3951,13 +4425,24 @@ func TestDisableResolutionFlag_PreventsResolution(t *testing.T) { } func TestDisableResolutionFlag_ProceedsWithStatusTaskSpec(t *testing.T) { - tr := tb.TaskRun("test-taskrun", - tb.TaskRunNamespace("foo"), - tb.TaskRunLabel("mylabel", "myvalue"), - tb.TaskRunSpec(tb.TaskRunTaskSpec( - tb.Step("myimage", tb.StepName("mycontainer"), tb.StepCommand("/mycmd")), - )), - ) + tr := &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-taskrun", + Namespace: "foo", + Labels: map[string]string{"mylabel": "myvalue"}, + }, + Spec: v1beta1.TaskRunSpec{ + TaskSpec: &v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "myimage", + Name: "mycontainer", + Command: []string{"/mycmd"}, + }, + }}, + }, + }, + } tr.Status.TaskSpec = tr.Spec.TaskSpec @@ -3992,3 +4477,177 @@ func TestDisableResolutionFlag_ProceedsWithStatusTaskSpec(t *testing.T) { t.Fatal("Expected pod to have been created") } } + +func podVolumeMounts(idx int) []corev1.VolumeMount { + var mnts []corev1.VolumeMount + mnts = append(mnts, corev1.VolumeMount{ + Name: "tekton-internal-bin", + MountPath: "/tekton/bin", + ReadOnly: true, + }) + mnts = append(mnts, corev1.VolumeMount{ + Name: "tekton-internal-run", + MountPath: "/tekton/run", + }) + if idx == 0 { + mnts = append(mnts, corev1.VolumeMount{ + Name: "tekton-internal-downward", + MountPath: "/tekton/downward", + ReadOnly: true, + }) + } + mnts = append(mnts, corev1.VolumeMount{ + Name: fmt.Sprintf("tekton-creds-init-home-%d", idx), + MountPath: "/tekton/creds", + }) + mnts = append(mnts, corev1.VolumeMount{ + Name: "tekton-internal-workspace", + MountPath: workspaceDir, + }) + mnts = append(mnts, corev1.VolumeMount{ + Name: "tekton-internal-home", + MountPath: "/tekton/home", + }) + mnts = append(mnts, corev1.VolumeMount{ + Name: "tekton-internal-results", + MountPath: "/tekton/results", + }) + mnts = append(mnts, corev1.VolumeMount{ + Name: "tekton-internal-steps", + MountPath: "/tekton/steps", + }) + + return mnts +} + +func podArgs(stepName string, cmd string, additionalArgs []string, idx int) []string { + args := []string{ + "-wait_file", + } + if idx == 0 { + args = append(args, "/tekton/downward/ready", "-wait_file_content") + } else { + args = append(args, fmt.Sprintf("/tekton/run/%d", idx-1)) + } + args = append(args, + "-post_file", + fmt.Sprintf("/tekton/run/%d", idx), + "-termination_path", + "/tekton/termination", + "-step_metadata_dir", + fmt.Sprintf("/tekton/steps/step-%s", stepName), + "-step_metadata_dir_link", + fmt.Sprintf("/tekton/steps/%d", idx), + "-entrypoint", + cmd, + "--", + ) + + args = append(args, additionalArgs...) + + return args +} + +func podObjectMeta(name, taskName, taskRunName, ns string, isClusterTask bool) metav1.ObjectMeta { + trueB := true + om := metav1.ObjectMeta{ + Name: name, + Namespace: ns, + Annotations: map[string]string{ + podconvert.ReleaseAnnotation: fakeVersion, + }, + Labels: map[string]string{ + pipeline.TaskRunLabelKey: taskRunName, + "app.kubernetes.io/managed-by": "tekton-pipelines", + }, + OwnerReferences: []metav1.OwnerReference{{ + Kind: "TaskRun", + Name: taskRunName, + Controller: &trueB, + BlockOwnerDeletion: &trueB, + APIVersion: currentAPIVersion, + }}, + } + + if taskName != "" { + if isClusterTask { + om.Labels[pipeline.ClusterTaskLabelKey] = taskName + } else { + om.Labels[pipeline.TaskLabelKey] = taskName + } + } + + return om +} + +type stepForExpectedPod struct { + name string + image string + cmd string + args []string + envVars map[string]string + volumes []corev1.Volume + workingDir string +} + +func expectedPod(podName, taskName, taskRunName, ns, saName string, isClusterTask bool, extraVolumes []corev1.Volume, steps []stepForExpectedPod) *corev1.Pod { + p := &corev1.Pod{ + ObjectMeta: podObjectMeta(podName, taskName, taskRunName, ns, isClusterTask), + Spec: corev1.PodSpec{ + Volumes: []corev1.Volume{ + workspaceVolume, + homeVolume, + resultsVolume, + stepsVolume, + binVolume, + runVolume, + downwardVolume, + }, + InitContainers: []corev1.Container{placeToolsInitContainer}, + RestartPolicy: corev1.RestartPolicyNever, + ActiveDeadlineSeconds: &defaultActiveDeadlineSeconds, + ServiceAccountName: saName, + }, + } + + for idx, s := range steps { + p.Spec.Volumes = append(p.Spec.Volumes, corev1.Volume{ + Name: fmt.Sprintf("tekton-creds-init-home-%d", idx), + VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: corev1.StorageMediumMemory}}, + }) + stepContainer := corev1.Container{ + Image: s.image, + Name: fmt.Sprintf("step-%s", s.name), + Command: []string{entrypointLocation}, + VolumeMounts: podVolumeMounts(idx), + TerminationMessagePath: "/tekton/termination", + } + stepContainer.Args = podArgs(s.name, s.cmd, s.args, idx) + + for k, v := range s.envVars { + stepContainer.Env = append(stepContainer.Env, corev1.EnvVar{ + Name: k, + Value: v, + }) + } + + if s.workingDir != "" { + stepContainer.WorkingDir = s.workingDir + } + + p.Spec.Containers = append(p.Spec.Containers, stepContainer) + } + + p.Spec.Volumes = append(p.Spec.Volumes, extraVolumes...) + + return p +} + +func objectMeta(name, ns string) metav1.ObjectMeta { + return metav1.ObjectMeta{ + Name: name, + Namespace: ns, + Labels: map[string]string{}, + Annotations: map[string]string{}, + } +} diff --git a/pkg/reconciler/taskrun/validate_resources_test.go b/pkg/reconciler/taskrun/validate_resources_test.go index 251b347172a..4818b3f25da 100644 --- a/pkg/reconciler/taskrun/validate_resources_test.go +++ b/pkg/reconciler/taskrun/validate_resources_test.go @@ -20,7 +20,10 @@ import ( "context" "testing" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" + "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/tektoncd/pipeline/pkg/apis/config" resourcev1alpha1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" @@ -30,32 +33,90 @@ import ( func TestValidateResolvedTaskResources_ValidResources(t *testing.T) { ctx := context.Background() - task := tb.Task("foo", tb.TaskSpec( - tb.Step("myimage", tb.StepCommand("mycmd")), - tb.TaskResources( - tb.TaskResourcesInput("resource-to-build", resourcev1alpha1.PipelineResourceTypeGit), - tb.TaskResourcesInput("optional-resource-to-build", resourcev1alpha1.PipelineResourceTypeGit, tb.ResourceOptional(true)), - tb.TaskResourcesOutput("resource-to-provide", resourcev1alpha1.PipelineResourceTypeImage), - tb.TaskResourcesOutput("optional-resource-to-provide", resourcev1alpha1.PipelineResourceTypeImage, tb.ResourceOptional(true)), - ), - )) + task := &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + }, + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "myimage", + Command: []string{"mycmd"}, + }, + }}, + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{ + { + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "resource-to-build", + Type: resourcev1alpha1.PipelineResourceTypeGit, + Optional: false, + }, + }, + { + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "optional-resource-to-build", + Type: resourcev1alpha1.PipelineResourceTypeGit, + Optional: true, + }, + }, + }, + Outputs: []v1beta1.TaskResource{ + { + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "resource-to-provide", + Type: resourcev1alpha1.PipelineResourceTypeImage, + Optional: false, + }, + }, + { + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "optional-resource-to-provide", + Type: resourcev1alpha1.PipelineResourceTypeImage, + Optional: true, + }, + }, + }, + }, + }, + } rtr := &resources.ResolvedTaskResources{ TaskSpec: &task.Spec, Inputs: map[string]*resourcev1alpha1.PipelineResource{ - "resource-to-build": tb.PipelineResource("example-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("foo", "bar"), - )), - "optional-resource-to-build": tb.PipelineResource("example-resource", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("foo", "bar"), - )), + "resource-to-build": { + ObjectMeta: metav1.ObjectMeta{Name: "example-resource"}, + Spec: v1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []v1beta1.ResourceParam{{ + Name: "foo", + Value: "bar", + }}, + }, + }, + "optional-resource-to-build": { + ObjectMeta: metav1.ObjectMeta{Name: "example-resource"}, + Spec: v1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []v1beta1.ResourceParam{{ + Name: "foo", + Value: "bar", + }}, + }, + }, }, Outputs: map[string]*resourcev1alpha1.PipelineResource{ - "resource-to-provide": tb.PipelineResource("example-image", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeImage)), - "optional-resource-to-provide": tb.PipelineResource("example-image", - tb.PipelineResourceSpec(resourcev1alpha1.PipelineResourceTypeImage)), + "resource-to-provide": { + ObjectMeta: metav1.ObjectMeta{Name: "example-image"}, + Spec: v1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeImage, + }, + }, + "optional-resource-to-provide": { + ObjectMeta: metav1.ObjectMeta{Name: "example-image"}, + Spec: v1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeImage, + }, + }, }, } if err := taskrun.ValidateResolvedTaskResources(ctx, []v1beta1.Param{}, rtr); err != nil { @@ -65,11 +126,27 @@ func TestValidateResolvedTaskResources_ValidResources(t *testing.T) { func TestValidateResolvedTaskResources_ValidParams(t *testing.T) { ctx := context.Background() - task := tb.Task("foo", tb.TaskSpec( - tb.Step("myimage", tb.StepCommand("mycmd")), - tb.TaskParam("foo", v1beta1.ParamTypeString), - tb.TaskParam("bar", v1beta1.ParamTypeString), - )) + task := &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "myimage", + Command: []string{"mycmd"}, + }, + }}, + Params: []v1beta1.ParamSpec{ + { + Name: "foo", + Type: v1beta1.ParamTypeString, + }, + { + Name: "bar", + Type: v1beta1.ParamTypeString, + }, + }, + }, + } rtr := &resources.ResolvedTaskResources{ TaskSpec: &task.Spec, } @@ -98,10 +175,23 @@ func TestValidateResolvedTaskResources_ValidParams(t *testing.T) { func TestValidateResolvedTaskResources_InvalidParams(t *testing.T) { ctx := context.Background() - task := tb.Task("foo", tb.TaskSpec( - tb.Step("myimage", tb.StepCommand("mycmd")), - tb.TaskParam("foo", v1beta1.ParamTypeString), - )) + task := &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: v1beta1.TaskSpec{ + Steps: []v1beta1.Step{{ + Container: corev1.Container{ + Image: "myimage", + Command: []string{"mycmd"}, + }, + }}, + Params: []v1beta1.ParamSpec{ + { + Name: "foo", + Type: v1beta1.ParamTypeString, + }, + }, + }, + } tcs := []struct { name string rtr *resources.ResolvedTaskResources @@ -127,41 +217,117 @@ func TestValidateResolvedTaskResources_InvalidParams(t *testing.T) { func TestValidateResolvedTaskResources_InvalidResources(t *testing.T) { ctx := context.Background() - r := tb.PipelineResource("git-test-resource", tb.PipelineResourceSpec( - resourcev1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("foo", "bar"), - )) - testinput := tb.Task("foo", tb.TaskSpec( - tb.TaskResources(tb.TaskResourcesInput("testinput", resourcev1alpha1.PipelineResourceTypeGit)), - // tb.TaskResources(tb.TaskResourcesInput()), - )) - testimageinput := tb.Task("foo", tb.TaskSpec( - tb.TaskResources(tb.TaskResourcesInput("testimageinput", resourcev1alpha1.PipelineResourceTypeImage)), - )) - testrequiredgitinput := tb.Task("foo", tb.TaskSpec( - tb.TaskResources(tb.TaskResourcesInput("requiredgitinput", resourcev1alpha1.PipelineResourceTypeGit, - tb.ResourceOptional(false))), - )) - testoutput := tb.Task("foo", tb.TaskSpec( - tb.TaskResources(tb.TaskResourcesOutput("testoutput", resourcev1alpha1.PipelineResourceTypeGit)), - )) - testimageoutput := tb.Task("foo", tb.TaskSpec( - tb.TaskResources(tb.TaskResourcesOutput("testimageoutput", resourcev1alpha1.PipelineResourceTypeImage)), - )) - testrequiredgitoutput := tb.Task("foo", tb.TaskSpec( - tb.TaskResources(tb.TaskResourcesOutput( - "requiredgitoutput", resourcev1alpha1.PipelineResourceTypeGit, - tb.ResourceOptional(false)), - ), - )) - testrequiredinputandoutput := tb.Task("foo", tb.TaskSpec( - tb.TaskResources( - tb.TaskResourcesInput("requiredimageinput", resourcev1alpha1.PipelineResourceTypeImage, - tb.ResourceOptional(false)), - tb.TaskResourcesOutput("requiredimageoutput", resourcev1alpha1.PipelineResourceTypeImage, - tb.ResourceOptional(false)), - ), - )) + r := &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{Name: "git-test-resource"}, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: resourcev1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{{ + Name: "foo", + Value: "bar", + }}, + }, + } + testinput := &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: v1beta1.TaskSpec{ + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "testinput", + Type: resourcev1alpha1.PipelineResourceTypeGit, + }, + }}, + }, + }, + } + testimageinput := &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: v1beta1.TaskSpec{ + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "testimageinput", + Type: resourcev1alpha1.PipelineResourceTypeImage, + }, + }}, + }, + }, + } + testrequiredgitinput := &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: v1beta1.TaskSpec{ + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "requiredgitinput", + Type: resourcev1alpha1.PipelineResourceTypeGit, + Optional: false, + }, + }}, + }, + }, + } + testoutput := &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: v1beta1.TaskSpec{ + Resources: &v1beta1.TaskResources{ + Outputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "testoutput", + Type: resourcev1alpha1.PipelineResourceTypeGit, + }, + }}, + }, + }, + } + testimageoutput := &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: v1beta1.TaskSpec{ + Resources: &v1beta1.TaskResources{ + Outputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "testimageoutput", + Type: resourcev1alpha1.PipelineResourceTypeImage, + }, + }}, + }, + }, + } + testrequiredgitoutput := &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: v1beta1.TaskSpec{ + Resources: &v1beta1.TaskResources{ + Outputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "requiredgitoutput", + Type: resourcev1alpha1.PipelineResourceTypeGit, + Optional: false, + }, + }}, + }, + }, + } + testrequiredinputandoutput := &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: v1beta1.TaskSpec{ + Resources: &v1beta1.TaskResources{ + Inputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "requiredimageinput", + Type: resourcev1alpha1.PipelineResourceTypeImage, + Optional: false, + }, + }}, + Outputs: []v1beta1.TaskResource{{ + ResourceDeclaration: v1beta1.ResourceDeclaration{ + Name: "requiredimageoutput", + Type: resourcev1alpha1.PipelineResourceTypeImage, + Optional: false, + }, + }}, + }, + }, + } tcs := []struct { name string rtr *resources.ResolvedTaskResources diff --git a/pkg/remote/oci/resolver_test.go b/pkg/remote/oci/resolver_test.go index 2749948050d..120775a9c75 100644 --- a/pkg/remote/oci/resolver_test.go +++ b/pkg/remote/oci/resolver_test.go @@ -27,7 +27,6 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/registry" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" "github.com/tektoncd/pipeline/pkg/remote" "github.com/tektoncd/pipeline/pkg/remote/oci" @@ -71,7 +70,15 @@ func TestOCIResolver(t *testing.T) { { name: "single-task", objs: []runtime.Object{ - tb.Task("simple-task", tb.TaskType), + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "simple-task", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, }, mapper: test.DefaultObjectAnnotationMapper, listExpected: []remote.ResolvedObject{{Kind: "task", APIVersion: "v1beta1", Name: "simple-task"}}, @@ -79,7 +86,15 @@ func TestOCIResolver(t *testing.T) { { name: "cluster-task", objs: []runtime.Object{ - tb.ClusterTask("simple-task", tb.ClusterTaskType), + &v1beta1.ClusterTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "simple-task", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "ClusterTask", + }, + }, }, mapper: test.DefaultObjectAnnotationMapper, listExpected: []remote.ResolvedObject{{Kind: "clustertask", APIVersion: "v1beta1", Name: "simple-task"}}, @@ -87,8 +102,24 @@ func TestOCIResolver(t *testing.T) { { name: "multiple-tasks", objs: []runtime.Object{ - tb.Task("first-task", tb.TaskType), - tb.Task("second-task", tb.TaskType), + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "first-task", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "second-task", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, }, mapper: test.DefaultObjectAnnotationMapper, listExpected: []remote.ResolvedObject{ @@ -99,17 +130,105 @@ func TestOCIResolver(t *testing.T) { { name: "too-many-objects", objs: []runtime.Object{ - tb.Task("first-task", tb.TaskType), - tb.Task("second-task", tb.TaskType), - tb.Task("third-task", tb.TaskType), - tb.Task("fourth-task", tb.TaskType), - tb.Task("fifth-task", tb.TaskType), - tb.Task("sixth-task", tb.TaskType), - tb.Task("seventh-task", tb.TaskType), - tb.Task("eighth-task", tb.TaskType), - tb.Task("ninth-task", tb.TaskType), - tb.Task("tenth-task", tb.TaskType), - tb.Task("eleventh-task", tb.TaskType), + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "first-task", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "second-task", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "third-task", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "fourth-task", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "fifth-task", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "sixth-task", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "seventh-task", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "eighth-task", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ninth-task", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "tenth-task", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, + &v1beta1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "eleventh-task", + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: "tekton.dev/v1beta1", + Kind: "Task", + }, + }, }, mapper: test.DefaultObjectAnnotationMapper, listExpected: []remote.ResolvedObject{}, diff --git a/pkg/taskrunmetrics/metrics_test.go b/pkg/taskrunmetrics/metrics_test.go index 6ea6080d8e4..143846223a4 100644 --- a/pkg/taskrunmetrics/metrics_test.go +++ b/pkg/taskrunmetrics/metrics_test.go @@ -23,7 +23,6 @@ import ( "testing" "time" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/config" "github.com/tektoncd/pipeline/pkg/apis/pipeline" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" @@ -416,27 +415,40 @@ func TestRecordCloudEvents(t *testing.T) { expectedCount float64 }{{ name: "for succeeded task", - taskRun: tb.TaskRun("taskrun-1", - tb.TaskRunNamespace("ns"), - tb.TaskRunLabel(pipeline.PipelineLabelKey, "pipeline-1"), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, "pipelinerun-1"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("task-1"), - ), - tb.TaskRunStatus( - tb.TaskRunStartTime(time.Now()), - tb.TaskRunCompletionTime(time.Now().Add(1*time.Minute)), - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionTrue, - }), - tb.TaskRunCloudEvent( - "http://event_target", - "", - 1, - v1beta1.CloudEventConditionSent, - ), - )), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "taskrun-1", + Namespace: "ns", + Labels: map[string]string{ + pipeline.PipelineLabelKey: "pipeline-1", + pipeline.PipelineRunLabelKey: "pipelinerun-1", + }, + }, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "task-1", + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionTrue, + }}, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + CompletionTime: &metav1.Time{Time: time.Now().Add(1 * time.Minute)}, + CloudEvents: []v1beta1.CloudEventDelivery{{ + Target: "http://event_target", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionSent, + RetryCount: 1, + }, + }}, + }, + }, + }, expectedTags: map[string]string{ "pipeline": "pipeline-1", "pipelinerun": "pipelinerun-1", @@ -448,27 +460,40 @@ func TestRecordCloudEvents(t *testing.T) { expectedCount: 2, }, { name: "for failed task", - taskRun: tb.TaskRun("taskrun-1", - tb.TaskRunNamespace("ns"), - tb.TaskRunLabel(pipeline.PipelineLabelKey, "pipeline-1"), - tb.TaskRunLabel(pipeline.PipelineRunLabelKey, "pipelinerun-1"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("task-1"), - ), - tb.TaskRunStatus( - tb.TaskRunStartTime(time.Now()), - tb.TaskRunCompletionTime(time.Now().Add(1*time.Minute)), - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionFalse, - }), - tb.TaskRunCloudEvent( - "http://event_target", - "", - 2, - v1beta1.CloudEventConditionFailed, - ), - )), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "taskrun-1", + Namespace: "ns", + Labels: map[string]string{ + pipeline.PipelineLabelKey: "pipeline-1", + pipeline.PipelineRunLabelKey: "pipelinerun-1", + }, + }, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "task-1", + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionFalse, + }}, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + CompletionTime: &metav1.Time{Time: time.Now().Add(1 * time.Minute)}, + CloudEvents: []v1beta1.CloudEventDelivery{{ + Target: "http://event_target", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionFailed, + RetryCount: 2, + }, + }}, + }, + }, + }, expectedTags: map[string]string{ "pipeline": "pipeline-1", "pipelinerun": "pipelinerun-1", @@ -480,25 +505,36 @@ func TestRecordCloudEvents(t *testing.T) { expectedCount: 3, }, { name: "for task not part of pipeline", - taskRun: tb.TaskRun("taskrun-1", - tb.TaskRunNamespace("ns"), - tb.TaskRunSpec( - tb.TaskRunTaskRef("task-1"), - ), - tb.TaskRunStatus( - tb.TaskRunStartTime(time.Now()), - tb.TaskRunCompletionTime(time.Now().Add(1*time.Minute)), - tb.StatusCondition(apis.Condition{ - Type: apis.ConditionSucceeded, - Status: corev1.ConditionTrue, - }), - tb.TaskRunCloudEvent( - "http://event_target", - "", - 1, - v1beta1.CloudEventConditionSent, - ), - )), + taskRun: &v1beta1.TaskRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "taskrun-1", + Namespace: "ns", + }, + Spec: v1beta1.TaskRunSpec{ + TaskRef: &v1beta1.TaskRef{ + Name: "task-1", + }, + }, + Status: v1beta1.TaskRunStatus{ + Status: duckv1beta1.Status{ + Conditions: duckv1beta1.Conditions{apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionTrue, + }}, + }, + TaskRunStatusFields: v1beta1.TaskRunStatusFields{ + StartTime: &metav1.Time{Time: time.Now()}, + CompletionTime: &metav1.Time{Time: time.Now().Add(1 * time.Minute)}, + CloudEvents: []v1beta1.CloudEventDelivery{{ + Target: "http://event_target", + Status: v1beta1.CloudEventDeliveryState{ + Condition: v1beta1.CloudEventConditionSent, + RetryCount: 1, + }, + }}, + }, + }, + }, expectedTags: map[string]string{ "task": "task-1", "taskrun": "taskrun-1", diff --git a/test/artifact_bucket_test.go b/test/artifact_bucket_test.go index a55aae0f589..4e9802617bd 100644 --- a/test/artifact_bucket_test.go +++ b/test/artifact_bucket_test.go @@ -26,7 +26,6 @@ import ( "testing" "time" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/config" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" @@ -142,12 +141,24 @@ func TestStorageBucketPipelineRun(t *testing.T) { defer resetConfigMap(ctx, t, c, systemNamespace, config.GetArtifactBucketConfigName(), originalConfigMapData) t.Logf("Creating Git PipelineResource %s", helloworldResourceName) - helloworldResource := tb.PipelineResource(helloworldResourceName, tb.PipelineResourceSpec( - v1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("Url", "https://github.com/pivotal-nader-ziada/gohelloworld"), - tb.PipelineResourceSpecParam("Revision", "master"), - ), - ) + helloworldResource := &resourcev1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: helloworldResourceName, + }, + Spec: resourcev1alpha1.PipelineResourceSpec{ + Type: v1alpha1.PipelineResourceTypeGit, + Params: []resourcev1alpha1.ResourceParam{ + { + Name: "Url", + Value: "https://github.com/pivotal-nader-ziada/gohelloworld", + }, + { + Name: "Revision", + Value: "master", + }, + }, + }, + } if _, err := c.PipelineResourceClient.Create(ctx, helloworldResource, metav1.CreateOptions{}); err != nil { t.Fatalf("Failed to create Pipeline Resource `%s`: %s", helloworldResourceName, err) } @@ -215,7 +226,7 @@ func TestStorageBucketPipelineRun(t *testing.T) { Name: "helloworldgit", Resource: "source-repo", }}, Outputs: []v1beta1.PipelineTaskOutputResource{{ - Name: "helloworldgit", Resource: "source-rep", + Name: "helloworldgit", Resource: "source-repo", }}, }, }, { diff --git a/test/cluster_resource_test.go b/test/cluster_resource_test.go index cead05d4965..39d615c5de3 100644 --- a/test/cluster_resource_test.go +++ b/test/cluster_resource_test.go @@ -22,7 +22,6 @@ import ( "context" "testing" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" resources "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" @@ -80,15 +79,44 @@ func TestClusterResource(t *testing.T) { } func getClusterResource(name, sname string) *v1alpha1.PipelineResource { - return tb.PipelineResource(name, tb.PipelineResourceSpec( - v1alpha1.PipelineResourceTypeCluster, - tb.PipelineResourceSpecParam("Name", "helloworld-cluster"), - tb.PipelineResourceSpecParam("Url", "https://1.1.1.1"), - tb.PipelineResourceSpecParam("username", "test-user"), - tb.PipelineResourceSpecParam("password", "test-password"), - tb.PipelineResourceSpecSecretParam("cadata", sname, "cadatakey"), - tb.PipelineResourceSpecSecretParam("token", sname, "tokenkey"), - )) + return &v1alpha1.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: v1alpha1.PipelineResourceSpec{ + Type: v1alpha1.PipelineResourceTypeCluster, + Params: []v1alpha1.ResourceParam{ + { + Name: "Name", + Value: "helloworld-cluster", + }, + { + Name: "Url", + Value: "https://1.1.1.1", + }, + { + Name: "username", + Value: "test-user", + }, + { + Name: "password", + Value: "test-password", + }, + }, + SecretParams: []v1alpha1.SecretParam{ + { + FieldName: "cadata", + SecretKey: "cadatakey", + SecretName: sname, + }, + { + FieldName: "token", + SecretKey: "tokenkey", + SecretName: sname, + }, + }, + }, + } } func getClusterResourceTaskSecret(namespace, name string) *corev1.Secret { diff --git a/test/helm_task_test.go b/test/helm_task_test.go index 080aa945087..e73cd3ad62b 100644 --- a/test/helm_task_test.go +++ b/test/helm_task_test.go @@ -23,7 +23,6 @@ import ( "fmt" "testing" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" resources "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" @@ -109,19 +108,35 @@ func TestHelmDeployPipelineRun(t *testing.T) { } func getGoHelloworldGitResource(sourceResourceName string) *v1alpha1.PipelineResource { - return tb.PipelineResource(sourceResourceName, tb.PipelineResourceSpec( - v1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("url", "https://github.com/tektoncd/pipeline"), - )) + return &resources.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: sourceResourceName, + }, + Spec: resources.PipelineResourceSpec{ + Type: resources.PipelineResourceTypeGit, + Params: []resources.ResourceParam{{ + Name: "url", + Value: "https://github.com/tektoncd/pipeline", + }}, + }, + } } func getHelmImageResource(dockerRepo, sourceImageName string) *v1alpha1.PipelineResource { imageName := fmt.Sprintf("%s/%s", dockerRepo, names.SimpleNameGenerator.RestrictLengthWithRandomSuffix(sourceImageName)) - return tb.PipelineResource(sourceImageName, tb.PipelineResourceSpec( - v1alpha1.PipelineResourceTypeImage, - tb.PipelineResourceSpecParam("url", imageName), - )) + return &resources.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: sourceImageName, + }, + Spec: resources.PipelineResourceSpec{ + Type: resources.PipelineResourceTypeImage, + Params: []resources.ResourceParam{{ + Name: "url", + Value: imageName, + }}, + }, + } } func getCreateImageTask(namespace, createImageTaskName string) *v1beta1.Task { diff --git a/test/kaniko_task_test.go b/test/kaniko_task_test.go index a1939e03239..2f3e82fd63b 100644 --- a/test/kaniko_task_test.go +++ b/test/kaniko_task_test.go @@ -26,7 +26,6 @@ import ( "time" "github.com/google/go-cmp/cmp" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" resources "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" @@ -134,18 +133,39 @@ func TestKanikoTaskRun(t *testing.T) { } func getGitResource() *v1alpha1.PipelineResource { - return tb.PipelineResource(kanikoGitResourceName, tb.PipelineResourceSpec( - v1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("Url", "https://github.com/GoogleContainerTools/kaniko"), - tb.PipelineResourceSpecParam("Revision", revision), - )) + return &resources.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: kanikoGitResourceName, + }, + Spec: resources.PipelineResourceSpec{ + Type: resources.PipelineResourceTypeGit, + Params: []resources.ResourceParam{ + { + Name: "Url", + Value: "https://github.com/GoogleContainerTools/kaniko", + }, + { + Name: "Revision", + Value: revision, + }, + }, + }, + } } func getImageResource(repo string) *v1alpha1.PipelineResource { - return tb.PipelineResource(kanikoImageResourceName, tb.PipelineResourceSpec( - v1alpha1.PipelineResourceTypeImage, - tb.PipelineResourceSpecParam("url", repo), - )) + return &resources.PipelineResource{ + ObjectMeta: metav1.ObjectMeta{ + Name: kanikoImageResourceName, + }, + Spec: resources.PipelineResourceSpec{ + Type: resources.PipelineResourceTypeImage, + Params: []resources.ResourceParam{{ + Name: "url", + Value: repo, + }}, + }, + } } func getTask(repo, namespace string) *v1beta1.Task { diff --git a/test/pipelinerun_test.go b/test/pipelinerun_test.go index 399c6c35148..c536aef778f 100644 --- a/test/pipelinerun_test.go +++ b/test/pipelinerun_test.go @@ -26,7 +26,6 @@ import ( "testing" "time" - tb "github.com/tektoncd/pipeline/internal/builder/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/pipeline" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" @@ -620,13 +619,24 @@ func getFanInFanOutPipeline(suffix int, namespace string) *v1beta1.Pipeline { } func getFanInFanOutGitResources() []*v1alpha1.PipelineResource { - return []*v1alpha1.PipelineResource{ - tb.PipelineResource("kritis-resource-git", tb.PipelineResourceSpec( - v1alpha1.PipelineResourceTypeGit, - tb.PipelineResourceSpecParam("Url", "https://github.com/grafeas/kritis"), - tb.PipelineResourceSpecParam("Revision", "master"), - )), - } + return []*v1alpha1.PipelineResource{{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kritis-resource-git", + }, + Spec: resource.PipelineResourceSpec{ + Type: resource.PipelineResourceTypeGit, + Params: []resource.ResourceParam{ + { + Name: "Url", + Value: "https://github.com/grafeas/kritis", + }, + { + Name: "Revision", + Value: "master", + }, + }, + }, + }} } func getPipelineRunServiceAccount(suffix int, namespace string) *corev1.ServiceAccount {