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  }