diff --git a/cmd/outback/errors.go b/cmd/outback/errors.go index d5d6698..2770993 100644 --- a/cmd/outback/errors.go +++ b/cmd/outback/errors.go @@ -32,6 +32,11 @@ var ( ErrCantFollowWithEndTime = errors.New("Could not follow logs because an end time was given") ) +var ( + ErrorMissingClusterInput = errors.New("A cluster name must be specified using the --cluster flag") + ErrorMissingServiceInput = errors.New("A service name must be specified using the --service flag") +) + // handleError is intended to be called with an error return to simplify error handling // Usage: // foo, err := GetFoo() diff --git a/cmd/outback/pull_latest.go b/cmd/outback/pull_latest.go new file mode 100644 index 0000000..3439481 --- /dev/null +++ b/cmd/outback/pull_latest.go @@ -0,0 +1,75 @@ +package cmd + +import ( + "fmt" + Outback "github.com/koala-labs/outback/pkg/outback" + "github.com/spf13/cobra" +) + +var pullLatestCmd = &cobra.Command{ + Use: "pull-latest", + Short: "Pull the latest deployed docker image from a service", + Long: `A cluster must be specified via the --cluster flag, and a service must be specified via the --cluster flag. + The --verbose flag can be input to enable verbose output. + The --login flag can be input to login to AWS ECR.`, + RunE: runPullLatest, +} + +func runPullLatest(cmd *cobra.Command, args []string) error { + return pullLatest(flagCluster, flagService) +} + +func pullLatest(clusterName string, serviceName string) error { + if clusterName == "" { + return ErrorMissingClusterInput + } + + if serviceName == "" { + return ErrorMissingServiceInput + } + + outback := Outback.New(awsConfig) + + cluster, err := cfg.getCluster(clusterName) + if err != nil { + return err + } + + ecsCluster, err := outback.GetCluster(cluster.Name) + if err != nil { + return err + } + + ecsService, err := outback.GetService(ecsCluster, serviceName) + if err != nil { + return err + } + + // Get the Service's TaskDefinition + ecsTaskDef, err := outback.GetTaskDefinition(ecsCluster, ecsService) + if err != nil { + return err + } + + // Get the commit from the last TaskDefinition if it exists + commit, err := outback.GetLastDeployedCommit(*ecsTaskDef.TaskDefinitionArn) + if err != nil { + return err + } + + fmt.Printf("Found image at %s:%s\nPulling...\n", cfg.Repo, commit) + + // Pull latest image + err = outback.LoginPullImage(cfg.Repo, commit) + if err != nil { + return err + } + + fmt.Printf("Successfully pulled the latest image from :\n\t%s:%s\n", cfg.Repo, commit) + + return nil +} + +func init() { + rootCmd.AddCommand(pullLatestCmd) +}