diff --git a/controllers/awscluster_controller.go b/controllers/awscluster_controller.go index b40de547be..21cc012c1a 100644 --- a/controllers/awscluster_controller.go +++ b/controllers/awscluster_controller.go @@ -171,6 +171,7 @@ func (r *AWSClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) patch.WithOwnedConditions{Conditions: []clusterv1.ConditionType{ infrav1.PrincipalCredentialRetrievedCondition, infrav1.PrincipalUsageAllowedCondition, + infrav1.LoadBalancerReadyCondition, }}) if e != nil { fmt.Println(e.Error()) diff --git a/pkg/cloud/services/elb/loadbalancer.go b/pkg/cloud/services/elb/loadbalancer.go index 81b61f4188..68c9f628cf 100644 --- a/pkg/cloud/services/elb/loadbalancer.go +++ b/pkg/cloud/services/elb/loadbalancer.go @@ -484,6 +484,8 @@ func (s *Service) deleteAPIServerELB() error { apiELB, err := s.describeClassicELB(elbName) if IsNotFound(err) { + s.scope.Debug("Control plane load balancer not found, skipping deletion") + conditions.MarkFalse(s.scope.InfraCluster(), infrav1.LoadBalancerReadyCondition, clusterv1.DeletedReason, clusterv1.ConditionSeverityInfo, "") return nil } if err != nil { @@ -492,6 +494,7 @@ func (s *Service) deleteAPIServerELB() error { if apiELB.IsUnmanaged(s.scope.Name()) { s.scope.Debug("Found unmanaged classic load balancer for apiserver, skipping deletion", "api-server-elb-name", apiELB.Name) + conditions.MarkFalse(s.scope.InfraCluster(), infrav1.LoadBalancerReadyCondition, clusterv1.DeletedReason, clusterv1.ConditionSeverityInfo, "") return nil } diff --git a/pkg/cloud/services/elb/loadbalancer_test.go b/pkg/cloud/services/elb/loadbalancer_test.go index b0d71a89cf..d5c6f0d1f5 100644 --- a/pkg/cloud/services/elb/loadbalancer_test.go +++ b/pkg/cloud/services/elb/loadbalancer_test.go @@ -40,6 +40,7 @@ import ( "sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope" "sigs.k8s.io/cluster-api-provider-aws/v2/test/mocks" clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + "sigs.k8s.io/cluster-api/util/conditions" ) func TestELBName(t *testing.T) { @@ -1587,8 +1588,9 @@ func TestDeleteAPIServerELB(t *testing.T) { clusterName := "bar" //nolint:goconst // does not need to be a package-level const elbName := "bar-apiserver" tests := []struct { - name string - elbAPIMocks func(m *mocks.MockELBAPIMockRecorder) + name string + elbAPIMocks func(m *mocks.MockELBAPIMockRecorder) + verifyAWSCluster func(*infrav1.AWSCluster) }{ { name: "if control plane ELB is not found, do nothing", @@ -1597,6 +1599,16 @@ func TestDeleteAPIServerELB(t *testing.T) { LoadBalancerNames: aws.StringSlice([]string{elbName}), })).Return(nil, awserr.New(elb.ErrCodeAccessPointNotFoundException, "", nil)) }, + verifyAWSCluster: func(awsCluster *infrav1.AWSCluster) { + loadBalancerConditionReady := conditions.IsTrue(awsCluster, infrav1.LoadBalancerReadyCondition) + if loadBalancerConditionReady { + t.Fatalf("Expected LoadBalancerReady condition to be False, but was True") + } + loadBalancerConditionReason := conditions.GetReason(awsCluster, infrav1.LoadBalancerReadyCondition) + if loadBalancerConditionReason != clusterv1.DeletedReason { + t.Fatalf("Expected LoadBalancerReady condition reason to be Deleted, but was %s", loadBalancerConditionReason) + } + }, }, { name: "if control plane ELB is found, and it is not managed, do nothing", @@ -1636,6 +1648,16 @@ func TestDeleteAPIServerELB(t *testing.T) { nil, ) }, + verifyAWSCluster: func(awsCluster *infrav1.AWSCluster) { + loadBalancerConditionReady := conditions.IsTrue(awsCluster, infrav1.LoadBalancerReadyCondition) + if loadBalancerConditionReady { + t.Fatalf("Expected LoadBalancerReady condition to be False, but was True") + } + loadBalancerConditionReason := conditions.GetReason(awsCluster, infrav1.LoadBalancerReadyCondition) + if loadBalancerConditionReason != clusterv1.DeletedReason { + t.Fatalf("Expected LoadBalancerReady condition reason to be Deleted, but was %s", loadBalancerConditionReason) + } + }, }, { name: "if control plane ELB is found, and it is managed, delete the ELB", @@ -1688,6 +1710,16 @@ func TestDeleteAPIServerELB(t *testing.T) { nil, ) }, + verifyAWSCluster: func(awsCluster *infrav1.AWSCluster) { + loadBalancerConditionReady := conditions.IsTrue(awsCluster, infrav1.LoadBalancerReadyCondition) + if loadBalancerConditionReady { + t.Fatalf("Expected LoadBalancerReady condition to be False, but was True") + } + loadBalancerConditionReason := conditions.GetReason(awsCluster, infrav1.LoadBalancerReadyCondition) + if loadBalancerConditionReason != clusterv1.DeletedReason { + t.Fatalf("Expected LoadBalancerReady condition reason to be Deleted, but was %s", loadBalancerConditionReason) + } + }, }, } @@ -1742,6 +1774,8 @@ func TestDeleteAPIServerELB(t *testing.T) { if err != nil { t.Fatal(err) } + + tc.verifyAWSCluster(awsCluster) }) } }