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 }