github.com/rhatdan/docker@v0.7.7-0.20180119204836-47a0dcbcd20a/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  }