Signed-off-by: Alexander Morozov <lk4d4@docker.com> Signed-off-by: Michael Crosby <crosbymichael@gmail.com> Conflicts: ctr/container.go
		
			
				
	
	
		
			120 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"os"
 | 
						|
	"text/tabwriter"
 | 
						|
 | 
						|
	"github.com/codegangsta/cli"
 | 
						|
	"github.com/docker/containerd/api/grpc/types"
 | 
						|
	netcontext "golang.org/x/net/context"
 | 
						|
)
 | 
						|
 | 
						|
var CheckpointCommand = cli.Command{
 | 
						|
	Name:  "checkpoints",
 | 
						|
	Usage: "list all checkpoints",
 | 
						|
	Subcommands: []cli.Command{
 | 
						|
		ListCheckpointCommand,
 | 
						|
		CreateCheckpointCommand,
 | 
						|
	},
 | 
						|
	Action: listCheckpoints,
 | 
						|
}
 | 
						|
 | 
						|
var ListCheckpointCommand = cli.Command{
 | 
						|
	Name:   "list",
 | 
						|
	Usage:  "list all checkpoints for a container",
 | 
						|
	Action: listCheckpoints,
 | 
						|
}
 | 
						|
 | 
						|
func listCheckpoints(context *cli.Context) {
 | 
						|
	var (
 | 
						|
		c  = getClient(context)
 | 
						|
		id = context.Args().First()
 | 
						|
	)
 | 
						|
	if id == "" {
 | 
						|
		fatal("container id cannot be empty", 1)
 | 
						|
	}
 | 
						|
	resp, err := c.ListCheckpoint(netcontext.Background(), &types.ListCheckpointRequest{
 | 
						|
		Id: id,
 | 
						|
	})
 | 
						|
	if err != nil {
 | 
						|
		fatal(err.Error(), 1)
 | 
						|
	}
 | 
						|
	w := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0)
 | 
						|
	fmt.Fprint(w, "NAME\tTCP\tUNIX SOCKETS\tSHELL\n")
 | 
						|
	for _, c := range resp.Checkpoints {
 | 
						|
		fmt.Fprintf(w, "%s\t%v\t%v\t%v\n", c.Name, c.Tcp, c.UnixSockets, c.Shell)
 | 
						|
	}
 | 
						|
	if err := w.Flush(); err != nil {
 | 
						|
		fatal(err.Error(), 1)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
var CreateCheckpointCommand = cli.Command{
 | 
						|
	Name:  "create",
 | 
						|
	Usage: "create a new checkpoint for the container",
 | 
						|
	Flags: []cli.Flag{
 | 
						|
		cli.BoolFlag{
 | 
						|
			Name:  "tcp",
 | 
						|
			Usage: "persist open tcp connections",
 | 
						|
		},
 | 
						|
		cli.BoolFlag{
 | 
						|
			Name:  "unix-sockets",
 | 
						|
			Usage: "perist unix sockets",
 | 
						|
		},
 | 
						|
		cli.BoolFlag{
 | 
						|
			Name:  "exit",
 | 
						|
			Usage: "exit the container after the checkpoint completes successfully",
 | 
						|
		},
 | 
						|
		cli.BoolFlag{
 | 
						|
			Name:  "shell",
 | 
						|
			Usage: "checkpoint shell jobs",
 | 
						|
		},
 | 
						|
	},
 | 
						|
	Action: func(context *cli.Context) {
 | 
						|
		var (
 | 
						|
			containerID = context.Args().Get(0)
 | 
						|
			name        = context.Args().Get(1)
 | 
						|
		)
 | 
						|
		if containerID == "" {
 | 
						|
			fatal("container id at cannot be empty", 1)
 | 
						|
		}
 | 
						|
		if name == "" {
 | 
						|
			fatal("checkpoint name cannot be empty", 1)
 | 
						|
		}
 | 
						|
		c := getClient(context)
 | 
						|
		if _, err := c.CreateCheckpoint(netcontext.Background(), &types.CreateCheckpointRequest{
 | 
						|
			Id: containerID,
 | 
						|
			Checkpoint: &types.Checkpoint{
 | 
						|
				Name: name,
 | 
						|
			},
 | 
						|
		}); err != nil {
 | 
						|
			fatal(err.Error(), 1)
 | 
						|
		}
 | 
						|
	},
 | 
						|
}
 | 
						|
 | 
						|
var DeleteCheckpointCommand = cli.Command{
 | 
						|
	Name:  "delete",
 | 
						|
	Usage: "delete a container's checkpoint",
 | 
						|
	Action: func(context *cli.Context) {
 | 
						|
		var (
 | 
						|
			containerID = context.Args().Get(0)
 | 
						|
			name        = context.Args().Get(1)
 | 
						|
		)
 | 
						|
		if containerID == "" {
 | 
						|
			fatal("container id at cannot be empty", 1)
 | 
						|
		}
 | 
						|
		if name == "" {
 | 
						|
			fatal("checkpoint name cannot be empty", 1)
 | 
						|
		}
 | 
						|
		c := getClient(context)
 | 
						|
		if _, err := c.DeleteCheckpoint(netcontext.Background(), &types.DeleteCheckpointRequest{
 | 
						|
			Id:   containerID,
 | 
						|
			Name: name,
 | 
						|
		}); err != nil {
 | 
						|
			fatal(err.Error(), 1)
 | 
						|
		}
 | 
						|
	},
 | 
						|
}
 |