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 }