forked from jenkins-x/jx
-
Notifications
You must be signed in to change notification settings - Fork 0
/
delete_aws.go
150 lines (134 loc) · 3.78 KB
/
delete_aws.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package cmd
import (
"fmt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
"io"
"github.com/spf13/cobra"
"github.com/aws/aws-sdk-go/service/elbv2"
)
type DeleteAwsOptions struct {
CommonOptions
VpcId string
Region string
}
func NewCmdDeleteAws(f Factory, out io.Writer, errOut io.Writer) *cobra.Command {
options := &DeleteAwsOptions{
CommonOptions: CommonOptions{
Factory: f,
Out: out,
Err: errOut,
},
}
cmd := &cobra.Command{
Use: "aws",
Short: "Deletes given AWS VPC and resources associated with it (like elastic load balancers or subnets)",
Run: func(cmd *cobra.Command, args []string) {
options.Cmd = cmd
options.Args = args
err := options.Run()
CheckErr(err)
},
}
cmd.Flags().StringVarP(&options.VpcId, "vpc-id", "", "", "ID of VPC to delete.")
cmd.Flags().StringVarP(&options.Region, "region", "", "", "AWS region to use.")
return cmd
}
func (o *DeleteAwsOptions) Run() error {
vpcid := o.VpcId
svc := ec2.New(session.New(&aws.Config{Region: aws.String(o.Region)}))
// Delete elastic load balancers assigned to VPC
elbSvc := elbv2.New(session.New(&aws.Config{Region: aws.String(o.Region)}))
loadBalancers, err := elbSvc.DescribeLoadBalancers(&elbv2.DescribeLoadBalancersInput{})
if err != nil {
return err
}
for _, loadBalancer := range loadBalancers.LoadBalancers {
if *loadBalancer.VpcId == vpcid {
fmt.Printf("Deleting load balancer %s...\n", *loadBalancer.LoadBalancerName)
_, err = elbSvc.DeleteLoadBalancer(&elbv2.DeleteLoadBalancerInput{LoadBalancerArn: loadBalancer.LoadBalancerArn})
if err != nil {
return err
}
fmt.Printf("Load balancer %s deleted.\n", *loadBalancer.LoadBalancerName)
}
}
// Detached and delete internet gateways associated with given VPC
internetGateways, err := svc.DescribeInternetGateways(&ec2.DescribeInternetGatewaysInput{
Filters: []*ec2.Filter{
{
Name: aws.String("attachment.vpc-id"),
Values: []*string{
aws.String(vpcid),
},
},
},
})
if err != nil {
return err
}
for _, internetGateway := range internetGateways.InternetGateways {
if len(internetGateway.Attachments) > 0 {
_, err = svc.DetachInternetGateway(&ec2.DetachInternetGatewayInput{InternetGatewayId: internetGateway.InternetGatewayId, VpcId: aws.String(vpcid)})
if err != nil {
return err
}
}
_, err = svc.DeleteInternetGateway(&ec2.DeleteInternetGatewayInput{InternetGatewayId: internetGateway.InternetGatewayId})
if err != nil {
return err
}
}
// Delete subnets assigned to VPC
subnets, err := svc.DescribeSubnets(&ec2.DescribeSubnetsInput{
Filters: []*ec2.Filter{
{
Name: aws.String("vpc-id"),
Values: []*string{
aws.String(vpcid),
},
},
},
})
for _, subnet := range subnets.Subnets {
interfaces, err := svc.DescribeNetworkInterfaces(&ec2.DescribeNetworkInterfacesInput{
Filters: []*ec2.Filter{
{
Name: aws.String("subnet-id"),
Values: []*string{
subnet.SubnetId,
},
},
},
})
if err != nil {
return err
}
for _, iface := range interfaces.NetworkInterfaces {
if iface.Attachment != nil {
fmt.Printf("Detaching interface %s\n", *iface.NetworkInterfaceId)
_, err = svc.DetachNetworkInterface(&ec2.DetachNetworkInterfaceInput{AttachmentId: iface.Attachment.AttachmentId})
if err != nil {
return err
}
}
_, err := svc.DeleteNetworkInterface(&ec2.DeleteNetworkInterfaceInput{NetworkInterfaceId: iface.NetworkInterfaceId})
if err != nil {
return err
}
}
_, err = svc.DeleteSubnet(&ec2.DeleteSubnetInput{SubnetId: subnet.SubnetId})
if err != nil {
return err
}
}
// Delete VPC
_, err = svc.DeleteVpc(&ec2.DeleteVpcInput{
VpcId: aws.String(vpcid),
})
if err != nil {
return err
}
return nil
}