diff --git a/ecs/cmd/main/main.go b/ecs/cmd/main/main.go index 75b6c2b7d..183404768 100644 --- a/ecs/cmd/main/main.go +++ b/ecs/cmd/main/main.go @@ -76,7 +76,19 @@ func ComposeCommand(clusteropts *clusterOptions) *cobra.Command { return cmd } +type upOptions struct { + loadBalancerArn string +} + +func (o upOptions) LoadBalancerArn() *string { + if o.loadBalancerArn == "" { + return nil + } + return &o.loadBalancerArn +} + func UpCommand(clusteropts *clusterOptions, projectOpts *compose.ProjectOptions) *cobra.Command { + opts := upOptions{} cmd := &cobra.Command{ Use: "up", RunE: compose.WithProject(projectOpts, func(project *compose.Project, args []string) error { @@ -84,22 +96,30 @@ func UpCommand(clusteropts *clusterOptions, projectOpts *compose.ProjectOptions) if err != nil { return err } - return client.ComposeUp(project) + return client.ComposeUp(project, opts.LoadBalancerArn()) }), } + cmd.Flags().StringVar(&opts.loadBalancerArn, "load-balancer", "", "") return cmd } -func DownCommand(clusteropts *clusterOptions, opts *compose.ProjectOptions) *cobra.Command { +type downOptions struct { + KeepLoadBalancer bool +} + + +func DownCommand(clusteropts *clusterOptions, projectOpts *compose.ProjectOptions) *cobra.Command { + opts := downOptions{} cmd := &cobra.Command{ Use: "down", - RunE: compose.WithProject(opts, func(project *compose.Project, args []string) error { + RunE: compose.WithProject(projectOpts, func(project *compose.Project, args []string) error { client, err := amazon.NewClient(clusteropts.profile, clusteropts.cluster, clusteropts.region) if err != nil { return err } - return client.ComposeDown(project) + return client.ComposeDown(project, opts.KeepLoadBalancer) }), } + cmd.Flags().BoolVar(&opts.KeepLoadBalancer, "keep-load-balancer", false, "Keep Load Balancer for further use") return cmd } \ No newline at end of file diff --git a/ecs/pkg/amazon/down.go b/ecs/pkg/amazon/down.go index e68c31329..dbd5b6842 100644 --- a/ecs/pkg/amazon/down.go +++ b/ecs/pkg/amazon/down.go @@ -8,8 +8,8 @@ import ( "github.com/sirupsen/logrus" ) -func (c *client) ComposeDown(project *compose.Project) error { - err := c.DeleteLoadBalancer(project) +func (c *client) ComposeDown(project *compose.Project, keepLoadBalancer bool) error { + err := c.DeleteLoadBalancer(project, keepLoadBalancer) if err != nil { return err } diff --git a/ecs/pkg/amazon/loadBalancer.go b/ecs/pkg/amazon/loadBalancer.go index 6edc79556..6972406e4 100644 --- a/ecs/pkg/amazon/loadBalancer.go +++ b/ecs/pkg/amazon/loadBalancer.go @@ -31,7 +31,7 @@ func (c client) CreateLoadBalancer(project *compose.Project, subnets []*string) return alb.LoadBalancers[0].LoadBalancerArn, nil } -func (c client) DeleteLoadBalancer(project *compose.Project) error { +func (c client) DeleteLoadBalancer(project *compose.Project, keepLoadBalancer bool) error { logrus.Debug("Delete Load Balancer") // FIXME We can tag LoadBalancer but not search by tag ? loadBalancer, err := c.ELB.DescribeLoadBalancers(&elbv2.DescribeLoadBalancersInput{ @@ -52,7 +52,9 @@ func (c client) DeleteLoadBalancer(project *compose.Project) error { return err } - _, err = c.ELB.DeleteLoadBalancer(&elbv2.DeleteLoadBalancerInput{LoadBalancerArn: arn}) + if !keepLoadBalancer { + _, err = c.ELB.DeleteLoadBalancer(&elbv2.DeleteLoadBalancerInput{LoadBalancerArn: arn}) + } return err } diff --git a/ecs/pkg/amazon/up.go b/ecs/pkg/amazon/up.go index d0b84b2a6..0dbc35c92 100644 --- a/ecs/pkg/amazon/up.go +++ b/ecs/pkg/amazon/up.go @@ -10,7 +10,7 @@ import ( "github.com/sirupsen/logrus" ) -func (c *client) ComposeUp(project *compose.Project) error { +func (c *client) ComposeUp(project *compose.Project, loadBalancerArn *string) error { type mapping struct { service *types.ServiceConfig task *ecs.RegisterTaskDefinitionInput @@ -41,9 +41,11 @@ func (c *client) ComposeUp(project *compose.Project) error { return err } - loadBalancer, err := c.CreateLoadBalancer(project, subnets) - if err != nil { - return err + if loadBalancerArn == nil { + loadBalancerArn, err = c.CreateLoadBalancer(project, subnets) + if err != nil { + return err + } } logGroup, err := c.GetOrCreateLogGroup(project) @@ -65,7 +67,7 @@ func (c *client) ComposeUp(project *compose.Project) error { TargetGroupArn: targetgroup, }) - err = c.CreateListener(port, loadBalancer, targetgroup) + err = c.CreateListener(port, loadBalancerArn, targetgroup) if err != nil { return err } diff --git a/ecs/pkg/compose/api.go b/ecs/pkg/compose/api.go index cd6eb7878..ceebacb89 100644 --- a/ecs/pkg/compose/api.go +++ b/ecs/pkg/compose/api.go @@ -1,6 +1,6 @@ package compose type API interface { - ComposeUp(project *Project) error - ComposeDown(project *Project) error + ComposeUp(project *Project, loadBalancerArn *string) error + ComposeDown(project *Project, keepLoadBalancer bool) error } \ No newline at end of file