mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
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:
@@ -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",
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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{
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user