github.com/lazyboychen7/engine@v17.12.1-ce-rc2+incompatible/daemon/cluster/tasks.go (about) 1 package cluster 2 3 import ( 4 apitypes "github.com/docker/docker/api/types" 5 "github.com/docker/docker/api/types/filters" 6 types "github.com/docker/docker/api/types/swarm" 7 "github.com/docker/docker/daemon/cluster/convert" 8 swarmapi "github.com/docker/swarmkit/api" 9 "golang.org/x/net/context" 10 ) 11 12 // GetTasks returns a list of tasks matching the filter options. 13 func (c *Cluster) GetTasks(options apitypes.TaskListOptions) ([]types.Task, error) { 14 var r *swarmapi.ListTasksResponse 15 16 if err := c.lockedManagerAction(func(ctx context.Context, state nodeState) error { 17 filterTransform := func(filter filters.Args) error { 18 if filter.Contains("service") { 19 serviceFilters := filter.Get("service") 20 for _, serviceFilter := range serviceFilters { 21 service, err := getService(ctx, state.controlClient, serviceFilter, false) 22 if err != nil { 23 return err 24 } 25 filter.Del("service", serviceFilter) 26 filter.Add("service", service.ID) 27 } 28 } 29 if filter.Contains("node") { 30 nodeFilters := filter.Get("node") 31 for _, nodeFilter := range nodeFilters { 32 node, err := getNode(ctx, state.controlClient, nodeFilter) 33 if err != nil { 34 return err 35 } 36 filter.Del("node", nodeFilter) 37 filter.Add("node", node.ID) 38 } 39 } 40 if !filter.Contains("runtime") { 41 // default to only showing container tasks 42 filter.Add("runtime", "container") 43 filter.Add("runtime", "") 44 } 45 return nil 46 } 47 48 filters, err := newListTasksFilters(options.Filters, filterTransform) 49 if err != nil { 50 return err 51 } 52 53 r, err = state.controlClient.ListTasks( 54 ctx, 55 &swarmapi.ListTasksRequest{Filters: filters}) 56 return err 57 }); err != nil { 58 return nil, err 59 } 60 61 tasks := make([]types.Task, 0, len(r.Tasks)) 62 for _, task := range r.Tasks { 63 t, err := convert.TaskFromGRPC(*task) 64 if err != nil { 65 return nil, err 66 } 67 tasks = append(tasks, t) 68 } 69 return tasks, nil 70 } 71 72 // GetTask returns a task by an ID. 73 func (c *Cluster) GetTask(input string) (types.Task, error) { 74 var task *swarmapi.Task 75 if err := c.lockedManagerAction(func(ctx context.Context, state nodeState) error { 76 t, err := getTask(ctx, state.controlClient, input) 77 if err != nil { 78 return err 79 } 80 task = t 81 return nil 82 }); err != nil { 83 return types.Task{}, err 84 } 85 return convert.TaskFromGRPC(*task) 86 }