mirror of
https://github.com/containers/podman.git
synced 2025-07-29 11:22:38 +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:
docs/source/markdown
libpod/filters
pkg/api/server
test/e2e
@ -57,6 +57,8 @@ Valid filters are listed below:
|
|||||||
| since | [ID] or [Name] Containers created since this container |
|
| since | [ID] or [Name] Containers created since this container |
|
||||||
| volume | [VolumeName] or [MountpointDestination] Volume mounted in container |
|
| volume | [VolumeName] or [MountpointDestination] Volume mounted in container |
|
||||||
| health | [Status] healthy or unhealthy |
|
| health | [Status] healthy or unhealthy |
|
||||||
|
| pod | [Pod] name or full or partial ID of pod |
|
||||||
|
|
||||||
|
|
||||||
#### **--format**=*format*
|
#### **--format**=*format*
|
||||||
|
|
||||||
|
@ -203,6 +203,37 @@ func GenerateContainerFilterFuncs(filter string, filterValues []string, r *libpo
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}, nil
|
}, 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)
|
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
|
// - `label`=(`key` or `"key=value"`) of an container label
|
||||||
// - `name=<name>` a container's name
|
// - `name=<name>` a container's name
|
||||||
// - `network`=(`<network id>` or `<network name>`)
|
// - `network`=(`<network id>` or `<network name>`)
|
||||||
|
// - `pod`=(`<pod id>` or `<pod name>`)
|
||||||
// - `publish`=(`<port>[/<proto>]` or `<startport-endport>/[<proto>]`)
|
// - `publish`=(`<port>[/<proto>]` or `<startport-endport>/[<proto>]`)
|
||||||
// - `since`=(`<container id>` or `<container name>`)
|
// - `since`=(`<container id>` or `<container name>`)
|
||||||
// - `status`=(`created`, `restarting`, `running`, `removing`, `paused`, `exited` or `dead`)
|
// - `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("test3")).To(BeTrue())
|
||||||
Expect(session.LineInOutputContains("test4")).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