зеркало из https://github.com/microsoft/docker.git
Merge pull request #22049 from boucher/docker-checkpoint-restore
Implement containerd API for checkpoints
This commit is contained in:
Коммит
cf58eb437c
15
Dockerfile
15
Dockerfile
|
@ -57,12 +57,17 @@ RUN apt-get update && apt-get install -y \
|
|||
libapparmor-dev \
|
||||
libcap-dev \
|
||||
libltdl-dev \
|
||||
libnl-3-dev \
|
||||
libprotobuf-c0-dev \
|
||||
libprotobuf-dev \
|
||||
libsqlite3-dev \
|
||||
libsystemd-journal-dev \
|
||||
libtool \
|
||||
mercurial \
|
||||
net-tools \
|
||||
pkg-config \
|
||||
protobuf-compiler \
|
||||
protobuf-c-compiler \
|
||||
python-dev \
|
||||
python-mock \
|
||||
python-pip \
|
||||
|
@ -145,6 +150,14 @@ RUN git clone https://github.com/golang/lint.git /go/src/github.com/golang/lint
|
|||
&& (cd /go/src/github.com/golang/lint && git checkout -q $GO_LINT_COMMIT) \
|
||||
&& go install -v github.com/golang/lint/golint
|
||||
|
||||
# Install CRIU for checkpoint/restore support
|
||||
ENV CRIU_VERSION 2.2
|
||||
RUN mkdir -p /usr/src/criu \
|
||||
&& curl -sSL https://github.com/xemul/criu/archive/v${CRIU_VERSION}.tar.gz | tar -v -C /usr/src/criu/ -xz --strip-components=1 \
|
||||
&& cd /usr/src/criu \
|
||||
&& make \
|
||||
&& make install-criu
|
||||
|
||||
# Install two versions of the registry. The first is an older version that
|
||||
# only supports schema1 manifests. The second is a newer version that supports
|
||||
# both. This allows integration-cli tests to cover push/pull with both schema1
|
||||
|
@ -230,7 +243,7 @@ RUN set -x \
|
|||
&& rm -rf "$GOPATH"
|
||||
|
||||
# Install containerd
|
||||
ENV CONTAINERD_COMMIT 8508d2bec90b96403143a1104cdcbd56f6aeb361
|
||||
ENV CONTAINERD_COMMIT 35a736c471ccd3ebfc7b80ceeb0ee303129acd61
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
|
||||
|
|
|
@ -186,7 +186,7 @@ RUN set -x \
|
|||
&& rm -rf "$GOPATH"
|
||||
|
||||
# Install containerd
|
||||
ENV CONTAINERD_COMMIT 8508d2bec90b96403143a1104cdcbd56f6aeb361
|
||||
ENV CONTAINERD_COMMIT 35a736c471ccd3ebfc7b80ceeb0ee303129acd61
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
|
||||
|
|
|
@ -184,7 +184,7 @@ RUN set -x \
|
|||
&& rm -rf "$GOPATH"
|
||||
|
||||
# Install containerd
|
||||
ENV CONTAINERD_COMMIT 8508d2bec90b96403143a1104cdcbd56f6aeb361
|
||||
ENV CONTAINERD_COMMIT 35a736c471ccd3ebfc7b80ceeb0ee303129acd61
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
|
||||
|
|
|
@ -104,7 +104,7 @@ RUN set -x \
|
|||
&& tar -C /usr/local -xzf golang.tar.gz \
|
||||
&& rm golang.tar.gz \
|
||||
&& cd go/src && ./make.bash 2>&1 \
|
||||
&& rm -rf $TEMPDIR
|
||||
&& rm -rf $TEMPDIR
|
||||
|
||||
ENV GOROOT_BOOTSTRAP /usr/local/go
|
||||
ENV PATH /usr/local/go/bin/:$PATH
|
||||
|
@ -204,7 +204,7 @@ RUN set -x \
|
|||
&& rm -rf "$GOPATH"
|
||||
|
||||
# Install containerd
|
||||
ENV CONTAINERD_COMMIT 8508d2bec90b96403143a1104cdcbd56f6aeb361
|
||||
ENV CONTAINERD_COMMIT 35a736c471ccd3ebfc7b80ceeb0ee303129acd61
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
|
||||
|
|
|
@ -196,7 +196,7 @@ RUN set -x \
|
|||
&& rm -rf "$GOPATH"
|
||||
|
||||
# Install containerd
|
||||
ENV CONTAINERD_COMMIT 8508d2bec90b96403143a1104cdcbd56f6aeb361
|
||||
ENV CONTAINERD_COMMIT 35a736c471ccd3ebfc7b80ceeb0ee303129acd61
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
|
||||
|
|
|
@ -68,7 +68,7 @@ RUN set -x \
|
|||
&& rm -rf "$GOPATH"
|
||||
|
||||
# Install containerd
|
||||
ENV CONTAINERD_COMMIT 8508d2bec90b96403143a1104cdcbd56f6aeb361
|
||||
ENV CONTAINERD_COMMIT 35a736c471ccd3ebfc7b80ceeb0ee303129acd61
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
// +build experimental
|
||||
|
||||
package checkpoint
|
||||
|
||||
import "github.com/docker/docker/api/types"
|
||||
|
||||
// Backend for Checkpoint
|
||||
type Backend interface {
|
||||
CheckpointCreate(container string, config types.CheckpointCreateOptions) error
|
||||
CheckpointDelete(container string, checkpointID string) error
|
||||
CheckpointList(container string) ([]types.Checkpoint, error)
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package checkpoint
|
||||
|
||||
import (
|
||||
"github.com/docker/docker/api/server/httputils"
|
||||
"github.com/docker/docker/api/server/router"
|
||||
)
|
||||
|
||||
// checkpointRouter is a router to talk with the checkpoint controller
|
||||
type checkpointRouter struct {
|
||||
backend Backend
|
||||
decoder httputils.ContainerDecoder
|
||||
routes []router.Route
|
||||
}
|
||||
|
||||
// NewRouter initializes a new checkpoint router
|
||||
func NewRouter(b Backend, decoder httputils.ContainerDecoder) router.Router {
|
||||
r := &checkpointRouter{
|
||||
backend: b,
|
||||
decoder: decoder,
|
||||
}
|
||||
r.initRoutes()
|
||||
return r
|
||||
}
|
||||
|
||||
// Routes returns the available routers to the checkpoint controller
|
||||
func (r *checkpointRouter) Routes() []router.Route {
|
||||
return r.routes
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
// +build experimental
|
||||
|
||||
package checkpoint
|
||||
|
||||
import (
|
||||
"github.com/docker/docker/api/server/router"
|
||||
)
|
||||
|
||||
func (r *checkpointRouter) initRoutes() {
|
||||
r.routes = []router.Route{
|
||||
router.NewGetRoute("/containers/{name:.*}/checkpoints", r.getContainerCheckpoints),
|
||||
router.NewPostRoute("/containers/{name:.*}/checkpoints", r.postContainerCheckpoint),
|
||||
router.NewDeleteRoute("/containers/{name}/checkpoints/{checkpoint}", r.deleteContainerCheckpoint),
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
// +build !experimental
|
||||
|
||||
package checkpoint
|
||||
|
||||
func (r *checkpointRouter) initRoutes() {}
|
||||
|
||||
// Backend is empty so that the package can compile in non-experimental
|
||||
type Backend interface{}
|
|
@ -0,0 +1,60 @@
|
|||
// +build experimental
|
||||
|
||||
package checkpoint
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"github.com/docker/docker/api/server/httputils"
|
||||
"github.com/docker/docker/api/types"
|
||||
"golang.org/x/net/context"
|
||||
)
|
||||
|
||||
func (s *checkpointRouter) postContainerCheckpoint(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
if err := httputils.ParseForm(r); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var options types.CheckpointCreateOptions
|
||||
|
||||
decoder := json.NewDecoder(r.Body)
|
||||
if err := decoder.Decode(&options); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err := s.backend.CheckpointCreate(vars["name"], options)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *checkpointRouter) getContainerCheckpoints(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
if err := httputils.ParseForm(r); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
checkpoints, err := s.backend.CheckpointList(vars["name"])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return httputils.WriteJSON(w, http.StatusOK, checkpoints)
|
||||
}
|
||||
|
||||
func (s *checkpointRouter) deleteContainerCheckpoint(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
if err := httputils.ParseForm(r); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err := s.backend.CheckpointDelete(vars["name"], vars["checkpoint"])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
return nil
|
||||
}
|
|
@ -39,7 +39,7 @@ type stateBackend interface {
|
|||
ContainerResize(name string, height, width int) error
|
||||
ContainerRestart(name string, seconds int) error
|
||||
ContainerRm(name string, config *types.ContainerRmConfig) error
|
||||
ContainerStart(name string, hostConfig *container.HostConfig, validateHostname bool) error
|
||||
ContainerStart(name string, hostConfig *container.HostConfig, validateHostname bool, checkpoint string) error
|
||||
ContainerStop(name string, seconds int) error
|
||||
ContainerUnpause(name string) error
|
||||
ContainerUpdate(name string, hostConfig *container.HostConfig, validateHostname bool) (types.ContainerUpdateResponse, error)
|
||||
|
|
|
@ -151,10 +151,16 @@ func (s *containerRouter) postContainersStart(ctx context.Context, w http.Respon
|
|||
hostConfig = c
|
||||
}
|
||||
|
||||
validateHostname := versions.GreaterThanOrEqualTo(version, "1.24")
|
||||
if err := s.backend.ContainerStart(vars["name"], hostConfig, validateHostname); err != nil {
|
||||
if err := httputils.ParseForm(r); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
checkpoint := r.Form.Get("checkpoint")
|
||||
validateHostname := versions.GreaterThanOrEqualTo(version, "1.24")
|
||||
if err := s.backend.ContainerStart(vars["name"], hostConfig, validateHostname, checkpoint); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -124,12 +124,19 @@ type Backend interface {
|
|||
// ContainerKill stops the container execution abruptly.
|
||||
ContainerKill(containerID string, sig uint64) error
|
||||
// ContainerStart starts a new container
|
||||
ContainerStart(containerID string, hostConfig *container.HostConfig, validateHostname bool) error
|
||||
ContainerStart(containerID string, hostConfig *container.HostConfig, validateHostname bool, checkpoint string) error
|
||||
// ContainerWait stops processing until the given container is stopped.
|
||||
ContainerWait(containerID string, timeout time.Duration) (int, error)
|
||||
// ContainerUpdateCmdOnBuild updates container.Path and container.Args
|
||||
ContainerUpdateCmdOnBuild(containerID string, cmd []string) error
|
||||
|
||||
// CheckpointCreate checkpoints a running container
|
||||
CheckpointCreate(container string, config types.CheckpointCreateOptions) error
|
||||
// CheckpointDelete deletes a container's checkpoint
|
||||
CheckpointDelete(container string, checkpoint string) error
|
||||
// CheckpointList lists the available checkpoints for a container
|
||||
CheckpointList(container string) ([]types.Checkpoint, error)
|
||||
|
||||
// ContainerCopy copies/extracts a source FileInfo to a destination path inside a container
|
||||
// specified by a container object.
|
||||
// TODO: make an Extract method instead of passing `decompress`
|
||||
|
|
|
@ -555,7 +555,7 @@ func (b *Builder) run(cID string) (err error) {
|
|||
}
|
||||
}()
|
||||
|
||||
if err := b.docker.ContainerStart(cID, nil, true); err != nil {
|
||||
if err := b.docker.ContainerStart(cID, nil, true, ""); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
// +build !experimental
|
||||
|
||||
package checkpoint
|
||||
|
||||
import (
|
||||
"github.com/docker/docker/cli/command"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
// NewCheckpointCommand appends the `checkpoint` subcommands to rootCmd (only in experimental)
|
||||
func NewCheckpointCommand(rootCmd *cobra.Command, dockerCli *command.DockerCli) {
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
// +build experimental
|
||||
|
||||
package checkpoint
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
"github.com/docker/docker/cli"
|
||||
"github.com/docker/docker/cli/command"
|
||||
)
|
||||
|
||||
// NewCheckpointCommand appends the `checkpoint` subcommands to rootCmd
|
||||
func NewCheckpointCommand(rootCmd *cobra.Command, dockerCli *command.DockerCli) {
|
||||
cmd := &cobra.Command{
|
||||
Use: "checkpoint",
|
||||
Short: "Manage Container Checkpoints",
|
||||
Args: cli.NoArgs,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString())
|
||||
},
|
||||
}
|
||||
cmd.AddCommand(
|
||||
newCreateCommand(dockerCli),
|
||||
newListCommand(dockerCli),
|
||||
newRemoveCommand(dockerCli),
|
||||
)
|
||||
|
||||
rootCmd.AddCommand(cmd)
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
// +build experimental
|
||||
|
||||
package checkpoint
|
||||
|
||||
import (
|
||||
"golang.org/x/net/context"
|
||||
|
||||
"github.com/docker/docker/api/types"
|
||||
"github.com/docker/docker/cli"
|
||||
"github.com/docker/docker/cli/command"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
type createOptions struct {
|
||||
container string
|
||||
checkpoint string
|
||||
leaveRunning bool
|
||||
}
|
||||
|
||||
func newCreateCommand(dockerCli *command.DockerCli) *cobra.Command {
|
||||
var opts createOptions
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Use: "create CONTAINER CHECKPOINT",
|
||||
Short: "Create a checkpoint from a running container",
|
||||
Args: cli.ExactArgs(2),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
opts.container = args[0]
|
||||
opts.checkpoint = args[1]
|
||||
return runCreate(dockerCli, opts)
|
||||
},
|
||||
}
|
||||
|
||||
flags := cmd.Flags()
|
||||
flags.BoolVar(&opts.leaveRunning, "leave-running", false, "leave the container running after checkpoint")
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
func runCreate(dockerCli *command.DockerCli, opts createOptions) error {
|
||||
client := dockerCli.Client()
|
||||
|
||||
checkpointOpts := types.CheckpointCreateOptions{
|
||||
CheckpointID: opts.checkpoint,
|
||||
Exit: !opts.leaveRunning,
|
||||
}
|
||||
|
||||
err := client.CheckpointCreate(context.Background(), opts.container, checkpointOpts)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
// +build experimental
|
||||
|
||||
package checkpoint
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"text/tabwriter"
|
||||
|
||||
"golang.org/x/net/context"
|
||||
|
||||
"github.com/docker/docker/cli"
|
||||
"github.com/docker/docker/cli/command"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
func newListCommand(dockerCli *command.DockerCli) *cobra.Command {
|
||||
return &cobra.Command{
|
||||
Use: "ls CONTAINER",
|
||||
Aliases: []string{"list"},
|
||||
Short: "List checkpoints for a container",
|
||||
Args: cli.ExactArgs(1),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
return runList(dockerCli, args[0])
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func runList(dockerCli *command.DockerCli, container string) error {
|
||||
client := dockerCli.Client()
|
||||
|
||||
checkpoints, err := client.CheckpointList(context.Background(), container)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
w := tabwriter.NewWriter(dockerCli.Out(), 20, 1, 3, ' ', 0)
|
||||
fmt.Fprintf(w, "CHECKPOINT NAME")
|
||||
fmt.Fprintf(w, "\n")
|
||||
|
||||
for _, checkpoint := range checkpoints {
|
||||
fmt.Fprintf(w, "%s\t", checkpoint.Name)
|
||||
fmt.Fprint(w, "\n")
|
||||
}
|
||||
|
||||
w.Flush()
|
||||
return nil
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
// +build experimental
|
||||
|
||||
package checkpoint
|
||||
|
||||
import (
|
||||
"golang.org/x/net/context"
|
||||
|
||||
"github.com/docker/docker/cli"
|
||||
"github.com/docker/docker/cli/command"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
func newRemoveCommand(dockerCli *command.DockerCli) *cobra.Command {
|
||||
return &cobra.Command{
|
||||
Use: "rm CONTAINER CHECKPOINT",
|
||||
Aliases: []string{"remove"},
|
||||
Short: "Remove a checkpoint",
|
||||
Args: cli.ExactArgs(2),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
return runRemove(dockerCli, args[0], args[1])
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func runRemove(dockerCli *command.DockerCli, container string, checkpoint string) error {
|
||||
client := dockerCli.Client()
|
||||
return client.CheckpointDelete(context.Background(), container, checkpoint)
|
||||
}
|
|
@ -2,6 +2,7 @@ package commands
|
|||
|
||||
import (
|
||||
"github.com/docker/docker/cli/command"
|
||||
"github.com/docker/docker/cli/command/checkpoint"
|
||||
"github.com/docker/docker/cli/command/container"
|
||||
"github.com/docker/docker/cli/command/image"
|
||||
"github.com/docker/docker/cli/command/network"
|
||||
|
@ -67,5 +68,6 @@ func AddCommands(cmd *cobra.Command, dockerCli *command.DockerCli) {
|
|||
volume.NewVolumeCommand(dockerCli),
|
||||
system.NewInfoCommand(dockerCli),
|
||||
)
|
||||
checkpoint.NewCheckpointCommand(cmd, dockerCli)
|
||||
plugin.NewPluginCommand(cmd, dockerCli)
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ type startOptions struct {
|
|||
attach bool
|
||||
openStdin bool
|
||||
detachKeys string
|
||||
checkpoint string
|
||||
|
||||
containers []string
|
||||
}
|
||||
|
@ -42,6 +43,9 @@ func NewStartCommand(dockerCli *command.DockerCli) *cobra.Command {
|
|||
flags.BoolVarP(&opts.attach, "attach", "a", false, "Attach STDOUT/STDERR and forward signals")
|
||||
flags.BoolVarP(&opts.openStdin, "interactive", "i", false, "Attach container's STDIN")
|
||||
flags.StringVar(&opts.detachKeys, "detach-keys", "", "Override the key sequence for detaching a container")
|
||||
|
||||
addExperimentalStartFlags(flags, &opts)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
|
@ -105,9 +109,12 @@ func runStart(dockerCli *command.DockerCli, opts *startOptions) error {
|
|||
// 3. We should open a channel for receiving status code of the container
|
||||
// no matter it's detached, removed on daemon side(--rm) or exit normally.
|
||||
statusChan, statusErr := waitExitOrRemoved(dockerCli, context.Background(), c.ID, c.HostConfig.AutoRemove)
|
||||
startOptions := types.ContainerStartOptions{
|
||||
CheckpointID: opts.checkpoint,
|
||||
}
|
||||
|
||||
// 4. Start the container.
|
||||
if err := dockerCli.Client().ContainerStart(ctx, c.ID, types.ContainerStartOptions{}); err != nil {
|
||||
if err := dockerCli.Client().ContainerStart(ctx, c.ID, startOptions); err != nil {
|
||||
cancelFun()
|
||||
<-cErr
|
||||
if c.HostConfig.AutoRemove && statusErr == nil {
|
||||
|
@ -134,6 +141,16 @@ func runStart(dockerCli *command.DockerCli, opts *startOptions) error {
|
|||
if status := <-statusChan; status != 0 {
|
||||
return cli.StatusError{StatusCode: status}
|
||||
}
|
||||
} else if opts.checkpoint != "" {
|
||||
if len(opts.containers) > 1 {
|
||||
return fmt.Errorf("You cannot restore multiple containers at once.")
|
||||
}
|
||||
container := opts.containers[0]
|
||||
startOptions := types.ContainerStartOptions{
|
||||
CheckpointID: opts.checkpoint,
|
||||
}
|
||||
return dockerCli.Client().ContainerStart(ctx, container, startOptions)
|
||||
|
||||
} else {
|
||||
// We're not going to attach to anything.
|
||||
// Start as many containers as we want.
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
// +build !experimental
|
||||
|
||||
package container
|
||||
|
||||
import "github.com/spf13/pflag"
|
||||
|
||||
func addExperimentalStartFlags(flags *pflag.FlagSet, opts *startOptions) {
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
// +build experimental
|
||||
|
||||
package container
|
||||
|
||||
import "github.com/spf13/pflag"
|
||||
|
||||
func addExperimentalStartFlags(flags *pflag.FlagSet, opts *startOptions) {
|
||||
flags.StringVar(&opts.checkpoint, "checkpoint", "", "Restore from this checkpoint")
|
||||
}
|
|
@ -398,18 +398,23 @@ func loadDaemonCliConfig(opts daemonOptions) (*daemon.Config, error) {
|
|||
func initRouter(s *apiserver.Server, d *daemon.Daemon, c *cluster.Cluster) {
|
||||
decoder := runconfig.ContainerDecoder{}
|
||||
|
||||
routers := []router.Router{
|
||||
routers := []router.Router{}
|
||||
|
||||
// we need to add the checkpoint router before the container router or the DELETE gets masked
|
||||
routers = addExperimentalRouters(routers, d, decoder)
|
||||
|
||||
routers = append(routers, []router.Router{
|
||||
container.NewRouter(d, decoder),
|
||||
image.NewRouter(d, decoder),
|
||||
systemrouter.NewRouter(d, c),
|
||||
volume.NewRouter(d),
|
||||
build.NewRouter(dockerfile.NewBuildManager(d)),
|
||||
swarmrouter.NewRouter(c),
|
||||
}
|
||||
}...)
|
||||
|
||||
if d.NetworkControllerEnabled() {
|
||||
routers = append(routers, network.NewRouter(d, c))
|
||||
}
|
||||
routers = addExperimentalRouters(routers)
|
||||
|
||||
s.InitRouter(utils.IsDebugEnabled(), routers...)
|
||||
}
|
||||
|
|
|
@ -2,8 +2,12 @@
|
|||
|
||||
package main
|
||||
|
||||
import "github.com/docker/docker/api/server/router"
|
||||
import (
|
||||
"github.com/docker/docker/api/server/httputils"
|
||||
"github.com/docker/docker/api/server/router"
|
||||
"github.com/docker/docker/daemon"
|
||||
)
|
||||
|
||||
func addExperimentalRouters(routers []router.Router) []router.Router {
|
||||
func addExperimentalRouters(routers []router.Router, d *daemon.Daemon, decoder httputils.ContainerDecoder) []router.Router {
|
||||
return routers
|
||||
}
|
||||
|
|
|
@ -3,11 +3,14 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"github.com/docker/docker/api/server/httputils"
|
||||
"github.com/docker/docker/api/server/router"
|
||||
checkpointrouter "github.com/docker/docker/api/server/router/checkpoint"
|
||||
pluginrouter "github.com/docker/docker/api/server/router/plugin"
|
||||
"github.com/docker/docker/daemon"
|
||||
"github.com/docker/docker/plugin"
|
||||
)
|
||||
|
||||
func addExperimentalRouters(routers []router.Router) []router.Router {
|
||||
return append(routers, pluginrouter.NewRouter(plugin.GetManager()))
|
||||
func addExperimentalRouters(routers []router.Router, d *daemon.Daemon, decoder httputils.ContainerDecoder) []router.Router {
|
||||
return append(routers, checkpointrouter.NewRouter(d, decoder), pluginrouter.NewRouter(plugin.GetManager()))
|
||||
}
|
||||
|
|
|
@ -306,6 +306,11 @@ func (container *Container) ConfigPath() (string, error) {
|
|||
return container.GetRootResourcePath(configFileName)
|
||||
}
|
||||
|
||||
// CheckpointDir returns the directory checkpoints are stored in
|
||||
func (container *Container) CheckpointDir() string {
|
||||
return filepath.Join(container.Root, "checkpoints")
|
||||
}
|
||||
|
||||
// StartLogger starts a new logger driver for the container.
|
||||
func (container *Container) StartLogger(cfg containertypes.LogConfig) (logger.Logger, error) {
|
||||
c, err := logger.GetLogDriver(cfg.Type)
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
package daemon
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/docker/docker/api/types"
|
||||
)
|
||||
|
||||
// CheckpointCreate checkpoints the process running in a container with CRIU
|
||||
func (daemon *Daemon) CheckpointCreate(name string, config types.CheckpointCreateOptions) error {
|
||||
container, err := daemon.GetContainer(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !container.IsRunning() {
|
||||
return fmt.Errorf("Container %s not running", name)
|
||||
}
|
||||
|
||||
err = daemon.containerd.CreateCheckpoint(container.ID, config.CheckpointID, container.CheckpointDir(), config.Exit)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Cannot checkpoint container %s: %s", name, err)
|
||||
}
|
||||
|
||||
daemon.LogContainerEvent(container, "checkpoint")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// CheckpointDelete deletes the specified checkpoint
|
||||
func (daemon *Daemon) CheckpointDelete(name string, checkpoint string) error {
|
||||
container, err := daemon.GetContainer(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
checkpointDir := container.CheckpointDir()
|
||||
return os.RemoveAll(filepath.Join(checkpointDir, checkpoint))
|
||||
}
|
||||
|
||||
// CheckpointList deletes the specified checkpoint
|
||||
func (daemon *Daemon) CheckpointList(name string) ([]types.Checkpoint, error) {
|
||||
response := []types.Checkpoint{}
|
||||
|
||||
container, err := daemon.GetContainer(name)
|
||||
if err != nil {
|
||||
return response, err
|
||||
}
|
||||
|
||||
checkpointDir := container.CheckpointDir()
|
||||
if err := os.MkdirAll(checkpointDir, 0755); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
dirs, err := ioutil.ReadDir(checkpointDir)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var out []types.Checkpoint
|
||||
for _, d := range dirs {
|
||||
if !d.IsDir() {
|
||||
continue
|
||||
}
|
||||
path := filepath.Join(checkpointDir, d.Name(), "config.json")
|
||||
data, err := ioutil.ReadFile(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var cpt types.Checkpoint
|
||||
if err := json.Unmarshal(data, &cpt); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out = append(out, cpt)
|
||||
}
|
||||
|
||||
return out, nil
|
||||
}
|
|
@ -24,7 +24,7 @@ type Backend interface {
|
|||
SetupIngress(req clustertypes.NetworkCreateRequest, nodeIP string) error
|
||||
PullImage(ctx context.Context, image, tag string, metaHeaders map[string][]string, authConfig *types.AuthConfig, outStream io.Writer) error
|
||||
CreateManagedContainer(config types.ContainerCreateConfig, validateHostname bool) (types.ContainerCreateResponse, error)
|
||||
ContainerStart(name string, hostConfig *container.HostConfig, validateHostname bool) error
|
||||
ContainerStart(name string, hostConfig *container.HostConfig, validateHostname bool, checkpoint string) error
|
||||
ContainerStop(name string, seconds int) error
|
||||
ConnectContainerToNetwork(containerName, networkName string, endpointConfig *network.EndpointSettings) error
|
||||
UpdateContainerServiceConfig(containerName string, serviceConfig *clustertypes.ServiceConfig) error
|
||||
|
|
|
@ -220,7 +220,7 @@ func (c *containerAdapter) create(ctx context.Context) error {
|
|||
func (c *containerAdapter) start(ctx context.Context) error {
|
||||
version := httputils.VersionFromContext(ctx)
|
||||
validateHostname := versions.GreaterThanOrEqualTo(version, "1.24")
|
||||
return c.backend.ContainerStart(c.container.name(), nil, validateHostname)
|
||||
return c.backend.ContainerStart(c.container.name(), nil, validateHostname, "")
|
||||
}
|
||||
|
||||
func (c *containerAdapter) inspect(ctx context.Context) (types.ContainerJSON, error) {
|
||||
|
|
|
@ -115,6 +115,9 @@ func (daemon *Daemon) create(params types.ContainerCreateConfig, managed bool) (
|
|||
if err := idtools.MkdirAs(container.Root, 0700, rootUID, rootGID); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := idtools.MkdirAs(container.CheckpointDir(), 0700, rootUID, rootGID); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := daemon.setHostConfig(container, params.HostConfig); err != nil {
|
||||
return nil, err
|
||||
|
|
|
@ -287,7 +287,7 @@ func (daemon *Daemon) restore() error {
|
|||
|
||||
// Make sure networks are available before starting
|
||||
daemon.waitForNetworks(c)
|
||||
if err := daemon.containerStart(c); err != nil {
|
||||
if err := daemon.containerStart(c, ""); err != nil {
|
||||
logrus.Errorf("Failed to start container %s: %s", c.ID, err)
|
||||
}
|
||||
close(chNotify)
|
||||
|
|
|
@ -28,7 +28,7 @@ func (daemon *Daemon) postRunProcessing(container *container.Container, e libcon
|
|||
|
||||
// Create a new servicing container, which will start, complete the update, and merge back the
|
||||
// results if it succeeded, all as part of the below function call.
|
||||
if err := daemon.containerd.Create((container.ID + "_servicing"), *spec, servicingOption); err != nil {
|
||||
if err := daemon.containerd.Create((container.ID + "_servicing"), "", "", *spec, servicingOption); err != nil {
|
||||
container.SetExitCode(-1)
|
||||
return fmt.Errorf("Post-run update servicing failed: %s", err)
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ func (daemon *Daemon) containerRestart(container *container.Container, seconds i
|
|||
}
|
||||
}
|
||||
|
||||
if err := daemon.containerStart(container); err != nil {
|
||||
if err := daemon.containerStart(container, ""); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ import (
|
|||
)
|
||||
|
||||
// ContainerStart starts a container.
|
||||
func (daemon *Daemon) ContainerStart(name string, hostConfig *containertypes.HostConfig, validateHostname bool) error {
|
||||
func (daemon *Daemon) ContainerStart(name string, hostConfig *containertypes.HostConfig, validateHostname bool, checkpoint string) error {
|
||||
container, err := daemon.GetContainer(name)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -78,19 +78,19 @@ func (daemon *Daemon) ContainerStart(name string, hostConfig *containertypes.Hos
|
|||
return err
|
||||
}
|
||||
|
||||
return daemon.containerStart(container)
|
||||
return daemon.containerStart(container, checkpoint)
|
||||
}
|
||||
|
||||
// Start starts a container
|
||||
func (daemon *Daemon) Start(container *container.Container) error {
|
||||
return daemon.containerStart(container)
|
||||
return daemon.containerStart(container, "")
|
||||
}
|
||||
|
||||
// containerStart prepares the container to run by setting up everything the
|
||||
// container needs, such as storage and networking, as well as links
|
||||
// between containers. The container is left waiting for a signal to
|
||||
// begin running.
|
||||
func (daemon *Daemon) containerStart(container *container.Container) (err error) {
|
||||
func (daemon *Daemon) containerStart(container *container.Container, checkpoint string) (err error) {
|
||||
container.Lock()
|
||||
defer container.Unlock()
|
||||
|
||||
|
@ -150,7 +150,7 @@ func (daemon *Daemon) containerStart(container *container.Container) (err error)
|
|||
createOptions = append(createOptions, *copts...)
|
||||
}
|
||||
|
||||
if err := daemon.containerd.Create(container.ID, *spec, createOptions...); err != nil {
|
||||
if err := daemon.containerd.Create(container.ID, checkpoint, container.CheckpointDir(), *spec, createOptions...); err != nil {
|
||||
errDesc := grpc.ErrorDesc(err)
|
||||
logrus.Errorf("Create container failed with error: %s", errDesc)
|
||||
// if we receive an internal error from the initial start of a container then lets
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
This page contains a list of features in the Docker engine which are
|
||||
experimental. Experimental features are **not** ready for production. They are
|
||||
provided for test and evaluation in your sandbox environments.
|
||||
provided for test and evaluation in your sandbox environments.
|
||||
|
||||
The information below describes each feature and the GitHub pull requests and
|
||||
issues associated with it. If necessary, links are provided to additional
|
||||
|
@ -74,9 +74,10 @@ to build a Docker binary with the experimental features enabled:
|
|||
* [External graphdriver plugins](plugins_graphdriver.md)
|
||||
* [Macvlan and Ipvlan Network Drivers](vlan-networks.md)
|
||||
* [Docker Stacks and Distributed Application Bundles](docker-stacks-and-bundles.md)
|
||||
* [Checkpoint & Restore](checkpoint-restore.md)
|
||||
|
||||
## How to comment on an experimental feature
|
||||
|
||||
Each feature's documentation includes a list of proposal pull requests or PRs associated with the feature. If you want to comment on or suggest a change to a feature, please add it to the existing feature PR.
|
||||
Each feature's documentation includes a list of proposal pull requests or PRs associated with the feature. If you want to comment on or suggest a change to a feature, please add it to the existing feature PR.
|
||||
|
||||
Issues or problems with a feature? Inquire for help on the `#docker` IRC channel or in on the [Docker Google group](https://groups.google.com/forum/#!forum/docker-user).
|
||||
Issues or problems with a feature? Inquire for help on the `#docker` IRC channel or in on the [Docker Google group](https://groups.google.com/forum/#!forum/docker-user).
|
||||
|
|
|
@ -0,0 +1,75 @@
|
|||
# Docker Checkpoint & Restore
|
||||
|
||||
Checkpoint & Restore is a new feature that allows you to freeze a running
|
||||
container by checkpointing it, which turns its state into a collection of files
|
||||
on disk. Later, the container can be restored from the point it was frozen.
|
||||
|
||||
This is accomplished using a tool called [CRIU](http://criu.org), which is an
|
||||
external dependency of this feature. A good overview of the history of
|
||||
checkpoint and restore in Docker is available in this
|
||||
[Kubernetes blog post](http://blog.kubernetes.io/2015/07/how-did-quake-demo-from-dockercon-work.html).
|
||||
|
||||
## Installing CRIU
|
||||
|
||||
If you use a Debian system, you can add the CRIU PPA and install with apt-get
|
||||
[from the criu launchpad](https://launchpad.net/~criu/+archive/ubuntu/ppa).
|
||||
|
||||
Alternatively, you can [build CRIU from source](http://criu.org/Installation).
|
||||
|
||||
You need at least version 2.0 of CRIU to run checkpoint/restore in Docker.
|
||||
|
||||
## Use cases for checkpoint & restore
|
||||
|
||||
This feature is currently focused on single-host use cases for checkpoint and
|
||||
restore. Here are a few:
|
||||
|
||||
- Restarting the host machine without stopping/starting containers
|
||||
- Speeding up the start time of slow start applications
|
||||
- "Rewinding" processes to an earlier point in time
|
||||
- "Forensic debugging" of running processes
|
||||
|
||||
Another primary use case of checkpoint & restore outside of Docker is the live
|
||||
migration of a server from one machine to another. This is possible with the
|
||||
current implementation, but not currently a priority (and so the workflow is
|
||||
not optimized for the task).
|
||||
|
||||
## Using Checkpoint & Restore
|
||||
|
||||
A new top level commands `docker checkpoint` is introduced, with three subcommands:
|
||||
- `create` (creates a new checkpoint)
|
||||
- `ls` (lists existing checkpoints)
|
||||
- `rm` (deletes an existing checkpoint)
|
||||
|
||||
Additionally, a `--checkpoint` flag is added to the container start command.
|
||||
|
||||
The options for checkpoint create:
|
||||
|
||||
Usage: docker checkpoint [OPTIONS] CONTAINER CHECKPOINT_ID
|
||||
|
||||
Checkpoint the specified container
|
||||
|
||||
--leave-running=false leave the container running after checkpoint
|
||||
|
||||
And to restore a container:
|
||||
|
||||
Usage: docker start --checkpoint CHECKPOINT_ID [OTHER OPTIONS] CONTAINER
|
||||
|
||||
|
||||
A simple example of using checkpoint & restore on a container:
|
||||
|
||||
$ docker run --security-opt=seccomp:unconfined --name cr -d busybox /bin/sh -c 'i=0; while true; do echo $i; i=$(expr $i + 1); sleep 1; done'
|
||||
> abc0123
|
||||
|
||||
$ docker checkpoint create cr checkpoint1
|
||||
|
||||
# <later>
|
||||
$ docker start --checkpoint checkpoint1 cr
|
||||
> abc0123
|
||||
|
||||
This process just logs an incrementing counter to stdout. If you `docker logs`
|
||||
in between running/checkpoint/restoring you should see that the counter
|
||||
increases while the process is running, stops while it's checkpointed, and
|
||||
resumes from the point it left off once you restore.
|
||||
|
||||
Note that seccomp is only supported by CRIU in very up to date kernels.
|
||||
|
|
@ -141,7 +141,7 @@ clone git google.golang.org/cloud dae7e3d993bc3812a2185af60552bb6b847e52a0 https
|
|||
clone git github.com/docker/docker-credential-helpers v0.3.0
|
||||
|
||||
# containerd
|
||||
clone git github.com/docker/containerd 8508d2bec90b96403143a1104cdcbd56f6aeb361
|
||||
clone git github.com/docker/containerd 35a736c471ccd3ebfc7b80ceeb0ee303129acd61
|
||||
|
||||
# cluster
|
||||
clone git github.com/docker/swarmkit 27fbaef4ceed648bb575969ccc9083a6e104a719
|
||||
|
|
|
@ -10,6 +10,7 @@ import (
|
|||
"github.com/docker/docker/pkg/homedir"
|
||||
"github.com/docker/docker/pkg/integration/checker"
|
||||
icmd "github.com/docker/docker/pkg/integration/cmd"
|
||||
"github.com/docker/docker/utils"
|
||||
"github.com/go-check/check"
|
||||
)
|
||||
|
||||
|
@ -122,6 +123,12 @@ func (s *DockerSuite) TestHelpTextVerify(c *check.C) {
|
|||
cmdsToTest = append(cmdsToTest, "network ls")
|
||||
cmdsToTest = append(cmdsToTest, "network rm")
|
||||
|
||||
if utils.ExperimentalBuild() {
|
||||
cmdsToTest = append(cmdsToTest, "checkpoint create")
|
||||
cmdsToTest = append(cmdsToTest, "checkpoint ls")
|
||||
cmdsToTest = append(cmdsToTest, "checkpoint rm")
|
||||
}
|
||||
|
||||
// Divide the list of commands into go routines and run the func testcommand on the commands in parallel
|
||||
// to save runtime of test
|
||||
|
||||
|
|
|
@ -133,7 +133,7 @@ func (clnt *client) prepareBundleDir(uid, gid int) (string, error) {
|
|||
return p, nil
|
||||
}
|
||||
|
||||
func (clnt *client) Create(containerID string, spec Spec, options ...CreateOption) (err error) {
|
||||
func (clnt *client) Create(containerID string, checkpoint string, checkpointDir string, spec Spec, options ...CreateOption) (err error) {
|
||||
clnt.lock(containerID)
|
||||
defer clnt.unlock(containerID)
|
||||
|
||||
|
@ -180,7 +180,7 @@ func (clnt *client) Create(containerID string, spec Spec, options ...CreateOptio
|
|||
return err
|
||||
}
|
||||
|
||||
return container.start()
|
||||
return container.start(checkpoint, checkpointDir)
|
||||
}
|
||||
|
||||
func (clnt *client) Signal(containerID string, sig int) error {
|
||||
|
@ -625,3 +625,57 @@ func (en *exitNotifier) close() {
|
|||
func (en *exitNotifier) wait() <-chan struct{} {
|
||||
return en.c
|
||||
}
|
||||
|
||||
func (clnt *client) CreateCheckpoint(containerID string, checkpointID string, checkpointDir string, exit bool) error {
|
||||
clnt.lock(containerID)
|
||||
defer clnt.unlock(containerID)
|
||||
if _, err := clnt.getContainer(containerID); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err := clnt.remote.apiClient.CreateCheckpoint(context.Background(), &containerd.CreateCheckpointRequest{
|
||||
Id: containerID,
|
||||
Checkpoint: &containerd.Checkpoint{
|
||||
Name: checkpointID,
|
||||
Exit: exit,
|
||||
Tcp: true,
|
||||
UnixSockets: true,
|
||||
Shell: false,
|
||||
EmptyNS: []string{"network"},
|
||||
},
|
||||
CheckpointDir: checkpointDir,
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
func (clnt *client) DeleteCheckpoint(containerID string, checkpointID string, checkpointDir string) error {
|
||||
clnt.lock(containerID)
|
||||
defer clnt.unlock(containerID)
|
||||
if _, err := clnt.getContainer(containerID); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err := clnt.remote.apiClient.DeleteCheckpoint(context.Background(), &containerd.DeleteCheckpointRequest{
|
||||
Id: containerID,
|
||||
Name: checkpointID,
|
||||
CheckpointDir: checkpointDir,
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
func (clnt *client) ListCheckpoints(containerID string, checkpointDir string) (*Checkpoints, error) {
|
||||
clnt.lock(containerID)
|
||||
defer clnt.unlock(containerID)
|
||||
if _, err := clnt.getContainer(containerID); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp, err := clnt.remote.apiClient.ListCheckpoint(context.Background(), &containerd.ListCheckpointRequest{
|
||||
Id: containerID,
|
||||
CheckpointDir: checkpointDir,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return (*Checkpoints)(resp), nil
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ func (clnt *client) AddProcess(ctx context.Context, containerID, processFriendly
|
|||
return nil
|
||||
}
|
||||
|
||||
func (clnt *client) Create(containerID string, spec Spec, options ...CreateOption) (err error) {
|
||||
func (clnt *client) Create(containerID string, checkpoint string, checkpointDir string, spec Spec, options ...CreateOption) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ const defaultOwner = "docker"
|
|||
|
||||
// Create is the entrypoint to create a container from a spec, and if successfully
|
||||
// created, start it too.
|
||||
func (clnt *client) Create(containerID string, spec Spec, options ...CreateOption) error {
|
||||
func (clnt *client) Create(containerID string, checkpoint string, checkpointDir string, spec Spec, options ...CreateOption) error {
|
||||
logrus.Debugln("libcontainerd: client.Create() with spec", spec)
|
||||
|
||||
configuration := &hcsshim.ContainerConfig{
|
||||
|
@ -435,3 +435,15 @@ func (clnt *client) UpdateResources(containerID string, resources Resources) err
|
|||
// but we should return nil for enabling updating container
|
||||
return nil
|
||||
}
|
||||
|
||||
func (clnt *client) CreateCheckpoint(containerID string, checkpointID string, checkpointDir string, exit bool) error {
|
||||
return errors.New("Windows: Containers do not support checkpoints")
|
||||
}
|
||||
|
||||
func (clnt *client) DeleteCheckpoint(containerID string, checkpointID string, checkpointDir string) error {
|
||||
return errors.New("Windows: Containers do not support checkpoints")
|
||||
}
|
||||
|
||||
func (clnt *client) ListCheckpoints(containerID string, checkpointDir string) (*Checkpoints, error) {
|
||||
return nil, errors.New("Windows: Containers do not support checkpoints")
|
||||
}
|
||||
|
|
|
@ -86,7 +86,7 @@ func (ctr *container) spec() (*specs.Spec, error) {
|
|||
return &spec, nil
|
||||
}
|
||||
|
||||
func (ctr *container) start() error {
|
||||
func (ctr *container) start(checkpoint string, checkpointDir string) error {
|
||||
spec, err := ctr.spec()
|
||||
if err != nil {
|
||||
return nil
|
||||
|
@ -97,11 +97,13 @@ func (ctr *container) start() error {
|
|||
}
|
||||
|
||||
r := &containerd.CreateContainerRequest{
|
||||
Id: ctr.containerID,
|
||||
BundlePath: ctr.dir,
|
||||
Stdin: ctr.fifo(syscall.Stdin),
|
||||
Stdout: ctr.fifo(syscall.Stdout),
|
||||
Stderr: ctr.fifo(syscall.Stderr),
|
||||
Id: ctr.containerID,
|
||||
BundlePath: ctr.dir,
|
||||
Stdin: ctr.fifo(syscall.Stdin),
|
||||
Stdout: ctr.fifo(syscall.Stdout),
|
||||
Stderr: ctr.fifo(syscall.Stderr),
|
||||
Checkpoint: checkpoint,
|
||||
CheckpointDir: checkpointDir,
|
||||
// check to see if we are running in ramdisk to disable pivot root
|
||||
NoPivotRoot: os.Getenv("DOCKER_RAMDISK") != "",
|
||||
Runtime: ctr.runtime,
|
||||
|
@ -191,7 +193,7 @@ func (ctr *container) handleEvent(e *containerd.Event) error {
|
|||
defer ctr.client.unlock(ctr.containerID)
|
||||
ctr.restarting = false
|
||||
if err == nil {
|
||||
if err = ctr.start(); err != nil {
|
||||
if err = ctr.start("", ""); err != nil {
|
||||
logrus.Errorf("libcontainerd: error restarting %v", err)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -261,7 +261,7 @@ func (ctr *container) waitExit(process *process, isFirstProcessToStart bool) err
|
|||
ctr.restarting = false
|
||||
ctr.client.deleteContainer(ctr.friendlyName)
|
||||
if err == nil {
|
||||
if err = ctr.client.Create(ctr.containerID, ctr.ociSpec, ctr.options...); err != nil {
|
||||
if err = ctr.client.Create(ctr.containerID, "", "", ctr.ociSpec, ctr.options...); err != nil {
|
||||
logrus.Errorf("libcontainerd: error restarting %v", err)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ type Backend interface {
|
|||
|
||||
// Client provides access to containerd features.
|
||||
type Client interface {
|
||||
Create(containerID string, spec Spec, options ...CreateOption) error
|
||||
Create(containerID string, checkpoint string, checkpointDir string, spec Spec, options ...CreateOption) error
|
||||
Signal(containerID string, sig int) error
|
||||
SignalProcess(containerID string, processFriendlyName string, sig int) error
|
||||
AddProcess(ctx context.Context, containerID, processFriendlyName string, process Process) error
|
||||
|
@ -48,6 +48,9 @@ type Client interface {
|
|||
GetPidsForContainer(containerID string) ([]int, error)
|
||||
Summary(containerID string) ([]Summary, error)
|
||||
UpdateResources(containerID string, resources Resources) error
|
||||
CreateCheckpoint(containerID string, checkpointID string, checkpointDir string, exit bool) error
|
||||
DeleteCheckpoint(containerID string, checkpointID string, checkpointDir string) error
|
||||
ListCheckpoints(containerID string, checkpointDir string) (*Checkpoints, error)
|
||||
}
|
||||
|
||||
// CreateOption allows to configure parameters of container creation.
|
||||
|
|
|
@ -53,3 +53,6 @@ type User specs.User
|
|||
|
||||
// Resources defines updatable container resource values.
|
||||
type Resources containerd.UpdateResource
|
||||
|
||||
// Checkpoints contains the details of a checkpoint
|
||||
type Checkpoints containerd.ListCheckpointResponse
|
||||
|
|
|
@ -37,3 +37,13 @@ type Resources struct{}
|
|||
type ServicingOption struct {
|
||||
IsServicing bool
|
||||
}
|
||||
|
||||
// Checkpoint holds the details of a checkpoint (not supported in windows)
|
||||
type Checkpoint struct {
|
||||
Name string
|
||||
}
|
||||
|
||||
// Checkpoints contains the details of a checkpoint
|
||||
type Checkpoints struct {
|
||||
Checkpoints []*Checkpoint
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@ func (pm *Manager) enable(p *v2.Plugin, force bool) error {
|
|||
}
|
||||
|
||||
p.RestartManager = restartmanager.New(container.RestartPolicy{Name: "always"}, 0)
|
||||
if err := pm.containerdClient.Create(p.GetID(), libcontainerd.Spec(*spec), libcontainerd.WithRestartManager(p.RestartManager)); err != nil {
|
||||
if err := pm.containerdClient.Create(p.GetID(), "", "", libcontainerd.Spec(*spec), libcontainerd.WithRestartManager(p.RestartManager)); err != nil {
|
||||
if err := p.RestartManager.Cancel(); err != nil {
|
||||
logrus.Errorf("enable: restartManager.Cancel failed due to %v", err)
|
||||
}
|
||||
|
|
|
@ -36,6 +36,9 @@ It has these top-level messages:
|
|||
StateResponse
|
||||
UpdateContainerRequest
|
||||
UpdateResource
|
||||
BlockIODevice
|
||||
WeightDevice
|
||||
ThrottleDevice
|
||||
UpdateContainerResponse
|
||||
EventsRequest
|
||||
Event
|
||||
|
@ -454,17 +457,23 @@ func (m *UpdateContainerRequest) GetResources() *UpdateResource {
|
|||
}
|
||||
|
||||
type UpdateResource struct {
|
||||
BlkioWeight uint64 `protobuf:"varint,1,opt,name=blkioWeight" json:"blkioWeight,omitempty"`
|
||||
CpuShares uint64 `protobuf:"varint,2,opt,name=cpuShares" json:"cpuShares,omitempty"`
|
||||
CpuPeriod uint64 `protobuf:"varint,3,opt,name=cpuPeriod" json:"cpuPeriod,omitempty"`
|
||||
CpuQuota uint64 `protobuf:"varint,4,opt,name=cpuQuota" json:"cpuQuota,omitempty"`
|
||||
CpusetCpus string `protobuf:"bytes,5,opt,name=cpusetCpus" json:"cpusetCpus,omitempty"`
|
||||
CpusetMems string `protobuf:"bytes,6,opt,name=cpusetMems" json:"cpusetMems,omitempty"`
|
||||
MemoryLimit uint64 `protobuf:"varint,7,opt,name=memoryLimit" json:"memoryLimit,omitempty"`
|
||||
MemorySwap uint64 `protobuf:"varint,8,opt,name=memorySwap" json:"memorySwap,omitempty"`
|
||||
MemoryReservation uint64 `protobuf:"varint,9,opt,name=memoryReservation" json:"memoryReservation,omitempty"`
|
||||
KernelMemoryLimit uint64 `protobuf:"varint,10,opt,name=kernelMemoryLimit" json:"kernelMemoryLimit,omitempty"`
|
||||
KernelTCPMemoryLimit uint64 `protobuf:"varint,11,opt,name=kernelTCPMemoryLimit" json:"kernelTCPMemoryLimit,omitempty"`
|
||||
BlkioWeight uint64 `protobuf:"varint,1,opt,name=blkioWeight" json:"blkioWeight,omitempty"`
|
||||
CpuShares uint64 `protobuf:"varint,2,opt,name=cpuShares" json:"cpuShares,omitempty"`
|
||||
CpuPeriod uint64 `protobuf:"varint,3,opt,name=cpuPeriod" json:"cpuPeriod,omitempty"`
|
||||
CpuQuota uint64 `protobuf:"varint,4,opt,name=cpuQuota" json:"cpuQuota,omitempty"`
|
||||
CpusetCpus string `protobuf:"bytes,5,opt,name=cpusetCpus" json:"cpusetCpus,omitempty"`
|
||||
CpusetMems string `protobuf:"bytes,6,opt,name=cpusetMems" json:"cpusetMems,omitempty"`
|
||||
MemoryLimit uint64 `protobuf:"varint,7,opt,name=memoryLimit" json:"memoryLimit,omitempty"`
|
||||
MemorySwap uint64 `protobuf:"varint,8,opt,name=memorySwap" json:"memorySwap,omitempty"`
|
||||
MemoryReservation uint64 `protobuf:"varint,9,opt,name=memoryReservation" json:"memoryReservation,omitempty"`
|
||||
KernelMemoryLimit uint64 `protobuf:"varint,10,opt,name=kernelMemoryLimit" json:"kernelMemoryLimit,omitempty"`
|
||||
KernelTCPMemoryLimit uint64 `protobuf:"varint,11,opt,name=kernelTCPMemoryLimit" json:"kernelTCPMemoryLimit,omitempty"`
|
||||
BlkioLeafWeight uint64 `protobuf:"varint,12,opt,name=blkioLeafWeight" json:"blkioLeafWeight,omitempty"`
|
||||
BlkioWeightDevice []*WeightDevice `protobuf:"bytes,13,rep,name=blkioWeightDevice" json:"blkioWeightDevice,omitempty"`
|
||||
BlkioThrottleReadBpsDevice []*ThrottleDevice `protobuf:"bytes,14,rep,name=blkioThrottleReadBpsDevice" json:"blkioThrottleReadBpsDevice,omitempty"`
|
||||
BlkioThrottleWriteBpsDevice []*ThrottleDevice `protobuf:"bytes,15,rep,name=blkioThrottleWriteBpsDevice" json:"blkioThrottleWriteBpsDevice,omitempty"`
|
||||
BlkioThrottleReadIopsDevice []*ThrottleDevice `protobuf:"bytes,16,rep,name=blkioThrottleReadIopsDevice" json:"blkioThrottleReadIopsDevice,omitempty"`
|
||||
BlkioThrottleWriteIopsDevice []*ThrottleDevice `protobuf:"bytes,17,rep,name=blkioThrottleWriteIopsDevice" json:"blkioThrottleWriteIopsDevice,omitempty"`
|
||||
}
|
||||
|
||||
func (m *UpdateResource) Reset() { *m = UpdateResource{} }
|
||||
|
@ -472,13 +481,93 @@ func (m *UpdateResource) String() string { return proto.CompactTextSt
|
|||
func (*UpdateResource) ProtoMessage() {}
|
||||
func (*UpdateResource) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
|
||||
|
||||
func (m *UpdateResource) GetBlkioWeightDevice() []*WeightDevice {
|
||||
if m != nil {
|
||||
return m.BlkioWeightDevice
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *UpdateResource) GetBlkioThrottleReadBpsDevice() []*ThrottleDevice {
|
||||
if m != nil {
|
||||
return m.BlkioThrottleReadBpsDevice
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *UpdateResource) GetBlkioThrottleWriteBpsDevice() []*ThrottleDevice {
|
||||
if m != nil {
|
||||
return m.BlkioThrottleWriteBpsDevice
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *UpdateResource) GetBlkioThrottleReadIopsDevice() []*ThrottleDevice {
|
||||
if m != nil {
|
||||
return m.BlkioThrottleReadIopsDevice
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *UpdateResource) GetBlkioThrottleWriteIopsDevice() []*ThrottleDevice {
|
||||
if m != nil {
|
||||
return m.BlkioThrottleWriteIopsDevice
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type BlockIODevice struct {
|
||||
Major int64 `protobuf:"varint,1,opt,name=major" json:"major,omitempty"`
|
||||
Minor int64 `protobuf:"varint,2,opt,name=minor" json:"minor,omitempty"`
|
||||
}
|
||||
|
||||
func (m *BlockIODevice) Reset() { *m = BlockIODevice{} }
|
||||
func (m *BlockIODevice) String() string { return proto.CompactTextString(m) }
|
||||
func (*BlockIODevice) ProtoMessage() {}
|
||||
func (*BlockIODevice) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
|
||||
|
||||
type WeightDevice struct {
|
||||
BlkIODevice *BlockIODevice `protobuf:"bytes,1,opt,name=blkIODevice" json:"blkIODevice,omitempty"`
|
||||
Weight uint32 `protobuf:"varint,2,opt,name=weight" json:"weight,omitempty"`
|
||||
LeafWeight uint32 `protobuf:"varint,3,opt,name=leafWeight" json:"leafWeight,omitempty"`
|
||||
}
|
||||
|
||||
func (m *WeightDevice) Reset() { *m = WeightDevice{} }
|
||||
func (m *WeightDevice) String() string { return proto.CompactTextString(m) }
|
||||
func (*WeightDevice) ProtoMessage() {}
|
||||
func (*WeightDevice) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
|
||||
|
||||
func (m *WeightDevice) GetBlkIODevice() *BlockIODevice {
|
||||
if m != nil {
|
||||
return m.BlkIODevice
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type ThrottleDevice struct {
|
||||
BlkIODevice *BlockIODevice `protobuf:"bytes,1,opt,name=blkIODevice" json:"blkIODevice,omitempty"`
|
||||
Rate uint64 `protobuf:"varint,2,opt,name=rate" json:"rate,omitempty"`
|
||||
}
|
||||
|
||||
func (m *ThrottleDevice) Reset() { *m = ThrottleDevice{} }
|
||||
func (m *ThrottleDevice) String() string { return proto.CompactTextString(m) }
|
||||
func (*ThrottleDevice) ProtoMessage() {}
|
||||
func (*ThrottleDevice) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
|
||||
|
||||
func (m *ThrottleDevice) GetBlkIODevice() *BlockIODevice {
|
||||
if m != nil {
|
||||
return m.BlkIODevice
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type UpdateContainerResponse struct {
|
||||
}
|
||||
|
||||
func (m *UpdateContainerResponse) Reset() { *m = UpdateContainerResponse{} }
|
||||
func (m *UpdateContainerResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*UpdateContainerResponse) ProtoMessage() {}
|
||||
func (*UpdateContainerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
|
||||
func (*UpdateContainerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
|
||||
|
||||
type EventsRequest struct {
|
||||
// Tag 1 is deprecated (old uint64 timestamp)
|
||||
|
@ -490,7 +579,7 @@ type EventsRequest struct {
|
|||
func (m *EventsRequest) Reset() { *m = EventsRequest{} }
|
||||
func (m *EventsRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*EventsRequest) ProtoMessage() {}
|
||||
func (*EventsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
|
||||
func (*EventsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
|
||||
|
||||
func (m *EventsRequest) GetTimestamp() *google_protobuf.Timestamp {
|
||||
if m != nil {
|
||||
|
@ -511,7 +600,7 @@ type Event struct {
|
|||
func (m *Event) Reset() { *m = Event{} }
|
||||
func (m *Event) String() string { return proto.CompactTextString(m) }
|
||||
func (*Event) ProtoMessage() {}
|
||||
func (*Event) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
|
||||
func (*Event) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }
|
||||
|
||||
func (m *Event) GetTimestamp() *google_protobuf.Timestamp {
|
||||
if m != nil {
|
||||
|
@ -535,7 +624,7 @@ type NetworkStats struct {
|
|||
func (m *NetworkStats) Reset() { *m = NetworkStats{} }
|
||||
func (m *NetworkStats) String() string { return proto.CompactTextString(m) }
|
||||
func (*NetworkStats) ProtoMessage() {}
|
||||
func (*NetworkStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
|
||||
func (*NetworkStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }
|
||||
|
||||
type CpuUsage struct {
|
||||
TotalUsage uint64 `protobuf:"varint,1,opt,name=total_usage,json=totalUsage" json:"total_usage,omitempty"`
|
||||
|
@ -547,7 +636,7 @@ type CpuUsage struct {
|
|||
func (m *CpuUsage) Reset() { *m = CpuUsage{} }
|
||||
func (m *CpuUsage) String() string { return proto.CompactTextString(m) }
|
||||
func (*CpuUsage) ProtoMessage() {}
|
||||
func (*CpuUsage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
|
||||
func (*CpuUsage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }
|
||||
|
||||
type ThrottlingData struct {
|
||||
Periods uint64 `protobuf:"varint,1,opt,name=periods" json:"periods,omitempty"`
|
||||
|
@ -558,7 +647,7 @@ type ThrottlingData struct {
|
|||
func (m *ThrottlingData) Reset() { *m = ThrottlingData{} }
|
||||
func (m *ThrottlingData) String() string { return proto.CompactTextString(m) }
|
||||
func (*ThrottlingData) ProtoMessage() {}
|
||||
func (*ThrottlingData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }
|
||||
func (*ThrottlingData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
|
||||
|
||||
type CpuStats struct {
|
||||
CpuUsage *CpuUsage `protobuf:"bytes,1,opt,name=cpu_usage,json=cpuUsage" json:"cpu_usage,omitempty"`
|
||||
|
@ -569,7 +658,7 @@ type CpuStats struct {
|
|||
func (m *CpuStats) Reset() { *m = CpuStats{} }
|
||||
func (m *CpuStats) String() string { return proto.CompactTextString(m) }
|
||||
func (*CpuStats) ProtoMessage() {}
|
||||
func (*CpuStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }
|
||||
func (*CpuStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }
|
||||
|
||||
func (m *CpuStats) GetCpuUsage() *CpuUsage {
|
||||
if m != nil {
|
||||
|
@ -593,7 +682,7 @@ type PidsStats struct {
|
|||
func (m *PidsStats) Reset() { *m = PidsStats{} }
|
||||
func (m *PidsStats) String() string { return proto.CompactTextString(m) }
|
||||
func (*PidsStats) ProtoMessage() {}
|
||||
func (*PidsStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }
|
||||
func (*PidsStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
|
||||
|
||||
type MemoryData struct {
|
||||
Usage uint64 `protobuf:"varint,1,opt,name=usage" json:"usage,omitempty"`
|
||||
|
@ -605,7 +694,7 @@ type MemoryData struct {
|
|||
func (m *MemoryData) Reset() { *m = MemoryData{} }
|
||||
func (m *MemoryData) String() string { return proto.CompactTextString(m) }
|
||||
func (*MemoryData) ProtoMessage() {}
|
||||
func (*MemoryData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
|
||||
func (*MemoryData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }
|
||||
|
||||
type MemoryStats struct {
|
||||
Cache uint64 `protobuf:"varint,1,opt,name=cache" json:"cache,omitempty"`
|
||||
|
@ -618,7 +707,7 @@ type MemoryStats struct {
|
|||
func (m *MemoryStats) Reset() { *m = MemoryStats{} }
|
||||
func (m *MemoryStats) String() string { return proto.CompactTextString(m) }
|
||||
func (*MemoryStats) ProtoMessage() {}
|
||||
func (*MemoryStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }
|
||||
func (*MemoryStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }
|
||||
|
||||
func (m *MemoryStats) GetUsage() *MemoryData {
|
||||
if m != nil {
|
||||
|
@ -658,7 +747,7 @@ type BlkioStatsEntry struct {
|
|||
func (m *BlkioStatsEntry) Reset() { *m = BlkioStatsEntry{} }
|
||||
func (m *BlkioStatsEntry) String() string { return proto.CompactTextString(m) }
|
||||
func (*BlkioStatsEntry) ProtoMessage() {}
|
||||
func (*BlkioStatsEntry) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
|
||||
func (*BlkioStatsEntry) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }
|
||||
|
||||
type BlkioStats struct {
|
||||
IoServiceBytesRecursive []*BlkioStatsEntry `protobuf:"bytes,1,rep,name=io_service_bytes_recursive,json=ioServiceBytesRecursive" json:"io_service_bytes_recursive,omitempty"`
|
||||
|
@ -674,7 +763,7 @@ type BlkioStats struct {
|
|||
func (m *BlkioStats) Reset() { *m = BlkioStats{} }
|
||||
func (m *BlkioStats) String() string { return proto.CompactTextString(m) }
|
||||
func (*BlkioStats) ProtoMessage() {}
|
||||
func (*BlkioStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }
|
||||
func (*BlkioStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }
|
||||
|
||||
func (m *BlkioStats) GetIoServiceBytesRecursive() []*BlkioStatsEntry {
|
||||
if m != nil {
|
||||
|
@ -742,7 +831,7 @@ type HugetlbStats struct {
|
|||
func (m *HugetlbStats) Reset() { *m = HugetlbStats{} }
|
||||
func (m *HugetlbStats) String() string { return proto.CompactTextString(m) }
|
||||
func (*HugetlbStats) ProtoMessage() {}
|
||||
func (*HugetlbStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }
|
||||
func (*HugetlbStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }
|
||||
|
||||
type CgroupStats struct {
|
||||
CpuStats *CpuStats `protobuf:"bytes,1,opt,name=cpu_stats,json=cpuStats" json:"cpu_stats,omitempty"`
|
||||
|
@ -755,7 +844,7 @@ type CgroupStats struct {
|
|||
func (m *CgroupStats) Reset() { *m = CgroupStats{} }
|
||||
func (m *CgroupStats) String() string { return proto.CompactTextString(m) }
|
||||
func (*CgroupStats) ProtoMessage() {}
|
||||
func (*CgroupStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }
|
||||
func (*CgroupStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} }
|
||||
|
||||
func (m *CgroupStats) GetCpuStats() *CpuStats {
|
||||
if m != nil {
|
||||
|
@ -802,7 +891,7 @@ type StatsResponse struct {
|
|||
func (m *StatsResponse) Reset() { *m = StatsResponse{} }
|
||||
func (m *StatsResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*StatsResponse) ProtoMessage() {}
|
||||
func (*StatsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }
|
||||
func (*StatsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} }
|
||||
|
||||
func (m *StatsResponse) GetNetworkStats() []*NetworkStats {
|
||||
if m != nil {
|
||||
|
@ -832,7 +921,7 @@ type StatsRequest struct {
|
|||
func (m *StatsRequest) Reset() { *m = StatsRequest{} }
|
||||
func (m *StatsRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*StatsRequest) ProtoMessage() {}
|
||||
func (*StatsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }
|
||||
func (*StatsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} }
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*GetServerVersionRequest)(nil), "types.GetServerVersionRequest")
|
||||
|
@ -862,6 +951,9 @@ func init() {
|
|||
proto.RegisterType((*StateResponse)(nil), "types.StateResponse")
|
||||
proto.RegisterType((*UpdateContainerRequest)(nil), "types.UpdateContainerRequest")
|
||||
proto.RegisterType((*UpdateResource)(nil), "types.UpdateResource")
|
||||
proto.RegisterType((*BlockIODevice)(nil), "types.BlockIODevice")
|
||||
proto.RegisterType((*WeightDevice)(nil), "types.WeightDevice")
|
||||
proto.RegisterType((*ThrottleDevice)(nil), "types.ThrottleDevice")
|
||||
proto.RegisterType((*UpdateContainerResponse)(nil), "types.UpdateContainerResponse")
|
||||
proto.RegisterType((*EventsRequest)(nil), "types.EventsRequest")
|
||||
proto.RegisterType((*Event)(nil), "types.Event")
|
||||
|
@ -1343,156 +1435,168 @@ var _API_serviceDesc = grpc.ServiceDesc{
|
|||
}
|
||||
|
||||
var fileDescriptor0 = []byte{
|
||||
// 2414 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0x59, 0xcd, 0x73, 0x1b, 0x4b,
|
||||
0x11, 0x8f, 0xa4, 0xb5, 0x6c, 0xb5, 0x3e, 0x6c, 0x6f, 0xfc, 0xa1, 0xe8, 0xbd, 0x7c, 0xb0, 0xf5,
|
||||
0x80, 0x00, 0xaf, 0x94, 0xa0, 0xbc, 0x57, 0xa4, 0xa0, 0x8a, 0xaa, 0xc4, 0x0e, 0x8f, 0xf0, 0xe2,
|
||||
0x3c, 0x65, 0x6d, 0xf3, 0x8e, 0xaa, 0xb5, 0x76, 0x22, 0x2d, 0x5e, 0xed, 0x6e, 0x76, 0x47, 0xb6,
|
||||
0x7c, 0xe1, 0xc0, 0x01, 0x6e, 0x70, 0xa5, 0x0a, 0x6e, 0xdc, 0xb8, 0x73, 0x80, 0x7f, 0x80, 0x2a,
|
||||
0xfe, 0x10, 0x6e, 0xdc, 0x39, 0xd2, 0xf3, 0xb9, 0xb3, 0xfa, 0xb0, 0x93, 0x03, 0xc5, 0x85, 0x8b,
|
||||
0x6a, 0xfa, 0x37, 0x3d, 0xdd, 0x3d, 0x3d, 0xdd, 0x3d, 0xbd, 0x23, 0xa8, 0x79, 0x49, 0xd0, 0x4d,
|
||||
0xd2, 0x98, 0xc6, 0xf6, 0x1a, 0xbd, 0x4a, 0x48, 0xd6, 0xb9, 0x3f, 0x8a, 0xe3, 0x51, 0x48, 0x1e,
|
||||
0x71, 0xf0, 0x6c, 0xfa, 0xf6, 0x11, 0x0d, 0x26, 0x24, 0xa3, 0xde, 0x24, 0x11, 0x7c, 0xce, 0x1d,
|
||||
0xd8, 0xff, 0x82, 0xd0, 0x63, 0x92, 0x5e, 0x90, 0xf4, 0xe7, 0x24, 0xcd, 0x82, 0x38, 0x72, 0xc9,
|
||||
0xbb, 0x29, 0xf2, 0x38, 0x33, 0x68, 0x2f, 0x4e, 0x65, 0x49, 0x1c, 0x65, 0xc4, 0xde, 0x81, 0xb5,
|
||||
0x89, 0xf7, 0x8b, 0x38, 0x6d, 0x97, 0x1e, 0x94, 0x1e, 0x36, 0x5d, 0x41, 0x70, 0x34, 0x88, 0x10,
|
||||
0x2d, 0x4b, 0x94, 0x11, 0x0c, 0x4d, 0x3c, 0x3a, 0x1c, 0xb7, 0x2b, 0x02, 0xe5, 0x84, 0xdd, 0x81,
|
||||
0x8d, 0x94, 0x5c, 0x04, 0x4c, 0x6a, 0xdb, 0xc2, 0x89, 0x9a, 0xab, 0x69, 0xe7, 0xd7, 0x25, 0xd8,
|
||||
0x39, 0x4d, 0x7c, 0x8f, 0x92, 0x7e, 0x1a, 0x0f, 0x49, 0x96, 0x49, 0x93, 0xec, 0x16, 0x94, 0x03,
|
||||
0x9f, 0xeb, 0xac, 0xb9, 0x38, 0xb2, 0xb7, 0xa0, 0x92, 0x20, 0x50, 0xe6, 0x00, 0x1b, 0xda, 0xf7,
|
||||
0x00, 0x86, 0x61, 0x9c, 0x91, 0x63, 0xea, 0x07, 0x11, 0xd7, 0xb8, 0xe1, 0x1a, 0x08, 0x33, 0xe6,
|
||||
0x32, 0xf0, 0xe9, 0x98, 0xeb, 0x44, 0x63, 0x38, 0x61, 0xef, 0x41, 0x75, 0x4c, 0x82, 0xd1, 0x98,
|
||||
0xb6, 0xd7, 0x38, 0x2c, 0x29, 0x67, 0x1f, 0x76, 0xe7, 0xec, 0x10, 0xfb, 0x77, 0xfe, 0x51, 0x86,
|
||||
0xbd, 0x83, 0x94, 0xe0, 0xcc, 0x41, 0x1c, 0x51, 0x2f, 0x88, 0x48, 0xba, 0xca, 0x46, 0xb4, 0xe8,
|
||||
0x6c, 0x1a, 0xf9, 0x21, 0xe9, 0x7b, 0xa8, 0x56, 0x98, 0x6a, 0x20, 0xdc, 0xe2, 0x31, 0x19, 0x9e,
|
||||
0x27, 0x71, 0x10, 0x51, 0x6e, 0x31, 0xce, 0xe7, 0x08, 0xb3, 0x38, 0xe3, 0x9b, 0x11, 0x5e, 0x12,
|
||||
0x04, 0xb3, 0x18, 0x07, 0xf1, 0x54, 0x58, 0x5c, 0x73, 0x25, 0x25, 0x71, 0x92, 0xa6, 0xed, 0xaa,
|
||||
0xc6, 0x91, 0x62, 0x78, 0xe8, 0x9d, 0x91, 0x30, 0x6b, 0xaf, 0x3f, 0xa8, 0x30, 0x5c, 0x50, 0xf6,
|
||||
0x03, 0xa8, 0x47, 0x71, 0x3f, 0xb8, 0x88, 0xa9, 0x1b, 0xc7, 0xb4, 0xbd, 0xc1, 0x1d, 0x66, 0x42,
|
||||
0x76, 0x1b, 0xd6, 0xd3, 0x69, 0xc4, 0xe2, 0xa6, 0x5d, 0xe3, 0x22, 0x15, 0xc9, 0xd6, 0xca, 0xe1,
|
||||
0xb3, 0x74, 0x94, 0xb5, 0x81, 0x0b, 0x36, 0x21, 0xfb, 0x13, 0x68, 0xe6, 0x3b, 0x39, 0x0c, 0xd2,
|
||||
0x76, 0x9d, 0x4b, 0x28, 0x82, 0xce, 0x4b, 0xd8, 0x5f, 0xf0, 0xa5, 0x8c, 0xb3, 0x2e, 0xd4, 0x86,
|
||||
0x0a, 0xe4, 0x3e, 0xad, 0xf7, 0xb6, 0xba, 0x3c, 0xb4, 0xbb, 0x39, 0x73, 0xce, 0x82, 0xa2, 0x9a,
|
||||
0xc7, 0xc1, 0x28, 0xf2, 0xc2, 0xf7, 0x8f, 0x18, 0xe6, 0x31, 0xbe, 0x44, 0xc6, 0xa7, 0xa4, 0x9c,
|
||||
0x2d, 0x68, 0x29, 0x51, 0xf2, 0xd0, 0xff, 0x52, 0x81, 0xed, 0x67, 0xbe, 0x7f, 0x43, 0x4c, 0x62,
|
||||
0x60, 0x53, 0x92, 0x62, 0xe8, 0xa3, 0xc4, 0x32, 0x77, 0xa7, 0xa6, 0xed, 0xfb, 0x60, 0x4d, 0x33,
|
||||
0xdc, 0x49, 0x85, 0xef, 0xa4, 0x2e, 0x77, 0x72, 0x8a, 0x90, 0xcb, 0x27, 0x6c, 0x1b, 0x2c, 0x8f,
|
||||
0xf9, 0xd2, 0xe2, 0xbe, 0xe4, 0x63, 0x66, 0x32, 0x89, 0x2e, 0xf0, 0x9c, 0x19, 0xc4, 0x86, 0x0c,
|
||||
0x19, 0x5e, 0xfa, 0xf2, 0x84, 0xd9, 0x50, 0x6d, 0x6b, 0x3d, 0xdf, 0x96, 0x0e, 0x9b, 0x8d, 0xe5,
|
||||
0x61, 0x53, 0x5b, 0x11, 0x36, 0x50, 0x08, 0x1b, 0x07, 0x1a, 0x43, 0x2f, 0xf1, 0xce, 0x82, 0x30,
|
||||
0xa0, 0x01, 0xc9, 0xf0, 0xfc, 0x98, 0x11, 0x05, 0xcc, 0x7e, 0x08, 0x9b, 0x5e, 0x92, 0x78, 0xe9,
|
||||
0x24, 0x4e, 0xd1, 0x35, 0x6f, 0x83, 0x90, 0xb4, 0x1b, 0x5c, 0xc8, 0x3c, 0xcc, 0xa4, 0x65, 0x24,
|
||||
0x0c, 0xa2, 0xe9, 0xec, 0x15, 0x8b, 0xbe, 0x76, 0x93, 0xb3, 0x15, 0x30, 0x26, 0x2d, 0x8a, 0x5f,
|
||||
0x93, 0xcb, 0x7e, 0x1a, 0x5c, 0xe0, 0x9a, 0x11, 0x2a, 0x6d, 0x71, 0x2f, 0xce, 0xc3, 0xf6, 0xb7,
|
||||
0x31, 0x30, 0xc3, 0x60, 0x12, 0xd0, 0xac, 0xbd, 0x89, 0x66, 0xd5, 0x7b, 0x4d, 0xe9, 0x4f, 0x97,
|
||||
0xa3, 0xae, 0x9a, 0x75, 0x0e, 0xa1, 0x2a, 0x20, 0xe6, 0x5e, 0xc6, 0x22, 0x4f, 0x8b, 0x8f, 0x19,
|
||||
0x96, 0xc5, 0x6f, 0x29, 0x3f, 0x2b, 0xcb, 0xe5, 0x63, 0x86, 0x8d, 0xbd, 0xd4, 0xe7, 0xe7, 0x84,
|
||||
0x18, 0x1b, 0x3b, 0x2e, 0x58, 0xec, 0xa0, 0x98, 0xab, 0xa7, 0xf2, 0xc0, 0x9b, 0x2e, 0x1b, 0x32,
|
||||
0x64, 0x24, 0x63, 0x0a, 0x11, 0x1c, 0xda, 0xdf, 0x82, 0x96, 0xe7, 0xfb, 0xe8, 0x9e, 0x18, 0x4f,
|
||||
0xfd, 0x8b, 0xc0, 0xcf, 0x50, 0x52, 0x05, 0x27, 0xe7, 0x50, 0x67, 0x07, 0x6c, 0x33, 0xa0, 0x64,
|
||||
0x9c, 0xfd, 0xaa, 0xa4, 0x13, 0x42, 0xe7, 0xc9, 0xaa, 0x68, 0xfb, 0x7e, 0xa1, 0x7a, 0x94, 0x79,
|
||||
0x5c, 0x6d, 0xab, 0x0c, 0xc9, 0x57, 0x9b, 0x05, 0x65, 0x21, 0x29, 0x2b, 0xcb, 0x92, 0xb2, 0x03,
|
||||
0xed, 0x45, 0x1b, 0xa4, 0x81, 0x43, 0xd8, 0x3f, 0x24, 0x21, 0x79, 0x1f, 0xfb, 0xd0, 0x93, 0x91,
|
||||
0x87, 0xa5, 0x43, 0x24, 0x1c, 0x1f, 0xbf, 0xbf, 0x01, 0x8b, 0x4a, 0xa4, 0x01, 0x47, 0xb0, 0xfb,
|
||||
0x2a, 0xc8, 0xe8, 0xcd, 0xea, 0x17, 0x54, 0x95, 0x97, 0xa9, 0xfa, 0x7d, 0x09, 0x20, 0x97, 0xa5,
|
||||
0x6d, 0x2e, 0x19, 0x36, 0x23, 0x46, 0x66, 0x01, 0x95, 0x19, 0xcd, 0xc7, 0xec, 0xdc, 0xe9, 0x30,
|
||||
0x91, 0x97, 0x0c, 0x1b, 0xb2, 0x8a, 0x38, 0x8d, 0x82, 0xd9, 0x71, 0x3c, 0x3c, 0x27, 0x34, 0xe3,
|
||||
0x15, 0x1b, 0xab, 0xa9, 0x01, 0xf1, 0xb4, 0x1c, 0x93, 0x30, 0xe4, 0x65, 0x7b, 0xc3, 0x15, 0x04,
|
||||
0xab, 0xb1, 0x64, 0x92, 0xd0, 0xab, 0xd7, 0xc7, 0x98, 0xd4, 0x2c, 0xc3, 0x14, 0x89, 0x3b, 0xdd,
|
||||
0x9b, 0xdf, 0xa9, 0x2c, 0x8d, 0x4f, 0xa0, 0x9e, 0xef, 0x22, 0x43, 0x63, 0x2b, 0xcb, 0x8f, 0xde,
|
||||
0xe4, 0x72, 0xee, 0x41, 0xe3, 0x98, 0xe2, 0xa1, 0xae, 0xf0, 0x97, 0xf3, 0x10, 0x5a, 0xba, 0xae,
|
||||
0x72, 0x46, 0x51, 0x19, 0x3c, 0x3a, 0xcd, 0x24, 0x97, 0xa4, 0x9c, 0xbf, 0x56, 0x60, 0x5d, 0x06,
|
||||
0xae, 0xaa, 0x3e, 0xa5, 0xbc, 0xfa, 0xfc, 0x4f, 0x8a, 0xe0, 0xc7, 0x50, 0xcb, 0xae, 0x32, 0x4a,
|
||||
0x26, 0x7d, 0x59, 0x0a, 0x9b, 0x6e, 0x0e, 0xfc, 0xbf, 0x20, 0xe6, 0x05, 0xf1, 0xef, 0x25, 0xa8,
|
||||
0xe9, 0x63, 0xfe, 0xe0, 0x86, 0xe5, 0x53, 0xa8, 0x25, 0xe2, 0xe0, 0x89, 0xa8, 0x6b, 0xf5, 0x5e,
|
||||
0x4b, 0x2a, 0x52, 0x95, 0x2c, 0x67, 0x30, 0xe2, 0xc7, 0x32, 0xe3, 0xc7, 0x68, 0x48, 0xd6, 0x0a,
|
||||
0x0d, 0x09, 0x1e, 0x7e, 0xc2, 0x0a, 0x66, 0x95, 0x17, 0x4c, 0x3e, 0x36, 0x5b, 0x90, 0xf5, 0x42,
|
||||
0x0b, 0xe2, 0x7c, 0x0e, 0xeb, 0x47, 0xde, 0x70, 0x8c, 0xfb, 0x60, 0x0b, 0x87, 0x89, 0x0c, 0x53,
|
||||
0x5c, 0xc8, 0xc6, 0x4c, 0xc9, 0x84, 0xa0, 0xbf, 0xaf, 0x64, 0x75, 0x97, 0x94, 0x73, 0x8e, 0x6d,
|
||||
0x82, 0x48, 0x03, 0x99, 0x4c, 0x8f, 0xb1, 0x8c, 0x2a, 0x87, 0xa8, 0x5c, 0x5a, 0x6c, 0x34, 0x0c,
|
||||
0x1e, 0x3c, 0x96, 0xf5, 0x89, 0xd0, 0x2c, 0xab, 0xae, 0xf2, 0x81, 0xb4, 0xc7, 0x55, 0xd3, 0xce,
|
||||
0x6f, 0x4a, 0xb0, 0x27, 0xba, 0xc8, 0x1b, 0x7b, 0xc5, 0xe5, 0xdd, 0x89, 0x70, 0x5f, 0xa5, 0xe0,
|
||||
0xbe, 0x27, 0x50, 0x4b, 0x49, 0x16, 0x4f, 0x53, 0x74, 0x33, 0xf7, 0x6c, 0xbd, 0xb7, 0xab, 0x32,
|
||||
0x89, 0xeb, 0x72, 0xe5, 0xac, 0x9b, 0xf3, 0x39, 0x7f, 0xac, 0x40, 0xab, 0x38, 0xcb, 0x2a, 0xd6,
|
||||
0x59, 0x78, 0x1e, 0xc4, 0x5f, 0x8b, 0xf6, 0xb7, 0xc4, 0xdd, 0x64, 0x42, 0x2c, 0xab, 0xd0, 0x97,
|
||||
0xc7, 0x78, 0x07, 0xa2, 0x26, 0xe1, 0xc6, 0x1c, 0x90, 0xb3, 0x7d, 0x92, 0x06, 0xb1, 0xba, 0x2e,
|
||||
0x73, 0x80, 0x95, 0x01, 0x24, 0xde, 0x4c, 0x63, 0xea, 0x71, 0x23, 0x2d, 0x57, 0xd3, 0xbc, 0xef,
|
||||
0xc5, 0x33, 0x22, 0xf4, 0x80, 0x9d, 0xda, 0x9a, 0xec, 0x7b, 0x35, 0x92, 0xcf, 0x1f, 0x91, 0x49,
|
||||
0x26, 0xd3, 0xdc, 0x40, 0x98, 0xe5, 0xe2, 0x34, 0x5f, 0xb1, 0xa0, 0xe6, 0x81, 0x81, 0x96, 0x1b,
|
||||
0x10, 0x93, 0x20, 0xc8, 0xe3, 0x4b, 0x2f, 0xe1, 0x69, 0x6f, 0xb9, 0x06, 0x82, 0x81, 0xbc, 0x2d,
|
||||
0x28, 0xf4, 0x06, 0x7e, 0xe5, 0x78, 0xec, 0x62, 0xe6, 0x65, 0xc0, 0x72, 0x17, 0x27, 0x18, 0xf7,
|
||||
0x39, 0x49, 0x23, 0x12, 0x1e, 0x19, 0x5a, 0x41, 0x70, 0x2f, 0x4c, 0xd8, 0x3d, 0xd8, 0x11, 0xe0,
|
||||
0xc9, 0x41, 0xdf, 0x5c, 0x50, 0xe7, 0x0b, 0x96, 0xce, 0xb1, 0x6f, 0xb1, 0x85, 0x38, 0x91, 0x17,
|
||||
0xde, 0x15, 0x34, 0x5f, 0x5c, 0x10, 0xac, 0xe0, 0x2a, 0x72, 0x9e, 0x42, 0x4d, 0x7f, 0xca, 0xc9,
|
||||
0x00, 0xec, 0x74, 0xc5, 0xc7, 0x5e, 0x57, 0x7d, 0xec, 0x75, 0x4f, 0x14, 0x87, 0x9b, 0x33, 0x33,
|
||||
0xaf, 0x64, 0x34, 0x4e, 0x89, 0xff, 0x55, 0x14, 0x5e, 0xa9, 0x2f, 0xa4, 0x1c, 0x91, 0x31, 0x69,
|
||||
0xe9, 0x2b, 0xe1, 0x77, 0x25, 0x58, 0xe3, 0xba, 0x97, 0x76, 0x4f, 0x82, 0xbb, 0xac, 0x23, 0xb8,
|
||||
0x18, 0xaf, 0x4d, 0x1d, 0xaf, 0x32, 0xb2, 0xad, 0x3c, 0xb2, 0x0b, 0x3b, 0xa8, 0x7e, 0xc0, 0x0e,
|
||||
0x9c, 0xdf, 0x96, 0xa1, 0xf1, 0x9a, 0xd0, 0xcb, 0x38, 0x3d, 0x67, 0x59, 0x9c, 0x2d, 0xbd, 0xb0,
|
||||
0xef, 0xe0, 0xf7, 0xe5, 0x6c, 0x70, 0x76, 0x45, 0x75, 0xd4, 0xae, 0xa7, 0xb3, 0xe7, 0x8c, 0xb4,
|
||||
0xef, 0x02, 0xe0, 0x54, 0xdf, 0x13, 0x97, 0xb4, 0x0c, 0xda, 0x74, 0x26, 0x01, 0xfb, 0x23, 0xa8,
|
||||
0xb9, 0xb3, 0x01, 0x16, 0xfb, 0x38, 0xcd, 0x54, 0xd4, 0xa6, 0xb3, 0x17, 0x9c, 0x66, 0x6b, 0x71,
|
||||
0xd2, 0x4f, 0xe3, 0x24, 0x21, 0x3e, 0x8f, 0x5a, 0xbe, 0xf6, 0x50, 0x00, 0x4c, 0xeb, 0x89, 0xd2,
|
||||
0x5a, 0x15, 0x5a, 0x69, 0xae, 0x15, 0xa7, 0x12, 0xa9, 0x55, 0x84, 0x6b, 0x8d, 0x9a, 0x5a, 0x4f,
|
||||
0xb4, 0x56, 0x11, 0xab, 0x1b, 0xd4, 0xd0, 0x7a, 0x92, 0x6b, 0xad, 0xa9, 0xb5, 0x52, 0xab, 0xf3,
|
||||
0xe7, 0x12, 0x6c, 0x60, 0xce, 0x9c, 0x66, 0xde, 0x88, 0xe0, 0xf5, 0x5a, 0xa7, 0x98, 0x5f, 0xe1,
|
||||
0x60, 0xca, 0x48, 0x99, 0xd1, 0xc0, 0x21, 0xc1, 0xf0, 0x0d, 0x68, 0x24, 0x24, 0xc5, 0x4c, 0x92,
|
||||
0x1c, 0x65, 0xac, 0x76, 0x98, 0x39, 0x02, 0x13, 0x2c, 0x5d, 0xb8, 0xcd, 0xe7, 0x06, 0x41, 0x34,
|
||||
0x10, 0xa1, 0x3a, 0x89, 0x7d, 0x22, 0x5d, 0xb5, 0xcd, 0xa7, 0x5e, 0x46, 0x5f, 0xea, 0x09, 0xfb,
|
||||
0xbb, 0xb0, 0xad, 0xf9, 0xd9, 0x15, 0xce, 0xb9, 0x85, 0xeb, 0x36, 0x25, 0xf7, 0xa9, 0x84, 0x9d,
|
||||
0x5f, 0x42, 0xeb, 0x64, 0x8c, 0xe7, 0x4b, 0xf1, 0x8e, 0x1b, 0x1d, 0x7a, 0x58, 0x09, 0xb0, 0xbc,
|
||||
0x27, 0xbc, 0x5e, 0x64, 0xd2, 0x5a, 0x45, 0xda, 0xdf, 0x83, 0x6d, 0x2a, 0x78, 0x89, 0x3f, 0x50,
|
||||
0x3c, 0xe2, 0x34, 0xb7, 0xf4, 0x44, 0x5f, 0x32, 0x7f, 0x13, 0x5a, 0x39, 0x33, 0xbf, 0x2c, 0x84,
|
||||
0xbd, 0x4d, 0x8d, 0xb2, 0x68, 0x72, 0xfe, 0x20, 0x9c, 0x25, 0x22, 0xe7, 0x53, 0x5e, 0xbe, 0x0c,
|
||||
0x57, 0xd5, 0x7b, 0x9b, 0xaa, 0xec, 0x4b, 0x67, 0xf0, 0x92, 0x25, 0xdc, 0xf2, 0x63, 0xd8, 0xa4,
|
||||
0xda, 0xf4, 0x01, 0x66, 0xaa, 0x27, 0x53, 0x4f, 0x95, 0xde, 0xe2, 0xc6, 0xdc, 0x16, 0x2d, 0x6e,
|
||||
0x14, 0x3d, 0x2f, 0xfa, 0x11, 0xa9, 0x50, 0xd8, 0x57, 0x17, 0x18, 0x57, 0xe1, 0xfc, 0x08, 0x6a,
|
||||
0xd8, 0xac, 0x64, 0xc2, 0x3a, 0x74, 0xcc, 0x70, 0x9a, 0xa6, 0x98, 0x7b, 0xca, 0x31, 0x92, 0x64,
|
||||
0xcd, 0x0c, 0xbf, 0xcb, 0xa5, 0x33, 0x04, 0xe1, 0xc4, 0x00, 0xa2, 0x9e, 0x70, 0x6d, 0xc8, 0x63,
|
||||
0x86, 0x80, 0x20, 0x58, 0x9c, 0x4d, 0xbc, 0x99, 0x3e, 0x7a, 0x1e, 0x67, 0x08, 0x88, 0x0d, 0xa2,
|
||||
0xc2, 0xb7, 0x5e, 0x10, 0x0e, 0xe5, 0x43, 0x04, 0x2a, 0x94, 0x64, 0xae, 0xd0, 0x32, 0x15, 0xfe,
|
||||
0xa9, 0x0c, 0x75, 0xa1, 0x51, 0x18, 0x8c, 0x5c, 0x43, 0xbc, 0xf5, 0xb4, 0x4a, 0x4e, 0x60, 0x5f,
|
||||
0xb2, 0x96, 0xab, 0xcb, 0x7b, 0xd4, 0xdc, 0x54, 0x65, 0x1b, 0xde, 0xc2, 0x19, 0x16, 0x66, 0xc3,
|
||||
0x3b, 0x4b, 0xb9, 0x6b, 0x8c, 0x49, 0x18, 0xfc, 0x19, 0x34, 0x44, 0x7c, 0xca, 0x35, 0xd6, 0xaa,
|
||||
0x35, 0x75, 0xc1, 0x26, 0x56, 0x3d, 0x61, 0xad, 0x20, 0xda, 0xcb, 0x5b, 0x8f, 0x7a, 0xef, 0x6e,
|
||||
0x81, 0x9d, 0xef, 0xa4, 0xcb, 0x7f, 0x5f, 0x44, 0x14, 0xef, 0x00, 0xc1, 0xdb, 0x79, 0x0a, 0x90,
|
||||
0x83, 0xac, 0x9e, 0x9d, 0x93, 0x2b, 0xd5, 0xf2, 0xe2, 0x90, 0xed, 0xfd, 0xc2, 0x0b, 0xa7, 0xca,
|
||||
0xa9, 0x82, 0xf8, 0x61, 0xf9, 0x69, 0x09, 0x3f, 0x97, 0x36, 0x9f, 0xb3, 0x0b, 0xd5, 0x58, 0x5e,
|
||||
0x78, 0x3f, 0xb3, 0x96, 0xbe, 0x9f, 0x59, 0xea, 0xfd, 0x0c, 0x4b, 0x6c, 0x9c, 0xc8, 0xeb, 0x1f,
|
||||
0x47, 0xb9, 0x22, 0xcb, 0x50, 0xe4, 0xfc, 0xd3, 0x02, 0xc8, 0xb5, 0xd8, 0xc7, 0xd0, 0x09, 0xe2,
|
||||
0x01, 0xbb, 0xbd, 0x82, 0x21, 0x11, 0x05, 0x69, 0x90, 0x12, 0x0c, 0x9f, 0x2c, 0xb8, 0x20, 0xb2,
|
||||
0xc1, 0xd9, 0x93, 0xfb, 0x9e, 0x33, 0xce, 0xdd, 0x47, 0x4a, 0x2c, 0xe4, 0x95, 0xcb, 0x55, 0xcb,
|
||||
0xec, 0x9f, 0xc1, 0x6e, 0x2e, 0xd4, 0x37, 0xe4, 0x95, 0xaf, 0x95, 0x77, 0x5b, 0xcb, 0xf3, 0x73,
|
||||
0x59, 0x3f, 0x01, 0x84, 0x07, 0x78, 0x99, 0x4d, 0x0b, 0x92, 0x2a, 0xd7, 0x4a, 0xda, 0x0e, 0xe2,
|
||||
0x37, 0x7c, 0x45, 0x2e, 0xe7, 0x0d, 0xdc, 0x31, 0x36, 0xca, 0xd2, 0xde, 0x90, 0x66, 0x5d, 0x2b,
|
||||
0x6d, 0x4f, 0xdb, 0xc5, 0x0a, 0x43, 0x2e, 0xf2, 0x4b, 0xc0, 0x99, 0xc1, 0xa5, 0x17, 0xd0, 0x79,
|
||||
0x79, 0x6b, 0x37, 0xed, 0xf3, 0x6b, 0x5c, 0x54, 0x14, 0x26, 0xf6, 0x39, 0x21, 0xe9, 0xa8, 0xb0,
|
||||
0xcf, 0xea, 0x4d, 0xfb, 0x3c, 0xe2, 0x2b, 0x72, 0x39, 0xcf, 0x01, 0xc1, 0x79, 0x7b, 0xd6, 0xaf,
|
||||
0x95, 0xb2, 0x19, 0xc4, 0x45, 0x5b, 0x0e, 0x60, 0x3b, 0x23, 0x43, 0xbc, 0xea, 0xcd, 0x58, 0xd8,
|
||||
0xb8, 0x56, 0xc6, 0x96, 0x5c, 0xa0, 0x85, 0x38, 0xef, 0xa0, 0xf1, 0xd3, 0xe9, 0x88, 0xd0, 0xf0,
|
||||
0x4c, 0xe7, 0xfc, 0x7f, 0xbb, 0xcc, 0xfc, 0x1b, 0xcb, 0xcc, 0xc1, 0x28, 0x8d, 0xa7, 0x49, 0xa1,
|
||||
0x6a, 0x8b, 0x1c, 0x5e, 0xa8, 0xda, 0x9c, 0x87, 0x57, 0x6d, 0xc1, 0xfd, 0x39, 0x34, 0x44, 0x37,
|
||||
0x27, 0x17, 0x88, 0x2a, 0x64, 0x2f, 0x26, 0xbd, 0xea, 0x1e, 0xc5, 0xb2, 0x9e, 0xec, 0x8c, 0xe5,
|
||||
0xaa, 0x62, 0x35, 0xca, 0xdd, 0x84, 0x9f, 0x46, 0x79, 0xd6, 0xbd, 0x84, 0xe6, 0x58, 0xf8, 0x46,
|
||||
0xae, 0x12, 0x01, 0xf8, 0x89, 0x32, 0x2e, 0xdf, 0x43, 0xd7, 0xf4, 0xa1, 0x70, 0x75, 0x63, 0x6c,
|
||||
0xba, 0xf5, 0x11, 0x00, 0xfb, 0xf6, 0x19, 0xa8, 0x42, 0x65, 0x3e, 0x7d, 0xea, 0x1b, 0x02, 0x3f,
|
||||
0xb4, 0xd4, 0xb0, 0x73, 0x02, 0xdb, 0x0b, 0x32, 0x97, 0x94, 0xa9, 0xef, 0x98, 0x65, 0xaa, 0xde,
|
||||
0xbb, 0x2d, 0x45, 0x9a, 0x4b, 0xcd, 0xda, 0xf5, 0xb7, 0x92, 0xf8, 0x54, 0xd2, 0xaf, 0x53, 0xd8,
|
||||
0xb7, 0x35, 0x23, 0xd1, 0x7c, 0xe9, 0x03, 0xa8, 0x18, 0x82, 0xcc, 0xc6, 0xcc, 0x6d, 0x44, 0x66,
|
||||
0x9b, 0x86, 0x07, 0x31, 0xe4, 0x1e, 0x58, 0x7a, 0x10, 0x86, 0x73, 0xdc, 0xfa, 0xd0, 0x38, 0xed,
|
||||
0x42, 0xa3, 0x68, 0x7d, 0x48, 0xa3, 0x28, 0x5f, 0x3b, 0x56, 0x3d, 0xd5, 0xf6, 0xfe, 0x55, 0x85,
|
||||
0xca, 0xb3, 0xfe, 0x4b, 0xfb, 0x14, 0xb6, 0xe6, 0xff, 0xe9, 0xb0, 0xef, 0x49, 0xb3, 0x56, 0xfc,
|
||||
0x3b, 0xd2, 0xb9, 0xbf, 0x72, 0x5e, 0xb6, 0xec, 0xb7, 0x6c, 0x17, 0x36, 0xe7, 0xde, 0xb5, 0x6d,
|
||||
0x75, 0xd5, 0x2c, 0xff, 0xef, 0xa0, 0x73, 0x6f, 0xd5, 0xb4, 0x29, 0x73, 0xee, 0x1b, 0x41, 0xcb,
|
||||
0x5c, 0xfe, 0x8d, 0xa9, 0x65, 0xae, 0xfa, 0xb4, 0xb8, 0x65, 0xff, 0x00, 0xaa, 0xe2, 0xa5, 0xdb,
|
||||
0xde, 0x91, 0xbc, 0x85, 0x37, 0xf4, 0xce, 0xee, 0x1c, 0xaa, 0x17, 0xbe, 0x82, 0x66, 0xe1, 0xef,
|
||||
0x11, 0xfb, 0xa3, 0x82, 0xae, 0xe2, 0x43, 0x79, 0xe7, 0xe3, 0xe5, 0x93, 0x5a, 0xda, 0x01, 0x40,
|
||||
0xfe, 0x18, 0x6a, 0xb7, 0x25, 0xf7, 0xc2, 0x83, 0x7b, 0xe7, 0xce, 0x92, 0x19, 0x2d, 0x04, 0x8f,
|
||||
0x72, 0xfe, 0xd9, 0xd2, 0x9e, 0xf3, 0xea, 0xfc, 0xa3, 0xa1, 0x3e, 0xca, 0x95, 0xef, 0x9d, 0x5c,
|
||||
0xec, 0xfc, 0x63, 0xa4, 0x16, 0xbb, 0xe2, 0x29, 0x54, 0x8b, 0x5d, 0xf9, 0x8a, 0x79, 0xcb, 0xfe,
|
||||
0x0a, 0x5a, 0xc5, 0xd7, 0x3d, 0x5b, 0x39, 0x69, 0xe9, 0xf3, 0x66, 0xe7, 0xee, 0x8a, 0x59, 0x2d,
|
||||
0xf0, 0x33, 0x58, 0x13, 0xcf, 0x76, 0x2a, 0x1d, 0xcd, 0xd7, 0xbe, 0xce, 0x4e, 0x11, 0xd4, 0xab,
|
||||
0x1e, 0x43, 0x55, 0x7c, 0x5d, 0xea, 0x00, 0x28, 0x7c, 0x6c, 0x76, 0x1a, 0x26, 0xea, 0xdc, 0x7a,
|
||||
0x5c, 0x52, 0x7a, 0xb2, 0x82, 0x9e, 0x6c, 0x99, 0x1e, 0xe3, 0x70, 0xce, 0xaa, 0x3c, 0x5d, 0x9f,
|
||||
0xfc, 0x27, 0x00, 0x00, 0xff, 0xff, 0xc9, 0x06, 0x1e, 0xda, 0xa8, 0x1c, 0x00, 0x00,
|
||||
// 2604 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0x59, 0x4b, 0x6f, 0x1c, 0x5b,
|
||||
0xf1, 0xcf, 0x3c, 0x3c, 0xf6, 0xd4, 0x3c, 0xec, 0xe9, 0x38, 0xce, 0x64, 0xf2, 0xfc, 0xb7, 0xee,
|
||||
0x1f, 0x02, 0x5c, 0x39, 0xc1, 0xb9, 0x17, 0x22, 0x90, 0x90, 0x12, 0x3b, 0x5c, 0xcc, 0xcd, 0xc3,
|
||||
0x69, 0x3b, 0x44, 0x48, 0x48, 0xa3, 0xf6, 0xcc, 0xc9, 0x4c, 0xe3, 0x9e, 0xee, 0xbe, 0xdd, 0x67,
|
||||
0xfc, 0xd8, 0xb0, 0x60, 0x01, 0x3b, 0xd8, 0x22, 0xb1, 0x64, 0xc7, 0x9e, 0x05, 0x7c, 0x01, 0x24,
|
||||
0x3e, 0x08, 0x3b, 0xf6, 0x2c, 0xa9, 0x53, 0xe7, 0xd1, 0xa7, 0xe7, 0xe1, 0x24, 0x48, 0x88, 0x0d,
|
||||
0x9b, 0x51, 0x57, 0x9d, 0x3a, 0x55, 0x75, 0xea, 0x54, 0xfd, 0x4e, 0x9d, 0x33, 0x50, 0xf7, 0x93,
|
||||
0x60, 0x3b, 0x49, 0x63, 0x1e, 0x3b, 0x2b, 0xfc, 0x22, 0x61, 0x59, 0xef, 0xee, 0x28, 0x8e, 0x47,
|
||||
0x21, 0x7b, 0x40, 0xcc, 0xe3, 0xe9, 0xbb, 0x07, 0x3c, 0x98, 0xb0, 0x8c, 0xfb, 0x93, 0x44, 0xca,
|
||||
0xb9, 0x37, 0xe0, 0xfa, 0x17, 0x8c, 0x1f, 0xb2, 0xf4, 0x94, 0xa5, 0x3f, 0x61, 0x69, 0x16, 0xc4,
|
||||
0x91, 0xc7, 0xbe, 0x9a, 0xa2, 0x8c, 0x7b, 0x0e, 0xdd, 0xf9, 0xa1, 0x2c, 0x89, 0xa3, 0x8c, 0x39,
|
||||
0x9b, 0xb0, 0x32, 0xf1, 0x7f, 0x1e, 0xa7, 0xdd, 0xd2, 0xbd, 0xd2, 0xfd, 0x96, 0x27, 0x09, 0xe2,
|
||||
0x06, 0x11, 0x72, 0xcb, 0x8a, 0x2b, 0x08, 0xc1, 0x4d, 0x7c, 0x3e, 0x18, 0x77, 0x2b, 0x92, 0x4b,
|
||||
0x84, 0xd3, 0x83, 0xb5, 0x94, 0x9d, 0x06, 0x42, 0x6b, 0xb7, 0x8a, 0x03, 0x75, 0xcf, 0xd0, 0xee,
|
||||
0xaf, 0x4a, 0xb0, 0xf9, 0x26, 0x19, 0xfa, 0x9c, 0x1d, 0xa4, 0xf1, 0x80, 0x65, 0x99, 0x72, 0xc9,
|
||||
0x69, 0x43, 0x39, 0x18, 0x92, 0xcd, 0xba, 0x87, 0x5f, 0xce, 0x06, 0x54, 0x12, 0x64, 0x94, 0x89,
|
||||
0x21, 0x3e, 0x9d, 0x3b, 0x00, 0x83, 0x30, 0xce, 0xd8, 0x21, 0x1f, 0x06, 0x11, 0x59, 0x5c, 0xf3,
|
||||
0x2c, 0x8e, 0x70, 0xe6, 0x2c, 0x18, 0xf2, 0x31, 0xd9, 0x44, 0x67, 0x88, 0x70, 0xb6, 0xa0, 0x36,
|
||||
0x66, 0xc1, 0x68, 0xcc, 0xbb, 0x2b, 0xc4, 0x56, 0x94, 0x7b, 0x1d, 0xae, 0xcd, 0xf8, 0x21, 0xd7,
|
||||
0xef, 0xfe, 0xad, 0x0c, 0x5b, 0xbb, 0x29, 0xc3, 0x91, 0xdd, 0x38, 0xe2, 0x7e, 0x10, 0xb1, 0x74,
|
||||
0x99, 0x8f, 0xe8, 0xd1, 0xf1, 0x34, 0x1a, 0x86, 0xec, 0xc0, 0x47, 0xb3, 0xd2, 0x55, 0x8b, 0x43,
|
||||
0x1e, 0x8f, 0xd9, 0xe0, 0x24, 0x89, 0x83, 0x88, 0x93, 0xc7, 0x38, 0x9e, 0x73, 0x84, 0xc7, 0x19,
|
||||
0x2d, 0x46, 0x46, 0x49, 0x12, 0xc2, 0x63, 0xfc, 0x88, 0xa7, 0xd2, 0xe3, 0xba, 0xa7, 0x28, 0xc5,
|
||||
0x67, 0x69, 0xda, 0xad, 0x19, 0x3e, 0x52, 0x82, 0x1f, 0xfa, 0xc7, 0x2c, 0xcc, 0xba, 0xab, 0xf7,
|
||||
0x2a, 0x82, 0x2f, 0x29, 0xe7, 0x1e, 0x34, 0xa2, 0xf8, 0x20, 0x38, 0x8d, 0xb9, 0x17, 0xc7, 0xbc,
|
||||
0xbb, 0x46, 0x01, 0xb3, 0x59, 0x4e, 0x17, 0x56, 0xd3, 0x69, 0x24, 0xf2, 0xa6, 0x5b, 0x27, 0x95,
|
||||
0x9a, 0x14, 0x73, 0xd5, 0xe7, 0x93, 0x74, 0x94, 0x75, 0x81, 0x14, 0xdb, 0x2c, 0xe7, 0x13, 0x68,
|
||||
0xe5, 0x2b, 0xd9, 0x0b, 0xd2, 0x6e, 0x83, 0x34, 0x14, 0x99, 0xee, 0x3e, 0x5c, 0x9f, 0x8b, 0xa5,
|
||||
0xca, 0xb3, 0x6d, 0xa8, 0x0f, 0x34, 0x93, 0x62, 0xda, 0xd8, 0xd9, 0xd8, 0xa6, 0xd4, 0xde, 0xce,
|
||||
0x85, 0x73, 0x11, 0x54, 0xd5, 0x3a, 0x0c, 0x46, 0x91, 0x1f, 0x7e, 0x78, 0xc6, 0x88, 0x88, 0xd1,
|
||||
0x14, 0x95, 0x9f, 0x8a, 0x72, 0x37, 0xa0, 0xad, 0x55, 0xa9, 0x4d, 0xff, 0x53, 0x05, 0x3a, 0x4f,
|
||||
0x86, 0xc3, 0xf7, 0xe4, 0x24, 0x26, 0x36, 0x67, 0x29, 0xa6, 0x3e, 0x6a, 0x2c, 0x53, 0x38, 0x0d,
|
||||
0xed, 0xdc, 0x85, 0xea, 0x34, 0xc3, 0x95, 0x54, 0x68, 0x25, 0x0d, 0xb5, 0x92, 0x37, 0xc8, 0xf2,
|
||||
0x68, 0xc0, 0x71, 0xa0, 0xea, 0x8b, 0x58, 0x56, 0x29, 0x96, 0xf4, 0x2d, 0x5c, 0x66, 0xd1, 0x29,
|
||||
0xee, 0xb3, 0x60, 0x89, 0x4f, 0xc1, 0x19, 0x9c, 0x0d, 0xd5, 0x0e, 0x8b, 0x4f, 0xbd, 0xac, 0xd5,
|
||||
0x7c, 0x59, 0x26, 0x6d, 0xd6, 0x16, 0xa7, 0x4d, 0x7d, 0x49, 0xda, 0x40, 0x21, 0x6d, 0x5c, 0x68,
|
||||
0x0e, 0xfc, 0xc4, 0x3f, 0x0e, 0xc2, 0x80, 0x07, 0x2c, 0xc3, 0xfd, 0x13, 0x4e, 0x14, 0x78, 0xce,
|
||||
0x7d, 0x58, 0xf7, 0x93, 0xc4, 0x4f, 0x27, 0x71, 0x8a, 0xa1, 0x79, 0x17, 0x84, 0xac, 0xdb, 0x24,
|
||||
0x25, 0xb3, 0x6c, 0xa1, 0x2d, 0x63, 0x61, 0x10, 0x4d, 0xcf, 0x9f, 0x8b, 0xec, 0xeb, 0xb6, 0x48,
|
||||
0xac, 0xc0, 0x13, 0xda, 0xa2, 0xf8, 0x25, 0x3b, 0x3b, 0x48, 0x83, 0x53, 0x9c, 0x33, 0x42, 0xa3,
|
||||
0x6d, 0x8a, 0xe2, 0x2c, 0xdb, 0xf9, 0x3a, 0x26, 0x66, 0x18, 0x4c, 0x02, 0x9e, 0x75, 0xd7, 0xd1,
|
||||
0xad, 0xc6, 0x4e, 0x4b, 0xc5, 0xd3, 0x23, 0xae, 0xa7, 0x47, 0xdd, 0x3d, 0xa8, 0x49, 0x96, 0x08,
|
||||
0xaf, 0x10, 0x51, 0xbb, 0x45, 0xdf, 0x82, 0x97, 0xc5, 0xef, 0x38, 0xed, 0x55, 0xd5, 0xa3, 0x6f,
|
||||
0xc1, 0x1b, 0xfb, 0xe9, 0x90, 0xf6, 0x09, 0x79, 0xe2, 0xdb, 0xf5, 0xa0, 0x2a, 0x36, 0x4a, 0x84,
|
||||
0x7a, 0xaa, 0x36, 0xbc, 0xe5, 0x89, 0x4f, 0xc1, 0x19, 0xa9, 0x9c, 0x42, 0x0e, 0x7e, 0x3a, 0x5f,
|
||||
0x83, 0xb6, 0x3f, 0x1c, 0x62, 0x78, 0x62, 0xdc, 0xf5, 0x2f, 0x82, 0x61, 0x86, 0x9a, 0x2a, 0x38,
|
||||
0x38, 0xc3, 0x75, 0x37, 0xc1, 0xb1, 0x13, 0x4a, 0xe5, 0xd9, 0x2f, 0x4b, 0xa6, 0x20, 0x4c, 0x9d,
|
||||
0x2c, 0xcb, 0xb6, 0x6f, 0x17, 0xd0, 0xa3, 0x4c, 0x79, 0xd5, 0xd1, 0x15, 0x92, 0xcf, 0xb6, 0x01,
|
||||
0x65, 0xae, 0x28, 0x2b, 0x8b, 0x8a, 0xb2, 0x07, 0xdd, 0x79, 0x1f, 0x94, 0x83, 0x03, 0xb8, 0xbe,
|
||||
0xc7, 0x42, 0xf6, 0x21, 0xfe, 0x61, 0x24, 0x23, 0x1f, 0xa1, 0x43, 0x16, 0x1c, 0x7d, 0x7f, 0xb8,
|
||||
0x03, 0xf3, 0x46, 0x94, 0x03, 0x2f, 0xe0, 0xda, 0xf3, 0x20, 0xe3, 0xef, 0x37, 0x3f, 0x67, 0xaa,
|
||||
0xbc, 0xc8, 0xd4, 0xef, 0x4a, 0x00, 0xb9, 0x2e, 0xe3, 0x73, 0xc9, 0xf2, 0x19, 0x79, 0xec, 0x3c,
|
||||
0xe0, 0xaa, 0xa2, 0xe9, 0x5b, 0xec, 0x3b, 0x1f, 0x24, 0xea, 0x90, 0x11, 0x9f, 0x02, 0x11, 0xa7,
|
||||
0x51, 0x70, 0x7e, 0x18, 0x0f, 0x4e, 0x18, 0xcf, 0x08, 0xb1, 0x11, 0x4d, 0x2d, 0x16, 0x95, 0xe5,
|
||||
0x98, 0x85, 0x21, 0xc1, 0xf6, 0x9a, 0x27, 0x09, 0x81, 0xb1, 0x6c, 0x92, 0xf0, 0x8b, 0x97, 0x87,
|
||||
0x58, 0xd4, 0xa2, 0xc2, 0x34, 0x89, 0x2b, 0xdd, 0x9a, 0x5d, 0xa9, 0x82, 0xc6, 0x47, 0xd0, 0xc8,
|
||||
0x57, 0x91, 0xa1, 0xb3, 0x95, 0xc5, 0x5b, 0x6f, 0x4b, 0xb9, 0x77, 0xa0, 0x79, 0xc8, 0x71, 0x53,
|
||||
0x97, 0xc4, 0xcb, 0xbd, 0x0f, 0x6d, 0x83, 0xab, 0x24, 0x28, 0x91, 0xc1, 0xe7, 0xd3, 0x4c, 0x49,
|
||||
0x29, 0xca, 0xfd, 0x73, 0x05, 0x56, 0x55, 0xe2, 0x6a, 0xf4, 0x29, 0xe5, 0xe8, 0xf3, 0x5f, 0x01,
|
||||
0xc1, 0x5b, 0x50, 0xcf, 0x2e, 0x32, 0xce, 0x26, 0x07, 0x0a, 0x0a, 0x5b, 0x5e, 0xce, 0xf8, 0x1f,
|
||||
0x20, 0xe6, 0x80, 0xf8, 0xd7, 0x12, 0xd4, 0xcd, 0x36, 0x7f, 0x74, 0xc3, 0xf2, 0x29, 0xd4, 0x13,
|
||||
0xb9, 0xf1, 0x4c, 0xe2, 0x5a, 0x63, 0xa7, 0xad, 0x0c, 0x69, 0x24, 0xcb, 0x05, 0xac, 0xfc, 0xa9,
|
||||
0xda, 0xf9, 0x63, 0x35, 0x24, 0x2b, 0x85, 0x86, 0x04, 0x37, 0x3f, 0x11, 0x80, 0x59, 0x23, 0xc0,
|
||||
0xa4, 0x6f, 0xbb, 0x05, 0x59, 0x2d, 0xb4, 0x20, 0xee, 0xe7, 0xb0, 0xfa, 0xc2, 0x1f, 0x8c, 0x71,
|
||||
0x1d, 0x62, 0xe2, 0x20, 0x51, 0x69, 0x8a, 0x13, 0xc5, 0xb7, 0x30, 0x32, 0x61, 0x18, 0xef, 0x0b,
|
||||
0x85, 0xee, 0x8a, 0x72, 0x4f, 0xb0, 0x4d, 0x90, 0x65, 0xa0, 0x8a, 0xe9, 0x21, 0xc2, 0xa8, 0x0e,
|
||||
0x88, 0xae, 0xa5, 0xf9, 0x46, 0xc3, 0x92, 0xc1, 0x6d, 0x59, 0x9d, 0x48, 0xcb, 0x0a, 0x75, 0x75,
|
||||
0x0c, 0x94, 0x3f, 0x9e, 0x1e, 0x76, 0x7f, 0x5d, 0x82, 0x2d, 0xd9, 0x45, 0xbe, 0xb7, 0x57, 0x5c,
|
||||
0xdc, 0x9d, 0xc8, 0xf0, 0x55, 0x0a, 0xe1, 0x7b, 0x04, 0xf5, 0x94, 0x65, 0xf1, 0x34, 0xc5, 0x30,
|
||||
0x53, 0x64, 0x1b, 0x3b, 0xd7, 0x74, 0x25, 0x91, 0x2d, 0x4f, 0x8d, 0x7a, 0xb9, 0x9c, 0xfb, 0x8f,
|
||||
0x1a, 0xb4, 0x8b, 0xa3, 0x02, 0xb1, 0x8e, 0xc3, 0x93, 0x20, 0x7e, 0x2b, 0xdb, 0xdf, 0x12, 0x85,
|
||||
0xc9, 0x66, 0x89, 0xaa, 0xc2, 0x58, 0x1e, 0xe2, 0x19, 0x88, 0x96, 0x64, 0x18, 0x73, 0x86, 0x1a,
|
||||
0x3d, 0x60, 0x69, 0x10, 0xeb, 0xe3, 0x32, 0x67, 0x08, 0x18, 0x40, 0xe2, 0xf5, 0x34, 0xe6, 0x3e,
|
||||
0x39, 0x59, 0xf5, 0x0c, 0x4d, 0x7d, 0x2f, 0xee, 0x11, 0xe3, 0xbb, 0x62, 0xd7, 0x56, 0x54, 0xdf,
|
||||
0x6b, 0x38, 0xf9, 0xf8, 0x0b, 0x36, 0xc9, 0x54, 0x99, 0x5b, 0x1c, 0xe1, 0xb9, 0xdc, 0xcd, 0xe7,
|
||||
0x22, 0xa9, 0x29, 0x31, 0xd0, 0x73, 0x8b, 0x25, 0x34, 0x48, 0xf2, 0xf0, 0xcc, 0x4f, 0xa8, 0xec,
|
||||
0xab, 0x9e, 0xc5, 0xc1, 0x44, 0xee, 0x48, 0x0a, 0xa3, 0x81, 0xb7, 0x1c, 0x5f, 0x1c, 0xcc, 0x04,
|
||||
0x03, 0x55, 0x6f, 0x7e, 0x40, 0x48, 0x9f, 0xb0, 0x34, 0x62, 0xe1, 0x0b, 0xcb, 0x2a, 0x48, 0xe9,
|
||||
0xb9, 0x01, 0x67, 0x07, 0x36, 0x25, 0xf3, 0x68, 0xf7, 0xc0, 0x9e, 0xd0, 0xa0, 0x09, 0x0b, 0xc7,
|
||||
0x44, 0xa5, 0x53, 0xe0, 0x9f, 0x33, 0xff, 0x9d, 0xda, 0x8f, 0x26, 0x89, 0xcf, 0xb2, 0x9d, 0x27,
|
||||
0xd0, 0xb1, 0xb6, 0x68, 0x0f, 0xef, 0x4d, 0x03, 0x86, 0xe0, 0x21, 0xb2, 0xf6, 0xaa, 0xca, 0x02,
|
||||
0x7b, 0xc8, 0x9b, 0x97, 0x76, 0xde, 0x40, 0x8f, 0x98, 0x47, 0x63, 0xbc, 0x07, 0xf2, 0x10, 0x33,
|
||||
0xc2, 0x1f, 0x3e, 0x4d, 0x32, 0xa5, 0xab, 0x4d, 0xba, 0x74, 0x46, 0x69, 0x19, 0xa5, 0xed, 0x92,
|
||||
0x89, 0xce, 0x5b, 0xb8, 0x59, 0x18, 0x7d, 0x9b, 0x06, 0x9c, 0xe5, 0x7a, 0xd7, 0x2f, 0xd3, 0x7b,
|
||||
0xd9, 0xcc, 0x39, 0xc5, 0xc2, 0xec, 0x7e, 0x6c, 0x14, 0x6f, 0x7c, 0xb8, 0xe2, 0xe2, 0x4c, 0xe7,
|
||||
0xa7, 0x70, 0x6b, 0xde, 0xae, 0xa5, 0xb9, 0x73, 0x99, 0xe6, 0x4b, 0xa7, 0xba, 0xdf, 0x87, 0xd6,
|
||||
0xd3, 0x10, 0x0f, 0xfe, 0xfd, 0x57, 0xca, 0x56, 0xe1, 0xda, 0x5c, 0x59, 0x78, 0x6d, 0xae, 0xa8,
|
||||
0x6b, 0xb3, 0xfb, 0x0b, 0x68, 0x16, 0x36, 0xec, 0x3b, 0x54, 0xa9, 0x5a, 0x95, 0xba, 0x0c, 0x6d,
|
||||
0x2a, 0xb7, 0x0a, 0x66, 0x3c, 0x5b, 0x50, 0x20, 0xc8, 0x99, 0x4c, 0x26, 0xd9, 0xa0, 0x2a, 0x4a,
|
||||
0x54, 0x47, 0x98, 0x27, 0x9a, 0xbc, 0xfb, 0x58, 0x1c, 0xf7, 0x67, 0xd0, 0x2e, 0x2e, 0xf6, 0xdf,
|
||||
0xf6, 0x00, 0x91, 0x39, 0x45, 0xcc, 0xd1, 0x1d, 0xb6, 0xf8, 0x16, 0xef, 0x0e, 0x73, 0x98, 0xa8,
|
||||
0x9a, 0xbb, 0x0b, 0x68, 0x3d, 0x3b, 0x65, 0xd8, 0xad, 0x68, 0x94, 0x7c, 0x0c, 0x75, 0xf3, 0x6c,
|
||||
0xa1, 0xc0, 0xb6, 0xb7, 0x2d, 0x1f, 0x36, 0xb6, 0xf5, 0xc3, 0xc6, 0xf6, 0x91, 0x96, 0xf0, 0x72,
|
||||
0x61, 0xb1, 0xc6, 0x8c, 0xc7, 0x29, 0x1b, 0xbe, 0x8a, 0xc2, 0x0b, 0xfd, 0x1a, 0x90, 0x73, 0x14,
|
||||
0xfe, 0x56, 0x4d, 0xfb, 0xf3, 0xdb, 0x12, 0xac, 0x90, 0xed, 0x85, 0x37, 0x05, 0x29, 0x5d, 0x36,
|
||||
0x68, 0x5d, 0xc4, 0xe6, 0x96, 0xc1, 0x66, 0x85, 0xe2, 0xd5, 0x1c, 0xc5, 0x0b, 0x2b, 0xa8, 0x7d,
|
||||
0xc4, 0x0a, 0xdc, 0xdf, 0x94, 0xa1, 0xf9, 0x92, 0xf1, 0xb3, 0x38, 0x3d, 0x11, 0x27, 0x56, 0xb6,
|
||||
0xb0, 0x39, 0xbd, 0x01, 0x6b, 0xe9, 0x79, 0xff, 0xf8, 0x82, 0x1b, 0x84, 0x5e, 0x4d, 0xcf, 0x9f,
|
||||
0x0a, 0xd2, 0xb9, 0x0d, 0x80, 0x43, 0x07, 0xbe, 0x6c, 0x48, 0x15, 0x40, 0xa7, 0xe7, 0x8a, 0xe1,
|
||||
0xdc, 0x84, 0xba, 0x77, 0xde, 0xc7, 0xc6, 0x26, 0x4e, 0x33, 0x8d, 0xd0, 0xe9, 0xf9, 0x33, 0xa2,
|
||||
0xc5, 0x5c, 0x1c, 0x1c, 0xa6, 0x71, 0x92, 0xb0, 0x21, 0x21, 0x34, 0xcd, 0xdd, 0x93, 0x0c, 0x61,
|
||||
0xf5, 0x48, 0x5b, 0xad, 0x49, 0xab, 0x3c, 0xb7, 0x8a, 0x43, 0x89, 0xb2, 0x2a, 0xa1, 0xb9, 0xce,
|
||||
0x6d, 0xab, 0x47, 0xc6, 0xaa, 0xc4, 0xe5, 0x35, 0x6e, 0x59, 0x3d, 0xca, 0xad, 0xd6, 0xf5, 0x5c,
|
||||
0x65, 0xd5, 0xfd, 0x63, 0x09, 0xd6, 0xf0, 0x7c, 0x78, 0x93, 0xf9, 0x23, 0x86, 0xad, 0x64, 0x83,
|
||||
0xe3, 0x59, 0x12, 0xf6, 0xa7, 0x82, 0x54, 0xa7, 0x17, 0x10, 0x4b, 0x0a, 0xfc, 0x1f, 0x34, 0x13,
|
||||
0x96, 0xe2, 0xa9, 0xa1, 0x24, 0xca, 0x58, 0xcc, 0x78, 0x4a, 0x48, 0x9e, 0x14, 0xd9, 0x86, 0xab,
|
||||
0x34, 0xd6, 0x0f, 0xa2, 0xbe, 0x84, 0xe5, 0x49, 0x3c, 0x64, 0x2a, 0x54, 0x1d, 0x1a, 0xda, 0x8f,
|
||||
0xbe, 0x34, 0x03, 0xce, 0x37, 0xa1, 0x63, 0xe4, 0x45, 0xbb, 0x4a, 0xd2, 0x32, 0x74, 0xeb, 0x4a,
|
||||
0xfa, 0x8d, 0x62, 0x63, 0x0d, 0xeb, 0x1a, 0x0a, 0xa2, 0xd1, 0x9e, 0x8f, 0xa7, 0x1e, 0xb6, 0x32,
|
||||
0x09, 0x9d, 0x8d, 0x99, 0xf2, 0x56, 0x93, 0xce, 0xb7, 0xa0, 0xc3, 0x55, 0xbd, 0x0d, 0xfb, 0x5a,
|
||||
0x46, 0xee, 0xe6, 0x86, 0x19, 0x38, 0x50, 0xc2, 0xff, 0x0f, 0xed, 0x5c, 0x98, 0x1a, 0x23, 0xe9,
|
||||
0x6f, 0xcb, 0x70, 0x45, 0x36, 0xb9, 0xbf, 0x97, 0xc1, 0x92, 0x99, 0xf3, 0x29, 0x1d, 0xd5, 0x56,
|
||||
0xa8, 0x1a, 0x3b, 0xeb, 0xba, 0xc5, 0x51, 0xc1, 0xa0, 0xe3, 0x59, 0x86, 0xe5, 0x07, 0xb0, 0xce,
|
||||
0x8d, 0xeb, 0x7d, 0xac, 0x54, 0x5f, 0x95, 0xde, 0x0c, 0x12, 0xaa, 0x85, 0x79, 0x6d, 0x5e, 0x5c,
|
||||
0x28, 0x46, 0x5e, 0xf6, 0xde, 0xca, 0xa0, 0xf4, 0xaf, 0x21, 0x79, 0x64, 0x02, 0xe1, 0xb1, 0x8e,
|
||||
0x8d, 0x79, 0x26, 0xbd, 0xc3, 0xc0, 0x0c, 0xa6, 0x69, 0x8a, 0xb5, 0xa7, 0x03, 0xa3, 0x48, 0x01,
|
||||
0x8f, 0xd4, 0xb7, 0xaa, 0x60, 0x48, 0xc2, 0x8d, 0x01, 0xe4, 0xd9, 0x49, 0xd6, 0x50, 0xc6, 0x4e,
|
||||
0x01, 0x49, 0x88, 0x3c, 0x9b, 0xf8, 0xe7, 0x66, 0xeb, 0x29, 0xcf, 0x90, 0x21, 0x17, 0x88, 0x06,
|
||||
0xdf, 0xf9, 0x41, 0x38, 0x50, 0x8f, 0x6e, 0x68, 0x50, 0x91, 0xb9, 0xc1, 0xaa, 0x6d, 0xf0, 0x0f,
|
||||
0x65, 0x68, 0x48, 0x8b, 0xd2, 0x61, 0x94, 0x1a, 0x60, 0x87, 0x67, 0x4c, 0x12, 0x81, 0x3d, 0xf8,
|
||||
0x4a, 0x6e, 0x2e, 0xbf, 0x8f, 0xe5, 0xae, 0x6a, 0xdf, 0xb0, 0xe3, 0xcc, 0xb0, 0x09, 0xb1, 0xa2,
|
||||
0xb3, 0x50, 0xba, 0x2e, 0x84, 0xa4, 0xc3, 0x9f, 0x41, 0x53, 0xe6, 0xa7, 0x9a, 0x53, 0x5d, 0x36,
|
||||
0xa7, 0x21, 0xc5, 0xe4, 0xac, 0x47, 0xe2, 0xda, 0x83, 0xfe, 0x52, 0x9b, 0xdd, 0xd8, 0xb9, 0x5d,
|
||||
0x10, 0xa7, 0x95, 0x6c, 0xd3, 0xef, 0xb3, 0x88, 0x63, 0xbf, 0x23, 0x65, 0x7b, 0x8f, 0x01, 0x72,
|
||||
0xa6, 0xc0, 0xb3, 0x13, 0x76, 0xa1, 0xaf, 0x77, 0xf8, 0x29, 0xd6, 0x7e, 0xea, 0x87, 0x53, 0x1d,
|
||||
0x54, 0x49, 0x7c, 0xaf, 0xfc, 0xb8, 0xe4, 0x0e, 0x60, 0xfd, 0xa9, 0x38, 0x12, 0xad, 0xe9, 0x85,
|
||||
0x43, 0xaf, 0xba, 0xf0, 0xd0, 0xab, 0xea, 0xb7, 0x62, 0x84, 0xd8, 0x38, 0x51, 0xad, 0x2e, 0x7e,
|
||||
0xe5, 0x86, 0xaa, 0x96, 0x21, 0xf7, 0xef, 0x55, 0x80, 0xdc, 0x8a, 0x73, 0x08, 0xbd, 0x20, 0xee,
|
||||
0x8b, 0x4e, 0x0d, 0x4f, 0x1b, 0x09, 0x48, 0xfd, 0x94, 0x61, 0xfa, 0x64, 0xc1, 0x29, 0x53, 0xcd,
|
||||
0xfc, 0x96, 0x39, 0xa6, 0x0a, 0xce, 0x79, 0xd7, 0x91, 0x92, 0x13, 0x09, 0xb9, 0x3c, 0x3d, 0xcd,
|
||||
0xf9, 0x31, 0x5c, 0xcb, 0x95, 0x0e, 0x2d, 0x7d, 0xe5, 0x4b, 0xf5, 0x5d, 0x35, 0xfa, 0x86, 0xb9,
|
||||
0xae, 0x1f, 0x02, 0xb2, 0xfb, 0x78, 0x98, 0x4d, 0x0b, 0x9a, 0x2a, 0x97, 0x6a, 0xea, 0x04, 0xf1,
|
||||
0x6b, 0x9a, 0x91, 0xeb, 0x79, 0x0d, 0x37, 0xac, 0x85, 0x8a, 0xb2, 0xb7, 0xb4, 0x55, 0x2f, 0xd5,
|
||||
0xb6, 0x65, 0xfc, 0x12, 0xc0, 0x90, 0xab, 0xfc, 0x12, 0x70, 0xa4, 0x7f, 0xe6, 0x07, 0x7c, 0x56,
|
||||
0xdf, 0xca, 0xfb, 0xd6, 0xf9, 0x16, 0x27, 0x15, 0x95, 0xc9, 0x75, 0x4e, 0x58, 0x3a, 0x2a, 0xac,
|
||||
0xb3, 0xf6, 0xbe, 0x75, 0xbe, 0xa0, 0x19, 0xb9, 0x9e, 0xa7, 0x80, 0xcc, 0x59, 0x7f, 0x56, 0x2f,
|
||||
0xd5, 0xb2, 0x8e, 0x5d, 0x58, 0xc1, 0x97, 0x5d, 0xe8, 0x64, 0x6c, 0x80, 0x47, 0xbd, 0x9d, 0x0b,
|
||||
0x6b, 0x97, 0xea, 0xd8, 0x50, 0x13, 0x8c, 0x12, 0xf7, 0x2b, 0x68, 0xfe, 0x68, 0x3a, 0x62, 0x3c,
|
||||
0x3c, 0x36, 0x35, 0xff, 0x9f, 0x86, 0x99, 0x7f, 0x22, 0xcc, 0xec, 0x8e, 0xd2, 0x78, 0x9a, 0x14,
|
||||
0x50, 0x5b, 0xd6, 0xf0, 0x1c, 0x6a, 0x93, 0x0c, 0xa1, 0xb6, 0x94, 0xfe, 0x1c, 0x9a, 0xf2, 0xe6,
|
||||
0xa2, 0x26, 0x48, 0x14, 0x72, 0xe6, 0x8b, 0x5e, 0xdf, 0x94, 0xe4, 0xb4, 0x1d, 0x75, 0x0b, 0x54,
|
||||
0xb3, 0x8a, 0x68, 0x94, 0x87, 0xc9, 0x83, 0xe3, 0xbc, 0xea, 0xf6, 0xa1, 0x35, 0x96, 0xb1, 0x51,
|
||||
0xb3, 0x64, 0x02, 0x7e, 0xa2, 0x9d, 0xcb, 0xd7, 0xb0, 0x6d, 0xc7, 0x50, 0x86, 0xba, 0x39, 0xb6,
|
||||
0xc3, 0xfa, 0x00, 0x40, 0xdc, 0xf3, 0xfb, 0x1a, 0xa8, 0xec, 0x67, 0x7e, 0x73, 0x42, 0x78, 0xf5,
|
||||
0x44, 0x7f, 0xf6, 0x8e, 0xa0, 0x33, 0xa7, 0x73, 0x01, 0x4c, 0x7d, 0xc3, 0x86, 0xa9, 0xfc, 0x6a,
|
||||
0x64, 0x4f, 0xb5, 0xb1, 0xeb, 0x2f, 0x25, 0xf9, 0x2c, 0x60, 0x5e, 0x62, 0xb1, 0x6f, 0x6b, 0x45,
|
||||
0xb2, 0xf9, 0x32, 0x1b, 0x60, 0xdf, 0xb1, 0xec, 0xc6, 0xcc, 0x6b, 0x46, 0x76, 0x9b, 0x86, 0x1b,
|
||||
0x31, 0xa0, 0x08, 0x2c, 0xdc, 0x08, 0x2b, 0x38, 0x5e, 0x63, 0x60, 0xed, 0x76, 0xa1, 0x51, 0xac,
|
||||
0x7e, 0x4c, 0xa3, 0xa8, 0x5e, 0xf6, 0x96, 0xfd, 0x2d, 0xb1, 0x83, 0x77, 0xff, 0xca, 0x93, 0x83,
|
||||
0x7d, 0xbc, 0xf7, 0x6d, 0xcc, 0xfe, 0xab, 0xe7, 0xdc, 0x51, 0x6e, 0x2d, 0xf9, 0x27, 0xb0, 0x77,
|
||||
0x77, 0xe9, 0xb8, 0x6a, 0xd9, 0xaf, 0x38, 0x1e, 0xac, 0xcf, 0xfc, 0x87, 0xe3, 0xe8, 0xa3, 0x66,
|
||||
0xf1, 0xff, 0x64, 0xbd, 0x3b, 0xcb, 0x86, 0x6d, 0x9d, 0x33, 0x77, 0x04, 0xa3, 0x73, 0xf1, 0x7b,
|
||||
0x8a, 0xd1, 0xb9, 0xec, 0x6a, 0x71, 0xc5, 0xf9, 0x2e, 0xd4, 0xe4, 0xbf, 0x3a, 0x8e, 0xbe, 0xb8,
|
||||
0x14, 0xfe, 0x2f, 0xea, 0x5d, 0x9b, 0xe1, 0x9a, 0x89, 0xcf, 0xa1, 0x55, 0xf8, 0x2b, 0xd0, 0xb9,
|
||||
0x59, 0xb0, 0x55, 0xfc, 0x53, 0xa8, 0x77, 0x6b, 0xf1, 0xa0, 0xd1, 0xb6, 0x0b, 0x90, 0x3f, 0xfc,
|
||||
0x3b, 0x5d, 0x25, 0x3d, 0xf7, 0xe7, 0x52, 0xef, 0xc6, 0x82, 0x11, 0xa3, 0x04, 0xb7, 0x72, 0xf6,
|
||||
0x89, 0xde, 0x99, 0x89, 0xea, 0xec, 0x03, 0xb9, 0xd9, 0xca, 0xa5, 0x6f, 0xfb, 0xa4, 0x76, 0xf6,
|
||||
0xe1, 0xdd, 0xa8, 0x5d, 0xf2, 0xec, 0x6f, 0xd4, 0x2e, 0x7d, 0xb1, 0xbf, 0xe2, 0xbc, 0x82, 0x76,
|
||||
0xf1, 0x25, 0xdb, 0xd1, 0x41, 0x5a, 0xf8, 0x94, 0xdf, 0xbb, 0xbd, 0x64, 0xd4, 0x28, 0xfc, 0x0c,
|
||||
0x56, 0xe4, 0x13, 0xb5, 0x2e, 0x47, 0xfb, 0x65, 0xbb, 0xb7, 0x59, 0x64, 0x9a, 0x59, 0x0f, 0xa1,
|
||||
0x26, 0x6f, 0x97, 0x26, 0x01, 0x0a, 0x97, 0xcd, 0x5e, 0xd3, 0xe6, 0xba, 0x57, 0x1e, 0x96, 0xb4,
|
||||
0x9d, 0xac, 0x60, 0x27, 0x5b, 0x64, 0xc7, 0xda, 0x9c, 0xe3, 0x1a, 0x95, 0xeb, 0xa3, 0x7f, 0x05,
|
||||
0x00, 0x00, 0xff, 0xff, 0xa7, 0x2d, 0xc6, 0x49, 0x94, 0x1f, 0x00, 0x00,
|
||||
}
|
||||
|
|
|
@ -192,7 +192,7 @@ message UpdateContainerRequest {
|
|||
}
|
||||
|
||||
message UpdateResource {
|
||||
uint64 blkioWeight =1;
|
||||
uint64 blkioWeight = 1;
|
||||
uint64 cpuShares = 2;
|
||||
uint64 cpuPeriod = 3;
|
||||
uint64 cpuQuota = 4;
|
||||
|
@ -203,6 +203,28 @@ message UpdateResource {
|
|||
uint64 memoryReservation = 9;
|
||||
uint64 kernelMemoryLimit = 10;
|
||||
uint64 kernelTCPMemoryLimit = 11;
|
||||
uint64 blkioLeafWeight = 12;
|
||||
repeated WeightDevice blkioWeightDevice = 13;
|
||||
repeated ThrottleDevice blkioThrottleReadBpsDevice = 14;
|
||||
repeated ThrottleDevice blkioThrottleWriteBpsDevice = 15;
|
||||
repeated ThrottleDevice blkioThrottleReadIopsDevice = 16;
|
||||
repeated ThrottleDevice blkioThrottleWriteIopsDevice = 17;
|
||||
}
|
||||
|
||||
message BlockIODevice {
|
||||
int64 major = 1;
|
||||
int64 minor = 2;
|
||||
}
|
||||
|
||||
message WeightDevice {
|
||||
BlockIODevice blkIODevice = 1;
|
||||
uint32 weight = 2;
|
||||
uint32 leafWeight = 3;
|
||||
}
|
||||
|
||||
message ThrottleDevice {
|
||||
BlockIODevice blkIODevice = 1;
|
||||
uint64 rate = 2;
|
||||
}
|
||||
|
||||
message UpdateContainerResponse {
|
||||
|
|
Загрузка…
Ссылка в новой задаче