sigs.k8s.io/cluster-api-provider-aws@v1.5.5/pkg/cloud/services/gc/loadbalancer.go (about) 1 /* 2 Copyright 2022 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package gc 18 19 import ( 20 "context" 21 "fmt" 22 "strings" 23 24 "github.com/aws/aws-sdk-go/aws" 25 "github.com/aws/aws-sdk-go/service/elb" 26 "github.com/aws/aws-sdk-go/service/elbv2" 27 ) 28 29 func (s *Service) deleteLoadBalancers(ctx context.Context, resources []*AWSResource) error { 30 for _, resource := range resources { 31 if !s.isELBResourceToDelete(resource, "loadbalancer") { 32 s.scope.V(5).Info("Resource not a load balancer for deletion", "arn", resource.ARN.String()) 33 continue 34 } 35 36 switch { 37 case strings.HasPrefix(resource.ARN.Resource, "loadbalancer/app/"): 38 s.scope.V(5).Info("Deleting ALB for Service", "arn", resource.ARN.String()) 39 if err := s.deleteLoadBalancerV2(ctx, resource.ARN.String()); err != nil { 40 return fmt.Errorf("deleting ALB: %w", err) 41 } 42 case strings.HasPrefix(resource.ARN.Resource, "loadbalancer/net/"): 43 s.scope.V(5).Info("Deleting NLB for Service", "arn", resource.ARN.String()) 44 if err := s.deleteLoadBalancerV2(ctx, resource.ARN.String()); err != nil { 45 return fmt.Errorf("deleting NLB: %w", err) 46 } 47 case strings.HasPrefix(resource.ARN.Resource, "loadbalancer/"): 48 name := strings.ReplaceAll(resource.ARN.Resource, "loadbalancer/", "") 49 s.scope.V(5).Info("Deleting classic ELB for Service", "arn", resource.ARN.String(), "name", name) 50 if err := s.deleteLoadBalancer(ctx, name); err != nil { 51 return fmt.Errorf("deleting classic ELB: %w", err) 52 } 53 default: 54 s.scope.V(4).Info("Unexpected elasticloadbalancing resource, ignoring", "arn", resource.ARN.String()) 55 } 56 } 57 58 s.scope.V(2).Info("Finished processing tagged resources for load balancers") 59 60 return nil 61 } 62 63 func (s *Service) deleteTargetGroups(ctx context.Context, resources []*AWSResource) error { 64 for _, resource := range resources { 65 if !s.isELBResourceToDelete(resource, "targetgroup") { 66 s.scope.V(4).Info("Resource not a target group for deletion", "arn", resource.ARN.String()) 67 continue 68 } 69 70 name := strings.ReplaceAll(resource.ARN.Resource, "targetgroup/", "") 71 if err := s.deleteTargetGroup(ctx, resource.ARN.String()); err != nil { 72 return fmt.Errorf("deleting target group %s: %w", name, err) 73 } 74 } 75 s.scope.V(2).Info("Finished processing resources for target group deletion") 76 77 return nil 78 } 79 80 func (s *Service) isELBResourceToDelete(resource *AWSResource, resourceName string) bool { 81 if !s.isMatchingResource(resource, elb.ServiceName, resourceName) { 82 return false 83 } 84 85 if serviceName := resource.Tags[serviceNameTag]; serviceName == "" { 86 s.scope.V(5).Info("Resource wasn't created for a Service via CCM", "arn", resource.ARN.String(), "resource_name", resourceName) 87 return false 88 } 89 90 return true 91 } 92 93 func (s *Service) deleteLoadBalancerV2(ctx context.Context, lbARN string) error { 94 input := elbv2.DeleteLoadBalancerInput{ 95 LoadBalancerArn: aws.String(lbARN), 96 } 97 98 s.scope.V(2).Info("Deleting v2 load balancer", "arn", lbARN) 99 if _, err := s.elbv2Client.DeleteLoadBalancerWithContext(ctx, &input); err != nil { 100 return fmt.Errorf("deleting v2 load balancer: %w", err) 101 } 102 103 return nil 104 } 105 106 func (s *Service) deleteLoadBalancer(ctx context.Context, name string) error { 107 input := elb.DeleteLoadBalancerInput{ 108 LoadBalancerName: aws.String(name), 109 } 110 111 s.scope.V(2).Info("Deleting classic load balancer", "name", name) 112 if _, err := s.elbClient.DeleteLoadBalancerWithContext(ctx, &input); err != nil { 113 return fmt.Errorf("deleting classic load balancer: %w", err) 114 } 115 116 return nil 117 } 118 119 func (s *Service) deleteTargetGroup(ctx context.Context, targetGroupARN string) error { 120 input := elbv2.DeleteTargetGroupInput{ 121 TargetGroupArn: aws.String(targetGroupARN), 122 } 123 124 s.scope.V(2).Info("Deleting target group", "arn", targetGroupARN) 125 if _, err := s.elbv2Client.DeleteTargetGroupWithContext(ctx, &input); err != nil { 126 return fmt.Errorf("deleting target group: %w", err) 127 } 128 129 return nil 130 }