Skip to content

Commit 2c437af

Browse files
16yuki0702tekton-robot
authored andcommitted
Add delete all flag to task command
1 parent 3b00b5f commit 2c437af

File tree

4 files changed

+105
-27
lines changed

4 files changed

+105
-27
lines changed

docs/cmd/tkn_task_delete.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,13 @@ Delete a task resource in a namespace
2020
# Delete a Task of name 'foo' in namespace 'bar'
2121
tkn task delete foo -n bar
2222

23-
tkn t rm foo -n bar",
23+
tkn t rm foo -n bar
2424

2525

2626
### Options
2727

2828
```
29+
-a, --all Whether to delete related resources (taskruns) (default: false)
2930
--allow-missing-template-keys If true, ignore any errors in templates when a field or map key is missing in the template. Only applies to golang and jsonpath output formats. (default true)
3031
-f, --force Whether to force deletion (default: false)
3132
-h, --help help for delete

docs/man/man1/tkn-task-delete.1

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ Delete a task resource in a namespace
1919

2020

2121
.SH OPTIONS
22+
.PP
23+
\fB\-a\fP, \fB\-\-all\fP[=false]
24+
Whether to delete related resources (taskruns) (default: false)
25+
2226
.PP
2327
\fB\-\-allow\-missing\-template\-keys\fP[=true]
2428
If true, ignore any errors in templates when a field or map key is missing in the template. Only applies to golang and jsonpath output formats.
@@ -58,7 +62,7 @@ Delete a task resource in a namespace
5862
tkn task delete foo \-n bar
5963

6064
.PP
61-
tkn t rm foo \-n bar",
65+
tkn t rm foo \-n bar
6266

6367

6468
.SH SEE ALSO

pkg/cmd/task/delete.go

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,20 @@ import (
2727

2828
type deleteOptions struct {
2929
forceDelete bool
30+
deleteAll bool
3031
}
3132

3233
func deleteCommand(p cli.Params) *cobra.Command {
33-
opts := &deleteOptions{forceDelete: false}
34+
opts := &deleteOptions{
35+
forceDelete: false,
36+
deleteAll: false,
37+
}
3438
f := cliopts.NewPrintFlags("delete")
3539
eg := `
3640
# Delete a Task of name 'foo' in namespace 'bar'
3741
tkn task delete foo -n bar
3842
39-
tkn t rm foo -n bar",
43+
tkn t rm foo -n bar
4044
`
4145

4246
c := &cobra.Command{
@@ -60,25 +64,47 @@ tkn t rm foo -n bar",
6064
return err
6165
}
6266

63-
return deleteTask(s, p, args[0])
67+
return deleteTask(opts, s, p, args[0])
6468
},
6569
}
6670
f.AddFlags(c)
6771
c.Flags().BoolVarP(&opts.forceDelete, "force", "f", false, "Whether to force deletion (default: false)")
72+
c.Flags().BoolVarP(&opts.deleteAll, "all", "a", false, "Whether to delete related resources (taskruns) (default: false)")
6873
return c
6974
}
7075

71-
func deleteTask(s *cli.Stream, p cli.Params, tName string) error {
76+
func deleteTask(opts *deleteOptions, s *cli.Stream, p cli.Params, tName string) error {
7277
cs, err := p.Clients()
7378
if err != nil {
74-
return fmt.Errorf("Failed to create tekton client")
79+
return fmt.Errorf("failed to create tekton client")
7580
}
7681

7782
if err := cs.Tekton.TektonV1alpha1().Tasks(p.Namespace()).Delete(tName, &metav1.DeleteOptions{}); err != nil {
78-
return fmt.Errorf("Failed to delete task %q: %s", tName, err)
83+
return fmt.Errorf("failed to delete task %q: %s", tName, err)
7984
}
80-
8185
fmt.Fprintf(s.Out, "Task deleted: %s\n", tName)
86+
87+
if !opts.deleteAll {
88+
return nil
89+
}
90+
91+
lOpts := metav1.ListOptions{
92+
LabelSelector: fmt.Sprintf("tekton.dev/task=%s", tName),
93+
}
94+
95+
taskRuns, err := cs.Tekton.TektonV1alpha1().TaskRuns(p.Namespace()).List(lOpts)
96+
if err != nil {
97+
return err
98+
}
99+
100+
for _, tr := range taskRuns.Items {
101+
if err := cs.Tekton.TektonV1alpha1().TaskRuns(p.Namespace()).Delete(tr.Name, &metav1.DeleteOptions{}); err != nil {
102+
return fmt.Errorf("failed to delete taskrun %q: %s", tr.Name, err)
103+
}
104+
105+
fmt.Fprintf(s.Out, "TaskRun deleted: %s\n", tr.Name)
106+
}
107+
82108
return nil
83109
}
84110

@@ -87,14 +113,19 @@ func checkOptions(opts *deleteOptions, s *cli.Stream, p cli.Params, tName string
87113
return nil
88114
}
89115

90-
fmt.Fprintf(s.Out, "Are you sure you want to delete task %q (y/n): ", tName)
116+
if opts.deleteAll {
117+
fmt.Fprintf(s.Out, "Are you sure you want to delete task and related resources (taskruns) %q (y/n): ", tName)
118+
} else {
119+
fmt.Fprintf(s.Out, "Are you sure you want to delete task %q (y/n): ", tName)
120+
}
121+
91122
scanner := bufio.NewScanner(s.In)
92123
for scanner.Scan() {
93124
t := strings.TrimSpace(scanner.Text())
94125
if t == "y" {
95126
break
96127
} else if t == "n" {
97-
return fmt.Errorf("Canceled deleting task %q", tName)
128+
return fmt.Errorf("canceled deleting task %q", tName)
98129
}
99130
fmt.Fprint(s.Out, "Please enter (y/n): ")
100131
}

pkg/cmd/task/delete_test.go

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,45 @@ import (
2424
"github.com/tektoncd/cli/pkg/test"
2525
cb "github.com/tektoncd/cli/pkg/test/builder"
2626
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1"
27+
"github.com/tektoncd/pipeline/pkg/reconciler/v1alpha1/pipelinerun/resources"
2728
pipelinetest "github.com/tektoncd/pipeline/test"
2829
tb "github.com/tektoncd/pipeline/test/builder"
30+
corev1 "k8s.io/api/core/v1"
31+
"knative.dev/pkg/apis"
2932
)
3033

3134
func TestTaskDelete(t *testing.T) {
3235
clock := clockwork.NewFakeClock()
3336

3437
seeds := make([]pipelinetest.Clients, 0)
35-
for i := 0; i < 3; i++ {
36-
tasks := []*v1alpha1.Task{
37-
tb.Task("tomatoes", "ns", cb.TaskCreationTime(clock.Now().Add(-1*time.Minute))),
38-
}
39-
cs, _ := test.SeedTestData(t, pipelinetest.Data{Tasks: tasks})
38+
for i := 0; i < 5; i++ {
39+
cs, _ := test.SeedTestData(t, pipelinetest.Data{
40+
Tasks: []*v1alpha1.Task{
41+
tb.Task("task", "ns", cb.TaskCreationTime(clock.Now().Add(-1*time.Minute))),
42+
},
43+
TaskRuns: []*v1alpha1.TaskRun{
44+
tb.TaskRun("task-run-1", "ns",
45+
tb.TaskRunLabel("tekton.dev/task", "task"),
46+
tb.TaskRunSpec(tb.TaskRunTaskRef("task")),
47+
tb.TaskRunStatus(
48+
tb.StatusCondition(apis.Condition{
49+
Status: corev1.ConditionTrue,
50+
Reason: resources.ReasonSucceeded,
51+
}),
52+
),
53+
),
54+
tb.TaskRun("task-run-2", "ns",
55+
tb.TaskRunLabel("tekton.dev/task", "task"),
56+
tb.TaskRunSpec(tb.TaskRunTaskRef("task")),
57+
tb.TaskRunStatus(
58+
tb.StatusCondition(apis.Condition{
59+
Status: corev1.ConditionTrue,
60+
Reason: resources.ReasonSucceeded,
61+
}),
62+
),
63+
),
64+
},
65+
})
4066
seeds = append(seeds, cs)
4167
}
4268

@@ -50,43 +76,59 @@ func TestTaskDelete(t *testing.T) {
5076
}{
5177
{
5278
name: "With force delete flag (shorthand)",
53-
command: []string{"rm", "tomatoes", "-n", "ns", "-f"},
79+
command: []string{"rm", "task", "-n", "ns", "-f"},
5480
input: seeds[0],
5581
inputStream: nil,
5682
wantError: false,
57-
want: "Task deleted: tomatoes\n",
83+
want: "Task deleted: task\n",
5884
},
5985
{
6086
name: "With force delete flag",
61-
command: []string{"rm", "tomatoes", "-n", "ns", "--force"},
87+
command: []string{"rm", "task", "-n", "ns", "--force"},
6288
input: seeds[1],
6389
inputStream: nil,
6490
wantError: false,
65-
want: "Task deleted: tomatoes\n",
91+
want: "Task deleted: task\n",
6692
},
6793
{
6894
name: "Without force delete flag, reply no",
69-
command: []string{"rm", "tomatoes", "-n", "ns"},
95+
command: []string{"rm", "task", "-n", "ns"},
7096
input: seeds[2],
7197
inputStream: strings.NewReader("n"),
7298
wantError: true,
73-
want: "Canceled deleting task \"tomatoes\"",
99+
want: "canceled deleting task \"task\"",
74100
},
75101
{
76102
name: "Without force delete flag, reply yes",
77-
command: []string{"rm", "tomatoes", "-n", "ns"},
103+
command: []string{"rm", "task", "-n", "ns"},
78104
input: seeds[2],
79105
inputStream: strings.NewReader("y"),
80106
wantError: false,
81-
want: "Are you sure you want to delete task \"tomatoes\" (y/n): Task deleted: tomatoes\n",
107+
want: "Are you sure you want to delete task \"task\" (y/n): Task deleted: task\n",
82108
},
83109
{
84110
name: "Remove non existent resource",
85111
command: []string{"rm", "nonexistent", "-n", "ns"},
86112
input: seeds[2],
87113
inputStream: strings.NewReader("y"),
88114
wantError: true,
89-
want: "Failed to delete task \"nonexistent\": tasks.tekton.dev \"nonexistent\" not found",
115+
want: "failed to delete task \"nonexistent\": tasks.tekton.dev \"nonexistent\" not found",
116+
},
117+
{
118+
name: "With delete all flag, reply yes",
119+
command: []string{"rm", "task", "-n", "ns", "-a"},
120+
input: seeds[3],
121+
inputStream: strings.NewReader("y"),
122+
wantError: false,
123+
want: "Are you sure you want to delete task and related resources (taskruns) \"task\" (y/n): Task deleted: task\nTaskRun deleted: task-run-1\nTaskRun deleted: task-run-2\n",
124+
},
125+
{
126+
name: "With delete all and force delete flag",
127+
command: []string{"rm", "task", "-n", "ns", "-f", "--all"},
128+
input: seeds[4],
129+
inputStream: nil,
130+
wantError: false,
131+
want: "Task deleted: task\nTaskRun deleted: task-run-1\nTaskRun deleted: task-run-2\n",
90132
},
91133
}
92134

@@ -102,12 +144,12 @@ func TestTaskDelete(t *testing.T) {
102144
out, err := test.ExecuteCommand(task, tp.command...)
103145
if tp.wantError {
104146
if err == nil {
105-
t.Errorf("Error expected here")
147+
t.Errorf("error expected here")
106148
}
107149
test.AssertOutput(t, tp.want, err.Error())
108150
} else {
109151
if err != nil {
110-
t.Errorf("Unexpected Error")
152+
t.Errorf("unexpected Error")
111153
}
112154
test.AssertOutput(t, tp.want, out)
113155
}

0 commit comments

Comments
 (0)