/
manager_ec2_vpc_peering.go
116 lines (102 loc) · 4.56 KB
/
manager_ec2_vpc_peering.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package aws
import (
"fmt"
"strings"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/aws/aws-sdk-go/service/resourcegroupstaggingapi"
"github.com/integr8ly/cluster-service/pkg/clusterservice"
"github.com/integr8ly/cluster-service/pkg/errors"
"github.com/sirupsen/logrus"
)
const (
loggingKeyVpcPeeringConnection = "vpc-peering-id"
resourceTypeVpcPeeringConnection = "ec2:vpc-peering-connection"
)
var _ ClusterResourceManager = &VpcPeeringManager{}
// VpcPeeringManager type
type VpcPeeringManager struct {
ec2Client ec2Client
taggingClient taggingClient
logger *logrus.Entry
}
// NewDefaultVpcPeeringManager create session for manager
func NewDefaultVpcPeeringManager(session *session.Session, logger *logrus.Entry) *VpcPeeringManager {
return &VpcPeeringManager{
ec2Client: ec2.New(session),
taggingClient: resourcegroupstaggingapi.New(session),
logger: logger.WithField(loggingKeyManager, managerVpcPeering),
}
}
// GetName getter function
func (r *VpcPeeringManager) GetName() string {
return "AWS EC2 Vpc Peering Connection Manager"
}
// DeleteResourcesForCluster deletes resource for cluster
func (r *VpcPeeringManager) DeleteResourcesForCluster(clusterId string, tags map[string]string, dryRun bool) ([]*clusterservice.ReportItem, error) {
var vpcPeeringConnectionsToDelete []*basicResource
r.logger.Debug("delete vpc peering connections resources for cluster")
resourceInput := &resourcegroupstaggingapi.GetResourcesInput{
ResourceTypeFilters: aws.StringSlice([]string{resourceTypeVpcPeeringConnection}),
TagFilters: convertClusterTagsToAWSTagFilter(clusterId, tags),
}
// add to the vpc peering delete array
resourceOutput, err := r.taggingClient.GetResources(resourceInput)
if err != nil {
return nil, errors.WrapLog(err, "failed to filter vpc peering connections", r.logger)
}
for _, resourceTagMapping := range resourceOutput.ResourceTagMappingList {
arn := aws.StringValue(resourceTagMapping.ResourceARN)
arnElements := strings.Split(arn, "/")
vpcPeeringConnectionID := arnElements[len(arnElements)-1]
if vpcPeeringConnectionID == "" {
return nil, errors.WrapLog(err, fmt.Sprintf("invalid vpc peering connection name from arn, %s", vpcPeeringConnectionID), r.logger)
}
vpcPeeringConnectionsToDelete = append(vpcPeeringConnectionsToDelete, &basicResource{
Name: vpcPeeringConnectionID,
ARN: arn,
})
r.logger.Debugf("found list of %d vpc peering connection to delete", len(vpcPeeringConnectionsToDelete))
}
//delete resources
var reportItems []*clusterservice.ReportItem
for _, vpcPeeringConnection := range vpcPeeringConnectionsToDelete {
vpcPeeringConnectionLogger := r.logger.WithField(loggingKeyVpcPeeringConnection, vpcPeeringConnection.Name)
reportItem := &clusterservice.ReportItem{
ID: vpcPeeringConnection.ARN,
Name: vpcPeeringConnection.Name,
Action: clusterservice.ActionDelete,
ActionStatus: clusterservice.ActionStatusInProgress,
}
reportItems = append(reportItems, reportItem)
if dryRun {
vpcPeeringConnectionLogger.Debugf("dry run is enabled, skipping deletion")
reportItem.ActionStatus = clusterservice.ActionStatusDryRun
continue
}
vpcPeeringConnectionLogger.Debugf("performing vpc peering connection deletion")
deleteVpcPeeringConnectionInput := &ec2.DeleteVpcPeeringConnectionInput{
VpcPeeringConnectionId: aws.String(vpcPeeringConnection.Name),
}
if _, err := r.ec2Client.DeleteVpcPeeringConnection(deleteVpcPeeringConnectionInput); err != nil {
if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "DependencyViolation" {
vpcPeeringConnectionLogger.Debug("vpc peering connection has existing dependencies which have not been deleted, skipping")
reportItem.ActionStatus = clusterservice.ActionStatusSkipped
r.logger.Infof("Error: %s, %s", awsErr.Code(), awsErr.Message())
continue
}
// in the case of vpc peerings they are picked up on describe but then when attempting to delete they are not found
// any that are not found can be skipped.
if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "InvalidVpcPeeringConnectionID.NotFound" {
vpcPeeringConnectionLogger.Debug("vpc peering connection does not exist, assume deleted")
reportItem.ActionStatus = clusterservice.ActionStatusComplete
continue
}
return nil, errors.WrapLog(err, "failed to delete vpc peering connection", r.logger)
}
reportItem.ActionStatus = clusterservice.ActionStatusComplete
}
return reportItems, nil
}