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