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