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  }