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