github.com/kobeld/docker@v1.12.0-rc1/api/client/task/print.go (about) 1 package task 2 3 import ( 4 "fmt" 5 "sort" 6 "strings" 7 "text/tabwriter" 8 "time" 9 10 "golang.org/x/net/context" 11 12 "github.com/docker/docker/api/client" 13 "github.com/docker/docker/api/client/idresolver" 14 "github.com/docker/engine-api/types/swarm" 15 "github.com/docker/go-units" 16 ) 17 18 const ( 19 psTaskItemFmt = "%s\t%s\t%s\t%s\t%s %s\t%s\t%s\n" 20 ) 21 22 type tasksBySlot []swarm.Task 23 24 func (t tasksBySlot) Len() int { 25 return len(t) 26 } 27 28 func (t tasksBySlot) Swap(i, j int) { 29 t[i], t[j] = t[j], t[i] 30 } 31 32 func (t tasksBySlot) Less(i, j int) bool { 33 // Sort by slot. 34 if t[i].Slot != t[j].Slot { 35 return t[i].Slot < t[j].Slot 36 } 37 38 // If same slot, sort by most recent. 39 return t[j].Meta.CreatedAt.Before(t[i].CreatedAt) 40 } 41 42 // Print task information in a table format 43 func Print(dockerCli *client.DockerCli, ctx context.Context, tasks []swarm.Task, resolver *idresolver.IDResolver) error { 44 sort.Stable(tasksBySlot(tasks)) 45 46 writer := tabwriter.NewWriter(dockerCli.Out(), 0, 4, 2, ' ', 0) 47 48 // Ignore flushing errors 49 defer writer.Flush() 50 fmt.Fprintln(writer, strings.Join([]string{"ID", "NAME", "SERVICE", "IMAGE", "LAST STATE", "DESIRED STATE", "NODE"}, "\t")) 51 for _, task := range tasks { 52 serviceValue, err := resolver.Resolve(ctx, swarm.Service{}, task.ServiceID) 53 if err != nil { 54 return err 55 } 56 nodeValue, err := resolver.Resolve(ctx, swarm.Node{}, task.NodeID) 57 if err != nil { 58 return err 59 } 60 name := serviceValue 61 if task.Slot > 0 { 62 name = fmt.Sprintf("%s.%d", name, task.Slot) 63 } 64 fmt.Fprintf( 65 writer, 66 psTaskItemFmt, 67 task.ID, 68 name, 69 serviceValue, 70 task.Spec.ContainerSpec.Image, 71 client.PrettyPrint(task.Status.State), 72 units.HumanDuration(time.Since(task.Status.Timestamp)), 73 client.PrettyPrint(task.DesiredState), 74 nodeValue, 75 ) 76 } 77 78 return nil 79 }