@@ -30,6 +30,7 @@ import (
30
30
corev1 "k8s.io/api/core/v1"
31
31
apierrors "k8s.io/apimachinery/pkg/api/errors"
32
32
"k8s.io/apimachinery/pkg/types"
33
+ "k8s.io/apimachinery/pkg/util/wait"
33
34
"k8s.io/client-go/tools/record"
34
35
"k8s.io/utils/pointer"
35
36
clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha4"
@@ -53,6 +54,7 @@ import (
53
54
"sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/loadbalancer"
54
55
"sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/networking"
55
56
"sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/provider"
57
+ capoerrors "sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/errors"
56
58
)
57
59
58
60
// OpenStackMachineReconciler reconciles a OpenStackMachine object.
@@ -353,7 +355,31 @@ func (r *OpenStackMachineReconciler) reconcileNormal(ctx context.Context, logger
353
355
handleUpdateMachineError (logger , openStackMachine , errors .Errorf ("Floating IP cannot be got or created: %v" , err ))
354
356
return ctrl.Result {}, nil
355
357
}
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
+
357
383
if err != nil {
358
384
handleUpdateMachineError (logger , openStackMachine , errors .Errorf ("Floating IP cannot be associated: %v" , err ))
359
385
return ctrl.Result {}, nil
0 commit comments