1package ec2 2 3import ( 4 "fmt" 5 "strings" 6 7 awsec2 "github.com/aws/aws-sdk-go/service/ec2" 8 awssts "github.com/aws/aws-sdk-go/service/sts" 9 "github.com/genevieve/leftovers/common" 10) 11 12type imagesClient interface { 13 DescribeImages(*awsec2.DescribeImagesInput) (*awsec2.DescribeImagesOutput, error) 14 DeregisterImage(*awsec2.DeregisterImageInput) (*awsec2.DeregisterImageOutput, error) 15} 16 17type stsClient interface { 18 GetCallerIdentity(*awssts.GetCallerIdentityInput) (*awssts.GetCallerIdentityOutput, error) 19} 20 21type Images struct { 22 client imagesClient 23 stsClient stsClient 24 logger logger 25 resourceTags resourceTags 26} 27 28func NewImages(client imagesClient, stsClient stsClient, logger logger, resourceTags resourceTags) Images { 29 return Images{ 30 client: client, 31 stsClient: stsClient, 32 logger: logger, 33 resourceTags: resourceTags, 34 } 35} 36 37func (i Images) List(filter string) ([]common.Deletable, error) { 38 caller, err := i.stsClient.GetCallerIdentity(&awssts.GetCallerIdentityInput{}) 39 if err != nil { 40 return nil, fmt.Errorf("Get caller identity: %s", err) 41 } 42 43 images, err := i.client.DescribeImages(&awsec2.DescribeImagesInput{ 44 Owners: []*string{caller.Account}, 45 }) 46 if err != nil { 47 return nil, fmt.Errorf("Describing EC2 Images: %s", err) 48 } 49 50 var resources []common.Deletable 51 for _, image := range images.Images { 52 r := NewImage(i.client, image.ImageId, i.resourceTags) 53 54 if !strings.Contains(r.Name(), filter) { 55 continue 56 } 57 58 proceed := i.logger.PromptWithDetails(r.Type(), r.Name()) 59 if !proceed { 60 continue 61 } 62 63 resources = append(resources, r) 64 } 65 66 return resources, nil 67} 68 69func (i Images) Type() string { 70 return "ec2-image" 71} 72