package cluster // import "github.com/docker/docker/daemon/cluster" import ( "context" apitypes "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" types "github.com/docker/docker/api/types/swarm" "github.com/docker/docker/daemon/cluster/convert" swarmapi "github.com/moby/swarmkit/v2/api" "google.golang.org/grpc" ) // GetTasks returns a list of tasks matching the filter options. func (c *Cluster) GetTasks(options apitypes.TaskListOptions) ([]types.Task, error) { var r *swarmapi.ListTasksResponse if err := c.lockedManagerAction(func(ctx context.Context, state nodeState) error { filterTransform := func(filter filters.Args) error { if filter.Contains("service") { serviceFilters := filter.Get("service") for _, serviceFilter := range serviceFilters { service, err := getService(ctx, state.controlClient, serviceFilter, false) if err != nil { return err } filter.Del("service", serviceFilter) filter.Add("service", service.ID) } } if filter.Contains("node") { nodeFilters := filter.Get("node") for _, nodeFilter := range nodeFilters { node, err := getNode(ctx, state.controlClient, nodeFilter) if err != nil { return err } filter.Del("node", nodeFilter) filter.Add("node", node.ID) } } if !filter.Contains("runtime") { // default to only showing container tasks filter.Add("runtime", "container") filter.Add("runtime", "") } return nil } filters, err := newListTasksFilters(options.Filters, filterTransform) if err != nil { return err } r, err = state.controlClient.ListTasks( ctx, &swarmapi.ListTasksRequest{Filters: filters}, grpc.MaxCallRecvMsgSize(defaultRecvSizeForListResponse), ) return err }); err != nil { return nil, err } tasks := make([]types.Task, 0, len(r.Tasks)) for _, task := range r.Tasks { t, err := convert.TaskFromGRPC(*task) if err != nil { return nil, err } tasks = append(tasks, t) } return tasks, nil } // GetTask returns a task by an ID. func (c *Cluster) GetTask(input string) (types.Task, error) { var task *swarmapi.Task if err := c.lockedManagerAction(func(ctx context.Context, state nodeState) error { t, err := getTask(ctx, state.controlClient, input) if err != nil { return err } task = t return nil }); err != nil { return types.Task{}, err } return convert.TaskFromGRPC(*task) }