Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions pkg/cloud/services/loadbalancer/loadbalancer.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,10 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust

if lb.ProvisioningStatus != loadBalancerProvisioningStatusActive {
var err error
lb, err = s.waitForLoadBalancerActive(lb.ID)
lbID := lb.ID
lb, err = s.waitForLoadBalancerActive(lbID)
if err != nil {
return false, fmt.Errorf("load balancer %q with id %s is not active after timeout: %v", loadBalancerName, lb.ID, err)
return false, fmt.Errorf("load balancer %q with id %s is not active after timeout: %v", loadBalancerName, lbID, err)
}
}

Expand Down
28 changes: 28 additions & 0 deletions pkg/cloud/services/loadbalancer/loadbalancer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,13 @@ func Test_ReconcileLoadBalancer(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()

// Shortcut wait timeout
backoffDurationPrev := backoff.Duration
backoff.Duration = 0
defer func() {
backoff.Duration = backoffDurationPrev
}()

// Stub the call to net.LookupHost
lookupHost = func(host string) (addrs *string, err error) {
if net.ParseIP(host) != nil {
Expand Down Expand Up @@ -139,6 +146,27 @@ func Test_ReconcileLoadBalancer(t *testing.T) {
},
wantError: nil,
},
{
name: "reconcile loadbalancer in non active state should timeout",
expectNetwork: func(*mock.MockNetworkClientMockRecorder) {
// add network api call results here
},
expectLoadBalancer: func(m *mock.MockLbClientMockRecorder) {
pendingLB := loadbalancers.LoadBalancer{
ID: "aaaaaaaa-bbbb-cccc-dddd-333333333333",
Name: "k8s-clusterapi-cluster-AAAAA-kubeapi",
ProvisioningStatus: "PENDING_CREATE",
}

// return existing loadbalancer in non-active state
lbList := []loadbalancers.LoadBalancer{pendingLB}
m.ListLoadBalancers(loadbalancers.ListOpts{Name: pendingLB.Name}).Return(lbList, nil)

// wait for loadbalancer until it times out
m.GetLoadBalancer("aaaaaaaa-bbbb-cccc-dddd-333333333333").Return(&pendingLB, nil).Return(&pendingLB, nil).AnyTimes()
},
wantError: fmt.Errorf("load balancer \"k8s-clusterapi-cluster-AAAAA-kubeapi\" with id aaaaaaaa-bbbb-cccc-dddd-333333333333 is not active after timeout: timed out waiting for the condition"),
},
}
for _, tt := range lbtests {
t.Run(tt.name, func(t *testing.T) {
Expand Down