mirror of
https://github.com/containers/podman.git
synced 2025-06-07 07:45:34 +08:00
Support label filters for podman pod ps.
Update the podman pod ps command to support filtering by labels. This brings the command in line with the documentation as well as the functionality by the containers equivalent podman ps. Signed-off-by: Stefano Pogliani <stefano@spogliani.net>
This commit is contained in:
@ -162,7 +162,7 @@ func FilterAllPodsWithFilterFunc(r *libpod.Runtime, filters ...libpod.PodFilter)
|
|||||||
func GenerateFilterFunction(r *libpod.Runtime, filters []string) ([]libpod.PodFilter, error) {
|
func GenerateFilterFunction(r *libpod.Runtime, filters []string) ([]libpod.PodFilter, error) {
|
||||||
var filterFuncs []libpod.PodFilter
|
var filterFuncs []libpod.PodFilter
|
||||||
for _, f := range filters {
|
for _, f := range filters {
|
||||||
filterSplit := strings.Split(f, "=")
|
filterSplit := strings.SplitN(f, "=", 2)
|
||||||
if len(filterSplit) < 2 {
|
if len(filterSplit) < 2 {
|
||||||
return nil, errors.Errorf("filter input must be in the form of filter=value: %s is invalid", f)
|
return nil, errors.Errorf("filter input must be in the form of filter=value: %s is invalid", f)
|
||||||
}
|
}
|
||||||
@ -256,6 +256,22 @@ func generatePodFilterFuncs(filter, filterValue string) (
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}, nil
|
}, nil
|
||||||
|
case "label":
|
||||||
|
var filterArray = strings.SplitN(filterValue, "=", 2)
|
||||||
|
var filterKey = filterArray[0]
|
||||||
|
if len(filterArray) > 1 {
|
||||||
|
filterValue = filterArray[1]
|
||||||
|
} else {
|
||||||
|
filterValue = ""
|
||||||
|
}
|
||||||
|
return func(p *libpod.Pod) bool {
|
||||||
|
for labelKey, labelValue := range p.Labels() {
|
||||||
|
if labelKey == filterKey && ("" == filterValue || labelValue == filterValue) {
|
||||||
|
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)
|
||||||
}
|
}
|
||||||
|
@ -519,6 +519,21 @@ func (p *PodmanTestIntegration) CreatePod(name string) (*PodmanSessionIntegratio
|
|||||||
return session, session.ExitCode(), session.OutputToString()
|
return session, session.ExitCode(), session.OutputToString()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreatePod creates a pod with no infra container and some labels.
|
||||||
|
// it optionally takes a pod name
|
||||||
|
func (p *PodmanTestIntegration) CreatePodWithLabels(name string, labels map[string]string) (*PodmanSessionIntegration, int, string) {
|
||||||
|
var podmanArgs = []string{"pod", "create", "--infra=false", "--share", ""}
|
||||||
|
if name != "" {
|
||||||
|
podmanArgs = append(podmanArgs, "--name", name)
|
||||||
|
}
|
||||||
|
for labelKey, labelValue := range labels {
|
||||||
|
podmanArgs = append(podmanArgs, "--label", fmt.Sprintf("%s=%s", labelKey, labelValue))
|
||||||
|
}
|
||||||
|
session := p.Podman(podmanArgs)
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
return session, session.ExitCode(), session.OutputToString()
|
||||||
|
}
|
||||||
|
|
||||||
func (p *PodmanTestIntegration) RunTopContainerInPod(name, pod string) *PodmanSessionIntegration {
|
func (p *PodmanTestIntegration) RunTopContainerInPod(name, pod string) *PodmanSessionIntegration {
|
||||||
var podmanArgs = []string{"run", "--pod", pod}
|
var podmanArgs = []string{"run", "--pod", pod}
|
||||||
if name != "" {
|
if name != "" {
|
||||||
|
@ -204,4 +204,27 @@ var _ = Describe("Podman ps", func() {
|
|||||||
Expect(session.ExitCode()).To(Equal(0))
|
Expect(session.ExitCode()).To(Equal(0))
|
||||||
Expect(session.OutputToString()).To(BeEmpty())
|
Expect(session.OutputToString()).To(BeEmpty())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("podman pod ps filter labels", func() {
|
||||||
|
_, ec, podid1 := podmanTest.CreatePod("")
|
||||||
|
Expect(ec).To(Equal(0))
|
||||||
|
|
||||||
|
_, ec, podid2 := podmanTest.CreatePodWithLabels("", map[string]string{
|
||||||
|
"io.podman.test.label": "value1",
|
||||||
|
"io.podman.test.key": "irrelevant-value",
|
||||||
|
})
|
||||||
|
Expect(ec).To(Equal(0))
|
||||||
|
|
||||||
|
_, ec, podid3 := podmanTest.CreatePodWithLabels("", map[string]string{
|
||||||
|
"io.podman.test.label": "value2",
|
||||||
|
})
|
||||||
|
Expect(ec).To(Equal(0))
|
||||||
|
|
||||||
|
session := podmanTest.Podman([]string{"pod", "ps", "--no-trunc", "--filter", "label=io.podman.test.key", "--filter", "label=io.podman.test.label=value1"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session.ExitCode()).To(Equal(0))
|
||||||
|
Expect(session.OutputToString()).To(Not(ContainSubstring(podid1)))
|
||||||
|
Expect(session.OutputToString()).To(ContainSubstring(podid2))
|
||||||
|
Expect(session.OutputToString()).To(Not(ContainSubstring(podid3)))
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user