github.com/flavio/docker@v0.1.3-0.20170117145210-f63d1a6eec47/cli/command/service/ps.go (about) 1 package service 2 3 import ( 4 "fmt" 5 "strings" 6 7 "golang.org/x/net/context" 8 9 "github.com/docker/docker/api/types" 10 "github.com/docker/docker/api/types/filters" 11 "github.com/docker/docker/cli" 12 "github.com/docker/docker/cli/command" 13 "github.com/docker/docker/cli/command/idresolver" 14 "github.com/docker/docker/cli/command/node" 15 "github.com/docker/docker/cli/command/task" 16 "github.com/docker/docker/opts" 17 "github.com/spf13/cobra" 18 ) 19 20 type psOptions struct { 21 services []string 22 quiet bool 23 noResolve bool 24 noTrunc bool 25 filter opts.FilterOpt 26 } 27 28 func newPsCommand(dockerCli *command.DockerCli) *cobra.Command { 29 opts := psOptions{filter: opts.NewFilterOpt()} 30 31 cmd := &cobra.Command{ 32 Use: "ps [OPTIONS] SERVICE [SERVICE...]", 33 Short: "List the tasks of one or more services", 34 Args: cli.RequiresMinArgs(1), 35 RunE: func(cmd *cobra.Command, args []string) error { 36 opts.services = args 37 return runPS(dockerCli, opts) 38 }, 39 } 40 flags := cmd.Flags() 41 flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Only display task IDs") 42 flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Do not truncate output") 43 flags.BoolVar(&opts.noResolve, "no-resolve", false, "Do not map IDs to Names") 44 flags.VarP(&opts.filter, "filter", "f", "Filter output based on conditions provided") 45 46 return cmd 47 } 48 49 func runPS(dockerCli *command.DockerCli, opts psOptions) error { 50 client := dockerCli.Client() 51 ctx := context.Background() 52 53 filter := opts.filter.Value() 54 55 serviceIDFilter := filters.NewArgs() 56 serviceNameFilter := filters.NewArgs() 57 for _, service := range opts.services { 58 serviceIDFilter.Add("id", service) 59 serviceNameFilter.Add("name", service) 60 } 61 serviceByIDList, err := client.ServiceList(ctx, types.ServiceListOptions{Filters: serviceIDFilter}) 62 if err != nil { 63 return err 64 } 65 serviceByNameList, err := client.ServiceList(ctx, types.ServiceListOptions{Filters: serviceNameFilter}) 66 if err != nil { 67 return err 68 } 69 70 for _, service := range opts.services { 71 serviceCount := 0 72 // Lookup by ID/Prefix 73 for _, serviceEntry := range serviceByIDList { 74 if strings.HasPrefix(serviceEntry.ID, service) { 75 filter.Add("service", serviceEntry.ID) 76 serviceCount++ 77 } 78 } 79 80 // Lookup by Name/Prefix 81 for _, serviceEntry := range serviceByNameList { 82 if strings.HasPrefix(serviceEntry.Spec.Annotations.Name, service) { 83 filter.Add("service", serviceEntry.ID) 84 serviceCount++ 85 } 86 } 87 // If nothing has been found, return immediately. 88 if serviceCount == 0 { 89 return fmt.Errorf("no such services: %s", service) 90 } 91 } 92 93 if filter.Include("node") { 94 nodeFilters := filter.Get("node") 95 for _, nodeFilter := range nodeFilters { 96 nodeReference, err := node.Reference(ctx, client, nodeFilter) 97 if err != nil { 98 return err 99 } 100 filter.Del("node", nodeFilter) 101 filter.Add("node", nodeReference) 102 } 103 } 104 105 tasks, err := client.TaskList(ctx, types.TaskListOptions{Filters: filter}) 106 if err != nil { 107 return err 108 } 109 110 if opts.quiet { 111 return task.PrintQuiet(dockerCli, tasks) 112 } 113 return task.Print(dockerCli, ctx, tasks, idresolver.New(client, opts.noResolve), opts.noTrunc) 114 }