mirror of
https://github.com/containers/podman.git
synced 2025-05-22 01:27:07 +08:00
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:
@ -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 {
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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() {
|
||||||
|
Reference in New Issue
Block a user