github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/cli/command/formatter/volume.go (about) 1 package formatter 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/docker/docker/api/types" 8 units "github.com/docker/go-units" 9 ) 10 11 const ( 12 defaultVolumeQuietFormat = "{{.Name}}" 13 defaultVolumeTableFormat = "table {{.Driver}}\t{{.Name}}" 14 15 mountpointHeader = "MOUNTPOINT" 16 linksHeader = "LINKS" 17 // Status header ? 18 ) 19 20 // NewVolumeFormat returns a format for use with a volume Context 21 func NewVolumeFormat(source string, quiet bool) Format { 22 switch source { 23 case TableFormatKey: 24 if quiet { 25 return defaultVolumeQuietFormat 26 } 27 return defaultVolumeTableFormat 28 case RawFormatKey: 29 if quiet { 30 return `name: {{.Name}}` 31 } 32 return `name: {{.Name}}\ndriver: {{.Driver}}\n` 33 } 34 return Format(source) 35 } 36 37 // VolumeWrite writes formatted volumes using the Context 38 func VolumeWrite(ctx Context, volumes []*types.Volume) error { 39 render := func(format func(subContext subContext) error) error { 40 for _, volume := range volumes { 41 if err := format(&volumeContext{v: *volume}); err != nil { 42 return err 43 } 44 } 45 return nil 46 } 47 return ctx.Write(&volumeContext{}, render) 48 } 49 50 type volumeContext struct { 51 HeaderContext 52 v types.Volume 53 } 54 55 func (c *volumeContext) Name() string { 56 c.AddHeader(nameHeader) 57 return c.v.Name 58 } 59 60 func (c *volumeContext) Driver() string { 61 c.AddHeader(driverHeader) 62 return c.v.Driver 63 } 64 65 func (c *volumeContext) Scope() string { 66 c.AddHeader(scopeHeader) 67 return c.v.Scope 68 } 69 70 func (c *volumeContext) Mountpoint() string { 71 c.AddHeader(mountpointHeader) 72 return c.v.Mountpoint 73 } 74 75 func (c *volumeContext) Labels() string { 76 c.AddHeader(labelsHeader) 77 if c.v.Labels == nil { 78 return "" 79 } 80 81 var joinLabels []string 82 for k, v := range c.v.Labels { 83 joinLabels = append(joinLabels, fmt.Sprintf("%s=%s", k, v)) 84 } 85 return strings.Join(joinLabels, ",") 86 } 87 88 func (c *volumeContext) Label(name string) string { 89 90 n := strings.Split(name, ".") 91 r := strings.NewReplacer("-", " ", "_", " ") 92 h := r.Replace(n[len(n)-1]) 93 94 c.AddHeader(h) 95 96 if c.v.Labels == nil { 97 return "" 98 } 99 return c.v.Labels[name] 100 } 101 102 func (c *volumeContext) Links() string { 103 c.AddHeader(linksHeader) 104 if c.v.Size == -1 { 105 return "N/A" 106 } 107 return fmt.Sprintf("%d", c.v.RefCount) 108 } 109 110 func (c *volumeContext) Size() string { 111 c.AddHeader(sizeHeader) 112 if c.v.Size == -1 { 113 return "N/A" 114 } 115 return units.HumanSize(float64(c.v.Size)) 116 }