Add runsc checkpoint command.

Checkpoint command is plumbed through container and sandbox.
Restore has also been added but it is only a stub. None of this
works yet. More changes to come.

PiperOrigin-RevId: 199510105
Change-Id: Ibd08d57f4737847eb25ca20b114518e487320185
This commit is contained in:
Googler
2018-06-06 12:31:53 -07:00
committed by Shentubot
parent 722275c3d1
commit 0c34b460f2
5 changed files with 148 additions and 0 deletions
+2
View File
@@ -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",
+70
View File
@@ -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
}
+51
View File
@@ -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
}
+10
View File
@@ -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{
+15
View File
@@ -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 {