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  }