Skip to content

Commit 15b59f9

Browse files
authored
Merge pull request containerd#3441 from YLonely/multiple-task-delete
Update ctr to support deleting multiple tasks at a time
2 parents 41e1723 + 392668d commit 15b59f9

File tree

1 file changed

+44
-17
lines changed

1 file changed

+44
-17
lines changed

cmd/ctr/commands/tasks/delete.go

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,20 @@
1717
package tasks
1818

1919
import (
20+
gocontext "context"
21+
2022
"github.com/containerd/containerd"
2123
"github.com/containerd/containerd/cio"
2224
"github.com/containerd/containerd/cmd/ctr/commands"
25+
"github.com/containerd/containerd/log"
2326
"github.com/urfave/cli"
2427
)
2528

2629
var deleteCommand = cli.Command{
2730
Name: "delete",
28-
Usage: "[flags] delete a task",
29-
ArgsUsage: "CONTAINER",
31+
Usage: "delete one or more tasks",
32+
ArgsUsage: "CONTAINER [CONTAINER, ...]",
33+
Aliases: []string{"rm"},
3034
Flags: []cli.Flag{
3135
cli.BoolFlag{
3236
Name: "force, f",
@@ -47,19 +51,16 @@ var deleteCommand = cli.Command{
4751
return err
4852
}
4953
defer cancel()
50-
container, err := client.LoadContainer(ctx, context.Args().First())
51-
if err != nil {
52-
return err
53-
}
54-
task, err := container.Task(ctx, cio.Load)
55-
if err != nil {
56-
return err
57-
}
5854
var opts []containerd.ProcessDeleteOpts
5955
if force {
6056
opts = append(opts, containerd.WithProcessKill)
6157
}
58+
var exitErr error
6259
if execID != "" {
60+
task, err := loadTask(ctx, client, context.Args().First())
61+
if err != nil {
62+
return err
63+
}
6364
p, err := task.LoadProcess(ctx, execID, nil)
6465
if err != nil {
6566
return err
@@ -72,14 +73,40 @@ var deleteCommand = cli.Command{
7273
return cli.NewExitError("", int(ec))
7374
}
7475
} else {
75-
status, err := task.Delete(ctx, opts...)
76-
if err != nil {
77-
return err
78-
}
79-
if ec := status.ExitCode(); ec != 0 {
80-
return cli.NewExitError("", int(ec))
76+
for _, target := range context.Args() {
77+
task, err := loadTask(ctx, client, target)
78+
if err != nil {
79+
if exitErr == nil {
80+
exitErr = err
81+
}
82+
log.G(ctx).WithError(err).Errorf("failed to load task from %v", target)
83+
continue
84+
}
85+
status, err := task.Delete(ctx, opts...)
86+
if err != nil {
87+
if exitErr == nil {
88+
exitErr = err
89+
}
90+
log.G(ctx).WithError(err).Errorf("unable to delete %v", task.ID())
91+
continue
92+
}
93+
if ec := status.ExitCode(); ec != 0 {
94+
log.G(ctx).Warnf("task %v exit with non-zero exit code %v", task.ID(), int(ec))
95+
}
8196
}
8297
}
83-
return nil
98+
return exitErr
8499
},
85100
}
101+
102+
func loadTask(ctx gocontext.Context, client *containerd.Client, containerID string) (containerd.Task, error) {
103+
container, err := client.LoadContainer(ctx, containerID)
104+
if err != nil {
105+
return nil, err
106+
}
107+
task, err := container.Task(ctx, cio.Load)
108+
if err != nil {
109+
return nil, err
110+
}
111+
return task, nil
112+
}

0 commit comments

Comments
 (0)