Add the pod name when we use podman ps -p

The pod name does not appear when doing `podman ps -p`.
It is missing as the documentation says:
-p, --pod              Print the ID and name of the pod the containers are associated with

The pod name is added in the ps output and checked in unit tests.

Closes #4703

Signed-off-by: NevilleC <neville.cain@qonto.eu>
This commit is contained in:
Neville Cain
2019-12-25 02:46:39 +01:00
parent c759c3f78d
commit 8bc394ce6e
4 changed files with 51 additions and 11 deletions

View File

@ -31,6 +31,7 @@ const (
hsize = "SIZE" hsize = "SIZE"
hinfra = "IS INFRA" //nolint hinfra = "IS INFRA" //nolint
hpod = "POD" hpod = "POD"
hpodname = "POD NAME"
nspid = "PID" nspid = "PID"
nscgroup = "CGROUPNS" nscgroup = "CGROUPNS"
nsipc = "IPC" nsipc = "IPC"
@ -351,7 +352,7 @@ func psDisplay(c *cliconfig.PsValues, runtime *adapter.LocalRuntime) error {
fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\t%s", hid, himage, hcommand, hcreated, hstatus, hports, hnames) fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\t%s", hid, himage, hcommand, hcreated, hstatus, hports, hnames)
// User wants pod info // User wants pod info
if opts.Pod { if opts.Pod {
fmt.Fprintf(w, "\t%s", hpod) fmt.Fprintf(w, "\t%s\t%s", hpod, hpodname)
} }
//User wants size info //User wants size info
if opts.Size { if opts.Size {
@ -370,7 +371,7 @@ func psDisplay(c *cliconfig.PsValues, runtime *adapter.LocalRuntime) error {
fmt.Fprintf(w, "\n%s\t%s\t%s\t%s\t%s\t%s\t%s", container.ID, container.Image, container.Command, container.Created, container.Status, container.Ports, container.Names) fmt.Fprintf(w, "\n%s\t%s\t%s\t%s\t%s\t%s\t%s", container.ID, container.Image, container.Command, container.Created, container.Status, container.Ports, container.Names)
// User wants pod info // User wants pod info
if opts.Pod { if opts.Pod {
fmt.Fprintf(w, "\t%s", container.Pod) fmt.Fprintf(w, "\t%s\t%s", container.Pod, container.PodName)
} }
//User wants size info //User wants size info
if opts.Size { if opts.Size {

View File

@ -76,6 +76,7 @@ type PsContainerOutput struct {
Pid int Pid int
Size *ContainerSize Size *ContainerSize
Pod string Pod string
PodName string
CreatedAt time.Time CreatedAt time.Time
ExitedAt time.Time ExitedAt time.Time
StartedAt time.Time StartedAt time.Time
@ -112,7 +113,7 @@ type ContainerSize struct {
// NewBatchContainer runs a batch process under one lock to get container information and only // NewBatchContainer runs a batch process under one lock to get container information and only
// be called in PBatch. // be called in PBatch.
func NewBatchContainer(ctr *libpod.Container, opts PsOptions) (PsContainerOutput, error) { func NewBatchContainer(r *libpod.Runtime, ctr *libpod.Container, opts PsOptions) (PsContainerOutput, error) {
var ( var (
conState define.ContainerStatus conState define.ContainerStatus
command string command string
@ -204,11 +205,11 @@ func NewBatchContainer(ctr *libpod.Container, opts PsOptions) (PsContainerOutput
_, imageName := ctr.Image() _, imageName := ctr.Image()
cid := ctr.ID() cid := ctr.ID()
pod := ctr.PodID() podID := ctr.PodID()
if !opts.NoTrunc { if !opts.NoTrunc {
cid = cid[0:cidTruncLength] cid = cid[0:cidTruncLength]
if len(pod) > podTruncLength { if len(podID) > podTruncLength {
pod = pod[0:podTruncLength] podID = podID[0:podTruncLength]
} }
if len(command) > cmdTruncLength { if len(command) > cmdTruncLength {
command = command[0:cmdTruncLength] + "..." command = command[0:cmdTruncLength] + "..."
@ -231,13 +232,29 @@ func NewBatchContainer(ctr *libpod.Container, opts PsOptions) (PsContainerOutput
pso.State = conState pso.State = conState
pso.Pid = pid pso.Pid = pid
pso.Size = size pso.Size = size
pso.Pod = pod
pso.ExitedAt = exitedAt pso.ExitedAt = exitedAt
pso.CreatedAt = ctr.CreatedTime() pso.CreatedAt = ctr.CreatedTime()
pso.StartedAt = startedAt pso.StartedAt = startedAt
pso.Labels = ctr.Labels() pso.Labels = ctr.Labels()
pso.Mounts = strings.Join(ctr.UserVolumes(), " ") pso.Mounts = strings.Join(ctr.UserVolumes(), " ")
// Add pod name and pod ID if requested by user.
// No need to look up the pod if its ID is empty.
if opts.Pod && len(podID) > 0 {
// The pod name is not in the container definition
// so we need to retrieve it using the pod ID.
var podName string
pod, err := r.LookupPod(podID)
if err != nil {
logrus.Errorf("unable to lookup pod for container %s", ctr.ID())
} else {
podName = pod.Name()
}
pso.Pod = podID
pso.PodName = podName
}
if opts.Namespace { if opts.Namespace {
pso.Cgroup = ns.Cgroup pso.Cgroup = ns.Cgroup
pso.IPC = ns.IPC pso.IPC = ns.IPC
@ -462,13 +479,13 @@ func GetPsContainerOutput(r *libpod.Runtime, opts PsOptions, filters []string, m
outputContainers = []*libpod.Container{latestCtr} outputContainers = []*libpod.Container{latestCtr}
} }
pss := PBatch(outputContainers, maxWorkers, opts) pss := PBatch(r, outputContainers, maxWorkers, opts)
return pss, nil return pss, nil
} }
// PBatch performs batch operations on a container in parallel. It spawns the // PBatch performs batch operations on a container in parallel. It spawns the
// number of workers relative to the number of parallel operations desired. // number of workers relative to the number of parallel operations desired.
func PBatch(containers []*libpod.Container, workers int, opts PsOptions) []PsContainerOutput { func PBatch(r *libpod.Runtime, containers []*libpod.Container, workers int, opts PsOptions) []PsContainerOutput {
var wg sync.WaitGroup var wg sync.WaitGroup
psResults := []PsContainerOutput{} psResults := []PsContainerOutput{}
@ -492,7 +509,7 @@ func PBatch(containers []*libpod.Container, workers int, opts PsOptions) []PsCon
j := j j := j
wg.Add(1) wg.Add(1)
f := func() (PsContainerOutput, error) { f := func() (PsContainerOutput, error) {
return NewBatchContainer(j, opts) return NewBatchContainer(r, j, opts)
} }
jobs <- workerInput{ jobs <- workerInput{
parallelFunc: f, parallelFunc: f,

View File

@ -768,7 +768,7 @@ func (r *Runtime) GetContainers(filters ...ContainerFilter) ([]*Container, error
return nil, define.ErrRuntimeStopped return nil, define.ErrRuntimeStopped
} }
ctrs, err := r.state.AllContainers() ctrs, err := r.GetAllContainers()
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -306,7 +306,29 @@ var _ = Describe("Podman ps", func() {
Expect(session.ExitCode()).To(Equal(0)) Expect(session.ExitCode()).To(Equal(0))
Expect(session.OutputToString()).To(ContainSubstring(podid)) Expect(session.OutputToString()).To(ContainSubstring(podid))
})
It("podman --pod with a non-empty pod name", func() {
SkipIfRemote()
podName := "testPodName"
_, ec, podid := podmanTest.CreatePod(podName)
Expect(ec).To(Equal(0))
session := podmanTest.RunTopContainerInPod("", podName)
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
// "--no-trunc" must be given. If not it will trunc the pod ID
// in the output and you will have to trunc it in the test too.
session = podmanTest.Podman([]string{"ps", "--pod", "--no-trunc"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
output := session.OutputToString()
Expect(output).To(ContainSubstring(podid))
Expect(output).To(ContainSubstring(podName))
}) })
It("podman ps test with port range", func() { It("podman ps test with port range", func() {