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 }