print.go 1.9 KB

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