github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/cli/command/formatter/service.go (about)

     1  package formatter
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"time"
     7  
     8  	mounttypes "github.com/docker/docker/api/types/mount"
     9  	"github.com/docker/docker/api/types/swarm"
    10  	"github.com/docker/docker/cli/command/inspect"
    11  	units "github.com/docker/go-units"
    12  )
    13  
    14  const serviceInspectPrettyTemplate Format = `
    15  ID:		{{.ID}}
    16  Name:		{{.Name}}
    17  {{- if .Labels }}
    18  Labels:
    19  {{- range $k, $v := .Labels }}
    20   {{ $k }}{{if $v }}={{ $v }}{{ end }}
    21  {{- end }}{{ end }}
    22  Service Mode:
    23  {{- if .IsModeGlobal }}	Global
    24  {{- else if .IsModeReplicated }}	Replicated
    25  {{- if .ModeReplicatedReplicas }}
    26   Replicas:	{{ .ModeReplicatedReplicas }}
    27  {{- end }}{{ end }}
    28  {{- if .HasUpdateStatus }}
    29  UpdateStatus:
    30   State:		{{ .UpdateStatusState }}
    31   Started:	{{ .UpdateStatusStarted }}
    32  {{- if .UpdateIsCompleted }}
    33   Completed:	{{ .UpdateStatusCompleted }}
    34  {{- end }}
    35   Message:	{{ .UpdateStatusMessage }}
    36  {{- end }}
    37  Placement:
    38  {{- if .TaskPlacementConstraints -}}
    39   Contraints:	{{ .TaskPlacementConstraints }}
    40  {{- end }}
    41  {{- if .HasUpdateConfig }}
    42  UpdateConfig:
    43   Parallelism:	{{ .UpdateParallelism }}
    44  {{- if .HasUpdateDelay -}}
    45   Delay:		{{ .UpdateDelay }}
    46  {{- end }}
    47   On failure:	{{ .UpdateOnFailure }}
    48  {{- end }}
    49  ContainerSpec:
    50   Image:		{{ .ContainerImage }}
    51  {{- if .ContainerArgs }}
    52   Args:		{{ range $arg := .ContainerArgs }}{{ $arg }} {{ end }}
    53  {{- end -}}
    54  {{- if .ContainerEnv }}
    55   Env:		{{ range $env := .ContainerEnv }}{{ $env }} {{ end }}
    56  {{- end -}}
    57  {{- if .ContainerWorkDir }}
    58   Dir:		{{ .ContainerWorkDir }}
    59  {{- end -}}
    60  {{- if .ContainerUser }}
    61   User: {{ .ContainerUser }}
    62  {{- end }}
    63  {{- if .ContainerMounts }}
    64  Mounts:
    65  {{- end }}
    66  {{- range $mount := .ContainerMounts }}
    67    Target = {{ $mount.Target }}
    68     Source = {{ $mount.Source }}
    69     ReadOnly = {{ $mount.ReadOnly }}
    70     Type = {{ $mount.Type }}
    71  {{- end -}}
    72  {{- if .HasResources }}
    73  Resources:
    74  {{- if .HasResourceReservations }}
    75   Reservations:
    76  {{- if gt .ResourceReservationNanoCPUs 0.0 }}
    77    CPU:		{{ .ResourceReservationNanoCPUs }}
    78  {{- end }}
    79  {{- if .ResourceReservationMemory }}
    80    Memory:	{{ .ResourceReservationMemory }}
    81  {{- end }}{{ end }}
    82  {{- if .HasResourceLimits }}
    83   Limits:
    84  {{- if gt .ResourceLimitsNanoCPUs 0.0 }}
    85    CPU:		{{ .ResourceLimitsNanoCPUs }}
    86  {{- end }}
    87  {{- if .ResourceLimitMemory }}
    88    Memory:	{{ .ResourceLimitMemory }}
    89  {{- end }}{{ end }}{{ end }}
    90  {{- if .Networks }}
    91  Networks:
    92  {{- range $network := .Networks }} {{ $network }}{{ end }} {{ end }}
    93  Endpoint Mode:	{{ .EndpointMode }}
    94  {{- if .Ports }}
    95  Ports:
    96  {{- range $port := .Ports }}
    97   PublishedPort {{ $port.PublishedPort }}
    98    Protocol = {{ $port.Protocol }}
    99    TargetPort = {{ $port.TargetPort }}
   100  {{- end }} {{ end -}}
   101  `
   102  
   103  // NewServiceFormat returns a Format for rendering using a Context
   104  func NewServiceFormat(source string) Format {
   105  	switch source {
   106  	case PrettyFormatKey:
   107  		return serviceInspectPrettyTemplate
   108  	default:
   109  		return Format(strings.TrimPrefix(source, RawFormatKey))
   110  	}
   111  }
   112  
   113  // ServiceInspectWrite renders the context for a list of services
   114  func ServiceInspectWrite(ctx Context, refs []string, getRef inspect.GetRefFunc) error {
   115  	if ctx.Format != serviceInspectPrettyTemplate {
   116  		return inspect.Inspect(ctx.Output, refs, string(ctx.Format), getRef)
   117  	}
   118  	render := func(format func(subContext subContext) error) error {
   119  		for _, ref := range refs {
   120  			serviceI, _, err := getRef(ref)
   121  			if err != nil {
   122  				return err
   123  			}
   124  			service, ok := serviceI.(swarm.Service)
   125  			if !ok {
   126  				return fmt.Errorf("got wrong object to inspect")
   127  			}
   128  			if err := format(&serviceInspectContext{Service: service}); err != nil {
   129  				return err
   130  			}
   131  		}
   132  		return nil
   133  	}
   134  	return ctx.Write(&serviceInspectContext{}, render)
   135  }
   136  
   137  type serviceInspectContext struct {
   138  	swarm.Service
   139  	subContext
   140  }
   141  
   142  func (ctx *serviceInspectContext) ID() string {
   143  	return ctx.Service.ID
   144  }
   145  
   146  func (ctx *serviceInspectContext) Name() string {
   147  	return ctx.Service.Spec.Name
   148  }
   149  
   150  func (ctx *serviceInspectContext) Labels() map[string]string {
   151  	return ctx.Service.Spec.Labels
   152  }
   153  
   154  func (ctx *serviceInspectContext) IsModeGlobal() bool {
   155  	return ctx.Service.Spec.Mode.Global != nil
   156  }
   157  
   158  func (ctx *serviceInspectContext) IsModeReplicated() bool {
   159  	return ctx.Service.Spec.Mode.Replicated != nil
   160  }
   161  
   162  func (ctx *serviceInspectContext) ModeReplicatedReplicas() *uint64 {
   163  	return ctx.Service.Spec.Mode.Replicated.Replicas
   164  }
   165  
   166  func (ctx *serviceInspectContext) HasUpdateStatus() bool {
   167  	return ctx.Service.UpdateStatus.State != ""
   168  }
   169  
   170  func (ctx *serviceInspectContext) UpdateStatusState() swarm.UpdateState {
   171  	return ctx.Service.UpdateStatus.State
   172  }
   173  
   174  func (ctx *serviceInspectContext) UpdateStatusStarted() string {
   175  	return units.HumanDuration(time.Since(ctx.Service.UpdateStatus.StartedAt))
   176  }
   177  
   178  func (ctx *serviceInspectContext) UpdateIsCompleted() bool {
   179  	return ctx.Service.UpdateStatus.State == swarm.UpdateStateCompleted
   180  }
   181  
   182  func (ctx *serviceInspectContext) UpdateStatusCompleted() string {
   183  	return units.HumanDuration(time.Since(ctx.Service.UpdateStatus.CompletedAt))
   184  }
   185  
   186  func (ctx *serviceInspectContext) UpdateStatusMessage() string {
   187  	return ctx.Service.UpdateStatus.Message
   188  }
   189  
   190  func (ctx *serviceInspectContext) TaskPlacementConstraints() []string {
   191  	if ctx.Service.Spec.TaskTemplate.Placement != nil {
   192  		return ctx.Service.Spec.TaskTemplate.Placement.Constraints
   193  	}
   194  	return nil
   195  }
   196  
   197  func (ctx *serviceInspectContext) HasUpdateConfig() bool {
   198  	return ctx.Service.Spec.UpdateConfig != nil
   199  }
   200  
   201  func (ctx *serviceInspectContext) UpdateParallelism() uint64 {
   202  	return ctx.Service.Spec.UpdateConfig.Parallelism
   203  }
   204  
   205  func (ctx *serviceInspectContext) HasUpdateDelay() bool {
   206  	return ctx.Service.Spec.UpdateConfig.Delay.Nanoseconds() > 0
   207  }
   208  
   209  func (ctx *serviceInspectContext) UpdateDelay() time.Duration {
   210  	return ctx.Service.Spec.UpdateConfig.Delay
   211  }
   212  
   213  func (ctx *serviceInspectContext) UpdateOnFailure() string {
   214  	return ctx.Service.Spec.UpdateConfig.FailureAction
   215  }
   216  
   217  func (ctx *serviceInspectContext) ContainerImage() string {
   218  	return ctx.Service.Spec.TaskTemplate.ContainerSpec.Image
   219  }
   220  
   221  func (ctx *serviceInspectContext) ContainerArgs() []string {
   222  	return ctx.Service.Spec.TaskTemplate.ContainerSpec.Args
   223  }
   224  
   225  func (ctx *serviceInspectContext) ContainerEnv() []string {
   226  	return ctx.Service.Spec.TaskTemplate.ContainerSpec.Env
   227  }
   228  
   229  func (ctx *serviceInspectContext) ContainerWorkDir() string {
   230  	return ctx.Service.Spec.TaskTemplate.ContainerSpec.Dir
   231  }
   232  
   233  func (ctx *serviceInspectContext) ContainerUser() string {
   234  	return ctx.Service.Spec.TaskTemplate.ContainerSpec.User
   235  }
   236  
   237  func (ctx *serviceInspectContext) ContainerMounts() []mounttypes.Mount {
   238  	return ctx.Service.Spec.TaskTemplate.ContainerSpec.Mounts
   239  }
   240  
   241  func (ctx *serviceInspectContext) HasResources() bool {
   242  	return ctx.Service.Spec.TaskTemplate.Resources != nil
   243  }
   244  
   245  func (ctx *serviceInspectContext) HasResourceReservations() bool {
   246  	return ctx.Service.Spec.TaskTemplate.Resources.Reservations.NanoCPUs > 0 || ctx.Service.Spec.TaskTemplate.Resources.Reservations.MemoryBytes > 0
   247  }
   248  
   249  func (ctx *serviceInspectContext) ResourceReservationNanoCPUs() float64 {
   250  	if ctx.Service.Spec.TaskTemplate.Resources.Reservations.NanoCPUs == 0 {
   251  		return float64(0)
   252  	}
   253  	return float64(ctx.Service.Spec.TaskTemplate.Resources.Reservations.NanoCPUs) / 1e9
   254  }
   255  
   256  func (ctx *serviceInspectContext) ResourceReservationMemory() string {
   257  	if ctx.Service.Spec.TaskTemplate.Resources.Reservations.MemoryBytes == 0 {
   258  		return ""
   259  	}
   260  	return units.BytesSize(float64(ctx.Service.Spec.TaskTemplate.Resources.Reservations.MemoryBytes))
   261  }
   262  
   263  func (ctx *serviceInspectContext) HasResourceLimits() bool {
   264  	return ctx.Service.Spec.TaskTemplate.Resources.Limits.NanoCPUs > 0 || ctx.Service.Spec.TaskTemplate.Resources.Limits.MemoryBytes > 0
   265  }
   266  
   267  func (ctx *serviceInspectContext) ResourceLimitsNanoCPUs() float64 {
   268  	return float64(ctx.Service.Spec.TaskTemplate.Resources.Limits.NanoCPUs) / 1e9
   269  }
   270  
   271  func (ctx *serviceInspectContext) ResourceLimitMemory() string {
   272  	if ctx.Service.Spec.TaskTemplate.Resources.Limits.MemoryBytes == 0 {
   273  		return ""
   274  	}
   275  	return units.BytesSize(float64(ctx.Service.Spec.TaskTemplate.Resources.Limits.MemoryBytes))
   276  }
   277  
   278  func (ctx *serviceInspectContext) Networks() []string {
   279  	var out []string
   280  	for _, n := range ctx.Service.Spec.Networks {
   281  		out = append(out, n.Target)
   282  	}
   283  	return out
   284  }
   285  
   286  func (ctx *serviceInspectContext) EndpointMode() string {
   287  	if ctx.Service.Spec.EndpointSpec == nil {
   288  		return ""
   289  	}
   290  
   291  	return string(ctx.Service.Spec.EndpointSpec.Mode)
   292  }
   293  
   294  func (ctx *serviceInspectContext) Ports() []swarm.PortConfig {
   295  	return ctx.Service.Endpoint.Ports
   296  }