Browse code

Merge pull request #24173 from vdemeester/tasks-filter-service-node-by-name

Allow service and node filter to be name in `tasks` subcommands

Alexander Morozov authored on 2016/07/06 04:16:57
Showing 6 changed files
... ...
@@ -35,9 +35,10 @@ func NewNodeCommand(dockerCli *client.DockerCli) *cobra.Command {
35 35
 	return cmd
36 36
 }
37 37
 
38
-func nodeReference(client apiclient.APIClient, ctx context.Context, ref string) (string, error) {
39
-	// The special value "self" for a node reference is mapped to the current
40
-	// node, hence the node ID is retrieved using the `/info` endpoint.
38
+// Reference return the reference of a node. The special value "self" for a node
39
+// reference is mapped to the current node, hence the node ID is retrieved using
40
+// the `/info` endpoint.
41
+func Reference(client apiclient.APIClient, ctx context.Context, ref string) (string, error) {
41 42
 	if ref == "self" {
42 43
 		info, err := client.Info(ctx)
43 44
 		if err != nil {
... ...
@@ -45,7 +45,7 @@ func runInspect(dockerCli *client.DockerCli, opts inspectOptions) error {
45 45
 	client := dockerCli.Client()
46 46
 	ctx := context.Background()
47 47
 	getRef := func(ref string) (interface{}, []byte, error) {
48
-		nodeRef, err := nodeReference(client, ctx, ref)
48
+		nodeRef, err := Reference(client, ctx, ref)
49 49
 		if err != nil {
50 50
 			return nil, nil, err
51 51
 		}
... ...
@@ -44,7 +44,7 @@ func runTasks(dockerCli *client.DockerCli, opts tasksOptions) error {
44 44
 	client := dockerCli.Client()
45 45
 	ctx := context.Background()
46 46
 
47
-	nodeRef, err := nodeReference(client, ctx, opts.nodeID)
47
+	nodeRef, err := Reference(client, ctx, opts.nodeID)
48 48
 	if err != nil {
49 49
 		return nil
50 50
 	}
... ...
@@ -5,6 +5,7 @@ import (
5 5
 
6 6
 	"github.com/docker/docker/api/client"
7 7
 	"github.com/docker/docker/api/client/idresolver"
8
+	"github.com/docker/docker/api/client/node"
8 9
 	"github.com/docker/docker/api/client/task"
9 10
 	"github.com/docker/docker/cli"
10 11
 	"github.com/docker/docker/opts"
... ...
@@ -56,6 +57,18 @@ func runTasks(dockerCli *client.DockerCli, opts tasksOptions) error {
56 56
 		filter.Add("desired-state", string(swarm.TaskStateAccepted))
57 57
 	}
58 58
 
59
+	if filter.Include("node") {
60
+		nodeFilters := filter.Get("node")
61
+		for _, nodeFilter := range nodeFilters {
62
+			nodeReference, err := node.Reference(client, ctx, nodeFilter)
63
+			if err != nil {
64
+				return err
65
+			}
66
+			filter.Del("node", nodeFilter)
67
+			filter.Add("node", nodeReference)
68
+		}
69
+	}
70
+
59 71
 	tasks, err := client.TaskList(ctx, types.TaskListOptions{Filter: filter})
60 72
 	if err != nil {
61 73
 		return err
... ...
@@ -22,6 +22,7 @@ import (
22 22
 	"github.com/docker/docker/pkg/ioutils"
23 23
 	"github.com/docker/docker/runconfig"
24 24
 	apitypes "github.com/docker/engine-api/types"
25
+	"github.com/docker/engine-api/types/filters"
25 26
 	types "github.com/docker/engine-api/types/swarm"
26 27
 	swarmagent "github.com/docker/swarmkit/agent"
27 28
 	swarmapi "github.com/docker/swarmkit/api"
... ...
@@ -884,7 +885,33 @@ func (c *Cluster) GetTasks(options apitypes.TaskListOptions) ([]types.Task, erro
884 884
 		return nil, c.errNoManager()
885 885
 	}
886 886
 
887
-	filters, err := newListTasksFilters(options.Filter)
887
+	byName := func(filter filters.Args) error {
888
+		if filter.Include("service") {
889
+			serviceFilters := filter.Get("service")
890
+			for _, serviceFilter := range serviceFilters {
891
+				service, err := c.GetService(serviceFilter)
892
+				if err != nil {
893
+					return err
894
+				}
895
+				filter.Del("service", serviceFilter)
896
+				filter.Add("service", service.ID)
897
+			}
898
+		}
899
+		if filter.Include("node") {
900
+			nodeFilters := filter.Get("node")
901
+			for _, nodeFilter := range nodeFilters {
902
+				node, err := c.GetNode(nodeFilter)
903
+				if err != nil {
904
+					return err
905
+				}
906
+				filter.Del("node", nodeFilter)
907
+				filter.Add("node", node.ID)
908
+			}
909
+		}
910
+		return nil
911
+	}
912
+
913
+	filters, err := newListTasksFilters(options.Filter, byName)
888 914
 	if err != nil {
889 915
 		return nil, err
890 916
 	}
... ...
@@ -61,7 +61,7 @@ func newListServicesFilters(filter filters.Args) (*swarmapi.ListServicesRequest_
61 61
 	}, nil
62 62
 }
63 63
 
64
-func newListTasksFilters(filter filters.Args) (*swarmapi.ListTasksRequest_Filters, error) {
64
+func newListTasksFilters(filter filters.Args, transformFunc func(filters.Args) error) (*swarmapi.ListTasksRequest_Filters, error) {
65 65
 	accepted := map[string]bool{
66 66
 		"name":          true,
67 67
 		"id":            true,
... ...
@@ -73,6 +73,11 @@ func newListTasksFilters(filter filters.Args) (*swarmapi.ListTasksRequest_Filter
73 73
 	if err := filter.Validate(accepted); err != nil {
74 74
 		return nil, err
75 75
 	}
76
+	if transformFunc != nil {
77
+		if err := transformFunc(filter); err != nil {
78
+			return nil, err
79
+		}
80
+	}
76 81
 	f := &swarmapi.ListTasksRequest_Filters{
77 82
 		Names:      filter.Get("name"),
78 83
 		IDPrefixes: filter.Get("id"),