This repository has been archived by the owner on May 6, 2024. It is now read-only.
/
service_destroy.go
82 lines (67 loc) · 2.22 KB
/
service_destroy.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package cmd
import (
"fmt"
"github.com/jpignata/fargate/console"
ECS "github.com/jpignata/fargate/ecs"
ELBV2 "github.com/jpignata/fargate/elbv2"
"github.com/spf13/cobra"
)
type ServiceDestroyOperation struct {
ServiceName string
}
var serviceDestroyCmd = &cobra.Command{
Use: "destroy <service-name>",
Short: "Destroy a service",
Long: `Destroy service
In order to destroy a service, it must first be scaled to 0 running tasks.`,
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
operation := &ServiceDestroyOperation{
ServiceName: args[0],
}
destroyService(operation)
},
}
func init() {
serviceCmd.AddCommand(serviceDestroyCmd)
}
func destroyService(operation *ServiceDestroyOperation) {
elbv2 := ELBV2.New(sess)
ecs := ECS.New(sess, clusterName)
service := ecs.DescribeService(operation.ServiceName)
if service.DesiredCount > 0 {
err := fmt.Errorf("%d tasks running, scale service to 0", service.DesiredCount)
console.ErrorExit(err, "Cannot destroy service %s", operation.ServiceName)
}
if service.TargetGroupArn != "" {
loadBalancerArn := elbv2.GetTargetGroupLoadBalancerArn(service.TargetGroupArn)
loadBalancer := elbv2.DescribeLoadBalancerByArn(loadBalancerArn)
listeners := elbv2.GetListeners(loadBalancerArn)
for _, listener := range listeners {
for _, rule := range elbv2.DescribeRules(listener.Arn) {
if rule.TargetGroupArn == service.TargetGroupArn {
if rule.IsDefault {
defaultTargetGroupName := fmt.Sprintf(defaultTargetGroupFormat, loadBalancer.Name)
defaultTargetGroupArn := elbv2.GetTargetGroupArn(defaultTargetGroupName)
if defaultTargetGroupArn == "" {
defaultTargetGroupArn = elbv2.CreateTargetGroup(
&ELBV2.CreateTargetGroupInput{
Name: defaultTargetGroupName,
Port: listeners[0].Port,
Protocol: listeners[0].Protocol,
VpcId: loadBalancer.VpcId,
},
)
}
elbv2.ModifyListenerDefaultAction(listener.Arn, defaultTargetGroupArn)
} else {
elbv2.DeleteRule(rule.Arn)
}
}
}
}
elbv2.DeleteTargetGroupByArn(service.TargetGroupArn)
}
ecs.DestroyService(operation.ServiceName)
console.Info("Destroyed service %s", operation.ServiceName)
}