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