volume.go 2.4 KB

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