diff options
author | Adrian Reber <areber@redhat.com> | 2021-07-08 15:31:51 +0000 |
---|---|---|
committer | Adrian Reber <adrian@lisas.de> | 2021-07-27 16:10:44 +0200 |
commit | 3375cbb198c74e895624eada148edff514b64d35 (patch) | |
tree | 4aa8679fddfe9221ab1560c3d06a9a0ce72efdb0 /vendor/github.com/checkpoint-restore/go-criu/main.go | |
parent | 92dce3e2febc752434c08574cbb394545c7fef47 (diff) | |
download | podman-3375cbb198c74e895624eada148edff514b64d35.tar.gz podman-3375cbb198c74e895624eada148edff514b64d35.tar.bz2 podman-3375cbb198c74e895624eada148edff514b64d35.zip |
Vendor in go-criu v5.1.0 for Pod checkpoint/restore support
Signed-off-by: Adrian Reber <areber@redhat.com>
Diffstat (limited to 'vendor/github.com/checkpoint-restore/go-criu/main.go')
-rw-r--r-- | vendor/github.com/checkpoint-restore/go-criu/main.go | 250 |
1 files changed, 0 insertions, 250 deletions
diff --git a/vendor/github.com/checkpoint-restore/go-criu/main.go b/vendor/github.com/checkpoint-restore/go-criu/main.go deleted file mode 100644 index cf94c376e..000000000 --- a/vendor/github.com/checkpoint-restore/go-criu/main.go +++ /dev/null @@ -1,250 +0,0 @@ -package criu - -import ( - "errors" - "fmt" - "os" - "os/exec" - "strconv" - "syscall" - - "github.com/checkpoint-restore/go-criu/rpc" - "github.com/golang/protobuf/proto" -) - -// Criu struct -type Criu struct { - swrkCmd *exec.Cmd - swrkSk *os.File -} - -// MakeCriu returns the Criu object required for most operations -func MakeCriu() *Criu { - return &Criu{} -} - -// Prepare sets up everything for the RPC communication to CRIU -func (c *Criu) Prepare() error { - fds, err := syscall.Socketpair(syscall.AF_LOCAL, syscall.SOCK_SEQPACKET, 0) - if err != nil { - return err - } - - cln := os.NewFile(uintptr(fds[0]), "criu-xprt-cln") - syscall.CloseOnExec(fds[0]) - srv := os.NewFile(uintptr(fds[1]), "criu-xprt-srv") - defer srv.Close() - - args := []string{"swrk", strconv.Itoa(fds[1])} - cmd := exec.Command("criu", args...) - - err = cmd.Start() - if err != nil { - cln.Close() - return err - } - - c.swrkCmd = cmd - c.swrkSk = cln - - return nil -} - -// Cleanup cleans up -func (c *Criu) Cleanup() { - if c.swrkCmd != nil { - c.swrkSk.Close() - c.swrkSk = nil - c.swrkCmd.Wait() - c.swrkCmd = nil - } -} - -func (c *Criu) sendAndRecv(reqB []byte) ([]byte, int, error) { - cln := c.swrkSk - _, err := cln.Write(reqB) - if err != nil { - return nil, 0, err - } - - respB := make([]byte, 2*4096) - n, err := cln.Read(respB) - if err != nil { - return nil, 0, err - } - - return respB, n, nil -} - -func (c *Criu) doSwrk(reqType rpc.CriuReqType, opts *rpc.CriuOpts, nfy Notify) error { - resp, err := c.doSwrkWithResp(reqType, opts, nfy) - if err != nil { - return err - } - respType := resp.GetType() - if respType != reqType { - return errors.New("unexpected responce") - } - - return nil -} - -func (c *Criu) doSwrkWithResp(reqType rpc.CriuReqType, opts *rpc.CriuOpts, nfy Notify) (*rpc.CriuResp, error) { - var resp *rpc.CriuResp - - req := rpc.CriuReq{ - Type: &reqType, - Opts: opts, - } - - if nfy != nil { - opts.NotifyScripts = proto.Bool(true) - } - - if c.swrkCmd == nil { - err := c.Prepare() - if err != nil { - return nil, err - } - - defer c.Cleanup() - } - - for { - reqB, err := proto.Marshal(&req) - if err != nil { - return nil, err - } - - respB, respS, err := c.sendAndRecv(reqB) - if err != nil { - return nil, err - } - - resp = &rpc.CriuResp{} - err = proto.Unmarshal(respB[:respS], resp) - if err != nil { - return nil, err - } - - if !resp.GetSuccess() { - return resp, fmt.Errorf("operation failed (msg:%s err:%d)", - resp.GetCrErrmsg(), resp.GetCrErrno()) - } - - respType := resp.GetType() - if respType != rpc.CriuReqType_NOTIFY { - break - } - if nfy == nil { - return resp, errors.New("unexpected notify") - } - - notify := resp.GetNotify() - switch notify.GetScript() { - case "pre-dump": - err = nfy.PreDump() - case "post-dump": - err = nfy.PostDump() - case "pre-restore": - err = nfy.PreRestore() - case "post-restore": - err = nfy.PostRestore(notify.GetPid()) - case "network-lock": - err = nfy.NetworkLock() - case "network-unlock": - err = nfy.NetworkUnlock() - case "setup-namespaces": - err = nfy.SetupNamespaces(notify.GetPid()) - case "post-setup-namespaces": - err = nfy.PostSetupNamespaces() - case "post-resume": - err = nfy.PostResume() - default: - err = nil - } - - if err != nil { - return resp, err - } - - req = rpc.CriuReq{ - Type: &respType, - NotifySuccess: proto.Bool(true), - } - } - - return resp, nil -} - -// Dump dumps a process -func (c *Criu) Dump(opts rpc.CriuOpts, nfy Notify) error { - return c.doSwrk(rpc.CriuReqType_DUMP, &opts, nfy) -} - -// Restore restores a process -func (c *Criu) Restore(opts rpc.CriuOpts, nfy Notify) error { - return c.doSwrk(rpc.CriuReqType_RESTORE, &opts, nfy) -} - -// PreDump does a pre-dump -func (c *Criu) PreDump(opts rpc.CriuOpts, nfy Notify) error { - return c.doSwrk(rpc.CriuReqType_PRE_DUMP, &opts, nfy) -} - -// StartPageServer starts the page server -func (c *Criu) StartPageServer(opts rpc.CriuOpts) error { - return c.doSwrk(rpc.CriuReqType_PAGE_SERVER, &opts, nil) -} - -// StartPageServerChld starts the page server and returns PID and port -func (c *Criu) StartPageServerChld(opts rpc.CriuOpts) (int, int, error) { - resp, err := c.doSwrkWithResp(rpc.CriuReqType_PAGE_SERVER_CHLD, &opts, nil) - if err != nil { - return 0, 0, err - } - - return int(resp.Ps.GetPid()), int(resp.Ps.GetPort()), nil -} - -// GetCriuVersion executes the VERSION RPC call and returns the version -// as an integer. Major * 10000 + Minor * 100 + SubLevel -func (c *Criu) GetCriuVersion() (int, error) { - resp, err := c.doSwrkWithResp(rpc.CriuReqType_VERSION, nil, nil) - if err != nil { - return 0, err - } - - if resp.GetType() != rpc.CriuReqType_VERSION { - return 0, fmt.Errorf("Unexpected CRIU RPC response") - } - - version := int(*resp.GetVersion().Major) * 10000 - version += int(*resp.GetVersion().Minor) * 100 - if resp.GetVersion().Sublevel != nil { - version += int(*resp.GetVersion().Sublevel) - } - - if resp.GetVersion().Gitid != nil { - // taken from runc: if it is a git release -> increase minor by 1 - version -= (version % 100) - version += 100 - } - - return version, nil -} - -// IsCriuAtLeast checks if the version is at least the same -// as the parameter version -func (c *Criu) IsCriuAtLeast(version int) (bool, error) { - criuVersion, err := c.GetCriuVersion() - if err != nil { - return false, err - } - - if criuVersion >= version { - return true, nil - } - - return false, nil -} |