|
|
@@ -42,7 +42,7 @@ type psOptions struct {
|
|
|
Quiet bool
|
|
|
Services bool
|
|
|
Filter string
|
|
|
- Status string
|
|
|
+ Status []string
|
|
|
}
|
|
|
|
|
|
func (p *psOptions) parseFilter() error {
|
|
|
@@ -55,7 +55,7 @@ func (p *psOptions) parseFilter() error {
|
|
|
}
|
|
|
switch parts[0] {
|
|
|
case "status":
|
|
|
- p.Status = parts[1]
|
|
|
+ p.Status = append(p.Status, parts[1])
|
|
|
case "source":
|
|
|
return api.ErrNotImplemented
|
|
|
default:
|
|
|
@@ -82,7 +82,7 @@ func psCommand(p *projectOptions, backend api.Service) *cobra.Command {
|
|
|
flags := psCmd.Flags()
|
|
|
flags.StringVar(&opts.Format, "format", "pretty", "Format the output. Values: [pretty | json]")
|
|
|
flags.StringVar(&opts.Filter, "filter", "", "Filter services by a property. Deprecated, use --status instead")
|
|
|
- flags.StringVar(&opts.Status, "status", "", "Filter services by status. Values: [paused | restarting | removing | running | dead | created | exited]")
|
|
|
+ flags.StringArrayVar(&opts.Status, "status", []string{}, "Filter services by status. Values: [paused | restarting | removing | running | dead | created | exited]")
|
|
|
flags.BoolVarP(&opts.Quiet, "quiet", "q", false, "Only display IDs")
|
|
|
flags.BoolVar(&opts.Services, "services", false, "Display services")
|
|
|
flags.BoolVarP(&opts.All, "all", "a", false, "Show all stopped containers (including those created by the run command)")
|
|
|
@@ -124,7 +124,7 @@ SERVICES:
|
|
|
return fmt.Errorf("no such service: %s", s)
|
|
|
}
|
|
|
|
|
|
- if opts.Status != "" {
|
|
|
+ if len(opts.Status) != 0 {
|
|
|
containers = filterByStatus(containers, opts.Status)
|
|
|
}
|
|
|
|
|
|
@@ -160,22 +160,25 @@ func writter(containers []api.ContainerSummary) func(w io.Writer) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func filterByStatus(containers []api.ContainerSummary, status string) []api.ContainerSummary {
|
|
|
- hasContainerWithState := map[string]struct{}{}
|
|
|
- for _, c := range containers {
|
|
|
- if c.State == status {
|
|
|
- hasContainerWithState[c.Service] = struct{}{}
|
|
|
- }
|
|
|
- }
|
|
|
+func filterByStatus(containers []api.ContainerSummary, statuses []string) []api.ContainerSummary {
|
|
|
var filtered []api.ContainerSummary
|
|
|
for _, c := range containers {
|
|
|
- if _, ok := hasContainerWithState[c.Service]; ok {
|
|
|
+ if hasStatus(c, statuses) {
|
|
|
filtered = append(filtered, c)
|
|
|
}
|
|
|
}
|
|
|
return filtered
|
|
|
}
|
|
|
|
|
|
+func hasStatus(c api.ContainerSummary, statuses []string) bool {
|
|
|
+ for _, status := range statuses {
|
|
|
+ if c.State == status {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false
|
|
|
+}
|
|
|
+
|
|
|
type portRange struct {
|
|
|
pStart int
|
|
|
pEnd int
|