Skip to content

Commit 1c0fcdf

Browse files
vinamra28piyush-garg
authored andcommitted
Fix clustertask start command with --last flag
`tkn clustertask start` command with `--last` flag was checking for the label `tekton.dev/task=name` in the created taskruns since any taskrun created from clustertask had the labels `tekton.dev/clusterTask=name` and `tekton.dev/task=name`. Since pipelines 0.22 release the label `tekton.dev/task=name` has been removed from the taskruns which were created from clustertasks. See: tektoncd/pipeline#3764 Fixing this in pkg/task/tasklastrun.go and adding corresponding tests. Signed-off-by: vinamra28 <vinjain@redhat.com>
1 parent 332e825 commit 1c0fcdf

File tree

3 files changed

+203
-12
lines changed

3 files changed

+203
-12
lines changed

pkg/cmd/clustertask/start_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ func Test_ClusterTask_Start(t *testing.T) {
322322
ObjectMeta: v1.ObjectMeta{
323323
Name: "taskrun-123",
324324
Namespace: "ns",
325-
Labels: map[string]string{"tekton.dev/task": "clustertask-1"},
325+
Labels: map[string]string{"tekton.dev/clusterTask": "clustertask-1"},
326326
},
327327
Spec: v1alpha1.TaskRunSpec{
328328
Params: []v1alpha1.Param{
@@ -1095,7 +1095,7 @@ func Test_ClusterTask_Start_v1beta1(t *testing.T) {
10951095
ObjectMeta: v1.ObjectMeta{
10961096
Name: "taskrun-123",
10971097
Namespace: "ns",
1098-
Labels: map[string]string{"tekton.dev/task": "clustertask-1"},
1098+
Labels: map[string]string{"tekton.dev/clusterTask": "clustertask-1"},
10991099
},
11001100
Spec: v1beta1.TaskRunSpec{
11011101
Params: []v1beta1.Param{
@@ -1966,7 +1966,7 @@ func Test_start_clustertask_last_override_timeout(t *testing.T) {
19661966

19671967
ObjectMeta: v1.ObjectMeta{
19681968
Name: trName,
1969-
Labels: map[string]string{"tekton.dev/clustertask": "clustertask"},
1969+
Labels: map[string]string{"tekton.dev/clusterTask": "clustertask"},
19701970
Namespace: "ns",
19711971
},
19721972
Spec: v1beta1.TaskRunSpec{

pkg/task/tasklastrun.go

+13-9
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,19 @@ import (
2323
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2424
)
2525

26-
// LastRun returns the last taskrun for a given task
27-
func LastRun(cs *cli.Clients, task string, ns, kind string) (*v1beta1.TaskRun, error) {
26+
// LastRun returns the last taskrun for a given task/clustertask
27+
func LastRun(cs *cli.Clients, resourceName, ns, kind string) (*v1beta1.TaskRun, error) {
2828
options := metav1.ListOptions{}
29-
if task != "" {
29+
30+
// change the label value to clusterTask if the resource is ClusterTask
31+
label := "task"
32+
if kind == "ClusterTask" {
33+
label = "clusterTask"
34+
}
35+
36+
if resourceName != "" {
3037
options = metav1.ListOptions{
31-
LabelSelector: fmt.Sprintf("tekton.dev/task=%s", task),
38+
LabelSelector: fmt.Sprintf("tekton.dev/%s=%s", label, resourceName),
3239
}
3340
}
3441

@@ -37,11 +44,8 @@ func LastRun(cs *cli.Clients, task string, ns, kind string) (*v1beta1.TaskRun, e
3744
return nil, err
3845
}
3946

40-
// this is required as the same label is getting added for both task and ClusterTask
41-
runs.Items = FilterByRef(runs.Items, kind)
42-
4347
if len(runs.Items) == 0 {
44-
return nil, fmt.Errorf("no TaskRuns related to %s %s found in namespace %s", kind, task, ns)
48+
return nil, fmt.Errorf("no TaskRuns related to %s %s found in namespace %s", kind, resourceName, ns)
4549
}
4650

4751
latest := runs.Items[0]
@@ -54,7 +58,7 @@ func LastRun(cs *cli.Clients, task string, ns, kind string) (*v1beta1.TaskRun, e
5458
return &latest, nil
5559
}
5660

57-
// this will filter the taskrun which have reference to Task
61+
// this will filter the taskrun which have reference to Task or ClusterTask
5862
func FilterByRef(taskruns []v1beta1.TaskRun, kind string) []v1beta1.TaskRun {
5963
var filtered []v1beta1.TaskRun
6064
for _, taskrun := range taskruns {

pkg/task/tasklastrun_test.go

+187
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ import (
2727
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
2828
pipelinetest "github.com/tektoncd/pipeline/test/v1alpha1"
2929
corev1 "k8s.io/api/core/v1"
30+
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3031
"knative.dev/pkg/apis"
32+
duckv1beta1 "knative.dev/pkg/apis/duck/v1beta1"
3133
)
3234

3335
const (
@@ -135,3 +137,188 @@ func TestTaskrunLatest_no_run(t *testing.T) {
135137
expected := "no TaskRuns related to Task task found in namespace ns"
136138
test.AssertOutput(t, expected, err.Error())
137139
}
140+
141+
func TestTaskrunLatestForClusterTask_two_run(t *testing.T) {
142+
clock := clockwork.NewFakeClock()
143+
144+
var (
145+
taskCreated = clock.Now().Add(5 * time.Minute)
146+
147+
firstRunCreated = clock.Now().Add(10 * time.Minute)
148+
firstRunStarted = firstRunCreated.Add(2 * time.Second)
149+
firstRunCompleted = firstRunStarted.Add(10 * time.Minute)
150+
151+
secondRunCreated = firstRunCreated.Add(1 * time.Minute)
152+
secondRunStarted = secondRunCreated.Add(2 * time.Second)
153+
secondRunCompleted = secondRunStarted.Add(5 * time.Minute)
154+
)
155+
clustertasks := []*v1alpha1.ClusterTask{
156+
{
157+
ObjectMeta: v1.ObjectMeta{
158+
Name: "task",
159+
CreationTimestamp: v1.Time{Time: taskCreated},
160+
},
161+
},
162+
}
163+
taskruns := []*v1alpha1.TaskRun{
164+
{
165+
ObjectMeta: v1.ObjectMeta{
166+
Name: "tr-1",
167+
Namespace: "ns",
168+
CreationTimestamp: v1.Time{Time: firstRunCreated},
169+
Labels: map[string]string{"tekton.dev/clusterTask": "task"},
170+
},
171+
Spec: v1alpha1.TaskRunSpec{
172+
TaskRef: &v1alpha1.TaskRef{
173+
Name: "task",
174+
Kind: v1alpha1.ClusterTaskKind,
175+
},
176+
},
177+
Status: v1beta1.TaskRunStatus{
178+
Status: duckv1beta1.Status{
179+
Conditions: duckv1beta1.Conditions{
180+
{
181+
Status: corev1.ConditionTrue,
182+
Reason: v1beta1.TaskRunReasonSuccessful.String(),
183+
},
184+
},
185+
},
186+
TaskRunStatusFields: v1beta1.TaskRunStatusFields{
187+
StartTime: &v1.Time{Time: firstRunStarted},
188+
CompletionTime: &v1.Time{Time: firstRunCompleted},
189+
},
190+
},
191+
},
192+
{
193+
ObjectMeta: v1.ObjectMeta{
194+
Name: "tr-2",
195+
Namespace: "ns",
196+
CreationTimestamp: v1.Time{Time: secondRunCompleted},
197+
Labels: map[string]string{"tekton.dev/clusterTask": "task"},
198+
},
199+
Spec: v1alpha1.TaskRunSpec{
200+
TaskRef: &v1alpha1.TaskRef{
201+
Name: "task",
202+
Kind: v1alpha1.ClusterTaskKind,
203+
},
204+
},
205+
Status: v1beta1.TaskRunStatus{
206+
Status: duckv1beta1.Status{
207+
Conditions: duckv1beta1.Conditions{
208+
{
209+
Status: corev1.ConditionTrue,
210+
Reason: v1beta1.TaskRunReasonSuccessful.String(),
211+
},
212+
},
213+
},
214+
TaskRunStatusFields: v1beta1.TaskRunStatusFields{
215+
StartTime: &v1.Time{Time: secondRunStarted},
216+
CompletionTime: &v1.Time{Time: secondRunCompleted},
217+
},
218+
},
219+
},
220+
}
221+
cs, _ := test.SeedTestData(t, pipelinetest.Data{
222+
ClusterTasks: clustertasks,
223+
TaskRuns: taskruns,
224+
})
225+
cs.Pipeline.Resources = cb.APIResourceList(versionA1, []string{"clustertask", "taskrun"})
226+
tdc := testDynamic.Options{}
227+
dc, _ := tdc.Client(
228+
cb.UnstructuredCT(clustertasks[0], versionA1),
229+
cb.UnstructuredTR(taskruns[0], versionA1),
230+
cb.UnstructuredTR(taskruns[1], versionA1),
231+
)
232+
p := &test.Params{Tekton: cs.Pipeline, Clock: clock, Dynamic: dc}
233+
client, err := p.Clients()
234+
if err != nil {
235+
t.Errorf("Unexpected error: %v", err)
236+
}
237+
238+
lastRun, err := LastRun(client, "task", "ns", "ClusterTask")
239+
if err != nil {
240+
t.Errorf("Unexpected error: %v", err)
241+
}
242+
243+
test.AssertOutput(t, "tr-2", lastRun.Name)
244+
}
245+
246+
func TestFilterByRef(t *testing.T) {
247+
clock := clockwork.NewFakeClock()
248+
249+
var (
250+
firstRunCreated = clock.Now().Add(10 * time.Minute)
251+
firstRunStarted = firstRunCreated.Add(2 * time.Second)
252+
firstRunCompleted = firstRunStarted.Add(10 * time.Minute)
253+
254+
secondRunCreated = firstRunCreated.Add(1 * time.Minute)
255+
secondRunStarted = secondRunCreated.Add(2 * time.Second)
256+
secondRunCompleted = secondRunStarted.Add(5 * time.Minute)
257+
)
258+
taskruns := []v1beta1.TaskRun{
259+
{
260+
ObjectMeta: v1.ObjectMeta{
261+
Name: "tr-1",
262+
Namespace: "ns",
263+
CreationTimestamp: v1.Time{Time: firstRunCreated},
264+
Labels: map[string]string{"tekton.dev/task": "task"},
265+
},
266+
Spec: v1beta1.TaskRunSpec{
267+
TaskRef: &v1alpha1.TaskRef{
268+
Name: "task",
269+
Kind: v1alpha1.NamespacedTaskKind,
270+
},
271+
},
272+
Status: v1beta1.TaskRunStatus{
273+
Status: duckv1beta1.Status{
274+
Conditions: duckv1beta1.Conditions{
275+
{
276+
Status: corev1.ConditionTrue,
277+
Reason: v1beta1.TaskRunReasonSuccessful.String(),
278+
},
279+
},
280+
},
281+
TaskRunStatusFields: v1beta1.TaskRunStatusFields{
282+
StartTime: &v1.Time{Time: firstRunStarted},
283+
CompletionTime: &v1.Time{Time: firstRunCompleted},
284+
},
285+
},
286+
},
287+
{
288+
ObjectMeta: v1.ObjectMeta{
289+
Name: "tr-2",
290+
Namespace: "ns",
291+
CreationTimestamp: v1.Time{Time: secondRunCompleted},
292+
Labels: map[string]string{"tekton.dev/clusterTask": "task"},
293+
},
294+
Spec: v1beta1.TaskRunSpec{
295+
TaskRef: &v1alpha1.TaskRef{
296+
Name: "task",
297+
Kind: v1alpha1.ClusterTaskKind,
298+
},
299+
},
300+
Status: v1beta1.TaskRunStatus{
301+
Status: duckv1beta1.Status{
302+
Conditions: duckv1beta1.Conditions{
303+
{
304+
Status: corev1.ConditionTrue,
305+
Reason: v1beta1.TaskRunReasonSuccessful.String(),
306+
},
307+
},
308+
},
309+
TaskRunStatusFields: v1beta1.TaskRunStatusFields{
310+
StartTime: &v1.Time{Time: secondRunStarted},
311+
CompletionTime: &v1.Time{Time: secondRunCompleted},
312+
},
313+
},
314+
},
315+
}
316+
317+
filteredClusterTask := FilterByRef(taskruns, "ClusterTask")
318+
319+
test.AssertOutput(t, "tr-2", filteredClusterTask[0].Name)
320+
321+
filteredTask := FilterByRef(taskruns, "Task")
322+
323+
test.AssertOutput(t, "tr-1", filteredTask[0].Name)
324+
}

0 commit comments

Comments
 (0)