From 5c02dda869390725a799339b094f548d327c9122 Mon Sep 17 00:00:00 2001
From: baude <bbaude@redhat.com>
Date: Mon, 3 Dec 2018 09:15:29 -0600
Subject: Adding more varlink endpoints

* runlabel
* checkpoint
* restore
* container|image exists
* mount
* unmount

Signed-off-by: baude <bbaude@redhat.com>
---
 pkg/varlinkapi/containers.go | 49 ++++++++++++++++++++++++++++++++++++++++++++
 pkg/varlinkapi/images.go     | 45 ++++++++++++++++++++++++++++++++++++++++
 pkg/varlinkapi/mount.go      | 49 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 143 insertions(+)
 create mode 100644 pkg/varlinkapi/mount.go

(limited to 'pkg')

diff --git a/pkg/varlinkapi/containers.go b/pkg/varlinkapi/containers.go
index f517e9b6e..07d981786 100644
--- a/pkg/varlinkapi/containers.go
+++ b/pkg/varlinkapi/containers.go
@@ -278,6 +278,18 @@ func (i *LibpodAPI) RestartContainer(call iopodman.VarlinkCall, name string, tim
 	return call.ReplyRestartContainer(ctr.ID())
 }
 
+// ContainerExists looks in local storage for the existence of a container
+func (i *LibpodAPI) ContainerExists(call iopodman.VarlinkCall, name string) error {
+	_, err := i.Runtime.LookupContainer(name)
+	if errors.Cause(err) == libpod.ErrNoSuchCtr {
+		return call.ReplyContainerExists(1)
+	}
+	if err != nil {
+		return call.ReplyErrorOccurred(err.Error())
+	}
+	return call.ReplyContainerExists(0)
+}
+
 // KillContainer kills a running container.  If you want to use the default SIGTERM signal, just send a -1
 // for the signal arg.
 func (i *LibpodAPI) KillContainer(call iopodman.VarlinkCall, name string, signal int64) error {
@@ -413,3 +425,40 @@ func (i *LibpodAPI) GetAttachSockets(call iopodman.VarlinkCall, name string) err
 	}
 	return call.ReplyGetAttachSockets(s)
 }
