… on `docker node tasks` and `docker service tasks` commands.
This changes is mainly server-side (between engine api and
swarmkit). There is just a check in `api/client/service/tasks.go` to
handle the special *self* meaning.
Signed-off-by: Vincent Demeester <vincent@sbr.pm>
| ... | ... |
@@ -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" |
| ... | ... |
@@ -855,7 +856,33 @@ func (c *Cluster) GetTasks(options apitypes.TaskListOptions) ([]types.Task, erro |
| 855 | 855 |
return nil, c.errNoManager() |
| 856 | 856 |
} |
| 857 | 857 |
|
| 858 |
- filters, err := newListTasksFilters(options.Filter) |
|
| 858 |
+ byName := func(filter filters.Args) error {
|
|
| 859 |
+ if filter.Include("service") {
|
|
| 860 |
+ serviceFilters := filter.Get("service")
|
|
| 861 |
+ for _, serviceFilter := range serviceFilters {
|
|
| 862 |
+ service, err := c.GetService(serviceFilter) |
|
| 863 |
+ if err != nil {
|
|
| 864 |
+ return err |
|
| 865 |
+ } |
|
| 866 |
+ filter.Del("service", serviceFilter)
|
|
| 867 |
+ filter.Add("service", service.ID)
|
|
| 868 |
+ } |
|
| 869 |
+ } |
|
| 870 |
+ if filter.Include("node") {
|
|
| 871 |
+ nodeFilters := filter.Get("node")
|
|
| 872 |
+ for _, nodeFilter := range nodeFilters {
|
|
| 873 |
+ node, err := c.GetNode(nodeFilter) |
|
| 874 |
+ if err != nil {
|
|
| 875 |
+ return err |
|
| 876 |
+ } |
|
| 877 |
+ filter.Del("node", nodeFilter)
|
|
| 878 |
+ filter.Add("node", node.ID)
|
|
| 879 |
+ } |
|
| 880 |
+ } |
|
| 881 |
+ return nil |
|
| 882 |
+ } |
|
| 883 |
+ |
|
| 884 |
+ filters, err := newListTasksFilters(options.Filter, byName) |
|
| 859 | 885 |
if err != nil {
|
| 860 | 886 |
return nil, err |
| 861 | 887 |
} |
| ... | ... |
@@ -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"),
|