Skip to content

Commit cdc41a9

Browse files
authored
Merge pull request #1148 from HassanAlsamahi/config-trust-list-tokens-add-column-flag
Config trust list tokens add column flag
2 parents 1a68fb5 + 2b84dba commit cdc41a9

File tree

12 files changed

+1086
-733
lines changed

12 files changed

+1086
-733
lines changed

cmd/incus/config_trust.go

+87-30
Original file line numberDiff line numberDiff line change
@@ -574,22 +574,92 @@ type cmdConfigTrustListTokens struct {
574574
config *cmdConfig
575575
configTrust *cmdConfigTrust
576576

577-
flagFormat string
577+
flagFormat string
578+
flagColumns string
579+
}
580+
581+
type configTrustListTokenColumn struct {
582+
Name string
583+
Data func(*api.CertificateAddToken) string
578584
}
579585

580586
func (c *cmdConfigTrustListTokens) Command() *cobra.Command {
581587
cmd := &cobra.Command{}
582588
cmd.Use = usage("list-tokens", i18n.G("[<remote>:]"))
583589
cmd.Short = i18n.G("List all active certificate add tokens")
584590
cmd.Long = cli.FormatSection(i18n.G("Description"), i18n.G(
585-
`List all active certificate add tokens`))
591+
`List all active certificate add tokens
592+
593+
Default column layout: ntE
594+
595+
== Columns ==
596+
The -c option takes a comma separated list of arguments that control
597+
which network zone attributes to output when displaying in table or csv
598+
format.
599+
600+
Column arguments are either pre-defined shorthand chars (see below),
601+
or (extended) config keys.
602+
603+
Commas between consecutive shorthand chars are optional.
604+
605+
Pre-defined column shorthand chars:
606+
n - Name
607+
t - Token
608+
E - Expires At`))
586609
cmd.Flags().StringVarP(&c.flagFormat, "format", "f", "table", i18n.G("Format (csv|json|table|yaml|compact)")+"``")
610+
cmd.Flags().StringVarP(&c.flagColumns, "columns", "c", defaultConfigTrustListTokenColumns, i18n.G("Columns")+"``")
587611

588612
cmd.RunE = c.Run
589613

590614
return cmd
591615
}
592616

617+
const defaultConfigTrustListTokenColumns = "ntE"
618+
619+
func (c *cmdConfigTrustListTokens) parseColumns() ([]configTrustListTokenColumn, error) {
620+
columnsShorthandMap := map[rune]configTrustListTokenColumn{
621+
'n': {i18n.G("NAME"), c.clientNameColumnData},
622+
't': {i18n.G("TOKEN"), c.tokenColumnData},
623+
'E': {i18n.G("EXPIRES AT"), c.expiresAtColumnData},
624+
}
625+
626+
columnList := strings.Split(c.flagColumns, ",")
627+
columns := []configTrustListTokenColumn{}
628+
629+
for _, columnEntry := range columnList {
630+
if columnEntry == "" {
631+
return nil, fmt.Errorf(i18n.G("Empty column entry (redundant, leading or trailing command) in '%s'"), c.flagColumns)
632+
}
633+
634+
for _, columnRune := range columnEntry {
635+
column, ok := columnsShorthandMap[columnRune]
636+
if !ok {
637+
return nil, fmt.Errorf(i18n.G("Unknown column shorthand char '%c' in '%s'"), columnRune, columnEntry)
638+
}
639+
640+
columns = append(columns, column)
641+
}
642+
}
643+
644+
return columns, nil
645+
}
646+
647+
func (c *cmdConfigTrustListTokens) clientNameColumnData(token *api.CertificateAddToken) string {
648+
return token.ClientName
649+
}
650+
651+
func (c *cmdConfigTrustListTokens) tokenColumnData(token *api.CertificateAddToken) string {
652+
return token.String()
653+
}
654+
655+
func (c *cmdConfigTrustListTokens) expiresAtColumnData(token *api.CertificateAddToken) string {
656+
if token.ExpiresAt.IsZero() {
657+
return " "
658+
}
659+
660+
return token.ExpiresAt.Local().Format(dateLayout)
661+
}
662+
593663
func (c *cmdConfigTrustListTokens) Run(cmd *cobra.Command, args []string) error {
594664
// Quick checks.
595665
exit, err := c.global.CheckArgs(cmd, args, 0, 1)
@@ -616,14 +686,14 @@ func (c *cmdConfigTrustListTokens) Run(cmd *cobra.Command, args []string) error
616686
return err
617687
}
618688

619-
// Convert the join token operation into encoded form for display.
620-
type displayToken struct {
621-
ClientName string
622-
Token string
623-
ExpiresAt string
624-
}
689+
data := [][]string{}
690+
joinTokens := []*api.CertificateAddToken{}
625691

626-
displayTokens := make([]displayToken, 0)
692+
// Parse column flags.
693+
columns, err := c.parseColumns()
694+
if err != nil {
695+
return err
696+
}
627697

628698
for _, op := range ops {
629699
if op.Class != api.OperationClassToken {
@@ -639,36 +709,23 @@ func (c *cmdConfigTrustListTokens) Run(cmd *cobra.Command, args []string) error
639709
continue // Operation is not a valid certificate add token operation.
640710
}
641711

642-
var expiresAt string
643-
644-
// Only show the expiry date if available, otherwise show an empty string.
645-
if !joinToken.ExpiresAt.IsZero() {
646-
expiresAt = joinToken.ExpiresAt.Local().Format(dateLayout)
712+
line := []string{}
713+
for _, column := range columns {
714+
line = append(line, column.Data(joinToken))
647715
}
648716

649-
displayTokens = append(displayTokens, displayToken{
650-
ClientName: joinToken.ClientName,
651-
Token: joinToken.String(),
652-
ExpiresAt: expiresAt,
653-
})
654-
}
655-
656-
// Render the table.
657-
data := [][]string{}
658-
for _, token := range displayTokens {
659-
line := []string{token.ClientName, token.Token, token.ExpiresAt}
717+
joinTokens = append(joinTokens, joinToken)
660718
data = append(data, line)
661719
}
662720

663721
sort.Sort(cli.SortColumnsNaturally(data))
664722

665-
header := []string{
666-
i18n.G("NAME"),
667-
i18n.G("TOKEN"),
668-
i18n.G("EXPIRES AT"),
723+
header := []string{}
724+
for _, column := range columns {
725+
header = append(header, column.Name)
669726
}
670727

671-
return cli.RenderTable(c.flagFormat, header, data, displayTokens)
728+
return cli.RenderTable(c.flagFormat, header, data, joinTokens)
672729
}
673730

674731
// Remove.

0 commit comments

Comments
 (0)