sigs.k8s.io/cluster-api-provider-aws@v1.5.5/pkg/cloud/services/network/network.go (about)

     1  /*
     2  Copyright 2018 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 network
    18  
    19  import (
    20  	infrav1 "sigs.k8s.io/cluster-api-provider-aws/api/v1beta1"
    21  	"sigs.k8s.io/cluster-api-provider-aws/pkg/cloud/awserrors"
    22  	infrautilconditions "sigs.k8s.io/cluster-api-provider-aws/util/conditions"
    23  	clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
    24  	"sigs.k8s.io/cluster-api/util/conditions"
    25  )
    26  
    27  // ReconcileNetwork reconciles the network of the given cluster.
    28  func (s *Service) ReconcileNetwork() (err error) {
    29  	s.scope.V(2).Info("Reconciling network for cluster", "cluster-name", s.scope.Name(), "cluster-namespace", s.scope.Namespace())
    30  
    31  	// VPC.
    32  	if err := s.reconcileVPC(); err != nil {
    33  		conditions.MarkFalse(s.scope.InfraCluster(), infrav1.VpcReadyCondition, infrav1.VpcReconciliationFailedReason, infrautilconditions.ErrorConditionAfterInit(s.scope.ClusterObj()), err.Error())
    34  		return err
    35  	}
    36  	conditions.MarkTrue(s.scope.InfraCluster(), infrav1.VpcReadyCondition)
    37  
    38  	// Secondary CIDR
    39  	if err := s.associateSecondaryCidr(); err != nil {
    40  		conditions.MarkFalse(s.scope.InfraCluster(), infrav1.SecondaryCidrsReadyCondition, infrav1.SecondaryCidrReconciliationFailedReason, infrautilconditions.ErrorConditionAfterInit(s.scope.ClusterObj()), err.Error())
    41  		return err
    42  	}
    43  
    44  	// Subnets.
    45  	if err := s.reconcileSubnets(); err != nil {
    46  		conditions.MarkFalse(s.scope.InfraCluster(), infrav1.SubnetsReadyCondition, infrav1.SubnetsReconciliationFailedReason, infrautilconditions.ErrorConditionAfterInit(s.scope.ClusterObj()), err.Error())
    47  		return err
    48  	}
    49  
    50  	// Internet Gateways.
    51  	if err := s.reconcileInternetGateways(); err != nil {
    52  		conditions.MarkFalse(s.scope.InfraCluster(), infrav1.InternetGatewayReadyCondition, infrav1.InternetGatewayFailedReason, infrautilconditions.ErrorConditionAfterInit(s.scope.ClusterObj()), err.Error())
    53  		return err
    54  	}
    55  
    56  	// NAT Gateways.
    57  	if err := s.reconcileNatGateways(); err != nil {
    58  		conditions.MarkFalse(s.scope.InfraCluster(), infrav1.NatGatewaysReadyCondition, infrav1.NatGatewaysReconciliationFailedReason, infrautilconditions.ErrorConditionAfterInit(s.scope.ClusterObj()), err.Error())
    59  		return err
    60  	}
    61  
    62  	// Routing tables.
    63  	if err := s.reconcileRouteTables(); err != nil {
    64  		conditions.MarkFalse(s.scope.InfraCluster(), infrav1.RouteTablesReadyCondition, infrav1.RouteTableReconciliationFailedReason, infrautilconditions.ErrorConditionAfterInit(s.scope.ClusterObj()), err.Error())
    65  		return err
    66  	}
    67  
    68  	s.scope.V(2).Info("Reconcile network completed successfully")
    69  	return nil
    70  }
    71  
    72  // DeleteNetwork deletes the network of the given cluster.
    73  func (s *Service) DeleteNetwork() (err error) {
    74  	s.scope.V(2).Info("Deleting network")
    75  
    76  	vpc := &infrav1.VPCSpec{}
    77  	// Get VPC used for the cluster
    78  	if s.scope.VPC().ID != "" {
    79  		var err error
    80  		vpc, err = s.describeVPCByID()
    81  		if err != nil {
    82  			if awserrors.IsNotFound(err) {
    83  				// If the VPC does not exist, nothing to do
    84  				return nil
    85  			}
    86  			return err
    87  		}
    88  	} else {
    89  		s.scope.Error(err, "non-fatal: VPC ID is missing, ")
    90  	}
    91  
    92  	vpc.DeepCopyInto(s.scope.VPC())
    93  
    94  	// Routing tables.
    95  	conditions.MarkFalse(s.scope.InfraCluster(), infrav1.RouteTablesReadyCondition, clusterv1.DeletingReason, clusterv1.ConditionSeverityInfo, "")
    96  	if err := s.scope.PatchObject(); err != nil {
    97  		return err
    98  	}
    99  
   100  	if err := s.deleteRouteTables(); err != nil {
   101  		conditions.MarkFalse(s.scope.InfraCluster(), infrav1.RouteTablesReadyCondition, "DeletingFailed", clusterv1.ConditionSeverityWarning, err.Error())
   102  		return err
   103  	}
   104  	conditions.MarkFalse(s.scope.InfraCluster(), infrav1.RouteTablesReadyCondition, clusterv1.DeletedReason, clusterv1.ConditionSeverityInfo, "")
   105  
   106  	// NAT Gateways.
   107  	conditions.MarkFalse(s.scope.InfraCluster(), infrav1.NatGatewaysReadyCondition, clusterv1.DeletingReason, clusterv1.ConditionSeverityInfo, "")
   108  	if err := s.scope.PatchObject(); err != nil {
   109  		return err
   110  	}
   111  
   112  	if err := s.deleteNatGateways(); err != nil {
   113  		conditions.MarkFalse(s.scope.InfraCluster(), infrav1.NatGatewaysReadyCondition, "DeletingFailed", clusterv1.ConditionSeverityWarning, err.Error())
   114  		return err
   115  	}
   116  	conditions.MarkFalse(s.scope.InfraCluster(), infrav1.NatGatewaysReadyCondition, clusterv1.DeletedReason, clusterv1.ConditionSeverityInfo, "")
   117  
   118  	// EIPs.
   119  	if err := s.releaseAddresses(); err != nil {
   120  		return err
   121  	}
   122  
   123  	// Internet Gateways.
   124  	conditions.MarkFalse(s.scope.InfraCluster(), infrav1.InternetGatewayReadyCondition, clusterv1.DeletingReason, clusterv1.ConditionSeverityInfo, "")
   125  	if err := s.scope.PatchObject(); err != nil {
   126  		return err
   127  	}
   128  
   129  	if err := s.deleteInternetGateways(); err != nil {
   130  		conditions.MarkFalse(s.scope.InfraCluster(), infrav1.InternetGatewayReadyCondition, "DeletingFailed", clusterv1.ConditionSeverityWarning, err.Error())
   131  		return err
   132  	}
   133  	conditions.MarkFalse(s.scope.InfraCluster(), infrav1.InternetGatewayReadyCondition, clusterv1.DeletedReason, clusterv1.ConditionSeverityInfo, "")
   134  
   135  	// Subnets.
   136  	conditions.MarkFalse(s.scope.InfraCluster(), infrav1.SubnetsReadyCondition, clusterv1.DeletingReason, clusterv1.ConditionSeverityInfo, "")
   137  	if err := s.scope.PatchObject(); err != nil {
   138  		return err
   139  	}
   140  
   141  	if err := s.deleteSubnets(); err != nil {
   142  		conditions.MarkFalse(s.scope.InfraCluster(), infrav1.SubnetsReadyCondition, "DeletingFailed", clusterv1.ConditionSeverityWarning, err.Error())
   143  		return err
   144  	}
   145  	conditions.MarkFalse(s.scope.InfraCluster(), infrav1.SubnetsReadyCondition, clusterv1.DeletedReason, clusterv1.ConditionSeverityInfo, "")
   146  
   147  	// Secondary CIDR.
   148  	conditions.MarkFalse(s.scope.InfraCluster(), infrav1.SecondaryCidrsReadyCondition, clusterv1.DeletingReason, clusterv1.ConditionSeverityInfo, "")
   149  	if err := s.disassociateSecondaryCidr(); err != nil {
   150  		conditions.MarkFalse(s.scope.InfraCluster(), infrav1.SecondaryCidrsReadyCondition, "DisassociateFailed", clusterv1.ConditionSeverityWarning, err.Error())
   151  		return err
   152  	}
   153  
   154  	// VPC.
   155  	conditions.MarkFalse(s.scope.InfraCluster(), infrav1.VpcReadyCondition, clusterv1.DeletingReason, clusterv1.ConditionSeverityInfo, "")
   156  	if err := s.scope.PatchObject(); err != nil {
   157  		return err
   158  	}
   159  
   160  	if err := s.deleteVPC(); err != nil {
   161  		conditions.MarkFalse(s.scope.InfraCluster(), infrav1.VpcReadyCondition, "DeletingFailed", clusterv1.ConditionSeverityWarning, err.Error())
   162  		return err
   163  	}
   164  	conditions.MarkFalse(s.scope.InfraCluster(), infrav1.VpcReadyCondition, clusterv1.DeletedReason, clusterv1.ConditionSeverityInfo, "")
   165  
   166  	s.scope.V(2).Info("Delete network completed successfully")
   167  	return nil
   168  }