Merge pull request #1299 from crosbymichael/ctr
Update ctr containers and tasks command
This commit is contained in:
commit
738c22a756
@ -9,7 +9,7 @@ import (
|
|||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
var attachCommand = cli.Command{
|
var taskAttachCommand = cli.Command{
|
||||||
Name: "attach",
|
Name: "attach",
|
||||||
Usage: "attach to the IO of a running container",
|
Usage: "attach to the IO of a running container",
|
||||||
ArgsUsage: "CONTAINER",
|
ArgsUsage: "CONTAINER",
|
||||||
|
@ -8,7 +8,7 @@ import (
|
|||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
var checkpointCommand = cli.Command{
|
var taskCheckpointCommand = cli.Command{
|
||||||
Name: "checkpoint",
|
Name: "checkpoint",
|
||||||
Usage: "checkpoint a container",
|
Usage: "checkpoint a container",
|
||||||
ArgsUsage: "CONTAINER",
|
ArgsUsage: "CONTAINER",
|
||||||
|
77
cmd/ctr/containers.go
Normal file
77
cmd/ctr/containers.go
Normal file
@ -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()
|
||||||
|
},
|
||||||
|
}
|
@ -9,7 +9,7 @@ import (
|
|||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
var execCommand = cli.Command{
|
var taskExecCommand = cli.Command{
|
||||||
Name: "exec",
|
Name: "exec",
|
||||||
Usage: "execute additional processes in an existing container",
|
Usage: "execute additional processes in an existing container",
|
||||||
ArgsUsage: "CONTAINER CMD [ARG...]",
|
ArgsUsage: "CONTAINER CMD [ARG...]",
|
||||||
|
@ -9,7 +9,7 @@ import (
|
|||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
var infoCommand = cli.Command{
|
var containerInfoCommand = cli.Command{
|
||||||
Name: "info",
|
Name: "info",
|
||||||
Usage: "get info about a container",
|
Usage: "get info about a container",
|
||||||
ArgsUsage: "CONTAINER",
|
ArgsUsage: "CONTAINER",
|
||||||
|
@ -5,7 +5,7 @@ import (
|
|||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
var killCommand = cli.Command{
|
var taskKillCommand = cli.Command{
|
||||||
Name: "kill",
|
Name: "kill",
|
||||||
Usage: "signal a container (default: SIGTERM)",
|
Usage: "signal a container (default: SIGTERM)",
|
||||||
ArgsUsage: "CONTAINER",
|
ArgsUsage: "CONTAINER",
|
||||||
|
138
cmd/ctr/list.go
138
cmd/ctr/list.go
@ -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
|
|
||||||
}
|
|
@ -65,30 +65,21 @@ containerd CLI
|
|||||||
}
|
}
|
||||||
app.Commands = append([]cli.Command{
|
app.Commands = append([]cli.Command{
|
||||||
applyCommand,
|
applyCommand,
|
||||||
attachCommand,
|
|
||||||
checkpointCommand,
|
|
||||||
containersCommand,
|
containersCommand,
|
||||||
contentCommand,
|
contentCommand,
|
||||||
eventsCommand,
|
eventsCommand,
|
||||||
execCommand,
|
|
||||||
fetchCommand,
|
fetchCommand,
|
||||||
fetchObjectCommand,
|
fetchObjectCommand,
|
||||||
imageCommand,
|
imageCommand,
|
||||||
infoCommand,
|
|
||||||
killCommand,
|
|
||||||
namespacesCommand,
|
namespacesCommand,
|
||||||
pauseCommand,
|
|
||||||
pprofCommand,
|
pprofCommand,
|
||||||
psCommand,
|
|
||||||
pullCommand,
|
pullCommand,
|
||||||
pushCommand,
|
pushCommand,
|
||||||
pushObjectCommand,
|
pushObjectCommand,
|
||||||
resumeCommand,
|
|
||||||
rootfsCommand,
|
rootfsCommand,
|
||||||
runCommand,
|
runCommand,
|
||||||
snapshotCommand,
|
snapshotCommand,
|
||||||
startCommand,
|
tasksCommand,
|
||||||
taskListCommand,
|
|
||||||
versionCommand,
|
versionCommand,
|
||||||
}, extraCmds...)
|
}, extraCmds...)
|
||||||
app.Before = func(context *cli.Context) error {
|
app.Before = func(context *cli.Context) error {
|
||||||
@ -102,14 +93,3 @@ containerd CLI
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var containersCommand = cli.Command{
|
|
||||||
Name: "containers",
|
|
||||||
Usage: "manage containers (metadata)",
|
|
||||||
Aliases: []string{"c"},
|
|
||||||
Subcommands: []cli.Command{
|
|
||||||
containersListCommand,
|
|
||||||
containersDeleteCommand,
|
|
||||||
containersSetLabelsCommand,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
@ -2,7 +2,7 @@ package main
|
|||||||
|
|
||||||
import "github.com/urfave/cli"
|
import "github.com/urfave/cli"
|
||||||
|
|
||||||
var pauseCommand = cli.Command{
|
var taskPauseCommand = cli.Command{
|
||||||
Name: "pause",
|
Name: "pause",
|
||||||
Usage: "pause an existing container",
|
Usage: "pause an existing container",
|
||||||
ArgsUsage: "CONTAINER",
|
ArgsUsage: "CONTAINER",
|
||||||
|
@ -9,7 +9,7 @@ import (
|
|||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
var psCommand = cli.Command{
|
var taskPsCommand = cli.Command{
|
||||||
Name: "ps",
|
Name: "ps",
|
||||||
Usage: "list processes for container",
|
Usage: "list processes for container",
|
||||||
ArgsUsage: "CONTAINER",
|
ArgsUsage: "CONTAINER",
|
||||||
|
@ -2,7 +2,7 @@ package main
|
|||||||
|
|
||||||
import "github.com/urfave/cli"
|
import "github.com/urfave/cli"
|
||||||
|
|
||||||
var resumeCommand = cli.Command{
|
var taskResumeCommand = cli.Command{
|
||||||
Name: "resume",
|
Name: "resume",
|
||||||
Usage: "resume a paused container",
|
Usage: "resume a paused container",
|
||||||
ArgsUsage: "CONTAINER",
|
ArgsUsage: "CONTAINER",
|
||||||
|
@ -8,7 +8,7 @@ import (
|
|||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
var startCommand = cli.Command{
|
var taskStartCommand = cli.Command{
|
||||||
Name: "start",
|
Name: "start",
|
||||||
Usage: "start a container that have been created",
|
Usage: "start a container that have been created",
|
||||||
ArgsUsage: "CONTAINER",
|
ArgsUsage: "CONTAINER",
|
||||||
|
68
cmd/ctr/task.go
Normal file
68
cmd/ctr/task.go
Normal file
@ -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()
|
||||||
|
},
|
||||||
|
}
|
33
cmd/ctr/task_delete.go
Normal file
33
cmd/ctr/task_delete.go
Normal file
@ -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
|
||||||
|
},
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user