github.com/cspotcode/docker-cli@v20.10.0-rc1.0.20201201121459-3faad7acc5b8+incompatible/cli/command/secret/formatter.go (about)

     1  package secret
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"time"
     7  
     8  	"github.com/docker/cli/cli/command"
     9  	"github.com/docker/cli/cli/command/formatter"
    10  	"github.com/docker/cli/cli/command/inspect"
    11  	"github.com/docker/docker/api/types/swarm"
    12  	units "github.com/docker/go-units"
    13  )
    14  
    15  const (
    16  	defaultSecretTableFormat                     = "table {{.ID}}\t{{.Name}}\t{{.Driver}}\t{{.CreatedAt}}\t{{.UpdatedAt}}" // #nosec G101
    17  	secretIDHeader                               = "ID"
    18  	secretCreatedHeader                          = "CREATED"
    19  	secretUpdatedHeader                          = "UPDATED"
    20  	secretInspectPrettyTemplate formatter.Format = `ID:              {{.ID}}
    21  Name:              {{.Name}}
    22  {{- if .Labels }}
    23  Labels:
    24  {{- range $k, $v := .Labels }}
    25   - {{ $k }}{{if $v }}={{ $v }}{{ end }}
    26  {{- end }}{{ end }}
    27  Driver:            {{.Driver}}
    28  Created at:        {{.CreatedAt}}
    29  Updated at:        {{.UpdatedAt}}`
    30  )
    31  
    32  // NewFormat returns a Format for rendering using a secret Context
    33  func NewFormat(source string, quiet bool) formatter.Format {
    34  	switch source {
    35  	case formatter.PrettyFormatKey:
    36  		return secretInspectPrettyTemplate
    37  	case formatter.TableFormatKey:
    38  		if quiet {
    39  			return formatter.DefaultQuietFormat
    40  		}
    41  		return defaultSecretTableFormat
    42  	}
    43  	return formatter.Format(source)
    44  }
    45  
    46  // FormatWrite writes the context
    47  func FormatWrite(ctx formatter.Context, secrets []swarm.Secret) error {
    48  	render := func(format func(subContext formatter.SubContext) error) error {
    49  		for _, secret := range secrets {
    50  			secretCtx := &secretContext{s: secret}
    51  			if err := format(secretCtx); err != nil {
    52  				return err
    53  			}
    54  		}
    55  		return nil
    56  	}
    57  	return ctx.Write(newSecretContext(), render)
    58  }
    59  
    60  func newSecretContext() *secretContext {
    61  	sCtx := &secretContext{}
    62  
    63  	sCtx.Header = formatter.SubHeaderContext{
    64  		"ID":        secretIDHeader,
    65  		"Name":      formatter.NameHeader,
    66  		"Driver":    formatter.DriverHeader,
    67  		"CreatedAt": secretCreatedHeader,
    68  		"UpdatedAt": secretUpdatedHeader,
    69  		"Labels":    formatter.LabelsHeader,
    70  	}
    71  	return sCtx
    72  }
    73  
    74  type secretContext struct {
    75  	formatter.HeaderContext
    76  	s swarm.Secret
    77  }
    78  
    79  func (c *secretContext) MarshalJSON() ([]byte, error) {
    80  	return formatter.MarshalJSON(c)
    81  }
    82  
    83  func (c *secretContext) ID() string {
    84  	return c.s.ID
    85  }
    86  
    87  func (c *secretContext) Name() string {
    88  	return c.s.Spec.Annotations.Name
    89  }
    90  
    91  func (c *secretContext) CreatedAt() string {
    92  	return units.HumanDuration(time.Now().UTC().Sub(c.s.Meta.CreatedAt)) + " ago"
    93  }
    94  
    95  func (c *secretContext) Driver() string {
    96  	if c.s.Spec.Driver == nil {
    97  		return ""
    98  	}
    99  	return c.s.Spec.Driver.Name
   100  }
   101  
   102  func (c *secretContext) UpdatedAt() string {
   103  	return units.HumanDuration(time.Now().UTC().Sub(c.s.Meta.UpdatedAt)) + " ago"
   104  }
   105  
   106  func (c *secretContext) Labels() string {
   107  	mapLabels := c.s.Spec.Annotations.Labels
   108  	if mapLabels == nil {
   109  		return ""
   110  	}
   111  	var joinLabels []string
   112  	for k, v := range mapLabels {
   113  		joinLabels = append(joinLabels, fmt.Sprintf("%s=%s", k, v))
   114  	}
   115  	return strings.Join(joinLabels, ",")
   116  }
   117  
   118  func (c *secretContext) Label(name string) string {
   119  	if c.s.Spec.Annotations.Labels == nil {
   120  		return ""
   121  	}
   122  	return c.s.Spec.Annotations.Labels[name]
   123  }
   124  
   125  // InspectFormatWrite renders the context for a list of secrets
   126  func InspectFormatWrite(ctx formatter.Context, refs []string, getRef inspect.GetRefFunc) error {
   127  	if ctx.Format != secretInspectPrettyTemplate {
   128  		return inspect.Inspect(ctx.Output, refs, string(ctx.Format), getRef)
   129  	}
   130  	render := func(format func(subContext formatter.SubContext) error) error {
   131  		for _, ref := range refs {
   132  			secretI, _, err := getRef(ref)
   133  			if err != nil {
   134  				return err
   135  			}
   136  			secret, ok := secretI.(swarm.Secret)
   137  			if !ok {
   138  				return fmt.Errorf("got wrong object to inspect :%v", ok)
   139  			}
   140  			if err := format(&secretInspectContext{Secret: secret}); err != nil {
   141  				return err
   142  			}
   143  		}
   144  		return nil
   145  	}
   146  	return ctx.Write(&secretInspectContext{}, render)
   147  }
   148  
   149  type secretInspectContext struct {
   150  	swarm.Secret
   151  	formatter.SubContext
   152  }
   153  
   154  func (ctx *secretInspectContext) ID() string {
   155  	return ctx.Secret.ID
   156  }
   157  
   158  func (ctx *secretInspectContext) Name() string {
   159  	return ctx.Secret.Spec.Name
   160  }
   161  
   162  func (ctx *secretInspectContext) Labels() map[string]string {
   163  	return ctx.Secret.Spec.Labels
   164  }
   165  
   166  func (ctx *secretInspectContext) Driver() string {
   167  	if ctx.Secret.Spec.Driver == nil {
   168  		return ""
   169  	}
   170  	return ctx.Secret.Spec.Driver.Name
   171  }
   172  
   173  func (ctx *secretInspectContext) CreatedAt() string {
   174  	return command.PrettyPrint(ctx.Secret.CreatedAt)
   175  }
   176  
   177  func (ctx *secretInspectContext) UpdatedAt() string {
   178  	return command.PrettyPrint(ctx.Secret.UpdatedAt)
   179  }