diff --git a/pkg/cmd/taskrun/delete.go b/pkg/cmd/taskrun/delete.go index aded57b77b..c13714eca5 100644 --- a/pkg/cmd/taskrun/delete.go +++ b/pkg/cmd/taskrun/delete.go @@ -15,6 +15,7 @@ package taskrun import ( + "encoding/json" "errors" "fmt" "strings" @@ -92,6 +93,11 @@ or Err: cmd.OutOrStderr(), } + output, err := cmd.LocalFlags().GetString("output") + if err != nil { + return err + } + if deleteOpts.TaskName != "" { opts.ParentResource = "Task" opts.ParentResourceName = deleteOpts.TaskName @@ -122,11 +128,13 @@ or return errs } - if err := opts.CheckOptions(s, availableTrs, p.Namespace()); err != nil { - return err + if output != "json" { + if err := opts.CheckOptions(s, availableTrs, p.Namespace()); err != nil { + return err + } } - if err := deleteTaskRuns(s, p, availableTrs, opts); err != nil { + if err := deleteTaskRuns(s, p, availableTrs, opts, output); err != nil { return err } return errs @@ -144,7 +152,7 @@ or return c } -func deleteTaskRuns(s *cli.Stream, p cli.Params, trNames []string, opts *options.DeleteOptions) error { +func deleteTaskRuns(s *cli.Stream, p cli.Params, trNames []string, opts *options.DeleteOptions, output string) error { var numberOfDeletedTr, numberOfKeptTr int cs, err := p.Clients() if err != nil { @@ -179,7 +187,7 @@ func deleteTaskRuns(s *cli.Stream, p cli.Params, trNames []string, opts *options if !prFinished && opts.ForceDelete { fmt.Fprintf(s.Out, "warning: Taskrun %s related pipelinerun still running.\n", tr.Name) } - if !prFinished && !opts.ForceDelete { + if !prFinished && !opts.ForceDelete && output != "json" { fmt.Fprintf(s.Out, "TaskRun(s): %s attached to PipelineRun is still running deleting will restart the completed taskrun. Proceed (y/n): ", tr.Name) if err := opts.TakeInput(s, ""); err != nil { continue @@ -222,6 +230,16 @@ func deleteTaskRuns(s *cli.Stream, p cli.Params, trNames []string, opts *options d.DeleteRelated([]string{opts.ParentResourceName}) } + if output == "json" { + result := struct { + Deleted []string `json:"deleted"` + }{ + Deleted: d.SuccessfulDeletes(), + } + + return json.NewEncoder(s.Out).Encode(result) + } + if !opts.DeleteAllNs { if d.Errors() == nil { switch { diff --git a/pkg/cmd/taskrun/delete_test.go b/pkg/cmd/taskrun/delete_test.go index 061853d43d..01471e8bf6 100644 --- a/pkg/cmd/taskrun/delete_test.go +++ b/pkg/cmd/taskrun/delete_test.go @@ -572,6 +572,26 @@ func TestTaskRunDelete_v1beta1(t *testing.T) { wantError: false, want: "All 6 TaskRuns associated with Task \"random\" deleted in namespace \"ns\"\n", }, + { + name: "With JSON output", + command: []string{"rm", "tr0-1", "-n", "ns", "-o", "json"}, + dynamic: seeds[15].dynamicClient, + input: seeds[15].pipelineClient, + inputStream: nil, + wantError: false, + want: `{"deleted":["tr0-1"]} +`, + }, + { + name: "With JSON output for multiple TaskRuns", + command: []string{"rm", "tr0-1", "tr0-2", "-n", "ns", "-o", "json"}, + dynamic: seeds[16].dynamicClient, + input: seeds[16].pipelineClient, + inputStream: strings.NewReader("y\n"), + wantError: false, + want: `{"deleted":["tr0-1","tr0-2"]} +`, + }, } for _, tp := range testParams { diff --git a/pkg/deleter/deleter.go b/pkg/deleter/deleter.go index 016b33b4b1..2872f68284 100644 --- a/pkg/deleter/deleter.go +++ b/pkg/deleter/deleter.go @@ -104,6 +104,14 @@ func (d *Deleter) PrintSuccesses(streams *cli.Stream) { } } +func (d *Deleter) SuccessfulDeletes() []string { + return d.successfulDeletes +} + +func (d *Deleter) SuccessfulRelatedDeletes() []string { + return d.successfulRelatedDeletes +} + // appendError adds that error to the list of accumulated errors that // have occurred during execution. func (d *Deleter) appendError(err error) { diff --git a/pkg/deleter/deleter_test.go b/pkg/deleter/deleter_test.go index 391bfe9bf9..054c22324b 100644 --- a/pkg/deleter/deleter_test.go +++ b/pkg/deleter/deleter_test.go @@ -1,6 +1,7 @@ package deleter import ( + "reflect" "strings" "testing" @@ -50,6 +51,29 @@ func TestDelete(t *testing.T) { } } +func TestSuccessfulDeletes(t *testing.T) { + d := New("FooBar", successfulDeleteFunc()) + d.Delete([]string{"foo", "bar"}) + + expected := []string{"foo", "bar"} + if got := d.SuccessfulDeletes(); !reflect.DeepEqual(got, expected) { + t.Errorf("expected %v, received %v", expected, got) + } +} + +func TestSuccessfulRelatedDeletes(t *testing.T) { + d := New("FooBar", successfulDeleteFunc()) + d.WithRelated("FooBarRun", successfulListFunc("fbr1", "fbr2"), successfulDeleteFunc()) + + deletedNames := d.Delete([]string{"foo"}) + d.DeleteRelated(deletedNames) + + expected := []string{"fbr1", "fbr2"} + if got := d.SuccessfulRelatedDeletes(); !reflect.DeepEqual(got, expected) { + t.Errorf("expected %v, received %v", expected, got) + } +} + func TestDeleteRelated(t *testing.T) { for _, tc := range []struct { description string