github.com/fabiokung/docker@v0.11.2-0.20170222101415-4534dcd49497/cli/command/task/print.go (about) 1 package task 2 3 import ( 4 "fmt" 5 "sort" 6 7 "golang.org/x/net/context" 8 9 "github.com/docker/docker/api/types/swarm" 10 "github.com/docker/docker/cli/command" 11 "github.com/docker/docker/cli/command/formatter" 12 "github.com/docker/docker/cli/command/idresolver" 13 ) 14 15 type tasksBySlot []swarm.Task 16 17 func (t tasksBySlot) Len() int { 18 return len(t) 19 } 20 21 func (t tasksBySlot) Swap(i, j int) { 22 t[i], t[j] = t[j], t[i] 23 } 24 25 func (t tasksBySlot) Less(i, j int) bool { 26 // Sort by slot. 27 if t[i].Slot != t[j].Slot { 28 return t[i].Slot < t[j].Slot 29 } 30 31 // If same slot, sort by most recent. 32 return t[j].Meta.CreatedAt.Before(t[i].CreatedAt) 33 } 34 35 // Print task information in a format. 36 // Besides this, command `docker node ps <node>` 37 // and `docker stack ps` will call this, too. 38 func Print(dockerCli command.Cli, ctx context.Context, tasks []swarm.Task, resolver *idresolver.IDResolver, trunc, quiet bool, format string) error { 39 sort.Stable(tasksBySlot(tasks)) 40 41 names := map[string]string{} 42 nodes := map[string]string{} 43 44 tasksCtx := formatter.Context{ 45 Output: dockerCli.Out(), 46 Format: formatter.NewTaskFormat(format, quiet), 47 Trunc: trunc, 48 } 49 50 prevName := "" 51 for _, task := range tasks { 52 serviceName, err := resolver.Resolve(ctx, swarm.Service{}, task.ServiceID) 53 if err != nil { 54 return err 55 } 56 57 nodeValue, err := resolver.Resolve(ctx, swarm.Node{}, task.NodeID) 58 if err != nil { 59 return err 60 } 61 62 name := "" 63 if task.Slot != 0 { 64 name = fmt.Sprintf("%v.%v", serviceName, task.Slot) 65 } else { 66 name = fmt.Sprintf("%v.%v", serviceName, task.NodeID) 67 } 68 69 // Indent the name if necessary 70 indentedName := name 71 if name == prevName { 72 indentedName = fmt.Sprintf(" \\_ %s", indentedName) 73 } 74 prevName = name 75 76 names[task.ID] = name 77 if tasksCtx.Format.IsTable() { 78 names[task.ID] = indentedName 79 } 80 nodes[task.ID] = nodeValue 81 } 82 83 return formatter.TaskWrite(tasksCtx, tasks, names, nodes) 84 }