mirror of
https://github.com/containers/podman.git
synced 2025-06-20 00:51:16 +08:00
Adding more varlink endpoints
* runlabel * checkpoint * restore * container|image exists * mount * unmount Signed-off-by: baude <bbaude@redhat.com>
This commit is contained in:
103
API.md
103
API.md
@ -9,6 +9,14 @@ in the [API.md](https://github.com/containers/libpod/blob/master/API.md) file in
|
|||||||
|
|
||||||
[func Commit(name: string, image_name: string, changes: []string, author: string, message: string, pause: bool, manifestType: string) string](#Commit)
|
[func Commit(name: string, image_name: string, changes: []string, author: string, message: string, pause: bool, manifestType: string) string](#Commit)
|
||||||
|
|
||||||
|
[func ContainerCheckpoint(name: string, keep: bool, leaveRunning: bool, tcpEstablished: bool) string](#ContainerCheckpoint)
|
||||||
|
|
||||||
|
[func ContainerExists(name: string) int](#ContainerExists)
|
||||||
|
|
||||||
|
[func ContainerRestore(name: string, keep: bool, tcpEstablished: bool) string](#ContainerRestore)
|
||||||
|
|
||||||
|
[func ContainerRunlabel(runlabel: Runlabel) ](#ContainerRunlabel)
|
||||||
|
|
||||||
[func CreateContainer(create: Create) string](#CreateContainer)
|
[func CreateContainer(create: Create) string](#CreateContainer)
|
||||||
|
|
||||||
[func CreateImage() NotImplemented](#CreateImage)
|
[func CreateImage() NotImplemented](#CreateImage)
|
||||||
@ -43,6 +51,8 @@ in the [API.md](https://github.com/containers/libpod/blob/master/API.md) file in
|
|||||||
|
|
||||||
[func HistoryImage(name: string) ImageHistory](#HistoryImage)
|
[func HistoryImage(name: string) ImageHistory](#HistoryImage)
|
||||||
|
|
||||||
|
[func ImageExists(name: string) int](#ImageExists)
|
||||||
|
|
||||||
[func ImportImage(source: string, reference: string, message: string, changes: []string) string](#ImportImage)
|
[func ImportImage(source: string, reference: string, message: string, changes: []string) string](#ImportImage)
|
||||||
|
|
||||||
[func InspectContainer(name: string) string](#InspectContainer)
|
[func InspectContainer(name: string) string](#InspectContainer)
|
||||||
@ -57,6 +67,10 @@ in the [API.md](https://github.com/containers/libpod/blob/master/API.md) file in
|
|||||||
|
|
||||||
[func ListContainerChanges(name: string) ContainerChanges](#ListContainerChanges)
|
[func ListContainerChanges(name: string) ContainerChanges](#ListContainerChanges)
|
||||||
|
|
||||||
|
[func ListContainerMounts() []string](#ListContainerMounts)
|
||||||
|
|
||||||
|
[func ListContainerPorts(name: string) NotImplemented](#ListContainerPorts)
|
||||||
|
|
||||||
[func ListContainerProcesses(name: string, opts: []string) []string](#ListContainerProcesses)
|
[func ListContainerProcesses(name: string, opts: []string) []string](#ListContainerProcesses)
|
||||||
|
|
||||||
[func ListContainers() ListContainerData](#ListContainers)
|
[func ListContainers() ListContainerData](#ListContainers)
|
||||||
@ -65,6 +79,8 @@ in the [API.md](https://github.com/containers/libpod/blob/master/API.md) file in
|
|||||||
|
|
||||||
[func ListPods() ListPodData](#ListPods)
|
[func ListPods() ListPodData](#ListPods)
|
||||||
|
|
||||||
|
[func MountContainer(name: string) string](#MountContainer)
|
||||||
|
|
||||||
[func PauseContainer(name: string) string](#PauseContainer)
|
[func PauseContainer(name: string) string](#PauseContainer)
|
||||||
|
|
||||||
[func PausePod(name: string) string](#PausePod)
|
[func PausePod(name: string) string](#PausePod)
|
||||||
@ -103,6 +119,8 @@ in the [API.md](https://github.com/containers/libpod/blob/master/API.md) file in
|
|||||||
|
|
||||||
[func TopPod() NotImplemented](#TopPod)
|
[func TopPod() NotImplemented](#TopPod)
|
||||||
|
|
||||||
|
[func UnmountContainer(name: string, force: bool) ](#UnmountContainer)
|
||||||
|
|
||||||
[func UnpauseContainer(name: string) string](#UnpauseContainer)
|
[func UnpauseContainer(name: string) string](#UnpauseContainer)
|
||||||
|
|
||||||
[func UnpausePod(name: string) string](#UnpausePod)
|
[func UnpausePod(name: string) string](#UnpausePod)
|
||||||
@ -165,6 +183,8 @@ in the [API.md](https://github.com/containers/libpod/blob/master/API.md) file in
|
|||||||
|
|
||||||
[type PodmanInfo](#PodmanInfo)
|
[type PodmanInfo](#PodmanInfo)
|
||||||
|
|
||||||
|
[type Runlabel](#Runlabel)
|
||||||
|
|
||||||
[type Sockets](#Sockets)
|
[type Sockets](#Sockets)
|
||||||
|
|
||||||
[type StringResponse](#StringResponse)
|
[type StringResponse](#StringResponse)
|
||||||
@ -211,6 +231,31 @@ attributes: _CMD, ENTRYPOINT, ENV, EXPOSE, LABEL, ONBUILD, STOPSIGNAL, USER, VOL
|
|||||||
container while it is being committed, pass a _true_ bool for the pause argument. If the container cannot
|
container while it is being committed, pass a _true_ bool for the pause argument. If the container cannot
|
||||||
be found by the ID or name provided, a (ContainerNotFound)[#ContainerNotFound] error will be returned; otherwise,
|
be found by the ID or name provided, a (ContainerNotFound)[#ContainerNotFound] error will be returned; otherwise,
|
||||||
the resulting image's ID will be returned as a string.
|
the resulting image's ID will be returned as a string.
|
||||||
|
### <a name="ContainerCheckpoint"></a>func ContainerCheckpoint
|
||||||
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
|
method ContainerCheckpoint(name: [string](https://godoc.org/builtin#string), keep: [bool](https://godoc.org/builtin#bool), leaveRunning: [bool](https://godoc.org/builtin#bool), tcpEstablished: [bool](https://godoc.org/builtin#bool)) [string](https://godoc.org/builtin#string)</div>
|
||||||
|
ContainerCheckPoint performs a checkpopint on a container by its name or full/partial container
|
||||||
|
ID. On successful checkpoint, the id of the checkpointed container is returned.
|
||||||
|
### <a name="ContainerExists"></a>func ContainerExists
|
||||||
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
|
method ContainerExists(name: [string](https://godoc.org/builtin#string)) [int](https://godoc.org/builtin#int)</div>
|
||||||
|
ContainerExists takes a full or partial container ID or name and returns an int as to
|
||||||
|
whether the container exists in local storage. A result of 0 means the container does
|
||||||
|
exists; whereas a result of 1 means it could not be found.
|
||||||
|
### <a name="ContainerRestore"></a>func ContainerRestore
|
||||||
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
|
method ContainerRestore(name: [string](https://godoc.org/builtin#string), keep: [bool](https://godoc.org/builtin#bool), tcpEstablished: [bool](https://godoc.org/builtin#bool)) [string](https://godoc.org/builtin#string)</div>
|
||||||
|
ContainerRestore restores a container that has been checkpointed. The container to be restored can
|
||||||
|
be identified by its name or full/partial container ID. A successful restore will result in the return
|
||||||
|
of the container's ID.
|
||||||
|
### <a name="ContainerRunlabel"></a>func ContainerRunlabel
|
||||||
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
|
method ContainerRunlabel(runlabel: [Runlabel](#Runlabel)) </div>
|
||||||
|
ContainerRunlabel runs executes a command as described by a given container image label.
|
||||||
### <a name="CreateContainer"></a>func CreateContainer
|
### <a name="CreateContainer"></a>func CreateContainer
|
||||||
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
@ -403,6 +448,13 @@ method HistoryImage(name: [string](https://godoc.org/builtin#string)) [ImageHist
|
|||||||
HistoryImage takes the name or ID of an image and returns information about its history and layers. The returned
|
HistoryImage takes the name or ID of an image and returns information about its history and layers. The returned
|
||||||
history is in the form of an array of ImageHistory structures. If the image cannot be found, an
|
history is in the form of an array of ImageHistory structures. If the image cannot be found, an
|
||||||
[ImageNotFound](#ImageNotFound) error is returned.
|
[ImageNotFound](#ImageNotFound) error is returned.
|
||||||
|
### <a name="ImageExists"></a>func ImageExists
|
||||||
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
|
method ImageExists(name: [string](https://godoc.org/builtin#string)) [int](https://godoc.org/builtin#int)</div>
|
||||||
|
ImageExists talks a full or partial image ID or name and returns an int as to whether
|
||||||
|
the image exists in local storage. An int result of 0 means the image does exist in
|
||||||
|
local storage; whereas 1 indicates the image does not exists in local storage.
|
||||||
### <a name="ImportImage"></a>func ImportImage
|
### <a name="ImportImage"></a>func ImportImage
|
||||||
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
@ -453,6 +505,17 @@ See also [StopPod](StopPod).
|
|||||||
method ListContainerChanges(name: [string](https://godoc.org/builtin#string)) [ContainerChanges](#ContainerChanges)</div>
|
method ListContainerChanges(name: [string](https://godoc.org/builtin#string)) [ContainerChanges](#ContainerChanges)</div>
|
||||||
ListContainerChanges takes a name or ID of a container and returns changes between the container and
|
ListContainerChanges takes a name or ID of a container and returns changes between the container and
|
||||||
its base image. It returns a struct of changed, deleted, and added path names.
|
its base image. It returns a struct of changed, deleted, and added path names.
|
||||||
|
### <a name="ListContainerMounts"></a>func ListContainerMounts
|
||||||
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
|
method ListContainerMounts() [[]string](#[]string)</div>
|
||||||
|
ListContainerMounts gathers all the mounted container mount points and returns them as an array
|
||||||
|
of strings
|
||||||
|
### <a name="ListContainerPorts"></a>func ListContainerPorts
|
||||||
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
|
method ListContainerPorts(name: [string](https://godoc.org/builtin#string)) [NotImplemented](#NotImplemented)</div>
|
||||||
|
This function is not implemented yet.
|
||||||
### <a name="ListContainerProcesses"></a>func ListContainerProcesses
|
### <a name="ListContainerProcesses"></a>func ListContainerProcesses
|
||||||
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
@ -491,6 +554,12 @@ an image currently in storage. See also [InspectImage](InspectImage).
|
|||||||
method ListPods() [ListPodData](#ListPodData)</div>
|
method ListPods() [ListPodData](#ListPodData)</div>
|
||||||
ListPods returns a list of pods in no particular order. They are
|
ListPods returns a list of pods in no particular order. They are
|
||||||
returned as an array of ListPodData structs. See also [GetPod](#GetPod).
|
returned as an array of ListPodData structs. See also [GetPod](#GetPod).
|
||||||
|
### <a name="MountContainer"></a>func MountContainer
|
||||||
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
|
method MountContainer(name: [string](https://godoc.org/builtin#string)) [string](https://godoc.org/builtin#string)</div>
|
||||||
|
MountContainer mounts a container by name or full/partial ID. Upon a successful mount, the destination
|
||||||
|
mount is returned as a string.
|
||||||
### <a name="PauseContainer"></a>func PauseContainer
|
### <a name="PauseContainer"></a>func PauseContainer
|
||||||
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
@ -696,6 +765,11 @@ be found, an [ImageNotFound](#ImageNotFound) error will be returned; otherwise,
|
|||||||
|
|
||||||
method TopPod() [NotImplemented](#NotImplemented)</div>
|
method TopPod() [NotImplemented](#NotImplemented)</div>
|
||||||
This method has not been implemented yet.
|
This method has not been implemented yet.
|
||||||
|
### <a name="UnmountContainer"></a>func UnmountContainer
|
||||||
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
|
method UnmountContainer(name: [string](https://godoc.org/builtin#string), force: [bool](https://godoc.org/builtin#bool)) </div>
|
||||||
|
UnmountContainer umounts a container by its name or full/partial container ID.
|
||||||
### <a name="UnpauseContainer"></a>func UnpauseContainer
|
### <a name="UnpauseContainer"></a>func UnpauseContainer
|
||||||
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
@ -1293,6 +1367,33 @@ insecure_registries [[]string](#[]string)
|
|||||||
store [InfoStore](#InfoStore)
|
store [InfoStore](#InfoStore)
|
||||||
|
|
||||||
podman [InfoPodmanBinary](#InfoPodmanBinary)
|
podman [InfoPodmanBinary](#InfoPodmanBinary)
|
||||||
|
### <a name="Runlabel"></a>type Runlabel
|
||||||
|
|
||||||
|
Runlabel describes the required input for container runlabel
|
||||||
|
|
||||||
|
image [string](https://godoc.org/builtin#string)
|
||||||
|
|
||||||
|
authfile [string](https://godoc.org/builtin#string)
|
||||||
|
|
||||||
|
certDir [string](https://godoc.org/builtin#string)
|
||||||
|
|
||||||
|
creds [string](https://godoc.org/builtin#string)
|
||||||
|
|
||||||
|
display [bool](https://godoc.org/builtin#bool)
|
||||||
|
|
||||||
|
name [string](https://godoc.org/builtin#string)
|
||||||
|
|
||||||
|
pull [bool](https://godoc.org/builtin#bool)
|
||||||
|
|
||||||
|
signaturePolicyPath [string](https://godoc.org/builtin#string)
|
||||||
|
|
||||||
|
tlsVerify [bool](https://godoc.org/builtin#bool)
|
||||||
|
|
||||||
|
label [string](https://godoc.org/builtin#string)
|
||||||
|
|
||||||
|
extraArgs [[]string](#[]string)
|
||||||
|
|
||||||
|
opts [map[string]](#map[string])
|
||||||
### <a name="Sockets"></a>type Sockets
|
### <a name="Sockets"></a>type Sockets
|
||||||
|
|
||||||
Sockets describes sockets location for a container
|
Sockets describes sockets location for a container
|
||||||
@ -1336,7 +1437,7 @@ ImageNotFound means the image could not be found by the provided name or ID in l
|
|||||||
NoContainerRunning means none of the containers requested are running in a command that requires a running container.
|
NoContainerRunning means none of the containers requested are running in a command that requires a running container.
|
||||||
### <a name="NoContainersInPod"></a>type NoContainersInPod
|
### <a name="NoContainersInPod"></a>type NoContainersInPod
|
||||||
|
|
||||||
NoContainersInPod means a pod has no containers on which to perform operation. It contains
|
NoContainersInPod means a pod has no containers on which to perform the operation. It contains
|
||||||
the pod ID.
|
the pod ID.
|
||||||
### <a name="PodContainerError"></a>type PodContainerError
|
### <a name="PodContainerError"></a>type PodContainerError
|
||||||
|
|
||||||
|
@ -6,11 +6,9 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/containers/image/types"
|
|
||||||
"github.com/containers/libpod/cmd/podman/libpodruntime"
|
"github.com/containers/libpod/cmd/podman/libpodruntime"
|
||||||
"github.com/containers/libpod/cmd/podman/shared"
|
"github.com/containers/libpod/cmd/podman/shared"
|
||||||
"github.com/containers/libpod/libpod/image"
|
"github.com/containers/libpod/libpod/image"
|
||||||
"github.com/containers/libpod/pkg/util"
|
|
||||||
"github.com/containers/libpod/utils"
|
"github.com/containers/libpod/utils"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
@ -94,7 +92,7 @@ func runlabelCmd(c *cli.Context) error {
|
|||||||
imageName string
|
imageName string
|
||||||
stdErr, stdOut io.Writer
|
stdErr, stdOut io.Writer
|
||||||
stdIn io.Reader
|
stdIn io.Reader
|
||||||
newImage *image.Image
|
extraArgs []string
|
||||||
)
|
)
|
||||||
|
|
||||||
// Evil images could trick into recursively executing the runlabel
|
// Evil images could trick into recursively executing the runlabel
|
||||||
@ -124,6 +122,9 @@ func runlabelCmd(c *cli.Context) error {
|
|||||||
return errors.Errorf("the display and quiet flags cannot be used together.")
|
return errors.Errorf("the display and quiet flags cannot be used together.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(args) > 2 {
|
||||||
|
extraArgs = args[2:]
|
||||||
|
}
|
||||||
pull := c.Bool("pull")
|
pull := c.Bool("pull")
|
||||||
label := args[0]
|
label := args[0]
|
||||||
|
|
||||||
@ -151,75 +152,24 @@ func runlabelCmd(c *cli.Context) error {
|
|||||||
stdIn = nil
|
stdIn = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if pull {
|
dockerRegistryOptions := image.DockerRegistryOptions{
|
||||||
var registryCreds *types.DockerAuthConfig
|
DockerCertPath: c.String("cert-dir"),
|
||||||
if c.IsSet("creds") {
|
DockerInsecureSkipTLSVerify: !c.BoolT("tls-verify"),
|
||||||
creds, err := util.ParseRegistryCreds(c.String("creds"))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
registryCreds = creds
|
|
||||||
}
|
|
||||||
dockerRegistryOptions := image.DockerRegistryOptions{
|
|
||||||
DockerRegistryCreds: registryCreds,
|
|
||||||
DockerCertPath: c.String("cert-dir"),
|
|
||||||
DockerInsecureSkipTLSVerify: !c.BoolT("tls-verify"),
|
|
||||||
}
|
|
||||||
authfile := getAuthFile(c.String("authfile"))
|
|
||||||
|
|
||||||
newImage, err = runtime.ImageRuntime().New(ctx, runlabelImage, c.String("signature-policy"), authfile, stdOut, &dockerRegistryOptions, image.SigningOptions{}, false, false)
|
|
||||||
} else {
|
|
||||||
newImage, err = runtime.ImageRuntime().NewFromLocal(runlabelImage)
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrapf(err, "unable to find image")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(newImage.Names()) < 1 {
|
authfile := getAuthFile(c.String("authfile"))
|
||||||
imageName = newImage.ID()
|
runLabel, imageName, err := shared.GetRunlabel(label, runlabelImage, ctx, runtime, pull, c.String("creds"), dockerRegistryOptions, authfile, c.String("signature-policy"), stdOut)
|
||||||
} else {
|
|
||||||
imageName = newImage.Names()[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
runLabel, err := newImage.GetLabel(ctx, label)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// If no label to execute, we return
|
|
||||||
if runLabel == "" {
|
if runLabel == "" {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// The user provided extra arguments that need to be tacked onto the label's command
|
cmd, env, err := shared.GenerateRunlabelCommand(runLabel, imageName, c.String("name"), opts, extraArgs)
|
||||||
if len(args) > 2 {
|
|
||||||
runLabel = fmt.Sprintf("%s %s", runLabel, strings.Join(args[2:], " "))
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd, err := shared.GenerateCommand(runLabel, imageName, c.String("name"))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "unable to generate command")
|
return err
|
||||||
}
|
}
|
||||||
env := shared.GenerateRunEnvironment(c.String("name"), imageName, opts)
|
|
||||||
env = append(env, "PODMAN_RUNLABEL_NESTED=1")
|
|
||||||
|
|
||||||
envmap := envSliceToMap(env)
|
|
||||||
|
|
||||||
envmapper := func(k string) string {
|
|
||||||
switch k {
|
|
||||||
case "OPT1":
|
|
||||||
return envmap["OPT1"]
|
|
||||||
case "OPT2":
|
|
||||||
return envmap["OPT2"]
|
|
||||||
case "OPT3":
|
|
||||||
return envmap["OPT3"]
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
newS := os.Expand(strings.Join(cmd, " "), envmapper)
|
|
||||||
cmd = strings.Split(newS, " ")
|
|
||||||
|
|
||||||
if !c.Bool("quiet") {
|
if !c.Bool("quiet") {
|
||||||
fmt.Printf("Command: %s\n", strings.Join(cmd, " "))
|
fmt.Printf("Command: %s\n", strings.Join(cmd, " "))
|
||||||
if c.Bool("display") {
|
if c.Bool("display") {
|
||||||
@ -228,12 +178,3 @@ func runlabelCmd(c *cli.Context) error {
|
|||||||
}
|
}
|
||||||
return utils.ExecCmdWithStdStreams(stdIn, stdOut, stdErr, env, cmd[0], cmd[1:]...)
|
return utils.ExecCmdWithStdStreams(stdIn, stdOut, stdErr, env, cmd[0], cmd[1:]...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func envSliceToMap(env []string) map[string]string {
|
|
||||||
m := make(map[string]string)
|
|
||||||
for _, i := range env {
|
|
||||||
split := strings.Split(i, "=")
|
|
||||||
m[split[0]] = strings.Join(split[1:], " ")
|
|
||||||
}
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
@ -1,10 +1,15 @@
|
|||||||
package shared
|
package shared
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/containers/image/types"
|
||||||
|
"github.com/containers/libpod/libpod/image"
|
||||||
|
"github.com/containers/libpod/pkg/util"
|
||||||
"github.com/cri-o/ocicni/pkg/ocicni"
|
"github.com/cri-o/ocicni/pkg/ocicni"
|
||||||
"github.com/docker/go-units"
|
"github.com/docker/go-units"
|
||||||
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
@ -589,3 +594,79 @@ func portsToString(ports []ocicni.PortMapping) string {
|
|||||||
}
|
}
|
||||||
return strings.Join(portDisplay, ", ")
|
return strings.Join(portDisplay, ", ")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetRunlabel is a helper function for runlabel; it gets the image if needed and begins the
|
||||||
|
// contruction of the runlabel output and environment variables
|
||||||
|
func GetRunlabel(label string, runlabelImage string, ctx context.Context, runtime *libpod.Runtime, pull bool, inputCreds string, dockerRegistryOptions image.DockerRegistryOptions, authfile string, signaturePolicyPath string, output io.Writer) (string, string, error) {
|
||||||
|
var (
|
||||||
|
newImage *image.Image
|
||||||
|
err error
|
||||||
|
imageName string
|
||||||
|
)
|
||||||
|
if pull {
|
||||||
|
var registryCreds *types.DockerAuthConfig
|
||||||
|
if inputCreds != "" {
|
||||||
|
creds, err := util.ParseRegistryCreds(inputCreds)
|
||||||
|
if err != nil {
|
||||||
|
return "", "", err
|
||||||
|
}
|
||||||
|
registryCreds = creds
|
||||||
|
}
|
||||||
|
dockerRegistryOptions.DockerRegistryCreds = registryCreds
|
||||||
|
newImage, err = runtime.ImageRuntime().New(ctx, runlabelImage, signaturePolicyPath, authfile, output, &dockerRegistryOptions, image.SigningOptions{}, false, false)
|
||||||
|
} else {
|
||||||
|
newImage, err = runtime.ImageRuntime().NewFromLocal(runlabelImage)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return "", "", errors.Wrapf(err, "unable to find image")
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(newImage.Names()) < 1 {
|
||||||
|
imageName = newImage.ID()
|
||||||
|
} else {
|
||||||
|
imageName = newImage.Names()[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
runLabel, err := newImage.GetLabel(ctx, label)
|
||||||
|
return runLabel, imageName, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GenerateRunlabelCommand generates the command that will eventually be execucted by podman
|
||||||
|
func GenerateRunlabelCommand(runLabel, imageName, name string, opts map[string]string, extraArgs []string) ([]string, []string, error) {
|
||||||
|
// The user provided extra arguments that need to be tacked onto the label's command
|
||||||
|
if len(extraArgs) > 0 {
|
||||||
|
runLabel = fmt.Sprintf("%s %s", runLabel, strings.Join(extraArgs, " "))
|
||||||
|
}
|
||||||
|
cmd, err := GenerateCommand(runLabel, imageName, name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, errors.Wrapf(err, "unable to generate command")
|
||||||
|
}
|
||||||
|
env := GenerateRunEnvironment(name, imageName, opts)
|
||||||
|
env = append(env, "PODMAN_RUNLABEL_NESTED=1")
|
||||||
|
|
||||||
|
envmap := envSliceToMap(env)
|
||||||
|
|
||||||
|
envmapper := func(k string) string {
|
||||||
|
switch k {
|
||||||
|
case "OPT1":
|
||||||
|
return envmap["OPT1"]
|
||||||
|
case "OPT2":
|
||||||
|
return envmap["OPT2"]
|
||||||
|
case "OPT3":
|
||||||
|
return envmap["OPT3"]
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
newS := os.Expand(strings.Join(cmd, " "), envmapper)
|
||||||
|
cmd = strings.Split(newS, " ")
|
||||||
|
return cmd, env, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func envSliceToMap(env []string) map[string]string {
|
||||||
|
m := make(map[string]string)
|
||||||
|
for _, i := range env {
|
||||||
|
split := strings.Split(i, "=")
|
||||||
|
m[split[0]] = strings.Join(split[1:], " ")
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
@ -371,6 +371,22 @@ type PodContainerErrorData (
|
|||||||
reason: string
|
reason: string
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Runlabel describes the required input for container runlabel
|
||||||
|
type Runlabel(
|
||||||
|
image: string,
|
||||||
|
authfile: string,
|
||||||
|
certDir: string,
|
||||||
|
creds: string,
|
||||||
|
display: bool,
|
||||||
|
name: string,
|
||||||
|
pull: bool,
|
||||||
|
signaturePolicyPath: string,
|
||||||
|
tlsVerify: bool,
|
||||||
|
label: string,
|
||||||
|
extraArgs: []string,
|
||||||
|
opts: [string]string
|
||||||
|
)
|
||||||
|
|
||||||
# Ping provides a response for developers to ensure their varlink setup is working.
|
# Ping provides a response for developers to ensure their varlink setup is working.
|
||||||
# #### Example
|
# #### Example
|
||||||
# ~~~
|
# ~~~
|
||||||
@ -804,6 +820,42 @@ method TopPod() -> (notimplemented: NotImplemented)
|
|||||||
# ~~~
|
# ~~~
|
||||||
method GetPodStats(name: string) -> (pod: string, containers: []ContainerStats)
|
method GetPodStats(name: string) -> (pod: string, containers: []ContainerStats)
|
||||||
|
|
||||||
|
# ImageExists talks a full or partial image ID or name and returns an int as to whether
|
||||||
|
# the image exists in local storage. An int result of 0 means the image does exist in
|
||||||
|
# local storage; whereas 1 indicates the image does not exists in local storage.
|
||||||
|
method ImageExists(name: string) -> (exists: int)
|
||||||
|
|
||||||
|
# ContainerExists takes a full or partial container ID or name and returns an int as to
|
||||||
|
# whether the container exists in local storage. A result of 0 means the container does
|
||||||
|
# exists; whereas a result of 1 means it could not be found.
|
||||||
|
method ContainerExists(name: string) -> (exists: int)
|
||||||
|
|
||||||
|
# ContainerCheckPoint performs a checkpopint on a container by its name or full/partial container
|
||||||
|
# ID. On successful checkpoint, the id of the checkpointed container is returned.
|
||||||
|
method ContainerCheckpoint(name: string, keep: bool, leaveRunning: bool, tcpEstablished: bool) -> (id: string)
|
||||||
|
|
||||||
|
# ContainerRestore restores a container that has been checkpointed. The container to be restored can
|
||||||
|
# be identified by its name or full/partial container ID. A successful restore will result in the return
|
||||||
|
# of the container's ID.
|
||||||
|
method ContainerRestore(name: string, keep: bool, tcpEstablished: bool) -> (id: string)
|
||||||
|
|
||||||
|
# ContainerRunlabel runs executes a command as described by a given container image label.
|
||||||
|
method ContainerRunlabel(runlabel: Runlabel) -> ()
|
||||||
|
|
||||||
|
# ListContainerMounts gathers all the mounted container mount points and returns them as an array
|
||||||
|
# of strings
|
||||||
|
method ListContainerMounts() -> (mounts: []string)
|
||||||
|
|
||||||
|
# MountContainer mounts a container by name or full/partial ID. Upon a successful mount, the destination
|
||||||
|
# mount is returned as a string.
|
||||||
|
method MountContainer(name: string) -> (path: string)
|
||||||
|
|
||||||
|
# UnmountContainer umounts a container by its name or full/partial container ID.
|
||||||
|
method UnmountContainer(name: string, force: bool) -> ()
|
||||||
|
|
||||||
|
# This function is not implemented yet.
|
||||||
|
method ListContainerPorts(name: string) -> (notimplemented: NotImplemented)
|
||||||
|
|
||||||
# ImageNotFound means the image could not be found by the provided name or ID in local storage.
|
# ImageNotFound means the image could not be found by the provided name or ID in local storage.
|
||||||
error ImageNotFound (name: string)
|
error ImageNotFound (name: string)
|
||||||
|
|
||||||
|
@ -278,6 +278,18 @@ func (i *LibpodAPI) RestartContainer(call iopodman.VarlinkCall, name string, tim
|
|||||||
return call.ReplyRestartContainer(ctr.ID())
|
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
|
// KillContainer kills a running container. If you want to use the default SIGTERM signal, just send a -1
|
||||||
// for the signal arg.
|
// for the signal arg.
|
||||||
func (i *LibpodAPI) KillContainer(call iopodman.VarlinkCall, name string, signal int64) error {
|
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)
|
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())
|
||||||
|
}
|
||||||
|
@ -4,7 +4,9 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/containers/libpod/cmd/podman/shared"
|
||||||
"io"
|
"io"
|
||||||
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@ -19,6 +21,7 @@ import (
|
|||||||
"github.com/containers/libpod/libpod/image"
|
"github.com/containers/libpod/libpod/image"
|
||||||
sysreg "github.com/containers/libpod/pkg/registries"
|
sysreg "github.com/containers/libpod/pkg/registries"
|
||||||
"github.com/containers/libpod/pkg/util"
|
"github.com/containers/libpod/pkg/util"
|
||||||
|
"github.com/containers/libpod/utils"
|
||||||
"github.com/docker/go-units"
|
"github.com/docker/go-units"
|
||||||
"github.com/opencontainers/image-spec/specs-go/v1"
|
"github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
"github.com/opencontainers/runtime-spec/specs-go"
|
"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())
|
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()
|
||||||
|
}
|
||||||
|
49
pkg/varlinkapi/mount.go
Normal file
49
pkg/varlinkapi/mount.go
Normal file
@ -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()
|
||||||
|
}
|
Reference in New Issue
Block a user