+
+// ContainerCheckpoint ...
+func (i *LibpodAPI) ContainerCheckpoint(call iopodman.VarlinkCall, name string, keep, leaveRunning, tcpEstablished bool) error {
+	ctx := getContext()
+	ctr, err := i.Runtime.LookupContainer(name)
+	if err != nil {
+		return call.ReplyContainerNotFound(name)
+	}
+
+	options := libpod.ContainerCheckpointOptions{
+		Keep:           keep,
+		TCPEstablished: tcpEstablished,
+		KeepRunning:    leaveRunning,
+	}
+	if err := ctr.Checkpoint(ctx, options); err != nil {
+		return call.ReplyErrorOccurred(err.Error())
+	}
+	return call.ReplyContainerCheckpoint(ctr.ID())
+}
+
+// ContainerRestore ...
+func (i *LibpodAPI) ContainerRestore(call iopodman.VarlinkCall, name string, keep, tcpEstablished bool) error {
+	ctx := getContext()
+	ctr, err := i.Runtime.LookupContainer(name)
+	if err != nil {
+		return call.ReplyContainerNotFound(name)
+	}
+
+	options := libpod.ContainerCheckpointOptions{
+		Keep:           keep,
+		TCPEstablished: tcpEstablished,
+	}
+	if err := ctr.Restore(ctx, options); err != nil {
+		return call.ReplyErrorOccurred(err.Error())
+	}
+	return call.ReplyContainerRestore(ctr.ID())
+}
diff --git a/pkg/varlinkapi/images.go b/pkg/varlinkapi/images.go
index 42e285b53..6d3f19422 100644
--- a/pkg/varlinkapi/images.go
+++ b/pkg/varlinkapi/images.go
@@ -4,7 +4,9 @@ import (
 	"bytes"
 	"encoding/json"
 	"fmt"
+	"github.com/containers/libpod/cmd/podman/shared"
 	"io"
+	"os"
 	"path/filepath"
 	"strings"
 	"time"
@@ -19,6 +21,7 @@ import (
 	"github.com/containers/libpod/libpod/image"
 	sysreg "github.com/containers/libpod/pkg/registries"
 	"github.com/containers/libpod/pkg/util"
+	"github.com/containers/libpod/utils"
 	"github.com/docker/go-units"
 	"github.com/opencontainers/image-spec/specs-go/v1"
 	"github.com/opencontainers/runtime-spec/specs-go"
@@ -500,3 +503,45 @@ func (i *LibpodAPI) PullImage(call iopodman.VarlinkCall, name string) error {
 	}
 	return call.ReplyPullImage(newImage.ID())
 }
+
+// ImageExists returns bool as to whether the input image exists in local storage
+func (i *LibpodAPI) ImageExists(call iopodman.VarlinkCall, name string) error {
+	_, err := i.Runtime.ImageRuntime().NewFromLocal(name)
+	if errors.Cause(err) == libpod.ErrNoSuchImage {
+		return call.ReplyImageExists(1)
+	}
+	if err != nil {
+		return call.ReplyErrorOccurred(err.Error())
+	}
+	return call.ReplyImageExists(0)
+}
+
+// ContainerRunlabel ...
+func (i *LibpodAPI) ContainerRunlabel(call iopodman.VarlinkCall, input iopodman.Runlabel) error {
+	ctx := getContext()
+	dockerRegistryOptions := image.DockerRegistryOptions{
+		DockerCertPath:              input.CertDir,
+		DockerInsecureSkipTLSVerify: !input.TlsVerify,
+	}
+
+	stdErr := os.Stderr
+	stdOut := os.Stdout
+	stdIn := os.Stdin
+
+	runLabel, imageName, err := shared.GetRunlabel(input.Label, input.Image, ctx, i.Runtime, input.Pull, input.Creds, dockerRegistryOptions, input.Authfile, input.SignaturePolicyPath, nil)
+	if err != nil {
+		return err
+	}
+	if runLabel == "" {
+		return nil
+	}
+
+	cmd, env, err := shared.GenerateRunlabelCommand(runLabel, imageName, input.Name, input.Opts, input.ExtraArgs)
+	if err != nil {
+		return err
+	}
+	if err := utils.ExecCmdWithStdStreams(stdIn, stdOut, stdErr, env, cmd[0], cmd[1:]...); err != nil {
+		return call.ReplyErrorOccurred(err.Error())
+	}
+	return call.ReplyContainerRunlabel()
+}
diff --git a/pkg/varlinkapi/mount.go b/pkg/varlinkapi/mount.go
new file mode 100644
index 000000000..84e6b2709
--- /dev/null
+++ b/pkg/varlinkapi/mount.go
@@ -0,0 +1,49 @@
+package varlinkapi
+
+import (
+	"github.com/containers/libpod/cmd/podman/varlink"
+)
+
+// ListContainerMounts ...
+func (i *LibpodAPI) ListContainerMounts(call iopodman.VarlinkCall) error {
+	var mounts []string
+	allContainers, err := i.Runtime.GetAllContainers()
+	if err != nil {
+		return call.ReplyErrorOccurred(err.Error())
+	}
+	for _, container := range allContainers {
+		mounted, mountPoint, err := container.Mounted()
+		if err != nil {
+			return call.ReplyErrorOccurred(err.Error())
+		}
+		if mounted {
+			mounts = append(mounts, mountPoint)
+		}
+	}
+	return call.ReplyListContainerMounts(mounts)
+}
+
+// MountContainer ...
+func (i *LibpodAPI) MountContainer(call iopodman.VarlinkCall, name string) error {
+	container, err := i.Runtime.LookupContainer(name)
+	if err != nil {
+		return call.ReplyErrorOccurred(err.Error())
+	}
+	path, err := container.Mount()
+	if err != nil {
+		return call.ReplyErrorOccurred(err.Error())
+	}
+	return call.ReplyMountContainer(path)
+}
+
+// UnmountContainer ...
+func (i *LibpodAPI) UnmountContainer(call iopodman.VarlinkCall, name string, force bool) error {
+	container, err := i.Runtime.LookupContainer(name)
+	if err != nil {
+		return call.ReplyErrorOccurred(err.Error())
+	}
+	if err := container.Unmount(force); err != nil {
+		return call.ReplyErrorOccurred(err.Error())
+	}
+	return call.ReplyUnmountContainer()
+}
-- 
cgit v1.2.3-54-g00ecf