diff options
Diffstat (limited to 'vendor/github.com/checkpoint-restore/go-criu/test/main.go')
-rw-r--r-- | vendor/github.com/checkpoint-restore/go-criu/test/main.go | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/vendor/github.com/checkpoint-restore/go-criu/test/main.go b/vendor/github.com/checkpoint-restore/go-criu/test/main.go new file mode 100644 index 000000000..418ebb843 --- /dev/null +++ b/vendor/github.com/checkpoint-restore/go-criu/test/main.go @@ -0,0 +1,133 @@ +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") +} |