diff --git a/cmd/ctr/attach.go b/cmd/ctr/attach.go index d11ba747f..c4934fa21 100644 --- a/cmd/ctr/attach.go +++ b/cmd/ctr/attach.go @@ -9,7 +9,7 @@ import ( "github.com/urfave/cli" ) -var attachCommand = cli.Command{ +var taskAttachCommand = cli.Command{ Name: "attach", Usage: "attach to the IO of a running container", ArgsUsage: "CONTAINER", diff --git a/cmd/ctr/checkpoint.go b/cmd/ctr/checkpoint.go index 2bea3169a..f34fc83ab 100644 --- a/cmd/ctr/checkpoint.go +++ b/cmd/ctr/checkpoint.go @@ -8,7 +8,7 @@ import ( "github.com/urfave/cli" ) -var checkpointCommand = cli.Command{ +var taskCheckpointCommand = cli.Command{ Name: "checkpoint", Usage: "checkpoint a container", ArgsUsage: "CONTAINER", diff --git a/cmd/ctr/delete.go b/cmd/ctr/container_delete.go similarity index 100% rename from cmd/ctr/delete.go rename to cmd/ctr/container_delete.go diff --git a/cmd/ctr/containers.go b/cmd/ctr/containers.go new file mode 100644 index 000000000..06002a53b --- /dev/null +++ b/cmd/ctr/containers.go @@ -0,0 +1,77 @@ +package main + +import ( + "fmt" + "os" + "strings" + "text/tabwriter" + + "github.com/urfave/cli" +) + +var containersCommand = cli.Command{ + Name: "containers", + Usage: "manage containers (metadata)", + Aliases: []string{"c"}, + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "quiet, q", + Usage: "print only the container id", + }, + }, + Subcommands: []cli.Command{ + containersDeleteCommand, + containersSetLabelsCommand, + containerInfoCommand, + }, + ArgsUsage: "[filter, ...]", + Action: func(context *cli.Context) error { + var ( + filters = context.Args() + quiet = context.Bool("quiet") + ctx, cancel = appContext(context) + ) + defer cancel() + + client, err := newClient(context) + if err != nil { + return err + } + containers, err := client.Containers(ctx, filters...) + if err != nil { + return err + } + if quiet { + for _, c := range containers { + fmt.Printf("%s\n", c.ID()) + } + return nil + } + w := tabwriter.NewWriter(os.Stdout, 4, 8, 4, ' ', 0) + fmt.Fprintln(w, "CONTAINER\tIMAGE\tRUNTIME\tLABELS\t") + for _, c := range containers { + var labelStrings []string + for k, v := range c.Info().Labels { + labelStrings = append(labelStrings, strings.Join([]string{k, v}, "=")) + } + labels := strings.Join(labelStrings, ",") + if labels == "" { + labels = "-" + } + imageName := c.Info().Image + if imageName == "" { + imageName = "-" + } + record := c.Info() + if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%v\t\n", + c.ID(), + imageName, + record.Runtime.Name, + labels, + ); err != nil { + return err + } + } + return w.Flush() + }, +} diff --git a/cmd/ctr/exec.go b/cmd/ctr/exec.go index 82fd7a83c..015836d81 100644 --- a/cmd/ctr/exec.go +++ b/cmd/ctr/exec.go @@ -9,7 +9,7 @@ import ( "github.com/urfave/cli" ) -var execCommand = cli.Command{ +var taskExecCommand = cli.Command{ Name: "exec", Usage: "execute additional processes in an existing container", ArgsUsage: "CONTAINER CMD [ARG...]", diff --git a/cmd/ctr/info.go b/cmd/ctr/info.go index 37a7400fa..fcbc28e3a 100644 --- a/cmd/ctr/info.go +++ b/cmd/ctr/info.go @@ -9,7 +9,7 @@ import ( "github.com/urfave/cli" ) -var infoCommand = cli.Command{ +var containerInfoCommand = cli.Command{ Name: "info", Usage: "get info about a container", ArgsUsage: "CONTAINER", diff --git a/cmd/ctr/kill.go b/cmd/ctr/kill.go index 53213384f..ff914d18b 100644 --- a/cmd/ctr/kill.go +++ b/cmd/ctr/kill.go @@ -5,7 +5,7 @@ import ( "github.com/urfave/cli" ) -var killCommand = cli.Command{ +var taskKillCommand = cli.Command{ Name: "kill", Usage: "signal a container (default: SIGTERM)", ArgsUsage: "CONTAINER", diff --git a/cmd/ctr/list.go b/cmd/ctr/list.go deleted file mode 100644 index 36897cf50..000000000 --- a/cmd/ctr/list.go +++ /dev/null @@ -1,138 +0,0 @@ -package main - -import ( - "fmt" - "os" - "strings" - "text/tabwriter" - - tasks "github.com/containerd/containerd/api/services/tasks/v1" - "github.com/urfave/cli" -) - -var taskListCommand = cli.Command{ - Name: "tasks", - Usage: "manage tasks", - Aliases: []string{"t"}, - Subcommands: []cli.Command{ - { - Name: "list", - Usage: "list tasks", - Aliases: []string{"ls"}, - Flags: []cli.Flag{ - cli.BoolFlag{ - Name: "quiet, q", - Usage: "print only the task id & pid", - }, - }, - Action: taskListFn, - }, - }, -} - -var containersListCommand = cli.Command{ - Name: "list", - Usage: "list all tasks or those that match a filter", - ArgsUsage: "[filter, ...]", - Aliases: []string{"ls"}, - Flags: []cli.Flag{ - cli.BoolFlag{ - Name: "quiet, q", - Usage: "print only the container id", - }, - }, - Action: containerListFn, -} - -func taskListFn(context *cli.Context) error { - var ( - quiet = context.Bool("quiet") - ctx, cancel = appContext(context) - ) - defer cancel() - - client, err := newClient(context) - if err != nil { - return err - } - - s := client.TaskService() - response, err := s.List(ctx, &tasks.ListTasksRequest{}) - if err != nil { - return err - } - - if quiet { - for _, task := range response.Tasks { - fmt.Println(task.ID) - } - } else { - w := tabwriter.NewWriter(os.Stdout, 4, 8, 4, ' ', 0) - fmt.Fprintln(w, "TASK\tPID\tSTATUS\t") - for _, task := range response.Tasks { - if _, err := fmt.Fprintf(w, "%s\t%d\t%s\n", - task.ID, - task.Pid, - task.Status.String(), - ); err != nil { - return err - } - } - return w.Flush() - } - return nil -} - -func containerListFn(context *cli.Context) error { - var ( - filters = context.Args() - quiet = context.Bool("quiet") - ctx, cancel = appContext(context) - ) - defer cancel() - - client, err := newClient(context) - if err != nil { - return err - } - containers, err := client.Containers(ctx, filters...) - if err != nil { - return err - } - - if quiet { - for _, c := range containers { - fmt.Printf("%s\n", c.ID()) - } - } else { - w := tabwriter.NewWriter(os.Stdout, 4, 8, 4, ' ', 0) - fmt.Fprintln(w, "CONTAINER\tIMAGE\tRUNTIME\tLABELS\t") - for _, c := range containers { - var labelStrings []string - for k, v := range c.Info().Labels { - labelStrings = append(labelStrings, strings.Join([]string{k, v}, "=")) - } - labels := strings.Join(labelStrings, ",") - if labels == "" { - labels = "-" - } - - imageName := c.Info().Image - if imageName == "" { - imageName = "-" - } - - record := c.Info() - if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%v\t\n", - c.ID(), - imageName, - record.Runtime.Name, - labels, - ); err != nil { - return err - } - } - return w.Flush() - } - return nil -} diff --git a/cmd/ctr/main.go b/cmd/ctr/main.go index 61d8b5d92..9cdee0afc 100644 --- a/cmd/ctr/main.go +++ b/cmd/ctr/main.go @@ -65,30 +65,21 @@ containerd CLI } app.Commands = append([]cli.Command{ applyCommand, - attachCommand, - checkpointCommand, containersCommand, contentCommand, eventsCommand, - execCommand, fetchCommand, fetchObjectCommand, imageCommand, - infoCommand, - killCommand, namespacesCommand, - pauseCommand, pprofCommand, - psCommand, pullCommand, pushCommand, pushObjectCommand, - resumeCommand, rootfsCommand, runCommand, snapshotCommand, - startCommand, - taskListCommand, + tasksCommand, versionCommand, }, extraCmds...) app.Before = func(context *cli.Context) error { @@ -102,14 +93,3 @@ containerd CLI os.Exit(1) } } - -var containersCommand = cli.Command{ - Name: "containers", - Usage: "manage containers (metadata)", - Aliases: []string{"c"}, - Subcommands: []cli.Command{ - containersListCommand, - containersDeleteCommand, - containersSetLabelsCommand, - }, -} diff --git a/cmd/ctr/pause.go b/cmd/ctr/pause.go index 5b2647ae1..4ed454248 100644 --- a/cmd/ctr/pause.go +++ b/cmd/ctr/pause.go @@ -2,7 +2,7 @@ package main import "github.com/urfave/cli" -var pauseCommand = cli.Command{ +var taskPauseCommand = cli.Command{ Name: "pause", Usage: "pause an existing container", ArgsUsage: "CONTAINER", diff --git a/cmd/ctr/ps.go b/cmd/ctr/ps.go index 5ed3eca46..c0a3f354a 100644 --- a/cmd/ctr/ps.go +++ b/cmd/ctr/ps.go @@ -9,7 +9,7 @@ import ( "github.com/urfave/cli" ) -var psCommand = cli.Command{ +var taskPsCommand = cli.Command{ Name: "ps", Usage: "list processes for container", ArgsUsage: "CONTAINER", diff --git a/cmd/ctr/resume.go b/cmd/ctr/resume.go index aeb5dbf55..79258c29c 100644 --- a/cmd/ctr/resume.go +++ b/cmd/ctr/resume.go @@ -2,7 +2,7 @@ package main import "github.com/urfave/cli" -var resumeCommand = cli.Command{ +var taskResumeCommand = cli.Command{ Name: "resume", Usage: "resume a paused container", ArgsUsage: "CONTAINER", diff --git a/cmd/ctr/start.go b/cmd/ctr/start.go index 066b3c53c..59ebefebd 100644 --- a/cmd/ctr/start.go +++ b/cmd/ctr/start.go @@ -8,7 +8,7 @@ import ( "github.com/urfave/cli" ) -var startCommand = cli.Command{ +var taskStartCommand = cli.Command{ Name: "start", Usage: "start a container that have been created", ArgsUsage: "CONTAINER", diff --git a/cmd/ctr/task.go b/cmd/ctr/task.go new file mode 100644 index 000000000..f1d84941e --- /dev/null +++ b/cmd/ctr/task.go @@ -0,0 +1,68 @@ +package main + +import ( + "fmt" + "os" + "text/tabwriter" + + tasks "github.com/containerd/containerd/api/services/tasks/v1" + "github.com/urfave/cli" +) + +var tasksCommand = cli.Command{ + Name: "tasks", + Usage: "manage tasks", + Aliases: []string{"t"}, + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "quiet, q", + Usage: "print only the task id & pid", + }, + }, + Subcommands: []cli.Command{ + taskAttachCommand, + taskCheckpointCommand, + taskExecCommand, + taskKillCommand, + taskPauseCommand, + taskPsCommand, + taskResumeCommand, + taskStartCommand, + taskDeleteCommand, + }, + Action: func(context *cli.Context) error { + var ( + quiet = context.Bool("quiet") + ctx, cancel = appContext(context) + ) + defer cancel() + + client, err := newClient(context) + if err != nil { + return err + } + s := client.TaskService() + response, err := s.List(ctx, &tasks.ListTasksRequest{}) + if err != nil { + return err + } + if quiet { + for _, task := range response.Tasks { + fmt.Println(task.ID) + } + return nil + } + w := tabwriter.NewWriter(os.Stdout, 4, 8, 4, ' ', 0) + fmt.Fprintln(w, "TASK\tPID\tSTATUS\t") + for _, task := range response.Tasks { + if _, err := fmt.Fprintf(w, "%s\t%d\t%s\n", + task.ID, + task.Pid, + task.Status.String(), + ); err != nil { + return err + } + } + return w.Flush() + }, +} diff --git a/cmd/ctr/task_delete.go b/cmd/ctr/task_delete.go new file mode 100644 index 000000000..932cc3b80 --- /dev/null +++ b/cmd/ctr/task_delete.go @@ -0,0 +1,33 @@ +package main + +import "github.com/urfave/cli" + +var taskDeleteCommand = cli.Command{ + Name: "delete", + Usage: "delete a task", + ArgsUsage: "CONTAINER", + Action: func(context *cli.Context) error { + ctx, cancel := appContext(context) + defer cancel() + client, err := newClient(context) + if err != nil { + return err + } + container, err := client.LoadContainer(ctx, context.Args().First()) + if err != nil { + return err + } + task, err := container.Task(ctx, nil) + if err != nil { + return err + } + status, err := task.Delete(ctx) + if err != nil { + return err + } + if status != 0 { + return cli.NewExitError("", int(status)) + } + return nil + }, +}