mirror of
https://github.com/containers/podman.git
synced 2025-06-21 09:28:09 +08:00
Merge pull request #2402 from baude/remotepodinspect
podman-remote pod inspect|exists
This commit is contained in:
21
API.md
21
API.md
@ -89,12 +89,16 @@ in the [API.md](https://github.com/containers/libpod/blob/master/API.md) file in
|
|||||||
|
|
||||||
[func ListPods() ListPodData](#ListPods)
|
[func ListPods() ListPodData](#ListPods)
|
||||||
|
|
||||||
|
[func LoadImage(name: string, inputFile: string, quiet: bool, deleteFile: bool) MoreResponse](#LoadImage)
|
||||||
|
|
||||||
[func MountContainer(name: string) string](#MountContainer)
|
[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)
|
||||||
|
|
||||||
|
[func PodStateData(name: string) string](#PodStateData)
|
||||||
|
|
||||||
[func PullImage(name: string, certDir: string, creds: string, signaturePolicy: string, tlsVerify: ) MoreResponse](#PullImage)
|
[func PullImage(name: string, certDir: string, creds: string, signaturePolicy: string, tlsVerify: ) MoreResponse](#PullImage)
|
||||||
|
|
||||||
[func PushImage(name: string, tag: string, tlsverify: , signaturePolicy: string, creds: string, certDir: string, compress: bool, format: string, removeSignatures: bool, signBy: string) MoreResponse](#PushImage)
|
[func PushImage(name: string, tag: string, tlsverify: , signaturePolicy: string, creds: string, certDir: string, compress: bool, format: string, removeSignatures: bool, signBy: string) MoreResponse](#PushImage)
|
||||||
@ -535,7 +539,9 @@ $ varlink call unix:/run/podman/io.podman/io.podman.GetPodStats '{"name": "7f62b
|
|||||||
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
method GetPodsByContext(all: [bool](https://godoc.org/builtin#bool), latest: [bool](https://godoc.org/builtin#bool), args: [[]string](#[]string)) [[]string](#[]string)</div>
|
method GetPodsByContext(all: [bool](https://godoc.org/builtin#bool), latest: [bool](https://godoc.org/builtin#bool), args: [[]string](#[]string)) [[]string](#[]string)</div>
|
||||||
|
GetPodsByContext allows you to get a list pod ids depending on all, latest, or a list of
|
||||||
|
pod names. The definition of latest pod means the latest by creation date. In a multi-
|
||||||
|
user environment, results might differ from what you expect.
|
||||||
### <a name="GetVersion"></a>func GetVersion
|
### <a name="GetVersion"></a>func GetVersion
|
||||||
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
@ -571,7 +577,7 @@ $ varlink call -m unix:/run/podman/io.podman/io.podman.ImageExists '{"name": "im
|
|||||||
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
method ImageSave(options: [ImageSaveOptions](#ImageSaveOptions)) [MoreResponse](#MoreResponse)</div>
|
method ImageSave(options: [ImageSaveOptions](#ImageSaveOptions)) [MoreResponse](#MoreResponse)</div>
|
||||||
|
ImageSave allows you to save an image from the local image storage to a tarball
|
||||||
### <a name="ImagesPrune"></a>func ImagesPrune
|
### <a name="ImagesPrune"></a>func ImagesPrune
|
||||||
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
@ -732,6 +738,11 @@ $ varlink call -m unix:/run/podman/io.podman/io.podman.ListPods
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
~~~
|
~~~
|
||||||
|
### <a name="LoadImage"></a>func LoadImage
|
||||||
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
|
method LoadImage(name: [string](https://godoc.org/builtin#string), inputFile: [string](https://godoc.org/builtin#string), quiet: [bool](https://godoc.org/builtin#bool), deleteFile: [bool](https://godoc.org/builtin#bool)) [MoreResponse](#MoreResponse)</div>
|
||||||
|
LoadImage allows you to load an image into local storage from a tarball.
|
||||||
### <a name="MountContainer"></a>func MountContainer
|
### <a name="MountContainer"></a>func MountContainer
|
||||||
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
@ -768,6 +779,12 @@ $ varlink call -m unix:/run/podman/io.podman/io.podman.PausePod '{"name": "fooba
|
|||||||
"pod": "1840835294cf076a822e4e12ba4152411f131bd869e7f6a4e8b16df9b0ea5c7f"
|
"pod": "1840835294cf076a822e4e12ba4152411f131bd869e7f6a4e8b16df9b0ea5c7f"
|
||||||
}
|
}
|
||||||
~~~
|
~~~
|
||||||
|
### <a name="PodStateData"></a>func PodStateData
|
||||||
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
|
method PodStateData(name: [string](https://godoc.org/builtin#string)) [string](https://godoc.org/builtin#string)</div>
|
||||||
|
PodStateData returns inspectr level information of a given pod in string form. This call is for
|
||||||
|
development of Podman only and generally should not be used.
|
||||||
### <a name="PullImage"></a>func PullImage
|
### <a name="PullImage"></a>func PullImage
|
||||||
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
<div style="background-color: #E8E8E8; padding: 15px; margin: 10px; border-radius: 10px;">
|
||||||
|
|
||||||
|
@ -92,8 +92,6 @@ func getContainerSubCommands() []*cobra.Command {
|
|||||||
func getPodSubCommands() []*cobra.Command {
|
func getPodSubCommands() []*cobra.Command {
|
||||||
return []*cobra.Command{
|
return []*cobra.Command{
|
||||||
_podCreateCommand,
|
_podCreateCommand,
|
||||||
_podExistsCommand,
|
|
||||||
_podInspectCommand,
|
|
||||||
_podKillCommand,
|
_podKillCommand,
|
||||||
_podPauseCommand,
|
_podPauseCommand,
|
||||||
_podPsCommand,
|
_podPsCommand,
|
||||||
|
@ -5,7 +5,6 @@ import (
|
|||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/containers/libpod/cmd/podman/libpodruntime"
|
|
||||||
"github.com/containers/libpod/libpod"
|
"github.com/containers/libpod/libpod"
|
||||||
"github.com/containers/libpod/libpod/adapter"
|
"github.com/containers/libpod/libpod/adapter"
|
||||||
"github.com/containers/libpod/libpod/image"
|
"github.com/containers/libpod/libpod/image"
|
||||||
@ -124,14 +123,14 @@ func podExistsCmd(c *cliconfig.PodExistsValues) error {
|
|||||||
if len(args) > 1 || len(args) < 1 {
|
if len(args) > 1 || len(args) < 1 {
|
||||||
return errors.New("you may only check for the existence of one pod at a time")
|
return errors.New("you may only check for the existence of one pod at a time")
|
||||||
}
|
}
|
||||||
runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
|
runtime, err := adapter.GetRuntime(&c.PodmanCommand)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "could not get runtime")
|
return errors.Wrapf(err, "could not get runtime")
|
||||||
}
|
}
|
||||||
defer runtime.Shutdown(false)
|
defer runtime.Shutdown(false)
|
||||||
|
|
||||||
if _, err := runtime.LookupPod(args[0]); err != nil {
|
if _, err := runtime.LookupPod(args[0]); err != nil {
|
||||||
if errors.Cause(err) == libpod.ErrNoSuchPod {
|
if errors.Cause(err) == libpod.ErrNoSuchPod || err.Error() == "io.podman.PodNotFound" {
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
@ -20,6 +20,8 @@ var podCommand = cliconfig.PodmanCommand{
|
|||||||
|
|
||||||
//podSubCommands are implemented both in local and remote clients
|
//podSubCommands are implemented both in local and remote clients
|
||||||
var podSubCommands = []*cobra.Command{
|
var podSubCommands = []*cobra.Command{
|
||||||
|
_podExistsCommand,
|
||||||
|
_podInspectCommand,
|
||||||
_podRmCommand,
|
_podRmCommand,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,8 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/containers/libpod/cmd/podman/cliconfig"
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
||||||
"github.com/containers/libpod/cmd/podman/libpodruntime"
|
"github.com/containers/libpod/libpod/adapter"
|
||||||
"github.com/containers/libpod/libpod"
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
@ -37,13 +36,13 @@ func init() {
|
|||||||
|
|
||||||
func podInspectCmd(c *cliconfig.PodInspectValues) error {
|
func podInspectCmd(c *cliconfig.PodInspectValues) error {
|
||||||
var (
|
var (
|
||||||
pod *libpod.Pod
|
pod *adapter.Pod
|
||||||
)
|
)
|
||||||
if err := checkMutuallyExclusiveFlags(&c.PodmanCommand); err != nil {
|
if err := checkMutuallyExclusiveFlags(&c.PodmanCommand); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
args := c.InputArgs
|
args := c.InputArgs
|
||||||
runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
|
runtime, err := adapter.GetRuntime(&c.PodmanCommand)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "could not get runtime")
|
return errors.Wrapf(err, "could not get runtime")
|
||||||
}
|
}
|
||||||
|
@ -1082,6 +1082,10 @@ method ContainerInspectData(name: string) -> (config: string)
|
|||||||
# development of Podman only and generally should not be used.
|
# development of Podman only and generally should not be used.
|
||||||
method ContainerStateData(name: string) -> (config: string)
|
method ContainerStateData(name: string) -> (config: string)
|
||||||
|
|
||||||
|
# PodStateData returns inspectr level information of a given pod in string form. This call is for
|
||||||
|
# development of Podman only and generally should not be used.
|
||||||
|
method PodStateData(name: string) -> (config: string)
|
||||||
|
|
||||||
# Sendfile allows a remote client to send a file to the host
|
# Sendfile allows a remote client to send a file to the host
|
||||||
method SendFile(type: string, length: int) -> (file_handle: string)
|
method SendFile(type: string, length: int) -> (file_handle: string)
|
||||||
|
|
||||||
@ -1100,11 +1104,15 @@ method GetVolumes(args: []string, all: bool) -> (volumes: []Volume)
|
|||||||
# VolumesPrune removes unused volumes on the host
|
# VolumesPrune removes unused volumes on the host
|
||||||
method VolumesPrune() -> (prunedNames: []string, prunedErrors: []string)
|
method VolumesPrune() -> (prunedNames: []string, prunedErrors: []string)
|
||||||
|
|
||||||
|
# ImageSave allows you to save an image from the local image storage to a tarball
|
||||||
method ImageSave(options: ImageSaveOptions) -> (reply: MoreResponse)
|
method ImageSave(options: ImageSaveOptions) -> (reply: MoreResponse)
|
||||||
|
|
||||||
|
# GetPodsByContext allows you to get a list pod ids depending on all, latest, or a list of
|
||||||
|
# pod names. The definition of latest pod means the latest by creation date. In a multi-
|
||||||
|
# user environment, results might differ from what you expect.
|
||||||
method GetPodsByContext(all: bool, latest: bool, args: []string) -> (pods: []string)
|
method GetPodsByContext(all: bool, latest: bool, args: []string) -> (pods: []string)
|
||||||
|
|
||||||
|
# LoadImage allows you to load an image into local storage from a tarball.
|
||||||
method LoadImage(name: string, inputFile: string, quiet: bool, deleteFile: bool) -> (reply: MoreResponse)
|
method LoadImage(name: string, inputFile: string, quiet: bool, deleteFile: bool) -> (reply: MoreResponse)
|
||||||
|
|
||||||
# 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.
|
||||||
|
@ -36,3 +36,19 @@ func (r *LocalRuntime) RemovePods(ctx context.Context, cli *cliconfig.PodRmValue
|
|||||||
}
|
}
|
||||||
return podids, errs
|
return podids, errs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetLatestPod gets the latest pod and wraps it in an adapter pod
|
||||||
|
func (r *LocalRuntime) GetLatestPod() (*Pod, error) {
|
||||||
|
pod := Pod{}
|
||||||
|
p, err := r.Runtime.GetLatestPod()
|
||||||
|
pod.Pod = p
|
||||||
|
return &pod, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// LookupPod gets a pod by name or id and wraps it in an adapter pod
|
||||||
|
func (r *LocalRuntime) LookupPod(nameOrID string) (*Pod, error) {
|
||||||
|
pod := Pod{}
|
||||||
|
p, err := r.Runtime.LookupPod(nameOrID)
|
||||||
|
pod.Pod = p
|
||||||
|
return &pod, err
|
||||||
|
}
|
||||||
|
@ -4,10 +4,13 @@ package adapter
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
"github.com/containers/libpod/cmd/podman/cliconfig"
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
||||||
"github.com/containers/libpod/cmd/podman/varlink"
|
"github.com/containers/libpod/cmd/podman/varlink"
|
||||||
"github.com/containers/libpod/libpod"
|
"github.com/containers/libpod/libpod"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"github.com/ulule/deepcopier"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Pod ...
|
// Pod ...
|
||||||
@ -18,9 +21,11 @@ type Pod struct {
|
|||||||
type remotepod struct {
|
type remotepod struct {
|
||||||
config *libpod.PodConfig
|
config *libpod.PodConfig
|
||||||
state *libpod.PodInspectState
|
state *libpod.PodInspectState
|
||||||
|
containers []libpod.PodContainerInfo
|
||||||
Runtime *LocalRuntime
|
Runtime *LocalRuntime
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RemovePods removes one or more based on the cli context.
|
||||||
func (r *LocalRuntime) RemovePods(ctx context.Context, cli *cliconfig.PodRmValues) ([]string, []error) {
|
func (r *LocalRuntime) RemovePods(ctx context.Context, cli *cliconfig.PodRmValues) ([]string, []error) {
|
||||||
var (
|
var (
|
||||||
rmErrs []error
|
rmErrs []error
|
||||||
@ -42,3 +47,52 @@ func (r *LocalRuntime) RemovePods(ctx context.Context, cli *cliconfig.PodRmValue
|
|||||||
}
|
}
|
||||||
return rmPods, rmErrs
|
return rmPods, rmErrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Inspect looks up a pod by name or id and embeds its data into a remote pod
|
||||||
|
// object.
|
||||||
|
func (r *LocalRuntime) Inspect(nameOrID string) (*Pod, error) {
|
||||||
|
reply, err := iopodman.PodStateData().Call(r.Conn, nameOrID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
data := libpod.PodInspect{}
|
||||||
|
if err := json.Unmarshal([]byte(reply), &data); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pod := Pod{}
|
||||||
|
pod.Runtime = r
|
||||||
|
pod.config = data.Config
|
||||||
|
pod.state = data.State
|
||||||
|
pod.containers = data.Containers
|
||||||
|
return &pod, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetLatestPod gets the latest pod and wraps it in an adapter pod
|
||||||
|
func (r *LocalRuntime) GetLatestPod() (*Pod, error) {
|
||||||
|
reply, err := iopodman.GetPodsByContext().Call(r.Conn, false, true, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if len(reply) > 0 {
|
||||||
|
return r.Inspect(reply[0])
|
||||||
|
}
|
||||||
|
return nil, errors.New("no pods exist")
|
||||||
|
}
|
||||||
|
|
||||||
|
// LookupPod gets a pod by name or ID and wraps it in an adapter pod
|
||||||
|
func (r *LocalRuntime) LookupPod(nameOrID string) (*Pod, error) {
|
||||||
|
return r.Inspect(nameOrID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inspect, like libpod pod inspect, returns a libpod.PodInspect object from
|
||||||
|
// the data of a remotepod data struct
|
||||||
|
func (p *Pod) Inspect() (*libpod.PodInspect, error) {
|
||||||
|
config := new(libpod.PodConfig)
|
||||||
|
deepcopier.Copy(p.remotepod.config).To(config)
|
||||||
|
inspectData := libpod.PodInspect{
|
||||||
|
Config: config,
|
||||||
|
State: p.remotepod.state,
|
||||||
|
Containers: p.containers,
|
||||||
|
}
|
||||||
|
return &inspectData, nil
|
||||||
|
}
|
||||||
|
@ -286,3 +286,20 @@ func (i *LibpodAPI) GetPodsByContext(call iopodman.VarlinkCall, all, latest bool
|
|||||||
}
|
}
|
||||||
return call.ReplyGetPodsByContext(podids)
|
return call.ReplyGetPodsByContext(podids)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PodStateData returns a container's state data in string format
|
||||||
|
func (i *LibpodAPI) PodStateData(call iopodman.VarlinkCall, name string) error {
|
||||||
|
pod, err := i.Runtime.LookupPod(name)
|
||||||
|
if err != nil {
|
||||||
|
return call.ReplyErrorOccurred(err.Error())
|
||||||
|
}
|
||||||
|
data, err := pod.Inspect()
|
||||||
|
if err != nil {
|
||||||
|
return call.ReplyErrorOccurred("unable to obtain pod state")
|
||||||
|
}
|
||||||
|
b, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
return call.ReplyErrorOccurred("unable to serialize pod inspect data")
|
||||||
|
}
|
||||||
|
return call.ReplyPodStateData(string(b))
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user