github.com/saucelabs/saucectl@v0.175.1/internal/cmd/imagerunner/list.go (about) 1 package imagerunner 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "time" 8 9 "github.com/jedib0t/go-pretty/v6/table" 10 cmds "github.com/saucelabs/saucectl/internal/cmd" 11 "github.com/saucelabs/saucectl/internal/http" 12 "github.com/saucelabs/saucectl/internal/segment" 13 "github.com/saucelabs/saucectl/internal/usage" 14 "github.com/spf13/cobra" 15 "golang.org/x/text/cases" 16 "golang.org/x/text/language" 17 ) 18 19 func ListCommand() *cobra.Command { 20 var out string 21 cmd := &cobra.Command{ 22 Use: "list", 23 Short: "Returns the list of containers", 24 SilenceUsage: true, 25 PreRunE: func(cmd *cobra.Command, args []string) error { 26 err := http.CheckProxy() 27 if err != nil { 28 return fmt.Errorf("invalid HTTP_PROXY value") 29 } 30 31 tracker := segment.DefaultTracker 32 33 go func() { 34 tracker.Collect( 35 cases.Title(language.English).String(cmds.FullName(cmd)), 36 usage.Properties{}.SetFlags(cmd.Flags()), 37 ) 38 _ = tracker.Close() 39 }() 40 return nil 41 }, 42 RunE: func(cmd *cobra.Command, args []string) error { 43 return list(out) 44 }, 45 } 46 flags := cmd.PersistentFlags() 47 flags.StringVarP(&out, "out", "o", "text", "Output format to the console. Options: text, json.") 48 49 return cmd 50 } 51 52 func list(outputFormat string) error { 53 containers, err := imagerunnerClient.ListContainers(context.Background()) 54 if err != nil { 55 return fmt.Errorf("failed to get container list: %v", err) 56 } 57 58 switch outputFormat { 59 case "json": 60 if err := renderJSON(containers); err != nil { 61 return fmt.Errorf("failed to render output: %v", err) 62 } 63 case "text": 64 renderContainersTable(containers) 65 default: 66 return errors.New("unknown output format") 67 } 68 return nil 69 } 70 71 func renderContainersTable(containers http.ContainersResp) { 72 if len(containers.Items) == 0 { 73 println("Cannot find any containers") 74 return 75 } 76 t := table.NewWriter() 77 t.SetStyle(defaultTableStyle) 78 t.SuppressEmptyColumns() 79 t.AppendHeader(table.Row{ 80 "ID", "Image", "Status", "CreationTime", "TerminationTime", 81 }) 82 83 for _, c := range containers.Items { 84 // the order of values must match the order of the header 85 t.AppendRow(table.Row{ 86 c.ID, 87 c.Image, 88 c.Status, 89 time.Unix(c.CreationTime, 0).Format(time.RFC3339), 90 time.Unix(c.TerminationTime, 0).Format(time.RFC3339), 91 }) 92 } 93 fmt.Println(t.Render()) 94 }