From b0fc5a21f1138f48e0431a550c936e8908d72840 Mon Sep 17 00:00:00 2001 From: Vincent Demeester Date: Thu, 30 Jun 2016 15:09:03 +0200 Subject: [PATCH] =?UTF-8?q?Allow=20service=20and=20node=20filter=20to=20be?= =?UTF-8?q?=20name=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit … 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 --- api/client/node/cmd.go | 7 ++++--- api/client/node/inspect.go | 2 +- api/client/node/tasks.go | 2 +- api/client/service/tasks.go | 13 +++++++++++++ daemon/cluster/cluster.go | 29 ++++++++++++++++++++++++++++- daemon/cluster/filters.go | 7 ++++++- 6 files changed, 53 insertions(+), 7 deletions(-) diff --git a/api/client/node/cmd.go b/api/client/node/cmd.go index 9971745ede..0588f1ee1d 100644 --- a/api/client/node/cmd.go +++ b/api/client/node/cmd.go @@ -35,9 +35,10 @@ func NewNodeCommand(dockerCli *client.DockerCli) *cobra.Command { return cmd } -func nodeReference(client apiclient.APIClient, ctx context.Context, ref string) (string, error) { - // The special value "self" for a node reference is mapped to the current - // node, hence the node ID is retrieved using the `/info` endpoint. +// Reference return the reference of a node. The special value "self" for a node +// reference is mapped to the current node, hence the node ID is retrieved using +// the `/info` endpoint. +func Reference(client apiclient.APIClient, ctx context.Context, ref string) (string, error) { if ref == "self" { info, err := client.Info(ctx) if err != nil { diff --git a/api/client/node/inspect.go b/api/client/node/inspect.go index f84cb6f95b..dc6245526c 100644 --- a/api/client/node/inspect.go +++ b/api/client/node/inspect.go @@ -45,7 +45,7 @@ func runInspect(dockerCli *client.DockerCli, opts inspectOptions) error { client := dockerCli.Client() ctx := context.Background() getRef := func(ref string) (interface{}, []byte, error) { - nodeRef, err := nodeReference(client, ctx, ref) + nodeRef, err := Reference(client, ctx, ref) if err != nil { return nil, nil, err } diff --git a/api/client/node/tasks.go b/api/client/node/tasks.go index 0c044e3dd6..97176adfc3 100644 --- a/api/client/node/tasks.go +++ b/api/client/node/tasks.go @@ -44,7 +44,7 @@ func runTasks(dockerCli *client.DockerCli, opts tasksOptions) error { client := dockerCli.Client() ctx := context.Background() - nodeRef, err := nodeReference(client, ctx, opts.nodeID) + nodeRef, err := Reference(client, ctx, opts.nodeID) if err != nil { return nil } diff --git a/api/client/service/tasks.go b/api/client/service/tasks.go index 7520b1f16d..e4dda9398f 100644 --- a/api/client/service/tasks.go +++ b/api/client/service/tasks.go @@ -5,6 +5,7 @@ import ( "github.com/docker/docker/api/client" "github.com/docker/docker/api/client/idresolver" + "github.com/docker/docker/api/client/node" "github.com/docker/docker/api/client/task" "github.com/docker/docker/cli" "github.com/docker/docker/opts" @@ -56,6 +57,18 @@ func runTasks(dockerCli *client.DockerCli, opts tasksOptions) error { filter.Add("desired_state", string(swarm.TaskStateAccepted)) } + if filter.Include("node") { + nodeFilters := filter.Get("node") + for _, nodeFilter := range nodeFilters { + nodeReference, err := node.Reference(client, ctx, nodeFilter) + if err != nil { + return err + } + filter.Del("node", nodeFilter) + filter.Add("node", nodeReference) + } + } + tasks, err := client.TaskList(ctx, types.TaskListOptions{Filter: filter}) if err != nil { return err diff --git a/daemon/cluster/cluster.go b/daemon/cluster/cluster.go index aeee0643f0..6c2da348c0 100644 --- a/daemon/cluster/cluster.go +++ b/daemon/cluster/cluster.go @@ -22,6 +22,7 @@ import ( "github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/runconfig" apitypes "github.com/docker/engine-api/types" + "github.com/docker/engine-api/types/filters" types "github.com/docker/engine-api/types/swarm" swarmagent "github.com/docker/swarmkit/agent" swarmapi "github.com/docker/swarmkit/api" @@ -855,7 +856,33 @@ func (c *Cluster) GetTasks(options apitypes.TaskListOptions) ([]types.Task, erro return nil, c.errNoManager() } - filters, err := newListTasksFilters(options.Filter) + byName := func(filter filters.Args) error { + if filter.Include("service") { + serviceFilters := filter.Get("service") + for _, serviceFilter := range serviceFilters { + service, err := c.GetService(serviceFilter) + if err != nil { + return err + } + filter.Del("service", serviceFilter) + filter.Add("service", service.ID) + } + } + if filter.Include("node") { + nodeFilters := filter.Get("node") + for _, nodeFilter := range nodeFilters { + node, err := c.GetNode(nodeFilter) + if err != nil { + return err + } + filter.Del("node", nodeFilter) + filter.Add("node", node.ID) + } + } + return nil + } + + filters, err := newListTasksFilters(options.Filter, byName) if err != nil { return nil, err } diff --git a/daemon/cluster/filters.go b/daemon/cluster/filters.go index 5890698d00..db83f7aed4 100644 --- a/daemon/cluster/filters.go +++ b/daemon/cluster/filters.go @@ -61,7 +61,7 @@ func newListServicesFilters(filter filters.Args) (*swarmapi.ListServicesRequest_ }, nil } -func newListTasksFilters(filter filters.Args) (*swarmapi.ListTasksRequest_Filters, error) { +func newListTasksFilters(filter filters.Args, transformFunc func(filters.Args) error) (*swarmapi.ListTasksRequest_Filters, error) { accepted := map[string]bool{ "name": true, "id": true, @@ -73,6 +73,11 @@ func newListTasksFilters(filter filters.Args) (*swarmapi.ListTasksRequest_Filter if err := filter.Validate(accepted); err != nil { return nil, err } + if transformFunc != nil { + if err := transformFunc(filter); err != nil { + return nil, err + } + } f := &swarmapi.ListTasksRequest_Filters{ Names: filter.Get("name"), IDPrefixes: filter.Get("id"),