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