diff options
-rw-r--r-- | runsc/cmd/BUILD | 2 | ||||
-rw-r--r-- | runsc/cmd/checkpoint.go | 70 | ||||
-rw-r--r-- | runsc/cmd/restore.go | 51 | ||||
-rw-r--r-- | runsc/container/container.go | 10 | ||||
-rw-r--r-- | runsc/sandbox/sandbox.go | 15 |
5 files changed, 148 insertions, 0 deletions
diff --git a/runsc/cmd/BUILD b/runsc/cmd/BUILD index 4b4afa4a0..a8c84a6a3 100644 --- a/runsc/cmd/BUILD +++ b/runsc/cmd/BUILD @@ -6,6 +6,7 @@ go_library( name = "cmd", srcs = [ "boot.go", + "checkpoint.go", "cmd.go", "create.go", "delete.go", @@ -16,6 +17,7 @@ go_library( "list.go", "path.go", "ps.go", + "restore.go", "run.go", "start.go", "state.go", diff --git a/runsc/cmd/checkpoint.go b/runsc/cmd/checkpoint.go new file mode 100644 index 000000000..9b045da1c --- /dev/null +++ b/runsc/cmd/checkpoint.go @@ -0,0 +1,70 @@ +// Copyright 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cmd + +import ( + "context" + "flag" + "github.com/google/subcommands" + "gvisor.googlesource.com/gvisor/runsc/boot" + "gvisor.googlesource.com/gvisor/runsc/container" +) + +// Checkpoint implements subcommands.Command for the "checkpoint" command. +type Checkpoint struct { +} + +// Name implements subcommands.Command.Name. +func (*Checkpoint) Name() string { + return "checkpoint" +} + +// Synopsis implements subcommands.Command.Synopsis. +func (*Checkpoint) Synopsis() string { + return "checkpoint current state of container" +} + +// Usage implements subcommands.Command.Usage. +func (*Checkpoint) Usage() string { + return `checkpoint [flags] <container id> - save current state of container. +` +} + +// SetFlags implements subcommands.Command.SetFlags. +func (c *Checkpoint) SetFlags(f *flag.FlagSet) { +} + +// Execute implements subcommands.Command.Execute. +func (c *Checkpoint) Execute(_ context.Context, f *flag.FlagSet, args ...interface{}) subcommands.ExitStatus { + + if f.NArg() != 1 { + f.Usage() + return subcommands.ExitUsageError + } + + id := f.Arg(0) + conf := args[0].(*boot.Config) + + cont, err := container.Load(conf.RootDir, id) + if err != nil { + Fatalf("error loading container: %v", err) + } + + if err := cont.Checkpoint(); err != nil { + Fatalf("checkpoint failed: %v", err) + } + + return subcommands.ExitSuccess +} diff --git a/runsc/cmd/restore.go b/runsc/cmd/restore.go new file mode 100644 index 000000000..a535197a4 --- /dev/null +++ b/runsc/cmd/restore.go @@ -0,0 +1,51 @@ +// Copyright 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cmd + +import ( + "context" + "flag" + "github.com/google/subcommands" +) + +// Restore implements subcommands.Command for the "restore" command. +type Restore struct { +} + +// Name implements subcommands.Command.Name. +func (*Restore) Name() string { + return "restore" +} + +// Synopsis implements subcommands.Command.Synopsis. +func (*Restore) Synopsis() string { + return "restore a saved state of container" +} + +// Usage implements subcommands.Command.Usage. +func (*Restore) Usage() string { + return `restore [flags] <container id> - restore last saved state of container. +` +} + +// SetFlags implements subcommands.Command.SetFlags. +func (r *Restore) SetFlags(f *flag.FlagSet) { +} + +// Execute implements subcommands.Command.Execute. +func (r *Restore) Execute(_ context.Context, f *flag.FlagSet, args ...interface{}) subcommands.ExitStatus { + Fatalf("restore not implemented") + return subcommands.ExitFailure +} diff --git a/runsc/container/container.go b/runsc/container/container.go index f20ec2453..eee148f5a 100644 --- a/runsc/container/container.go +++ b/runsc/container/container.go @@ -299,6 +299,16 @@ func (c *Container) Signal(sig syscall.Signal) error { return c.Sandbox.Signal(c.ID, sig) } +// Checkpoint sends the checkpoint call to the container. +func (c *Container) Checkpoint() error { + log.Debugf("Checkpoint container %q", c.ID) + if c.Status == Stopped { + log.Warningf("container %q not running, not checkpointing", c.ID) + return nil + } + return c.Sandbox.Checkpoint(c.ID) +} + // State returns the metadata of the container. func (c *Container) State() specs.State { return specs.State{ diff --git a/runsc/sandbox/sandbox.go b/runsc/sandbox/sandbox.go index bfaead1f2..2a434cfb7 100644 --- a/runsc/sandbox/sandbox.go +++ b/runsc/sandbox/sandbox.go @@ -440,6 +440,21 @@ func (s *Sandbox) Signal(cid string, sig syscall.Signal) error { return nil } +// Checkpoint sends the checkpoint call for a container in the sandbox. +func (s *Sandbox) Checkpoint(cid string) error { + log.Debugf("Checkpoint sandbox %q", s.ID) + conn, err := s.connect() + if err != nil { + return err + } + defer conn.Close() + + if err := conn.Call(boot.ContainerCheckpoint, nil, nil); err != nil { + return fmt.Errorf("err checkpointing container %q: %v", cid, err) + } + return nil +} + // IsRunning returns true if the sandbox or gofer process is running. func (s *Sandbox) IsRunning() bool { if s.Pid != 0 { |