123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- package formatter
- import (
- "fmt"
- "strings"
- "github.com/docker/docker/api/types"
- units "github.com/docker/go-units"
- )
- const (
- defaultVolumeQuietFormat = "{{.Name}}"
- defaultVolumeTableFormat = "table {{.Driver}}\t{{.Name}}"
- volumeNameHeader = "VOLUME NAME"
- mountpointHeader = "MOUNTPOINT"
- linksHeader = "LINKS"
- // Status header ?
- )
- // NewVolumeFormat returns a format for use with a volume Context
- func NewVolumeFormat(source string, quiet bool) Format {
- switch source {
- case TableFormatKey:
- if quiet {
- return defaultVolumeQuietFormat
- }
- return defaultVolumeTableFormat
- case RawFormatKey:
- if quiet {
- return `name: {{.Name}}`
- }
- return `name: {{.Name}}\ndriver: {{.Driver}}\n`
- }
- return Format(source)
- }
- // VolumeWrite writes formatted volumes using the Context
- func VolumeWrite(ctx Context, volumes []*types.Volume) error {
- render := func(format func(subContext subContext) error) error {
- for _, volume := range volumes {
- if err := format(&volumeContext{v: *volume}); err != nil {
- return err
- }
- }
- return nil
- }
- return ctx.Write(&volumeContext{}, render)
- }
- type volumeContext struct {
- HeaderContext
- v types.Volume
- }
- func (c *volumeContext) MarshalJSON() ([]byte, error) {
- return marshalJSON(c)
- }
- func (c *volumeContext) Name() string {
- c.AddHeader(volumeNameHeader)
- return c.v.Name
- }
- func (c *volumeContext) Driver() string {
- c.AddHeader(driverHeader)
- return c.v.Driver
- }
- func (c *volumeContext) Scope() string {
- c.AddHeader(scopeHeader)
- return c.v.Scope
- }
- func (c *volumeContext) Mountpoint() string {
- c.AddHeader(mountpointHeader)
- return c.v.Mountpoint
- }
- func (c *volumeContext) Labels() string {
- c.AddHeader(labelsHeader)
- if c.v.Labels == nil {
- return ""
- }
- var joinLabels []string
- for k, v := range c.v.Labels {
- joinLabels = append(joinLabels, fmt.Sprintf("%s=%s", k, v))
- }
- return strings.Join(joinLabels, ",")
- }
- func (c *volumeContext) Label(name string) string {
- n := strings.Split(name, ".")
- r := strings.NewReplacer("-", " ", "_", " ")
- h := r.Replace(n[len(n)-1])
- c.AddHeader(h)
- if c.v.Labels == nil {
- return ""
- }
- return c.v.Labels[name]
- }
- func (c *volumeContext) Links() string {
- c.AddHeader(linksHeader)
- if c.v.UsageData == nil {
- return "N/A"
- }
- return fmt.Sprintf("%d", c.v.UsageData.RefCount)
- }
- func (c *volumeContext) Size() string {
- c.AddHeader(sizeHeader)
- if c.v.UsageData == nil {
- return "N/A"
- }
- return units.HumanSize(float64(c.v.UsageData.Size))
- }
|