Skip to content

Commit 35b1e22

Browse files
committed
Retry assocate floating IP in case it's not found at first
1 parent a2acda3 commit 35b1e22

File tree

1 file changed

+27
-1
lines changed

1 file changed

+27
-1
lines changed

controllers/openstackmachine_controller.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
corev1 "k8s.io/api/core/v1"
3131
apierrors "k8s.io/apimachinery/pkg/api/errors"
3232
"k8s.io/apimachinery/pkg/types"
33+
"k8s.io/apimachinery/pkg/util/wait"
3334
"k8s.io/client-go/tools/record"
3435
"k8s.io/utils/pointer"
3536
clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha4"
@@ -53,6 +54,7 @@ import (
5354
"sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/loadbalancer"
5455
"sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/networking"
5556
"sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/provider"
57+
capoerrors "sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/errors"
5658
)
5759

5860
// OpenStackMachineReconciler reconciles a OpenStackMachine object.
@@ -353,7 +355,31 @@ func (r *OpenStackMachineReconciler) reconcileNormal(ctx context.Context, logger
353355
handleUpdateMachineError(logger, openStackMachine, errors.Errorf("Floating IP cannot be got or created: %v", err))
354356
return ctrl.Result{}, nil
355357
}
356-
err = computeService.AssociateFloatingIP(instance.ID, fp.FloatingIP)
358+
359+
// There is some possibility that floating IP is created but not able to be find right after that
360+
// so give a retry here, see #927 for further information.
361+
backoff := wait.Backoff{
362+
Steps: 10,
363+
Duration: time.Second,
364+
Factor: 1.25,
365+
Jitter: 0.1,
366+
}
367+
err = wait.ExponentialBackoff(backoff, func() (bool, error) {
368+
if err := computeService.AssociateFloatingIP(instance.ID, fp.FloatingIP); err != nil {
369+
if capoerrors.IsNotFound(err) {
370+
// not found, timing issue
371+
logger.Info("Floating IP association failed, will retry.", "instance-id", instance.ID, "floating-ip", fp.FloatingIP)
372+
return false, nil
373+
}
374+
// real error occurs
375+
return false, err
376+
}
377+
return true, nil
378+
})
379+
if err == wait.ErrWaitTimeout {
380+
err = fmt.Errorf("floating IP association timeout %s", fp.FloatingIP)
381+
}
382+
357383
if err != nil {
358384
handleUpdateMachineError(logger, openStackMachine, errors.Errorf("Floating IP cannot be associated: %v", err))
359385
return ctrl.Result{}, nil

0 commit comments

Comments
 (0)