diff --git a/cmd/exec.go b/cmd/exec.go index 12fa9e6..633de08 100644 --- a/cmd/exec.go +++ b/cmd/exec.go @@ -8,7 +8,6 @@ import ( "regexp" "syscall" - "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/ecs/types" "github.com/sestrella/iecs/client" "github.com/sestrella/iecs/selector" @@ -58,18 +57,9 @@ var execCmd = &cobra.Command{ return nil }, RunE: func(cmd *cobra.Command, args []string) error { - cfg, err := config.LoadDefaultConfig(context.TODO()) - if err != nil { - return err - } - - awsClient := client.NewClient(cfg) - selection, err := execSelector( context.TODO(), - selector.NewSelectors(awsClient, *theme), - rootClusterRegex, - rootServiceRegex, + rootSelectors, execTaskRegex, execContainerRegex, ) @@ -79,7 +69,7 @@ var execCmd = &cobra.Command{ err = runExec( context.TODO(), - awsClient, + rootClient, *selection, execCommand, execInteractive, @@ -95,22 +85,10 @@ var execCmd = &cobra.Command{ func execSelector( ctx context.Context, selectors selector.Selectors, - clusterRegex *regexp.Regexp, - serviceRegex *regexp.Regexp, taskRegex *regexp.Regexp, containerRegex *regexp.Regexp, ) (*ExecSelection, error) { - cluster, err := selectors.Cluster(ctx, clusterRegex) - if err != nil { - return nil, err - } - - service, err := selectors.Service(ctx, cluster, serviceRegex) - if err != nil { - return nil, err - } - - task, err := selectors.Task(ctx, service, taskRegex) + task, err := selectors.Task(ctx, rootService, taskRegex) if err != nil { return nil, err } @@ -121,8 +99,8 @@ func execSelector( } return &ExecSelection{ - cluster: cluster, - service: service, + cluster: rootCluster, + service: rootService, task: task, container: container, }, nil diff --git a/cmd/logs.go b/cmd/logs.go index 4225c20..dbd876e 100644 --- a/cmd/logs.go +++ b/cmd/logs.go @@ -8,7 +8,6 @@ import ( "sync" "time" - "github.com/aws/aws-sdk-go-v2/config" logsTypes "github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs/types" "github.com/aws/aws-sdk-go-v2/service/ecs/types" "github.com/fatih/color" @@ -46,14 +45,7 @@ var logsCmd = &cobra.Command{ return err } - cfg, err := config.LoadDefaultConfig(context.TODO()) - if err != nil { - return err - } - - client := client.NewClient(cfg) - - selection, err := logsSelector(context.TODO(), selector.NewSelectors(client, *theme)) + selection, err := logsSelector(context.TODO(), rootSelectors) if err != nil { return err } @@ -61,7 +53,7 @@ var logsCmd = &cobra.Command{ err = runLogs( context.TODO(), noColors, - client, + rootClient, *selection, ) if err != nil { @@ -174,29 +166,19 @@ func logsSelector( ctx context.Context, selectors selector.Selectors, ) (*LogsSelection, error) { - cluster, err := selectors.Cluster(ctx, rootClusterRegex) - if err != nil { - return nil, err - } - - service, err := selectors.Service(ctx, cluster, rootServiceRegex) - if err != nil { - return nil, err - } - - tasks, err := selectors.Tasks(ctx, service) + tasks, err := selectors.Tasks(ctx, rootService) if err != nil { return nil, err } - containers, err := selectors.ContainerDefinitions(ctx, *service.TaskDefinition) + containers, err := selectors.ContainerDefinitions(ctx, *rootService.TaskDefinition) if err != nil { return nil, err } return &LogsSelection{ - cluster: cluster, - service: service, + cluster: rootCluster, + service: rootService, tasks: tasks, containers: containers, }, nil diff --git a/cmd/root.go b/cmd/root.go index 5528174..91bac84 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -1,23 +1,30 @@ package cmd import ( + "context" _ "embed" "fmt" "regexp" "strings" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/service/ecs/types" "github.com/charmbracelet/huh" + "github.com/sestrella/iecs/client" + "github.com/sestrella/iecs/selector" "github.com/spf13/cobra" ) var ( - availableThemes string - themeStr string - theme *huh.Theme - rootCluster string - rootClusterRegex *regexp.Regexp - rootService string - rootServiceRegex *regexp.Regexp + availableThemes string + themeStr string + theme *huh.Theme + rootClient client.Client + rootSelectors selector.Selectors + rootClusterStr string + rootCluster *types.Cluster + rootServiceStr string + rootService *types.Service ) var themes = map[string]*huh.Theme{ @@ -33,26 +40,46 @@ var rootCmd = &cobra.Command{ Short: "An interactive CLI for ECS", Long: "Performs commons tasks on ECS, such as getting remote access or viewing logs", PersistentPreRunE: func(cmd *cobra.Command, args []string) error { + cfg, err := config.LoadDefaultConfig(context.TODO()) + if err != nil { + return err + } + + rootClient = client.NewClient(cfg) + if selectedTheme, ok := themes[themeStr]; ok { theme = selectedTheme } else { return fmt.Errorf("unsupported theme \"%s\" expecting one of: %s", themeStr, availableThemes) } - var err error + rootSelectors = selector.NewSelectors(rootClient, *theme) - if rootCluster != "" { - rootClusterRegex, err = regexp.Compile(rootCluster) + var clusterRegex *regexp.Regexp + if rootClusterStr != "" { + clusterRegex, err = regexp.Compile(rootClusterStr) if err != nil { return err } } - if rootService != "" { - rootServiceRegex, err = regexp.Compile(rootService) + rootCluster, err = rootSelectors.Cluster(context.TODO(), clusterRegex) + if err != nil { + return err + } + + var serviceRegex *regexp.Regexp + if rootServiceStr != "" { + serviceRegex, err = regexp.Compile(rootServiceStr) if err != nil { return err } + + } + + rootService, err = rootSelectors.Service(context.TODO(), rootCluster, serviceRegex) + if err != nil { + return err } return nil @@ -88,7 +115,7 @@ func init() { ), ) rootCmd.PersistentFlags(). - StringVar(&rootCluster, "cluster", "", "A regex pattern for filtering clusters") + StringVar(&rootClusterStr, "cluster", "", "A regex pattern for filtering clusters") rootCmd.PersistentFlags(). - StringVar(&rootService, "service", "", "A regex pattern for filtering services") + StringVar(&rootServiceStr, "service", "", "A regex pattern for filtering services") } diff --git a/cmd/update.go b/cmd/update.go index 6aa3504..5e1bd18 100644 --- a/cmd/update.go +++ b/cmd/update.go @@ -4,7 +4,6 @@ import ( "context" "time" - "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/ecs/types" "github.com/sestrella/iecs/client" "github.com/sestrella/iecs/selector" @@ -23,23 +22,15 @@ var updateCmd = &cobra.Command{ Use: "update", Short: "Updates a serice configuration", RunE: func(cmd *cobra.Command, args []string) error { - cfg, err := config.LoadDefaultConfig(context.Background()) - if err != nil { - return err - } - - client := client.NewClient(cfg) - selectors := selector.NewSelectors(client, *theme) - selection, err := updateSelector( context.Background(), - selectors, + rootSelectors, ) if err != nil { return err } - err = runUpdate(context.Background(), *selection, client, waitTimeoutFlag) + err = runUpdate(context.Background(), *selection, rootClient, waitTimeoutFlag) if err != nil { return err } @@ -52,24 +43,14 @@ func updateSelector( ctx context.Context, selectors selector.Selectors, ) (*UpdateSelection, error) { - cluster, err := selectors.Cluster(ctx, rootClusterRegex) - if err != nil { - return nil, err - } - - service, err := selectors.Service(ctx, cluster, rootServiceRegex) - if err != nil { - return nil, err - } - - serviceConfig, err := selectors.ServiceConfig(ctx, service) + serviceConfig, err := selectors.ServiceConfig(ctx, rootService) if err != nil { return nil, err } return &UpdateSelection{ - cluster: *cluster, - service: *service, + cluster: *rootCluster, + service: *rootService, serviceConfig: *serviceConfig, }, nil }