Allow service and node filter to be name in `tasks` subcommands
| ... | ... |
@@ -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"),
|