1package ec2
2
3import (
4	"fmt"
5	"strings"
6
7	"github.com/aws/aws-sdk-go/aws"
8	awsec2 "github.com/aws/aws-sdk-go/service/ec2"
9	"github.com/genevieve/leftovers/common"
10)
11
12type vpcsClient interface {
13	DescribeVpcs(*awsec2.DescribeVpcsInput) (*awsec2.DescribeVpcsOutput, error)
14	DeleteVpc(*awsec2.DeleteVpcInput) (*awsec2.DeleteVpcOutput, error)
15}
16
17type Vpcs struct {
18	client       vpcsClient
19	logger       logger
20	routes       routeTables
21	subnets      subnets
22	gateways     internetGateways
23	resourceTags resourceTags
24}
25
26func NewVpcs(client vpcsClient, logger logger, routes routeTables, subnets subnets, gateways internetGateways, resourceTags resourceTags) Vpcs {
27	return Vpcs{
28		client:       client,
29		logger:       logger,
30		routes:       routes,
31		subnets:      subnets,
32		gateways:     gateways,
33		resourceTags: resourceTags,
34	}
35}
36
37func (v Vpcs) List(filter string) ([]common.Deletable, error) {
38	output, err := v.client.DescribeVpcs(&awsec2.DescribeVpcsInput{
39		Filters: []*awsec2.Filter{{
40			Name:   aws.String("isDefault"),
41			Values: []*string{aws.String("false")},
42		}},
43	})
44	if err != nil {
45		return nil, fmt.Errorf("Describe EC2 VPCs: %s", err)
46	}
47
48	var resources []common.Deletable
49	for _, vpc := range output.Vpcs {
50		r := NewVpc(v.client, v.routes, v.subnets, v.gateways, v.resourceTags, vpc.VpcId, vpc.Tags)
51
52		if !strings.Contains(r.Name(), filter) {
53			continue
54		}
55
56		proceed := v.logger.PromptWithDetails(r.Type(), r.Name())
57		if !proceed {
58			continue
59		}
60
61		resources = append(resources, r)
62	}
63
64	return resources, nil
65}
66
67func (v Vpcs) Type() string {
68	return "ec2-vpc"
69}
70