mirror of https://github.com/docker/cli.git
Fix complexity of service/ps.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
This commit is contained in:
parent
6279612443
commit
b5baffde44
|
@ -12,6 +12,7 @@ import (
|
||||||
"github.com/docker/cli/opts"
|
"github.com/docker/cli/opts"
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/api/types/filters"
|
"github.com/docker/docker/api/types/filters"
|
||||||
|
"github.com/docker/docker/client"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
@ -52,6 +53,34 @@ func runPS(dockerCli command.Cli, options psOptions) error {
|
||||||
client := dockerCli.Client()
|
client := dockerCli.Client()
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
|
filter, notfound, err := createFilter(ctx, client, options)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks, err := client.TaskList(ctx, types.TaskListOptions{Filters: filter})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
format := options.format
|
||||||
|
if len(format) == 0 {
|
||||||
|
if len(dockerCli.ConfigFile().TasksFormat) > 0 && !options.quiet {
|
||||||
|
format = dockerCli.ConfigFile().TasksFormat
|
||||||
|
} else {
|
||||||
|
format = formatter.TableFormatKey
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := task.Print(ctx, dockerCli, tasks, idresolver.New(client, options.noResolve), !options.noTrunc, options.quiet, format); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(notfound) != 0 {
|
||||||
|
return errors.New(strings.Join(notfound, "\n"))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func createFilter(ctx context.Context, client client.APIClient, options psOptions) (filters.Args, []string, error) {
|
||||||
filter := options.filter.Value()
|
filter := options.filter.Value()
|
||||||
|
|
||||||
serviceIDFilter := filters.NewArgs()
|
serviceIDFilter := filters.NewArgs()
|
||||||
|
@ -62,14 +91,14 @@ func runPS(dockerCli command.Cli, options psOptions) error {
|
||||||
}
|
}
|
||||||
serviceByIDList, err := client.ServiceList(ctx, types.ServiceListOptions{Filters: serviceIDFilter})
|
serviceByIDList, err := client.ServiceList(ctx, types.ServiceListOptions{Filters: serviceIDFilter})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return filter, nil, err
|
||||||
}
|
}
|
||||||
serviceByNameList, err := client.ServiceList(ctx, types.ServiceListOptions{Filters: serviceNameFilter})
|
serviceByNameList, err := client.ServiceList(ctx, types.ServiceListOptions{Filters: serviceNameFilter})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return filter, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var errs []string
|
var notfound []string
|
||||||
serviceCount := 0
|
serviceCount := 0
|
||||||
loop:
|
loop:
|
||||||
// Match services by 1. Full ID, 2. Full name, 3. ID prefix. An error is returned if the ID-prefix match is ambiguous
|
// Match services by 1. Full ID, 2. Full name, 3. ID prefix. An error is returned if the ID-prefix match is ambiguous
|
||||||
|
@ -92,7 +121,7 @@ loop:
|
||||||
for _, s := range serviceByIDList {
|
for _, s := range serviceByIDList {
|
||||||
if strings.HasPrefix(s.ID, service) {
|
if strings.HasPrefix(s.ID, service) {
|
||||||
if found {
|
if found {
|
||||||
return errors.New("multiple services found with provided prefix: " + service)
|
return filter, nil, errors.New("multiple services found with provided prefix: " + service)
|
||||||
}
|
}
|
||||||
filter.Add("service", s.ID)
|
filter.Add("service", s.ID)
|
||||||
serviceCount++
|
serviceCount++
|
||||||
|
@ -100,42 +129,22 @@ loop:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !found {
|
if !found {
|
||||||
errs = append(errs, "no such service: "+service)
|
notfound = append(notfound, "no such service: "+service)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if serviceCount == 0 {
|
if serviceCount == 0 {
|
||||||
return errors.New(strings.Join(errs, "\n"))
|
return filter, nil, errors.New(strings.Join(notfound, "\n"))
|
||||||
}
|
}
|
||||||
if filter.Include("node") {
|
if filter.Include("node") {
|
||||||
nodeFilters := filter.Get("node")
|
nodeFilters := filter.Get("node")
|
||||||
for _, nodeFilter := range nodeFilters {
|
for _, nodeFilter := range nodeFilters {
|
||||||
nodeReference, err := node.Reference(ctx, client, nodeFilter)
|
nodeReference, err := node.Reference(ctx, client, nodeFilter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return filter, nil, err
|
||||||
}
|
}
|
||||||
filter.Del("node", nodeFilter)
|
filter.Del("node", nodeFilter)
|
||||||
filter.Add("node", nodeReference)
|
filter.Add("node", nodeReference)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return filter, notfound, err
|
||||||
tasks, err := client.TaskList(ctx, types.TaskListOptions{Filters: filter})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
format := options.format
|
|
||||||
if len(format) == 0 {
|
|
||||||
if len(dockerCli.ConfigFile().TasksFormat) > 0 && !options.quiet {
|
|
||||||
format = dockerCli.ConfigFile().TasksFormat
|
|
||||||
} else {
|
|
||||||
format = formatter.TableFormatKey
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err := task.Print(ctx, dockerCli, tasks, idresolver.New(client, options.noResolve), !options.noTrunc, options.quiet, format); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if len(errs) != 0 {
|
|
||||||
return errors.New(strings.Join(errs, "\n"))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue