@@ -2,21 +2,25 @@ package ec2
2
2
3
3
import (
4
4
"fmt"
5
+ "log"
5
6
"strings"
6
7
7
8
"github.com/aws/aws-sdk-go/aws"
9
+ "github.com/aws/aws-sdk-go/aws/awserr"
8
10
awsec2 "github.com/aws/aws-sdk-go/service/ec2"
11
+ "github.com/genevieve/leftovers/aws/common"
9
12
)
10
13
11
14
type Instance struct {
12
15
client instancesClient
16
+ logger logger
13
17
resourceTags resourceTags
14
18
id * string
15
19
identifier string
16
20
rtype string
17
21
}
18
22
19
- func NewInstance (client instancesClient , resourceTags resourceTags , id , keyName * string , tags []* awsec2.Tag ) Instance {
23
+ func NewInstance (client instancesClient , logger logger , resourceTags resourceTags , id , keyName * string , tags []* awsec2.Tag ) Instance {
20
24
identifier := * id
21
25
22
26
extra := []string {}
@@ -34,13 +38,17 @@ func NewInstance(client instancesClient, resourceTags resourceTags, id, keyName
34
38
35
39
return Instance {
36
40
client : client ,
41
+ logger : logger ,
37
42
resourceTags : resourceTags ,
38
43
id : id ,
39
44
identifier : identifier ,
40
45
rtype : "EC2 Instance" ,
41
46
}
42
47
}
43
48
49
+ var pending = []string {"pending" , "running" , "shutting-down" , "stopped" , "stopping" }
50
+ var target = []string {"terminated" }
51
+
44
52
func (i Instance ) Delete () error {
45
53
addresses , err := i .client .DescribeAddresses (& awsec2.DescribeAddressesInput {
46
54
Filters : []* awsec2.Filter {{
@@ -57,6 +65,14 @@ func (i Instance) Delete() error {
57
65
return fmt .Errorf ("Terminate: %s" , err )
58
66
}
59
67
68
+ refresh := instanceRefresh (i .client , i .id )
69
+ state := common .NewState (i .logger , refresh , pending , target )
70
+
71
+ _ , err = state .Wait ()
72
+ if err != nil {
73
+ return fmt .Errorf ("Waiting for deletion: %s" , err )
74
+ }
75
+
60
76
err = i .resourceTags .Delete ("instance" , * i .id )
61
77
if err != nil {
62
78
return fmt .Errorf ("Delete resource tags: %s" , err )
@@ -79,3 +95,28 @@ func (i Instance) Name() string {
79
95
func (i Instance ) Type () string {
80
96
return i .rtype
81
97
}
98
+
99
+ func instanceRefresh (client instancesClient , id * string ) common.StateRefreshFunc {
100
+ return func () (interface {}, string , error ) {
101
+ resp , err := client .DescribeInstances (& awsec2.DescribeInstancesInput {
102
+ InstanceIds : []* string {id },
103
+ })
104
+ if err != nil {
105
+ if ec2err , ok := err .(awserr.Error ); ok && ec2err .Code () == "InvalidInstanceID.NotFound" {
106
+ resp = nil
107
+ } else {
108
+ log .Printf ("Error on InstanceStateRefresh: %s" , err )
109
+ return nil , "" , err
110
+ }
111
+ }
112
+
113
+ if resp == nil || len (resp .Reservations ) == 0 || len (resp .Reservations [0 ].Instances ) == 0 {
114
+ return nil , "" , nil
115
+ }
116
+
117
+ i := resp .Reservations [0 ].Instances [0 ]
118
+ state := * i .State .Name
119
+
120
+ return i , state , nil
121
+ }
122
+ }
0 commit comments