diff options
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/podman/pod_ps.go | 126 | ||||
| -rw-r--r-- | cmd/podman/shared/pod.go | 126 | 
2 files changed, 137 insertions, 115 deletions
diff --git a/cmd/podman/pod_ps.go b/cmd/podman/pod_ps.go index d7731e983..7acbd6888 100644 --- a/cmd/podman/pod_ps.go +++ b/cmd/podman/pod_ps.go @@ -4,7 +4,6 @@ import (  	"fmt"  	"reflect"  	"sort" -	"strconv"  	"strings"  	"time" @@ -13,7 +12,6 @@ import (  	"github.com/containers/libpod/cmd/podman/shared"  	"github.com/containers/libpod/libpod/define"  	"github.com/containers/libpod/pkg/adapter" -	"github.com/containers/libpod/pkg/util"  	"github.com/docker/go-units"  	"github.com/pkg/errors"  	"github.com/spf13/cobra" @@ -29,8 +27,6 @@ const (  	NUM_CTR_INFO = 10  ) -type PodFilter func(*adapter.Pod) bool -  var (  	bc_opts shared.PsOptions  ) @@ -174,29 +170,23 @@ func podPsCmd(c *cliconfig.PodPsValues) error {  	opts.Format = genPodPsFormat(c) -	var filterFuncs []PodFilter -	if c.Filter != "" { -		filters := strings.Split(c.Filter, ",") -		for _, f := range filters { -			filterSplit := strings.Split(f, "=") -			if len(filterSplit) < 2 { -				return errors.Errorf("filter input must be in the form of filter=value: %s is invalid", f) -			} -			generatedFunc, err := generatePodFilterFuncs(filterSplit[0], filterSplit[1]) -			if err != nil { -				return errors.Wrapf(err, "invalid filter") -			} -			filterFuncs = append(filterFuncs, generatedFunc) -		} -	} -  	var pods []*adapter.Pod + +	// If latest is set true filters are ignored.  	if c.Latest {  		pod, err := runtime.GetLatestPod()  		if err != nil {  			return err  		}  		pods = append(pods, pod) +		return generatePodPsOutput(pods, opts) +	} + +	if c.Filter != "" { +		pods, err = runtime.GetPodsWithFilters(c.Filter) +		if err != nil { +			return err +		}  	} else {  		pods, err = runtime.GetAllPods()  		if err != nil { @@ -204,19 +194,7 @@ func podPsCmd(c *cliconfig.PodPsValues) error {  		}  	} -	podsFiltered := make([]*adapter.Pod, 0, len(pods)) -	for _, pod := range pods { -		include := true -		for _, filter := range filterFuncs { -			include = include && filter(pod) -		} - -		if include { -			podsFiltered = append(podsFiltered, pod) -		} -	} - -	return generatePodPsOutput(podsFiltered, opts) +	return generatePodPsOutput(pods, opts)  }  // podPsCheckFlagsPassed checks if mutually exclusive flags are passed together @@ -235,88 +213,6 @@ func podPsCheckFlagsPassed(c *cliconfig.PodPsValues) error {  	return nil  } -func generatePodFilterFuncs(filter, filterValue string) (func(pod *adapter.Pod) bool, error) { -	switch filter { -	case "ctr-ids": -		return func(p *adapter.Pod) bool { -			ctrIds, err := p.AllContainersByID() -			if err != nil { -				return false -			} -			return util.StringInSlice(filterValue, ctrIds) -		}, nil -	case "ctr-names": -		return func(p *adapter.Pod) bool { -			ctrs, err := p.AllContainers() -			if err != nil { -				return false -			} -			for _, ctr := range ctrs { -				if filterValue == ctr.Name() { -					return true -				} -			} -			return false -		}, nil -	case "ctr-number": -		return func(p *adapter.Pod) bool { -			ctrIds, err := p.AllContainersByID() -			if err != nil { -				return false -			} - -			fVint, err2 := strconv.Atoi(filterValue) -			if err2 != nil { -				return false -			} -			return len(ctrIds) == fVint -		}, nil -	case "ctr-status": -		if !util.StringInSlice(filterValue, []string{"created", "restarting", "running", "paused", "exited", "unknown"}) { -			return nil, errors.Errorf("%s is not a valid status", filterValue) -		} -		return func(p *adapter.Pod) bool { -			ctr_statuses, err := p.Status() -			if err != nil { -				return false -			} -			for _, ctr_status := range ctr_statuses { -				state := ctr_status.String() -				if ctr_status == define.ContainerStateConfigured { -					state = "created" -				} -				if state == filterValue { -					return true -				} -			} -			return false -		}, nil -	case "id": -		return func(p *adapter.Pod) bool { -			return strings.Contains(p.ID(), filterValue) -		}, nil -	case "name": -		return func(p *adapter.Pod) bool { -			return strings.Contains(p.Name(), filterValue) -		}, nil -	case "status": -		if !util.StringInSlice(filterValue, []string{"stopped", "running", "paused", "exited", "dead", "created"}) { -			return nil, errors.Errorf("%s is not a valid pod status", filterValue) -		} -		return func(p *adapter.Pod) bool { -			status, err := p.GetPodStatus() -			if err != nil { -				return false -			} -			if strings.ToLower(status) == filterValue { -				return true -			} -			return false -		}, nil -	} -	return nil, errors.Errorf("%s is an invalid filter", filter) -} -  // generate the template based on conditions given  func genPodPsFormat(c *cliconfig.PodPsValues) string {  	format := "" diff --git a/cmd/podman/shared/pod.go b/cmd/podman/shared/pod.go index 7b0b497fc..3046953b5 100644 --- a/cmd/podman/shared/pod.go +++ b/cmd/podman/shared/pod.go @@ -2,9 +2,11 @@ package shared  import (  	"strconv" +	"strings"  	"github.com/containers/libpod/libpod"  	"github.com/containers/libpod/libpod/define" +	"github.com/containers/libpod/pkg/util"  	"github.com/cri-o/ocicni/pkg/ocicni"  	"github.com/docker/go-connections/nat"  	"github.com/pkg/errors" @@ -134,4 +136,128 @@ func CreatePortBindings(ports []string) ([]ocicni.PortMapping, error) {  	return portBindings, nil  } +// GetPodsWithFilters uses the cliconfig to categorize if the latest pod is required. +func GetPodsWithFilters(r *libpod.Runtime, filters string) ([]*libpod.Pod, error) { +	filterFuncs, err := GenerateFilterFunction(r, strings.Split(filters, ",")) +	if err != nil { +		return nil, err +	} +	return FilterAllPodsWithFilterFunc(r, filterFuncs...) +} + +// FilterAllPodsWithFilterFunc retrieves all pods +// Filters can be provided which will determine which pods are included in the +// output. Multiple filters are handled by ANDing their output, so only pods +// matching all filters are returned +func FilterAllPodsWithFilterFunc(r *libpod.Runtime, filters ...libpod.PodFilter) ([]*libpod.Pod, error) { +	pods, err := r.Pods(filters...) +	if err != nil { +		return nil, err +	} +	return pods, nil +} + +// GenerateFilterFunction basically gets the filters based on the input by the user +// and filter the pod list based on the criteria. +func GenerateFilterFunction(r *libpod.Runtime, filters []string) ([]libpod.PodFilter, error) { +	var filterFuncs []libpod.PodFilter +	for _, f := range filters { +		filterSplit := strings.Split(f, "=") +		if len(filterSplit) < 2 { +			return nil, errors.Errorf("filter input must be in the form of filter=value: %s is invalid", f) +		} +		generatedFunc, err := generatePodFilterFuncs(filterSplit[0], filterSplit[1]) +		if err != nil { +			return nil, errors.Wrapf(err, "invalid filter") +		} +		filterFuncs = append(filterFuncs, generatedFunc) +	} + +	return filterFuncs, nil +} +func generatePodFilterFuncs(filter, filterValue 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 +			} +			return util.StringInSlice(filterValue, ctrIds) +		}, nil +	case "ctr-names": +		return func(p *libpod.Pod) bool { +			ctrs, err := p.AllContainers() +			if err != nil { +				return false +			} +			for _, ctr := range ctrs { +				if filterValue == ctr.Name() { +					return true +				} +			} +			return false +		}, nil +	case "ctr-number": +		return func(p *libpod.Pod) bool { +			ctrIds, err := p.AllContainersByID() +			if err != nil { +				return false +			} + +			fVint, err2 := strconv.Atoi(filterValue) +			if err2 != nil { +				return false +			} +			return len(ctrIds) == fVint +		}, nil +	case "ctr-status": +		if !util.StringInSlice(filterValue, +			[]string{"created", "restarting", "running", "paused", +				"exited", "unknown"}) { +			return nil, errors.Errorf("%s is not a valid status", filterValue) +		} +		return func(p *libpod.Pod) bool { +			ctr_statuses, err := p.Status() +			if err != nil { +				return false +			} +			for _, ctr_status := range ctr_statuses { +				state := ctr_status.String() +				if ctr_status == define.ContainerStateConfigured { +					state = "created" +				} +				if state == filterValue { +					return true +				} +			} +			return false +		}, nil +	case "id": +		return func(p *libpod.Pod) bool { +			return strings.Contains(p.ID(), filterValue) +		}, nil +	case "name": +		return func(p *libpod.Pod) bool { +			return strings.Contains(p.Name(), filterValue) +		}, nil +	case "status": +		if !util.StringInSlice(filterValue, []string{"stopped", "running", "paused", "exited", "dead", "created"}) { +			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 +			} +			if strings.ToLower(status) == filterValue { +				return true +			} +			return false +		}, nil +	} +	return nil, errors.Errorf("%s is an invalid filter", filter) +} +  var DefaultKernelNamespaces = "cgroup,ipc,net,uts"  | 
