Files
moby/daemon/cluster/tasks.go
Cory Snider 778e5bfad3 api/types/filters: move to daemon/internal
Most of the code in the filters package relates to the unmarshaling,
validation and application of filters from client requests. None of this
is necessary or particularly useful for Go SDK users. Move the full-fat
filters package into daemon/internal and switch all the daemon code to
import that package so we are free to iterate upon the code without
worrying about source-code interface compatibility.

Signed-off-by: Cory Snider <csnider@mirantis.com>
2025-10-08 12:06:26 -04:00

93 lines
2.4 KiB
Go

package cluster
import (
"context"
types "github.com/moby/moby/api/types/swarm"
"github.com/moby/moby/v2/daemon/cluster/convert"
"github.com/moby/moby/v2/daemon/internal/filters"
"github.com/moby/moby/v2/daemon/server/swarmbackend"
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 swarmbackend.TaskListOptions) ([]types.Task, error) {
var r *swarmapi.ListTasksResponse
err := c.lockedManagerAction(context.TODO(), 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
}
f, err := newListTasksFilters(options.Filters, filterTransform)
if err != nil {
return err
}
r, err = state.controlClient.ListTasks(
ctx,
&swarmapi.ListTasksRequest{Filters: f},
grpc.MaxCallRecvMsgSize(defaultRecvSizeForListResponse),
)
return err
})
if 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
err := c.lockedManagerAction(context.TODO(), func(ctx context.Context, state nodeState) error {
t, err := getTask(ctx, state.controlClient, input)
if err != nil {
return err
}
task = t
return nil
})
if err != nil {
return types.Task{}, err
}
return convert.TaskFromGRPC(*task)
}