summaryrefslogtreecommitdiff
path: root/pkg/domain/filters/pods.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/domain/filters/pods.go')
-rw-r--r--pkg/domain/filters/pods.go139
1 files changed, 139 insertions, 0 deletions
diff --git a/pkg/domain/filters/pods.go b/pkg/domain/filters/pods.go
new file mode 100644
index 000000000..7e6b7f2cc
--- /dev/null
+++ b/pkg/domain/filters/pods.go
@@ -0,0 +1,139 @@
+package filters
+
+import (
+ "strconv"
+ "strings"
+
+ "github.com/containers/podman/v2/libpod"
+ "github.com/containers/podman/v2/libpod/define"
+ "github.com/containers/podman/v2/pkg/util"
+ "github.com/pkg/errors"
+)
+
+// GeneratePodFilterFunc takes a filter and filtervalue (key, value)
+// and generates a libpod function that can be used to filter
+// pods
+func GeneratePodFilterFunc(filter string, filterValues []string) (
+ func(pod *libpod.Pod) bool, error) {
+ switch filter {
+ case "ctr-ids":
+ return func(p *libpod.Pod) bool {
+ ctrIds, err := p.AllContainersByID()
+ if err != nil {
+ return false
+ }
+ for _, id := range ctrIds {
+ return util.StringMatchRegexSlice(id, filterValues)
+ }
+ return false
+ }, nil
+ case "ctr-names":
+ return func(p *libpod.Pod) bool {
+ ctrs, err := p.AllContainers()
+ if err != nil {
+ return false
+ }
+ for _, ctr := range ctrs {
+ return util.StringMatchRegexSlice(ctr.Name(), filterValues)
+ }
+ return false
+ }, nil
+ case "ctr-number":
+ return func(p *libpod.Pod) bool {
+ ctrIds, err := p.AllContainersByID()
+ if err != nil {
+ return false
+ }
+ for _, filterValue := range filterValues {
+ fVint, err2 := strconv.Atoi(filterValue)
+ if err2 != nil {
+ return false
+ }
+ if len(ctrIds) == fVint {
+ return true
+ }
+ }
+ return false
+ }, nil
+ case "ctr-status":
+ for _, filterValue := range filterValues {
+ if !util.StringInSlice(filterValue, []string{"created", "running", "paused", "stopped", "exited", "unknown"}) {
+ return nil, errors.Errorf("%s is not a valid status", filterValue)
+ }
+ }
+ return func(p *libpod.Pod) bool {
+ ctrStatuses, err := p.Status()
+ if err != nil {
+ return false
+ }
+ for _, ctrStatus := range ctrStatuses {
+ state := ctrStatus.String()
+ if ctrStatus == define.ContainerStateConfigured {
+ state = "created"
+ } else if ctrStatus == define.ContainerStateStopped {
+ state = "exited"
+ }
+ for _, filterValue := range filterValues {
+ if filterValue == "stopped" {
+ filterValue = "exited"
+ }
+ if state == filterValue {
+ return true
+ }
+ }
+ }
+ return false
+ }, nil
+ case "id":
+ return func(p *libpod.Pod) bool {
+ return util.StringMatchRegexSlice(p.ID(), filterValues)
+ }, nil
+ case "name":
+ return func(p *libpod.Pod) bool {
+ return util.StringMatchRegexSlice(p.Name(), filterValues)
+ }, nil
+ case "status":
+ for _, filterValue := range filterValues {
+ if !util.StringInSlice(filterValue, []string{"stopped", "running", "paused", "exited", "dead", "created", "degraded"}) {
+ return nil, errors.Errorf("%s is not a valid pod status", filterValue)
+ }
+ }
+ return func(p *libpod.Pod) bool {
+ status, err := p.GetPodStatus()
+ if err != nil {
+ return false
+ }
+ for _, filterValue := range filterValues {
+ if strings.ToLower(status) == filterValue {
+ return true
+ }
+ }
+ return false
+ }, nil
+ case "label":
+ return func(p *libpod.Pod) bool {
+ labels := p.Labels()
+ for _, filterValue := range filterValues {
+ matched := false
+ filterArray := strings.SplitN(filterValue, "=", 2)
+ filterKey := filterArray[0]
+ if len(filterArray) > 1 {
+ filterValue = filterArray[1]
+ } else {
+ filterValue = ""
+ }
+ for labelKey, labelValue := range labels {
+ if labelKey == filterKey && ("" == filterValue || labelValue == filterValue) {
+ matched = true
+ break
+ }
+ }
+ if !matched {
+ return false
+ }
+ }
+ return true
+ }, nil
+ }
+ return nil, errors.Errorf("%s is an invalid filter", filter)
+}