Files
runc/vendor/github.com/checkpoint-restore/go-criu/test/main.go
T
Adrian Reber bfca1e6262 Vendor in go-criu
Now that CRIU has released Go bindings, this commit vendors those in.

At first it only replaces the copy of RPC interface but the goal is to
use CRIU functions from the Go bindings instead of replicating the
functionality in runc.

Signed-off-by: Adrian Reber <areber@redhat.com>
2019-02-14 18:20:02 +01:00

134 lines
2.5 KiB
Go

package main
import (
"fmt"
"github.com/checkpoint-restore/go-criu"
"github.com/checkpoint-restore/go-criu/rpc"
"github.com/golang/protobuf/proto"
"os"
"strconv"
)
// TestNfy struct
type TestNfy struct {
criu.NoNotify
}
// PreDump test function
func (c TestNfy) PreDump() error {
fmt.Printf("TEST PRE DUMP\n")
return nil
}
func doDump(c *criu.Criu, pidS string, imgDir string, pre bool, prevImg string) error {
fmt.Printf("Dumping\n")
pid, _ := strconv.Atoi(pidS)
img, err := os.Open(imgDir)
if err != nil {
return fmt.Errorf("can't open image dir (%s)", err)
}
defer img.Close()
opts := rpc.CriuOpts{
Pid: proto.Int32(int32(pid)),
ImagesDirFd: proto.Int32(int32(img.Fd())),
LogLevel: proto.Int32(4),
LogFile: proto.String("dump.log"),
}
if prevImg != "" {
opts.ParentImg = proto.String(prevImg)
opts.TrackMem = proto.Bool(true)
}
if pre {
err = c.PreDump(opts, TestNfy{})
} else {
err = c.Dump(opts, TestNfy{})
}
if err != nil {
return fmt.Errorf("dump fail (%s)", err)
}
return nil
}
// Usage: test $act $pid $images_dir
func main() {
c := criu.MakeCriu()
// Read out CRIU version
version, err := c.GetCriuVersion()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println("CRIU version", version)
// Check if version at least 3.2
result, err := c.IsCriuAtLeast(30200)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
if !result {
fmt.Println("CRIU too old")
os.Exit(1)
}
act := os.Args[1]
switch act {
case "dump":
err := doDump(c, os.Args[2], os.Args[3], false, "")
if err != nil {
fmt.Print(err)
os.Exit(1)
}
case "dump2":
err := c.Prepare()
if err != nil {
fmt.Print(err)
os.Exit(1)
}
err = doDump(c, os.Args[2], os.Args[3]+"/pre", true, "")
if err != nil {
fmt.Printf("pre-dump failed")
fmt.Print(err)
os.Exit(1)
}
err = doDump(c, os.Args[2], os.Args[3], false, "./pre")
if err != nil {
fmt.Printf("dump failed")
fmt.Print(err)
os.Exit(1)
}
c.Cleanup()
case "restore":
fmt.Printf("Restoring\n")
img, err := os.Open(os.Args[2])
if err != nil {
fmt.Printf("can't open image dir")
os.Exit(1)
}
defer img.Close()
opts := rpc.CriuOpts{
ImagesDirFd: proto.Int32(int32(img.Fd())),
LogLevel: proto.Int32(4),
LogFile: proto.String("restore.log"),
}
err = c.Restore(opts, nil)
if err != nil {
fmt.Printf("Error:")
fmt.Print(err)
fmt.Printf("\n")
os.Exit(1)
}
default:
fmt.Printf("unknown action\n")
os.Exit(1)
}
fmt.Printf("Success\n")
}