@@ -18,6 +18,7 @@ package aws
1818
1919import (
2020 "context"
21+ "errors"
2122 "fmt"
2223 "time"
2324
@@ -30,7 +31,6 @@ func (p *Provider) Delete() error {
3031 if err != nil {
3132 return fmt .Errorf ("error retrieving cache: %v" , err )
3233 }
33- p .updateProgressingCondition (* p .Environment .DeepCopy (), cache , "v1alpha1.Destroying" , "Destroying AWS resources" )
3434
3535 if err := p .delete (cache ); err != nil {
3636 return fmt .Errorf ("error destroying AWS resources: %v" , err )
@@ -41,99 +41,159 @@ func (p *Provider) Delete() error {
4141
4242func (p * Provider ) delete (cache * AWS ) error {
4343 var err error
44+
4445 // Delete the EC2 instance
46+ p .updateProgressingCondition (* p .Environment .DeepCopy (), cache , "v1alpha1.Destroying" , "Deleting EC2 instance" )
4547 if cache .Instanceid == "" {
4648 p .log .Warning ("No instance found to delete" )
4749 } else {
48- terminateInstancesInput := & ec2.TerminateInstancesInput {
49- InstanceIds : []string {cache .Instanceid },
50- }
51- _ , err := p .ec2 .TerminateInstances (context .Background (), terminateInstancesInput )
52- if err != nil {
53- return fmt .Errorf ("error deleting instance: %v" , err )
50+ // call deleteEC2 3 times to ensure the instance is deleted or until it returns nil
51+ for i := 0 ; i < 3 ; i ++ {
52+ err = p .deleteEC2 (cache )
53+ if err == nil {
54+ break
55+ }
56+
57+ if i == 2 {
58+ p .updateDegradedCondition (* p .Environment .DeepCopy (), cache , "v1alpha1.Destroying" , "Error deleting EC2 instance" )
59+ return fmt .Errorf ("error deleting EC2 instance: %v" , err )
60+ }
5461 }
62+ }
5563
56- p .log .Wg .Add (1 )
57- go p .log .Loading ("Waiting for instance %s to be terminated" , cache .Instanceid )
58-
59- waiterOptions := []func (* ec2.InstanceTerminatedWaiterOptions ){
60- func (o * ec2.InstanceTerminatedWaiterOptions ) {
61- o .MaxDelay = 10 * time .Minute
62- o .MinDelay = 5 * time .Second
63- },
64- }
65- wait := ec2 .NewInstanceTerminatedWaiter (p .ec2 , waiterOptions ... )
66- if err := wait .Wait (context .Background (), & ec2.DescribeInstancesInput {
67- InstanceIds : []string {cache .Instanceid },
68- }, 10 * time .Minute , waiterOptions ... ); err != nil {
69- p .fail ()
70- return fmt .Errorf ("error waiting for instance to be terminated: %v" , err )
64+ // Delete the VPC
65+ p .updateProgressingCondition (* p .Environment .DeepCopy (), cache , "v1alpha1.Destroying" , "Deleting VPC resources" )
66+ for i := 0 ; i < 3 ; i ++ {
67+ err = p .deleteVPC (cache )
68+ if err == nil {
69+ break
7170 }
7271
73- // Delete the security group
74- deleteSecurityGroup := & ec2.DeleteSecurityGroupInput {
75- GroupId : & cache .SecurityGroupid ,
76- }
77- _ , err = p .ec2 .DeleteSecurityGroup (context .Background (), deleteSecurityGroup )
78- if err != nil {
79- p .fail ()
80- return fmt .Errorf ("error deleting security group: %v" , err )
72+ if i == 2 {
73+ p .updateDegradedCondition (* p .Environment .DeepCopy (), cache , "v1alpha1.Destroying" , "Error deleting VPC resources" )
74+ return fmt .Errorf ("error deleting VPC resources: %v" , err )
8175 }
76+ }
77+
78+ return nil
79+ }
8280
83- p .done ()
81+ func (p * Provider ) deleteEC2 (cache * AWS ) error {
82+ terminateInstancesInput := & ec2.TerminateInstancesInput {
83+ InstanceIds : []string {cache .Instanceid },
84+ }
85+ _ , err := p .ec2 .TerminateInstances (context .Background (), terminateInstancesInput )
86+ if err != nil {
87+ return fmt .Errorf ("error deleting instance: %v" , err )
8488 }
8589
8690 p .log .Wg .Add (1 )
87- go p .log .Loading ("Deleting VPC resources" )
88- // Delete the subnet
89- deleteSubnet := & ec2.DeleteSubnetInput {
90- SubnetId : & cache .Subnetid ,
91+ go p .log .Loading ("Waiting for instance %s to be terminated" , cache .Instanceid )
92+
93+ waiterOptions := []func (* ec2.InstanceTerminatedWaiterOptions ){
94+ func (o * ec2.InstanceTerminatedWaiterOptions ) {
95+ o .MaxDelay = 10 * time .Minute
96+ o .MinDelay = 5 * time .Second
97+ },
9198 }
92- _ , err = p .ec2 .DeleteSubnet (context .Background (), deleteSubnet )
93- if err != nil {
99+ wait := ec2 .NewInstanceTerminatedWaiter (p .ec2 , waiterOptions ... )
100+ if err := wait .Wait (context .Background (), & ec2.DescribeInstancesInput {
101+ InstanceIds : []string {cache .Instanceid },
102+ }, 10 * time .Minute , waiterOptions ... ); err != nil {
94103 p .fail ()
95- return fmt .Errorf ("error deleting subnet : %v" , err )
104+ return fmt .Errorf ("error waiting for instance to be terminated : %v" , err )
96105 }
97106
98- // Delete the route tables
99- deleteRouteTable := & ec2.DeleteRouteTableInput {
100- RouteTableId : & cache .RouteTable ,
107+ // Delete the security group
108+ deleteSecurityGroup := & ec2.DeleteSecurityGroupInput {
109+ GroupId : & cache .SecurityGroupid ,
101110 }
102- _ , err = p .ec2 .DeleteRouteTable (context .Background (), deleteRouteTable )
111+ _ , err = p .ec2 .DeleteSecurityGroup (context .Background (), deleteSecurityGroup )
103112 if err != nil {
104113 p .fail ()
105- return fmt .Errorf ("error deleting route table : %v" , err )
114+ return fmt .Errorf ("error deleting security group : %v" , err )
106115 }
107116
108- // Detach the Internet Gateway
109- detachInternetGateway := & ec2.DetachInternetGatewayInput {
110- InternetGatewayId : & cache .InternetGwid ,
111- VpcId : & cache .Vpcid ,
117+ p .done ()
118+ return nil
119+ }
120+
121+ func (p * Provider ) deleteVPC (cache * AWS ) error {
122+ var err error
123+
124+ // Delete the VPC
125+ p .log .Wg .Add (1 )
126+ go p .log .Loading ("Deleting VPC resources" )
127+ p .updateProgressingCondition (* p .Environment .DeepCopy (), cache , "v1alpha1.Destroying" , "Deleting VPC resources" )
128+ // Delete the subnet
129+ if cache .Subnetid == "" {
130+ p .log .Warning ("No subnet found to delete" )
131+ } else {
132+ deleteSubnet := & ec2.DeleteSubnetInput {
133+ SubnetId : & cache .Subnetid ,
134+ }
135+ _ , err = p .ec2 .DeleteSubnet (context .Background (), deleteSubnet )
136+ if err != nil {
137+ err = errors .Join (err , fmt .Errorf ("error deleting subnet: %v" , err ))
138+ }
112139 }
113- _ , err = p .ec2 .DetachInternetGateway (context .Background (), detachInternetGateway )
114- if err != nil {
115- p .fail ()
116- return fmt .Errorf ("error detaching Internet Gateway: %v" , err )
140+
141+ // Delete the route tables
142+ if cache .RouteTable == "" {
143+ p .log .Warning ("No route table found to delete" )
144+ } else {
145+ deleteRouteTable := & ec2.DeleteRouteTableInput {
146+ RouteTableId : & cache .RouteTable ,
147+ }
148+ _ , err = p .ec2 .DeleteRouteTable (context .Background (), deleteRouteTable )
149+ if err != nil {
150+ err = errors .Join (err , fmt .Errorf ("error deleting route table: %v" , err ))
151+ }
117152 }
118153
119- // Delete the Internet Gateway
120- deleteInternetGatewayInput := & ec2.DeleteInternetGatewayInput {
121- InternetGatewayId : & cache .InternetGwid ,
154+ // Detach the Internet Gateway
155+ if cache .InternetGwid == "" {
156+ p .log .Warning ("No Internet Gateway found to delete" )
157+ } else {
158+ detachInternetGateway := & ec2.DetachInternetGatewayInput {
159+ InternetGatewayId : & cache .InternetGwid ,
160+ VpcId : & cache .Vpcid ,
161+ }
162+ _ , err = p .ec2 .DetachInternetGateway (context .Background (), detachInternetGateway )
163+ if err != nil {
164+ err = errors .Join (err , fmt .Errorf ("error detaching Internet Gateway: %v" , err ))
165+ }
122166 }
123- _ , err = p .ec2 .DeleteInternetGateway (context .Background (), deleteInternetGatewayInput )
124- if err != nil {
125- p .fail ()
126- return fmt .Errorf ("error deleting Internet Gateway: %v" , err )
167+
168+ // Delete the Internet Gateway
169+ if cache .InternetGwid == "" {
170+ p .log .Warning ("No Internet Gateway found to delete" )
171+ } else {
172+ deleteInternetGatewayInput := & ec2.DeleteInternetGatewayInput {
173+ InternetGatewayId : & cache .InternetGwid ,
174+ }
175+ _ , err = p .ec2 .DeleteInternetGateway (context .Background (), deleteInternetGatewayInput )
176+ if err != nil {
177+ err = errors .Join (err , fmt .Errorf ("error deleting Internet Gateway: %v" , err ))
178+ }
127179 }
128180
129181 // Delete the VPC
130- dVpc := & ec2.DeleteVpcInput {
131- VpcId : & cache .Vpcid ,
182+ if cache .Vpcid == "" {
183+ p .log .Warning ("No VPC found to delete" )
184+ } else {
185+ dVpc := & ec2.DeleteVpcInput {
186+ VpcId : & cache .Vpcid ,
187+ }
188+ _ , err = p .ec2 .DeleteVpc (context .Background (), dVpc )
189+ if err != nil {
190+ err = errors .Join (err , fmt .Errorf ("error deleting VPC: %v" , err ))
191+ }
132192 }
133- _ , err = p . ec2 . DeleteVpc ( context . Background (), dVpc )
193+
134194 if err != nil {
135195 p .fail ()
136- return fmt . Errorf ( "error deleting VPC: %v" , err )
196+ return err
137197 }
138198
139199 p .done ()
0 commit comments