1package ec2 2 3import ( 4 "fmt" 5 6 "github.com/aws/aws-sdk-go/aws" 7 awsec2 "github.com/aws/aws-sdk-go/service/ec2" 8) 9 10type subnetsClient interface { 11 DescribeSubnets(*awsec2.DescribeSubnetsInput) (*awsec2.DescribeSubnetsOutput, error) 12 DeleteSubnet(*awsec2.DeleteSubnetInput) (*awsec2.DeleteSubnetOutput, error) 13} 14 15type subnets interface { 16 Delete(vpcId string) error 17} 18 19type Subnets struct { 20 client subnetsClient 21 logger logger 22 resourceTags resourceTags 23} 24 25func NewSubnets(client subnetsClient, logger logger, resourceTags resourceTags) Subnets { 26 return Subnets{ 27 client: client, 28 logger: logger, 29 resourceTags: resourceTags, 30 } 31} 32 33func (u Subnets) Delete(vpcId string) error { 34 subnets, err := u.client.DescribeSubnets(&awsec2.DescribeSubnetsInput{ 35 Filters: []*awsec2.Filter{{ 36 Name: aws.String("vpc-id"), 37 Values: []*string{aws.String(vpcId)}, 38 }}, 39 }) 40 if err != nil { 41 return fmt.Errorf("Describe EC2 Subnets: %s", err) 42 } 43 44 for _, s := range subnets.Subnets { 45 n := *s.SubnetId 46 47 _, err = u.client.DeleteSubnet(&awsec2.DeleteSubnetInput{SubnetId: s.SubnetId}) 48 if err != nil { 49 return fmt.Errorf("Delete subnet %s: %s", n, err) 50 } 51 52 err = u.resourceTags.Delete("subnet", n) 53 if err != nil { 54 u.logger.Printf("[EC2 VPC: %s] Delete subnet %s tags: %s \n", vpcId, n, err) 55 } else { 56 u.logger.Printf("[EC2 VPC: %s] Deleted subnet %s tags \n", vpcId, n) 57 } 58 } 59 60 return nil 61} 62