mirror of
https://github.com/containers/podman.git
synced 2025-06-23 02:18:13 +08:00
add pod filter for ps
adds the ability to filter containers based on the filter "pod". the value can be a pod name or its full or partial id. Fixes: #8512 Signed-off-by: baude <bbaude@redhat.com>
This commit is contained in:
@ -57,6 +57,8 @@ Valid filters are listed below:
|
||||
| since | [ID] or [Name] Containers created since this container |
|
||||
| volume | [VolumeName] or [MountpointDestination] Volume mounted in container |
|
||||
| health | [Status] healthy or unhealthy |
|
||||
| pod | [Pod] name or full or partial ID of pod |
|
||||
|
||||
|
||||
#### **--format**=*format*
|
||||
|
||||
|
@ -203,6 +203,37 @@ func GenerateContainerFilterFuncs(filter string, filterValues []string, r *libpo
|
||||
}
|
||||
return false
|
||||
}, nil
|
||||
case "pod":
|
||||
var pods []*libpod.Pod
|
||||
for _, podNameOrID := range filterValues {
|
||||
p, err := r.LookupPod(podNameOrID)
|
||||
if err != nil {
|
||||
if errors.Cause(err) == define.ErrNoSuchPod {
|
||||
continue
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
pods = append(pods, p)
|
||||
}
|
||||
return func(c *libpod.Container) bool {
|
||||
// if no pods match, quick out
|
||||
if len(pods) < 1 {
|
||||
return false
|
||||
}
|
||||
// if the container has no pod id, quick out
|
||||
if len(c.PodID()) < 1 {
|
||||
return false
|
||||
}
|
||||
for _, p := range pods {
|
||||
// we already looked up by name or id, so id match
|
||||
// here is ok
|
||||
if p.ID() == c.PodID() {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}, nil
|
||||
|
||||
}
|
||||
return nil, errors.Errorf("%s is an invalid filter", filter)
|
||||
}
|
||||
|
@ -690,6 +690,7 @@ func (s *APIServer) registerContainersHandlers(r *mux.Router) error {
|
||||
// - `label`=(`key` or `"key=value"`) of an container label
|
||||
// - `name=<name>` a container's name
|
||||
// - `network`=(`<network id>` or `<network name>`)
|
||||
// - `pod`=(`<pod id>` or `<pod name>`)
|
||||
// - `publish`=(`<port>[/<proto>]` or `<startport-endport>/[<proto>]`)
|
||||
// - `since`=(`<container id>` or `<container name>`)
|
||||
// - `status`=(`created`, `restarting`, `running`, `removing`, `paused`, `exited` or `dead`)
|
||||
|
@ -673,4 +673,55 @@ var _ = Describe("Podman ps", func() {
|
||||
Expect(session.LineInOutputContains("test3")).To(BeTrue())
|
||||
Expect(session.LineInOutputContains("test4")).To(BeTrue())
|
||||
})
|
||||
It("podman ps filter pod", func() {
|
||||
pod1 := podmanTest.Podman([]string{"pod", "create", "--name", "pod1"})
|
||||
pod1.WaitWithDefaultTimeout()
|
||||
Expect(pod1.ExitCode()).To(BeZero())
|
||||
con1 := podmanTest.Podman([]string{"run", "-dt", "--pod", "pod1", ALPINE, "top"})
|
||||
con1.WaitWithDefaultTimeout()
|
||||
Expect(con1.ExitCode()).To(BeZero())
|
||||
|
||||
pod2 := podmanTest.Podman([]string{"pod", "create", "--name", "pod2"})
|
||||
pod2.WaitWithDefaultTimeout()
|
||||
Expect(pod2.ExitCode()).To(BeZero())
|
||||
con2 := podmanTest.Podman([]string{"run", "-dt", "--pod", "pod2", ALPINE, "top"})
|
||||
con2.WaitWithDefaultTimeout()
|
||||
Expect(con2.ExitCode()).To(BeZero())
|
||||
|
||||
// bogus pod name or id should not result in error
|
||||
session := podmanTest.Podman([]string{"ps", "--filter", "pod=1234"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(BeZero())
|
||||
|
||||
// filter by pod name
|
||||
session = podmanTest.Podman([]string{"ps", "-q", "--no-trunc", "--filter", "pod=pod1"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(BeZero())
|
||||
Expect(len(session.OutputToStringArray())).To(Equal(2))
|
||||
Expect(StringInSlice(pod1.OutputToString(), session.OutputToStringArray()))
|
||||
|
||||
// filter by full pod id
|
||||
session = podmanTest.Podman([]string{"ps", "-q", "--no-trunc", "--filter", "pod=" + pod1.OutputToString()})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(BeZero())
|
||||
Expect(len(session.OutputToStringArray())).To(Equal(2))
|
||||
Expect(StringInSlice(pod1.OutputToString(), session.OutputToStringArray()))
|
||||
|
||||
// filter by partial pod id
|
||||
session = podmanTest.Podman([]string{"ps", "-q", "--no-trunc", "--filter", "pod=" + pod1.OutputToString()[0:12]})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(BeZero())
|
||||
Expect(len(session.OutputToStringArray())).To(Equal(2))
|
||||
Expect(StringInSlice(pod1.OutputToString(), session.OutputToStringArray()))
|
||||
|
||||
// filter by multiple pods is inclusive
|
||||
session = podmanTest.Podman([]string{"ps", "-q", "--no-trunc", "--filter", "pod=pod1", "--filter", "pod=pod2"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(BeZero())
|
||||
Expect(len(session.OutputToStringArray())).To(Equal(4))
|
||||
Expect(StringInSlice(pod1.OutputToString(), session.OutputToStringArray()))
|
||||
Expect(StringInSlice(pod2.OutputToString(), session.OutputToStringArray()))
|
||||
|
||||
})
|
||||
|
||||
})
|
||||
|
Reference in New Issue
Block a user