From 9fb82751ad87ef16082de5536e81af98a0fed603 Mon Sep 17 00:00:00 2001 From: Vincent Demeester Date: Tue, 9 Jul 2019 15:09:33 +0200 Subject: [PATCH] Add a PodTemplate field for PipelineRun and TaskRun This allows to group and add `PodSpec` customizations to PipelineRun and TaskRun and share the field with both of them. - We are still putting field by hand compared to PodSpec as PodSpec has a large number of fields, including `InitContainers` and `Containers` and we don't want people to be able to add random containers to the `Task` pod. - This adds SecurityContext in addition to the current `PodSpec` specific fields. - This adds Volumes in addition to the current `PodSpec` specific fields. This is done in a backward compatibility way. The old field are still there, but `PodTemplate` takes precedence over it (depending on which field are present). These fields will be remove when we bump the API to `v1beta1`. Signed-off-by: Vincent Demeester --- cmd/imagedigestexporter/main.go | 2 +- config/400-controller-service.yaml | 2 +- config/config-logging.yaml | 2 +- hack/nightly.sh | 2 +- .../pipeline/v1alpha1/pipelinerun_types.go | 5 + pkg/apis/pipeline/v1alpha1/pod.go | 61 +++++++++++ pkg/apis/pipeline/v1alpha1/pod_test.go | 102 ++++++++++++++++++ pkg/apis/pipeline/v1alpha1/taskrun_types.go | 5 + .../v1alpha1/zz_generated.deepcopy.go | 57 ++++++++++ .../v1alpha1/pipelinerun/pipelinerun.go | 9 +- .../v1alpha1/taskrun/resources/pod.go | 9 +- test/adoc.go | 2 +- test/artifact_bucket_test.go | 2 +- test/cancel_test.go | 2 +- test/clients.go | 2 +- test/cluster_resource_test.go | 2 +- test/dag_test.go | 2 +- test/duplicate_test.go | 2 +- test/embed_test.go | 2 +- test/entrypoint_test.go | 2 +- test/gcs_taskrun_test.go | 2 +- test/git_checkout_test.go | 2 +- test/helm_task_test.go | 2 +- test/init_test.go | 2 +- test/kaniko_task_test.go | 2 +- test/names/generate.go | 2 +- test/status_test.go | 2 +- 27 files changed, 260 insertions(+), 28 deletions(-) create mode 100644 pkg/apis/pipeline/v1alpha1/pod.go create mode 100644 pkg/apis/pipeline/v1alpha1/pod_test.go diff --git a/cmd/imagedigestexporter/main.go b/cmd/imagedigestexporter/main.go index 6d9b3dcea3d..0a271049324 100644 --- a/cmd/imagedigestexporter/main.go +++ b/cmd/imagedigestexporter/main.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Tekton Authors +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. diff --git a/config/400-controller-service.yaml b/config/400-controller-service.yaml index 90f2ee36f8c..cbfb83688e0 100644 --- a/config/400-controller-service.yaml +++ b/config/400-controller-service.yaml @@ -1,4 +1,4 @@ -# Copyright 2018 Knative Authors LLC +# Copyright 2019 Tekton Authors LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/config/config-logging.yaml b/config/config-logging.yaml index bf331f5a9b7..79e775f7e0d 100644 --- a/config/config-logging.yaml +++ b/config/config-logging.yaml @@ -1,4 +1,4 @@ -# Copyright 2018 Knative Authors LLC +# Copyright 2019 Tekton Authors LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/hack/nightly.sh b/hack/nightly.sh index 4e3611a3ba4..14794a2416e 100644 --- a/hack/nightly.sh +++ b/hack/nightly.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2018 The Tekton Authors +# 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. diff --git a/pkg/apis/pipeline/v1alpha1/pipelinerun_types.go b/pkg/apis/pipeline/v1alpha1/pipelinerun_types.go index 32a593fd8cb..677e61d3734 100644 --- a/pkg/apis/pipeline/v1alpha1/pipelinerun_types.go +++ b/pkg/apis/pipeline/v1alpha1/pipelinerun_types.go @@ -59,6 +59,11 @@ type PipelineRunSpec struct { // Refer to Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration // +optional Timeout *metav1.Duration `json:"timeout,omitempty"` + + // PodTemplate holds pod specific configuration + PodTemplate PodTemplate `json:"podTemplate,omitempty"` + + // FIXME(vdemeester) Deprecated // NodeSelector is a selector which must be true for the pod to fit on a node. // Selector which must match a node's labels for the pod to be scheduled on that node. // More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ diff --git a/pkg/apis/pipeline/v1alpha1/pod.go b/pkg/apis/pipeline/v1alpha1/pod.go new file mode 100644 index 00000000000..a9094b78278 --- /dev/null +++ b/pkg/apis/pipeline/v1alpha1/pod.go @@ -0,0 +1,61 @@ +/* +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 v1alpha1 + +import ( + corev1 "k8s.io/api/core/v1" +) + +type PodTemplate struct { + // NodeSelector is a selector which must be true for the pod to fit on a node. + // Selector which must match a node's labels for the pod to be scheduled on that node. + // More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ + // +optional + NodeSelector map[string]string `json:"nodeSelector,omitempty"` + + // If specified, the pod's tolerations. + // +optional + Tolerations []corev1.Toleration `json:"tolerations,omitempty"` + + // If specified, the pod's scheduling constraints + // +optional + Affinity *corev1.Affinity `json:"affinity,omitempty"` + + // SecurityContext holds pod-level security attributes and common container settings. + // Optional: Defaults to empty. See type description for default values of each field. + // +optional + SecurityContext *corev1.PodSecurityContext `json:"securityContext,omitempty"` + + // List of volumes that can be mounted by containers belonging to the pod. + // More info: https://kubernetes.io/docs/concepts/storage/volumes + // +optional + Volumes []corev1.Volume `json:"volumes,omitempty" patchStrategy:"merge,retainKeys" patchMergeKey:"name" protobuf:"bytes,1,rep,name=volumes"` +} + +// CombinePodTemplate takes a PodTemplate (either from TaskRun or PipelineRun) and merge it with deprecated field that were inlined. +func CombinedPodTemplate(template PodTemplate, deprecatedNodeSelector map[string]string, deprecatedTolerations []corev1.Toleration, deprecatedAffinity *corev1.Affinity) PodTemplate { + if len(template.NodeSelector) == 0 && len(deprecatedNodeSelector) != 0 { + template.NodeSelector = deprecatedNodeSelector + } + if len(template.Tolerations) == 0 && len(deprecatedTolerations) != 0 { + template.Tolerations = deprecatedTolerations + } + if template.Affinity == nil && deprecatedAffinity != nil { + template.Affinity = deprecatedAffinity + } + return template +} diff --git a/pkg/apis/pipeline/v1alpha1/pod_test.go b/pkg/apis/pipeline/v1alpha1/pod_test.go new file mode 100644 index 00000000000..6fbb05e581c --- /dev/null +++ b/pkg/apis/pipeline/v1alpha1/pod_test.go @@ -0,0 +1,102 @@ +/* +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 v1alpha1_test + +import ( + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" + corev1 "k8s.io/api/core/v1" +) + +func TestCombinedPodTemplate(t *testing.T) { + affinity := &corev1.Affinity{ + NodeAffinity: &corev1.NodeAffinity{}, + } + nodeSelector := map[string]string{ + "banana": "chocolat", + } + tolerations := []corev1.Toleration{{ + Key: "banana", + Value: "chocolat", + }} + + template := v1alpha1.PodTemplate{ + NodeSelector: map[string]string{ + "foo": "bar", + "bar": "baz", + }, + Tolerations: []corev1.Toleration{{ + Key: "foo", + Value: "bar", + }}, + Affinity: &corev1.Affinity{ + PodAffinity: &corev1.PodAffinity{}, + }, + } + // Same as template above + want := v1alpha1.PodTemplate{ + NodeSelector: map[string]string{ + "foo": "bar", + "bar": "baz", + }, + Tolerations: []corev1.Toleration{{ + Key: "foo", + Value: "bar", + }}, + Affinity: &corev1.Affinity{ + PodAffinity: &corev1.PodAffinity{}, + }, + } + + got := v1alpha1.CombinedPodTemplate(template, nodeSelector, tolerations, affinity) + if d := cmp.Diff(got, want); d != "" { + t.Errorf("Diff:\n%s", d) + } +} + +func TestCombinedPodTemplateOnlyDeprecated(t *testing.T) { + template := v1alpha1.PodTemplate{} + affinity := &corev1.Affinity{ + NodeAffinity: &corev1.NodeAffinity{}, + } + + nodeSelector := map[string]string{ + "foo": "bar", + } + tolerations := []corev1.Toleration{{ + Key: "foo", + Value: "bar", + }} + + want := v1alpha1.PodTemplate{ + NodeSelector: map[string]string{ + "foo": "bar", + }, + Tolerations: []corev1.Toleration{{ + Key: "foo", + Value: "bar", + }}, + Affinity: affinity, + } + + got := v1alpha1.CombinedPodTemplate(template, nodeSelector, tolerations, affinity) + if d := cmp.Diff(got, want); d != "" { + t.Errorf("Diff:\n%s", d) + } +} diff --git a/pkg/apis/pipeline/v1alpha1/taskrun_types.go b/pkg/apis/pipeline/v1alpha1/taskrun_types.go index 4f4968bdb30..dc51212ff14 100644 --- a/pkg/apis/pipeline/v1alpha1/taskrun_types.go +++ b/pkg/apis/pipeline/v1alpha1/taskrun_types.go @@ -53,6 +53,11 @@ type TaskRunSpec struct { // Refer Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration // +optional Timeout *metav1.Duration `json:"timeout,omitempty"` + + // PodTemplate holds pod specific configuration + PodTemplate PodTemplate `json:"podTemplate,omitempty"` + + // FIXME(vdemeester) Deprecated // NodeSelector is a selector which must be true for the pod to fit on a node. // Selector which must match a node's labels for the pod to be scheduled on that node. // More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ diff --git a/pkg/apis/pipeline/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/pipeline/v1alpha1/zz_generated.deepcopy.go index d95226a4571..2da0a96f81d 100644 --- a/pkg/apis/pipeline/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/pipeline/v1alpha1/zz_generated.deepcopy.go @@ -723,6 +723,7 @@ func (in *PipelineRunSpec) DeepCopyInto(out *PipelineRunSpec) { **out = **in } } + in.PodTemplate.DeepCopyInto(&out.PodTemplate) if in.NodeSelector != nil { in, out := &in.NodeSelector, &out.NodeSelector *out = make(map[string]string, len(*in)) @@ -1038,6 +1039,61 @@ func (in *PipelineTaskRun) DeepCopy() *PipelineTaskRun { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodTemplate) DeepCopyInto(out *PodTemplate) { + *out = *in + if in.NodeSelector != nil { + in, out := &in.NodeSelector, &out.NodeSelector + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Tolerations != nil { + in, out := &in.Tolerations, &out.Tolerations + *out = make([]v1.Toleration, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Affinity != nil { + in, out := &in.Affinity, &out.Affinity + if *in == nil { + *out = nil + } else { + *out = new(v1.Affinity) + (*in).DeepCopyInto(*out) + } + } + if in.SecurityContext != nil { + in, out := &in.SecurityContext, &out.SecurityContext + if *in == nil { + *out = nil + } else { + *out = new(v1.PodSecurityContext) + (*in).DeepCopyInto(*out) + } + } + if in.Volumes != nil { + in, out := &in.Volumes, &out.Volumes + *out = make([]v1.Volume, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodTemplate. +func (in *PodTemplate) DeepCopy() *PodTemplate { + if in == nil { + return nil + } + out := new(PodTemplate) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PullRequestResource) DeepCopyInto(out *PullRequestResource) { *out = *in @@ -1384,6 +1440,7 @@ func (in *TaskRunSpec) DeepCopyInto(out *TaskRunSpec) { **out = **in } } + in.PodTemplate.DeepCopyInto(&out.PodTemplate) if in.NodeSelector != nil { in, out := &in.NodeSelector, &out.NodeSelector *out = make(map[string]string, len(*in)) diff --git a/pkg/reconciler/v1alpha1/pipelinerun/pipelinerun.go b/pkg/reconciler/v1alpha1/pipelinerun/pipelinerun.go index b02e7dbdc2a..a15974f1bdc 100644 --- a/pkg/reconciler/v1alpha1/pipelinerun/pipelinerun.go +++ b/pkg/reconciler/v1alpha1/pipelinerun/pipelinerun.go @@ -493,6 +493,8 @@ func (c *Reconciler) createTaskRun(logger *zap.SugaredLogger, rprt *resources.Re }) return c.PipelineClientSet.TektonV1alpha1().TaskRuns(pr.Namespace).UpdateStatus(tr) } + + podTemplate := v1alpha1.CombinedPodTemplate(pr.Spec.PodTemplate, pr.Spec.NodeSelector, pr.Spec.Tolerations, pr.Spec.Affinity) tr = &v1alpha1.TaskRun{ ObjectMeta: metav1.ObjectMeta{ Name: rprt.TaskRunName, @@ -511,11 +513,8 @@ func (c *Reconciler) createTaskRun(logger *zap.SugaredLogger, rprt *resources.Re }, ServiceAccount: serviceAccount, Timeout: taskRunTimeout, - NodeSelector: pr.Spec.NodeSelector, - Tolerations: pr.Spec.Tolerations, - Affinity: pr.Spec.Affinity, - }, - } + PodTemplate: podTemplate, + }} resources.WrapSteps(&tr.Spec, rprt.PipelineTask, rprt.ResolvedTaskResources.Inputs, rprt.ResolvedTaskResources.Outputs, storageBasePath) diff --git a/pkg/reconciler/v1alpha1/taskrun/resources/pod.go b/pkg/reconciler/v1alpha1/taskrun/resources/pod.go index 27e96302c65..17469a52e7d 100644 --- a/pkg/reconciler/v1alpha1/taskrun/resources/pod.go +++ b/pkg/reconciler/v1alpha1/taskrun/resources/pod.go @@ -333,6 +333,8 @@ func MakePod(taskRun *v1alpha1.TaskRun, taskSpec v1alpha1.TaskSpec, kubeclient k return nil, err } + podTemplate := v1alpha1.CombinedPodTemplate(taskRun.Spec.PodTemplate, taskRun.Spec.NodeSelector, taskRun.Spec.Tolerations, taskRun.Spec.Affinity) + return &corev1.Pod{ ObjectMeta: metav1.ObjectMeta{ // We execute the build's pod in the same namespace as where the build was @@ -356,9 +358,10 @@ func MakePod(taskRun *v1alpha1.TaskRun, taskSpec v1alpha1.TaskSpec, kubeclient k Containers: mergedPodContainers, ServiceAccountName: taskRun.Spec.ServiceAccount, Volumes: volumes, - NodeSelector: taskRun.Spec.NodeSelector, - Tolerations: taskRun.Spec.Tolerations, - Affinity: taskRun.Spec.Affinity, + NodeSelector: podTemplate.NodeSelector, + Tolerations: podTemplate.Tolerations, + Affinity: podTemplate.Affinity, + SecurityContext: podTemplate.SecurityContext, }, }, nil } diff --git a/test/adoc.go b/test/adoc.go index 02148db8e1d..f86335ebf95 100644 --- a/test/adoc.go +++ b/test/adoc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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 diff --git a/test/artifact_bucket_test.go b/test/artifact_bucket_test.go index 8c58b8c1490..9ff9e5ca835 100644 --- a/test/artifact_bucket_test.go +++ b/test/artifact_bucket_test.go @@ -1,7 +1,7 @@ // +build e2e /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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 diff --git a/test/cancel_test.go b/test/cancel_test.go index 449dfd85498..3a65a3dddad 100644 --- a/test/cancel_test.go +++ b/test/cancel_test.go @@ -1,7 +1,7 @@ // +build e2e /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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 diff --git a/test/clients.go b/test/clients.go index b88fbf40f42..35149c5e3e1 100644 --- a/test/clients.go +++ b/test/clients.go @@ -1,5 +1,5 @@ /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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 diff --git a/test/cluster_resource_test.go b/test/cluster_resource_test.go index f5283452de6..a61529a1876 100644 --- a/test/cluster_resource_test.go +++ b/test/cluster_resource_test.go @@ -1,7 +1,7 @@ // +build e2e /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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 diff --git a/test/dag_test.go b/test/dag_test.go index 464612b06cf..1b3f86b05da 100644 --- a/test/dag_test.go +++ b/test/dag_test.go @@ -1,7 +1,7 @@ // +build e2e /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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 diff --git a/test/duplicate_test.go b/test/duplicate_test.go index 9dbb3072b72..45f0e15e752 100644 --- a/test/duplicate_test.go +++ b/test/duplicate_test.go @@ -1,7 +1,7 @@ // +build e2e /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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 diff --git a/test/embed_test.go b/test/embed_test.go index eff42876ef6..4c5ea55601f 100644 --- a/test/embed_test.go +++ b/test/embed_test.go @@ -1,7 +1,7 @@ // +build e2e /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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 diff --git a/test/entrypoint_test.go b/test/entrypoint_test.go index 19142c94b9a..fcc26ab0f3d 100644 --- a/test/entrypoint_test.go +++ b/test/entrypoint_test.go @@ -1,7 +1,7 @@ // +build e2e /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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 diff --git a/test/gcs_taskrun_test.go b/test/gcs_taskrun_test.go index 54f2b85a243..df29dcedcc7 100644 --- a/test/gcs_taskrun_test.go +++ b/test/gcs_taskrun_test.go @@ -1,7 +1,7 @@ // +build e2e /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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 diff --git a/test/git_checkout_test.go b/test/git_checkout_test.go index 4f4af867043..bf49b7f521c 100644 --- a/test/git_checkout_test.go +++ b/test/git_checkout_test.go @@ -1,7 +1,7 @@ // +build e2e /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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 diff --git a/test/helm_task_test.go b/test/helm_task_test.go index 6f63bc471d9..07832476712 100644 --- a/test/helm_task_test.go +++ b/test/helm_task_test.go @@ -1,7 +1,7 @@ // +build e2e /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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 diff --git a/test/init_test.go b/test/init_test.go index b1ae921da7c..5f9678e24c3 100644 --- a/test/init_test.go +++ b/test/init_test.go @@ -1,7 +1,7 @@ // +build e2e /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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 diff --git a/test/kaniko_task_test.go b/test/kaniko_task_test.go index 37d86d40e8d..b603490b2e0 100644 --- a/test/kaniko_task_test.go +++ b/test/kaniko_task_test.go @@ -1,7 +1,7 @@ // +build e2e /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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 diff --git a/test/names/generate.go b/test/names/generate.go index 7aef7f35a06..27910dc340d 100644 --- a/test/names/generate.go +++ b/test/names/generate.go @@ -1,5 +1,5 @@ /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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 diff --git a/test/status_test.go b/test/status_test.go index 3ac07b84ad8..016574d6480 100644 --- a/test/status_test.go +++ b/test/status_test.go @@ -1,7 +1,7 @@ // +build e2e /* -Copyright 2018 Knative Authors LLC +Copyright 2019 Tekton Authors LLC 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