mirror of
https://github.com/containers/podman.git
synced 2025-08-02 17:22:30 +08:00
podmanv2 pod inspect
Add the ability to inspect pod in podmanv2 Signed-off-by: Sujil02 <sushah@redhat.com>
This commit is contained in:
64
cmd/podmanV2/pods/inspect.go
Normal file
64
cmd/podmanV2/pods/inspect.go
Normal file
@ -0,0 +1,64 @@
|
||||
package pods
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/containers/libpod/cmd/podmanV2/registry"
|
||||
"github.com/containers/libpod/pkg/domain/entities"
|
||||
jsoniter "github.com/json-iterator/go"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var (
|
||||
inspectOptions = entities.PodInspectOptions{}
|
||||
)
|
||||
|
||||
var (
|
||||
inspectDescription = fmt.Sprintf(`Display the configuration for a pod by name or id
|
||||
|
||||
By default, this will render all results in a JSON array.`)
|
||||
|
||||
inspectCmd = &cobra.Command{
|
||||
Use: "inspect [flags] POD [POD...]",
|
||||
Short: "Displays a pod configuration",
|
||||
Long: inspectDescription,
|
||||
RunE: inspect,
|
||||
Example: `podman pod inspect podID`,
|
||||
}
|
||||
)
|
||||
|
||||
func init() {
|
||||
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
|
||||
Command: inspectCmd,
|
||||
Parent: podCmd,
|
||||
})
|
||||
flags := inspectCmd.Flags()
|
||||
flags.BoolVarP(&inspectOptions.Latest, "latest", "l", false, "Act on the latest pod podman is aware of")
|
||||
if registry.IsRemote() {
|
||||
_ = flags.MarkHidden("latest")
|
||||
}
|
||||
}
|
||||
|
||||
func inspect(cmd *cobra.Command, args []string) error {
|
||||
|
||||
if len(args) < 1 && !inspectOptions.Latest {
|
||||
return errors.Errorf("you must provide the name or id of a running pod")
|
||||
}
|
||||
|
||||
if !inspectOptions.Latest {
|
||||
inspectOptions.NameOrID = args[0]
|
||||
}
|
||||
responses, err := registry.ContainerEngine().PodInspect(context.Background(), inspectOptions)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b, err := jsoniter.MarshalIndent(responses, "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Println(string(b))
|
||||
return nil
|
||||
}
|
3
go.sum
3
go.sum
@ -189,6 +189,7 @@ github.com/google/btree v0.0.0-20160524151835-7d79101e329e/go.mod h1:lNA+9X1NB3Z
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
|
||||
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
|
||||
@ -572,6 +573,7 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3
|
||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72 h1:bw9doJza/SFBEweII/rHQh338oozWyiFsBRHtrflcws=
|
||||
golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||
@ -617,6 +619,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
|
||||
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
|
@ -73,7 +73,10 @@ func PodInspect(w http.ResponseWriter, r *http.Request) {
|
||||
utils.Error(w, "Something went wrong", http.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
utils.WriteResponse(w, http.StatusOK, podData)
|
||||
report := entities.PodInspectReport{
|
||||
PodInspect: podData,
|
||||
}
|
||||
utils.WriteResponse(w, http.StatusOK, report)
|
||||
}
|
||||
|
||||
func PodStop(w http.ResponseWriter, r *http.Request) {
|
||||
|
@ -7,7 +7,6 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/containers/libpod/libpod"
|
||||
"github.com/containers/libpod/pkg/api/handlers"
|
||||
"github.com/containers/libpod/pkg/bindings"
|
||||
"github.com/containers/libpod/pkg/domain/entities"
|
||||
@ -49,17 +48,19 @@ func Exists(ctx context.Context, nameOrID string) (bool, error) {
|
||||
}
|
||||
|
||||
// Inspect returns low-level information about the given pod.
|
||||
func Inspect(ctx context.Context, nameOrID string) (*libpod.PodInspect, error) {
|
||||
func Inspect(ctx context.Context, nameOrID string) (*entities.PodInspectReport, error) {
|
||||
var (
|
||||
report entities.PodInspectReport
|
||||
)
|
||||
conn, err := bindings.GetClient(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
inspect := libpod.PodInspect{}
|
||||
response, err := conn.DoRequest(nil, http.MethodGet, "/pods/%s/json", nil, nameOrID)
|
||||
if err != nil {
|
||||
return &inspect, err
|
||||
return nil, err
|
||||
}
|
||||
return &inspect, response.Process(&inspect)
|
||||
return &report, response.Process(&report)
|
||||
}
|
||||
|
||||
// Kill sends a SIGTERM to all the containers in a pod. The optional signal parameter
|
||||
|
@ -19,6 +19,7 @@ type ContainerEngine interface {
|
||||
ContainerUnpause(ctx context.Context, namesOrIds []string, options PauseUnPauseOptions) ([]*PauseUnpauseReport, error)
|
||||
ContainerWait(ctx context.Context, namesOrIds []string, options WaitOptions) ([]WaitReport, error)
|
||||
HealthCheckRun(ctx context.Context, nameOrId string, options HealthCheckOptions) (*define.HealthCheckResults, error)
|
||||
|
||||
PodCreate(ctx context.Context, opts PodCreateOptions) (*PodCreateReport, error)
|
||||
PodExists(ctx context.Context, nameOrId string) (*BoolReport, error)
|
||||
PodKill(ctx context.Context, namesOrIds []string, options PodKillOptions) ([]*PodKillReport, error)
|
||||
@ -30,6 +31,8 @@ type ContainerEngine interface {
|
||||
PodStop(ctx context.Context, namesOrIds []string, options PodStopOptions) ([]*PodStopReport, error)
|
||||
PodTop(ctx context.Context, options PodTopOptions) (*StringSliceReport, error)
|
||||
PodUnpause(ctx context.Context, namesOrIds []string, options PodunpauseOptions) ([]*PodUnpauseReport, error)
|
||||
PodInspect(ctx context.Context, options PodInspectOptions) (*PodInspectReport, error)
|
||||
|
||||
VolumeCreate(ctx context.Context, opts VolumeCreateOptions) (*IdOrNameResponse, error)
|
||||
VolumeInspect(ctx context.Context, namesOrIds []string, opts VolumeInspectOptions) ([]*VolumeInspectReport, error)
|
||||
VolumeList(ctx context.Context, opts VolumeListOptions) ([]*VolumeListReport, error)
|
||||
|
@ -3,6 +3,7 @@ package entities
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/containers/libpod/libpod"
|
||||
"github.com/containers/libpod/pkg/specgen"
|
||||
)
|
||||
|
||||
@ -164,3 +165,14 @@ type PodPSOptions struct {
|
||||
Quiet bool
|
||||
Sort string
|
||||
}
|
||||
|
||||
type PodInspectOptions struct {
|
||||
Latest bool
|
||||
|
||||
// Options for the API.
|
||||
NameOrID string
|
||||
}
|
||||
|
||||
type PodInspectReport struct {
|
||||
*libpod.PodInspect
|
||||
}
|
||||
|
@ -331,3 +331,24 @@ func (ic *ContainerEngine) PodPs(ctx context.Context, options entities.PodPSOpti
|
||||
}
|
||||
return reports, nil
|
||||
}
|
||||
|
||||
func (ic *ContainerEngine) PodInspect(ctx context.Context, options entities.PodInspectOptions) (*entities.PodInspectReport, error) {
|
||||
var (
|
||||
pod *libpod.Pod
|
||||
err error
|
||||
)
|
||||
// Look up the pod.
|
||||
if options.Latest {
|
||||
pod, err = ic.Libpod.GetLatestPod()
|
||||
} else {
|
||||
pod, err = ic.Libpod.LookupPod(options.NameOrID)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "unable to lookup requested container")
|
||||
}
|
||||
inspect, err := pod.Inspect()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &entities.PodInspectReport{PodInspect: inspect}, nil
|
||||
}
|
||||
|
@ -197,3 +197,13 @@ func (ic *ContainerEngine) PodTop(ctx context.Context, options entities.PodTopOp
|
||||
func (ic *ContainerEngine) PodPs(ctx context.Context, options entities.PodPSOptions) ([]*entities.ListPodsReport, error) {
|
||||
return pods.List(ic.ClientCxt, options.Filters)
|
||||
}
|
||||
|
||||
func (ic *ContainerEngine) PodInspect(ctx context.Context, options entities.PodInspectOptions) (*entities.PodInspectReport, error) {
|
||||
switch {
|
||||
case options.Latest:
|
||||
return nil, errors.New("latest is not supported")
|
||||
case options.NameOrID == "":
|
||||
return nil, errors.New("NameOrID must be specified")
|
||||
}
|
||||
return pods.Inspect(ic.ClientCxt, options.NameOrID)
|
||||
}
|
||||
|
Reference in New Issue
Block a user