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