github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/swarmkit/cmd/swarmctl/task/print.go (about)

     1  package task
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"sort"
     7  	"text/tabwriter"
     8  
     9  	"github.com/docker/swarmkit/api"
    10  	"github.com/docker/swarmkit/cmd/swarmctl/common"
    11  	gogotypes "github.com/gogo/protobuf/types"
    12  )
    13  
    14  type tasksBySlot []*api.Task
    15  
    16  func (t tasksBySlot) Len() int {
    17  	return len(t)
    18  }
    19  func (t tasksBySlot) Swap(i, j int) {
    20  	t[i], t[j] = t[j], t[i]
    21  }
    22  func (t tasksBySlot) Less(i, j int) bool {
    23  	// Sort by slot.
    24  	if t[i].Slot != t[j].Slot {
    25  		return t[i].Slot < t[j].Slot
    26  	}
    27  
    28  	// If same slot, sort by most recent.
    29  	it, err := gogotypes.TimestampFromProto(t[i].Meta.CreatedAt)
    30  	if err != nil {
    31  		panic(err)
    32  	}
    33  	jt, err := gogotypes.TimestampFromProto(t[j].Meta.CreatedAt)
    34  	if err != nil {
    35  		panic(err)
    36  	}
    37  	return jt.Before(it)
    38  }
    39  
    40  // Print prints a list of tasks.
    41  func Print(tasks []*api.Task, all bool, res *common.Resolver) {
    42  	w := tabwriter.NewWriter(os.Stdout, 4, 4, 4, ' ', 0)
    43  	defer w.Flush()
    44  
    45  	common.PrintHeader(w, "Task ID", "Service", "Slot", "Image", "Desired State", "Last State", "Node")
    46  	sort.Stable(tasksBySlot(tasks))
    47  	for _, t := range tasks {
    48  		if !all && t.DesiredState > api.TaskStateRunning {
    49  			continue
    50  		}
    51  		c := t.Spec.GetContainer()
    52  		fmt.Fprintf(w, "%s\t%s\t%d\t%s\t%s\t%s %s\t%s\n",
    53  			t.ID,
    54  			t.ServiceAnnotations.Name,
    55  			t.Slot,
    56  			c.Image,
    57  			t.DesiredState.String(),
    58  			t.Status.State.String(),
    59  			common.TimestampAgo(t.Status.Timestamp),
    60  			res.Resolve(api.Node{}, t.NodeID),
    61  		)
    62  	}
    63  }