1package asset
2
3import (
4	"errors"
5	"fmt"
6	"io"
7	"net/url"
8	"path"
9
10	"github.com/sensu/sensu-go/cli"
11	"github.com/sensu/sensu-go/cli/commands/flags"
12	"github.com/sensu/sensu-go/cli/commands/helpers"
13	"github.com/sensu/sensu-go/cli/elements/table"
14	"github.com/sensu/sensu-go/types"
15
16	"github.com/spf13/cobra"
17)
18
19// ListCommand defines new command responsible for listing assets
20func ListCommand(cli *cli.SensuCli) *cobra.Command {
21	cmd := &cobra.Command{
22		Use:          "list",
23		Short:        "list assets",
24		SilenceUsage: true,
25		RunE: func(cmd *cobra.Command, args []string) error {
26			if len(args) != 0 {
27				_ = cmd.Help()
28				return errors.New("invalid argument(s) received")
29			}
30			namespace := cli.Config.Namespace()
31			if ok, _ := cmd.Flags().GetBool(flags.AllNamespaces); ok {
32				namespace = types.NamespaceTypeAll
33			}
34
35			opts, err := helpers.ListOptionsFromFlags(cmd.Flags())
36			if err != nil {
37				return err
38			}
39
40			// Fetch assets from API
41			results, err := cli.Client.ListAssets(namespace, &opts)
42			if err != nil {
43				return err
44			}
45
46			// Print the results based on the user preferences
47			resources := []types.Resource{}
48			for i := range results {
49				resources = append(resources, &results[i])
50			}
51			return helpers.Print(cmd, cli.Config.Format(), printToTable, resources, results)
52		},
53	}
54
55	helpers.AddFormatFlag(cmd.Flags())
56	helpers.AddAllNamespace(cmd.Flags())
57	helpers.AddFieldSelectorFlag(cmd.Flags())
58	helpers.AddLabelSelectorFlag(cmd.Flags())
59	helpers.AddChunkSizeFlag(cmd.Flags())
60
61	return cmd
62}
63
64func printToTable(results interface{}, writer io.Writer) {
65	table := table.New([]*table.Column{
66		{
67			Title:       "Name",
68			ColumnStyle: table.PrimaryTextStyle,
69			CellTransformer: func(data interface{}) string {
70				asset, ok := data.(types.Asset)
71				if !ok {
72					return cli.TypeError
73				}
74				return asset.Name
75			},
76		},
77		{
78			Title: "URL",
79			CellTransformer: func(data interface{}) string {
80				asset, ok := data.(types.Asset)
81				if !ok {
82					return cli.TypeError
83				}
84				u, err := url.Parse(asset.URL)
85				if err != nil {
86					return ""
87				}
88
89				_, file := path.Split(u.EscapedPath())
90				return fmt.Sprintf(
91					"//%s/.../%s",
92					u.Hostname(),
93					file,
94				)
95			},
96		},
97		{
98			Title: "Hash",
99			CellTransformer: func(data interface{}) string {
100				asset, ok := data.(types.Asset)
101				if !ok {
102					return cli.TypeError
103				}
104				if len(asset.Sha512) >= 128 {
105					return string(asset.Sha512[0:7])
106				}
107				return "invalid"
108			},
109		},
110	})
111
112	table.Render(writer, results)
113}
114