Skip to content

Commit f030fbf

Browse files
committed
Backoffs WithContext
1 parent 700d533 commit f030fbf

File tree

2 files changed

+42
-40
lines changed

2 files changed

+42
-40
lines changed

api/v1alpha1/openstackfloatingippool_types.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
// it is the newest API version we should no longer be making breaking
2727
// changes to. If we bump this we need to look carefully for resulting
2828
// CRD changes in v1alpha1 to ensure they are compatible.
29-
"sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha7"
29+
infrav1alpha7 "sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha7"
3030
)
3131

3232
const (
@@ -56,11 +56,11 @@ type OpenStackFloatingIPPoolSpec struct {
5656

5757
// IdentityRef is a reference to a identity to be used when reconciling this pool.
5858
// +optional
59-
IdentityRef *v1alpha7.OpenStackIdentityReference `json:"identityRef,omitempty"`
59+
IdentityRef *infrav1alpha7.OpenStackIdentityReference `json:"identityRef,omitempty"`
6060

6161
// FloatingIPNetwork is the external network to use for floating ips, if there's only one external network it will be used by default
6262
// +optional
63-
FloatingIPNetwork v1alpha7.NetworkFilter `json:"floatingIPNetwork"`
63+
FloatingIPNetwork infrav1alpha7.NetworkFilter `json:"floatingIPNetwork"`
6464

6565
// The name of the cloud to use from the clouds secret
6666
// +optional
@@ -88,7 +88,7 @@ type OpenStackFloatingIPPoolStatus struct {
8888

8989
// floatingIPNetwork contains information about the network used for floating ips
9090
// +optional
91-
FloatingIPNetwork *v1alpha7.NetworkStatus `json:"floatingIPNetwork,omitempty"`
91+
FloatingIPNetwork *infrav1alpha7.NetworkStatus `json:"floatingIPNetwork,omitempty"`
9292

9393
Conditions clusterv1.Conditions `json:"conditions,omitempty"`
9494
}

controllers/openstackfloatingippool_controller.go

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ import (
4040
"sigs.k8s.io/controller-runtime/pkg/handler"
4141
"sigs.k8s.io/controller-runtime/pkg/reconcile"
4242

43-
"sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha1"
44-
"sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha7"
43+
infrav1alpha1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha1"
44+
infrav1alpha7 "sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha7"
4545
infrav1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha8"
4646
"sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/networking"
4747
"sigs.k8s.io/cluster-api-provider-openstack/pkg/scope"
@@ -76,7 +76,7 @@ type OpenStackFloatingIPPoolReconciler struct {
7676

7777
func (r *OpenStackFloatingIPPoolReconciler) Reconcile(ctx context.Context, req ctrl.Request) (_ ctrl.Result, reterr error) {
7878
log := ctrl.LoggerFrom(ctx)
79-
pool := &v1alpha1.OpenStackFloatingIPPool{}
79+
pool := &infrav1alpha1.OpenStackFloatingIPPool{}
8080
if err := r.Client.Get(ctx, req.NamespacedName, pool); err != nil {
8181
return ctrl.Result{}, client.IgnoreNotFound(err)
8282
}
@@ -93,7 +93,7 @@ func (r *OpenStackFloatingIPPoolReconciler) Reconcile(ctx context.Context, req c
9393

9494
if pool.ObjectMeta.DeletionTimestamp.IsZero() {
9595
// Add finalizer if it does not exist
96-
if controllerutil.AddFinalizer(pool, v1alpha1.OpenStackFloatingIPPoolFinalizer) {
96+
if controllerutil.AddFinalizer(pool, infrav1alpha1.OpenStackFloatingIPPoolFinalizer) {
9797
return ctrl.Result{}, r.Client.Update(ctx, pool)
9898
}
9999
} else {
@@ -119,7 +119,7 @@ func (r *OpenStackFloatingIPPoolReconciler) Reconcile(ctx context.Context, req c
119119
}
120120

121121
claims := &ipamv1.IPAddressClaimList{}
122-
if err := r.Client.List(context.Background(), claims, client.InNamespace(req.Namespace), client.MatchingFields{v1alpha1.OpenStackFloatingIPPoolNameIndex: pool.Name}); err != nil {
122+
if err := r.Client.List(context.Background(), claims, client.InNamespace(req.Namespace), client.MatchingFields{infrav1alpha1.OpenStackFloatingIPPoolNameIndex: pool.Name}); err != nil {
123123
return ctrl.Result{}, err
124124
}
125125

@@ -137,7 +137,7 @@ func (r *OpenStackFloatingIPPoolReconciler) Reconcile(ctx context.Context, req c
137137
return ctrl.Result{}, err
138138
}
139139
if apierrors.IsNotFound(err) {
140-
ip, err := r.getIP(scope, pool)
140+
ip, err := r.getIP(ctx, scope, pool)
141141
if err != nil {
142142
return ctrl.Result{}, err
143143
}
@@ -147,7 +147,7 @@ func (r *OpenStackFloatingIPPoolReconciler) Reconcile(ctx context.Context, req c
147147
Name: claim.Name,
148148
Namespace: claim.Namespace,
149149
Finalizers: []string{
150-
v1alpha1.DeleteFloatingIPFinalizer,
150+
infrav1alpha1.DeleteFloatingIPFinalizer,
151151
},
152152
OwnerReferences: []metav1.OwnerReference{
153153
{
@@ -163,7 +163,7 @@ func (r *OpenStackFloatingIPPoolReconciler) Reconcile(ctx context.Context, req c
163163
Name: claim.Name,
164164
},
165165
PoolRef: corev1.TypedLocalObjectReference{
166-
APIGroup: pointer.String(v1alpha1.GroupVersion.Group),
166+
APIGroup: pointer.String(infrav1alpha1.GroupVersion.Group),
167167
Kind: pool.Kind,
168168
Name: pool.Name,
169169
},
@@ -173,7 +173,7 @@ func (r *OpenStackFloatingIPPoolReconciler) Reconcile(ctx context.Context, req c
173173
}
174174

175175
// Retry creating the IPAddress object
176-
err = wait.ExponentialBackoff(backoff, func() (bool, error) {
176+
err = wait.ExponentialBackoffWithContext(ctx, backoff, func(ctx context.Context) (bool, error) {
177177
if err := r.Client.Create(ctx, ipAddress); err != nil {
178178
return false, err
179179
}
@@ -196,10 +196,10 @@ func (r *OpenStackFloatingIPPoolReconciler) Reconcile(ctx context.Context, req c
196196
return ctrl.Result{}, r.Client.Status().Update(ctx, pool)
197197
}
198198

199-
func (r *OpenStackFloatingIPPoolReconciler) reconcileDelete(ctx context.Context, scope scope.Scope, pool *v1alpha1.OpenStackFloatingIPPool) error {
199+
func (r *OpenStackFloatingIPPoolReconciler) reconcileDelete(ctx context.Context, scope scope.Scope, pool *infrav1alpha1.OpenStackFloatingIPPool) error {
200200
log := ctrl.LoggerFrom(ctx)
201201
ipAddresses := &ipamv1.IPAddressList{}
202-
if err := r.Client.List(ctx, ipAddresses, client.InNamespace(pool.Namespace), client.MatchingFields{v1alpha1.OpenStackFloatingIPPoolNameIndex: pool.Name}); err != nil {
202+
if err := r.Client.List(ctx, ipAddresses, client.InNamespace(pool.Namespace), client.MatchingFields{infrav1alpha1.OpenStackFloatingIPPoolNameIndex: pool.Name}); err != nil {
203203
return err
204204
}
205205

@@ -223,7 +223,7 @@ func (r *OpenStackFloatingIPPoolReconciler) reconcileDelete(ctx context.Context,
223223
pool.Status.AvailableIPs = diff(pool.Status.AvailableIPs, []string{ip})
224224
}
225225

226-
if controllerutil.RemoveFinalizer(pool, v1alpha1.OpenStackFloatingIPPoolFinalizer) {
226+
if controllerutil.RemoveFinalizer(pool, infrav1alpha1.OpenStackFloatingIPPoolFinalizer) {
227227
log.Info("Removing finalizer from OpenStackFloatingIPPool")
228228
return r.Client.Update(ctx, pool)
229229
}
@@ -260,9 +260,9 @@ func diff(a []string, b []string) []string {
260260
return result
261261
}
262262

263-
func (r *OpenStackFloatingIPPoolReconciler) reconcileIPAddresses(ctx context.Context, scope scope.Scope, pool *v1alpha1.OpenStackFloatingIPPool) error {
263+
func (r *OpenStackFloatingIPPoolReconciler) reconcileIPAddresses(ctx context.Context, scope scope.Scope, pool *infrav1alpha1.OpenStackFloatingIPPool) error {
264264
ipAddresses := &ipamv1.IPAddressList{}
265-
if err := r.Client.List(ctx, ipAddresses, client.InNamespace(pool.Namespace), client.MatchingFields{v1alpha1.OpenStackFloatingIPPoolNameIndex: pool.Name}); err != nil {
265+
if err := r.Client.List(ctx, ipAddresses, client.InNamespace(pool.Namespace), client.MatchingFields{infrav1alpha1.OpenStackFloatingIPPoolNameIndex: pool.Name}); err != nil {
266266
return err
267267
}
268268

@@ -282,16 +282,16 @@ func (r *OpenStackFloatingIPPoolReconciler) reconcileIPAddresses(ctx context.Con
282282
continue
283283
}
284284

285-
if controllerutil.ContainsFinalizer(ipAddress, v1alpha1.DeleteFloatingIPFinalizer) {
286-
if pool.Spec.ReclaimPolicy == v1alpha1.ReclaimDelete && !contains(pool.Spec.PreAllocatedFloatingIPs, ipAddress.Spec.Address) {
285+
if controllerutil.ContainsFinalizer(ipAddress, infrav1alpha1.DeleteFloatingIPFinalizer) {
286+
if pool.Spec.ReclaimPolicy == infrav1alpha1.ReclaimDelete && !contains(pool.Spec.PreAllocatedFloatingIPs, ipAddress.Spec.Address) {
287287
if err = networkingService.DeleteFloatingIP(pool, ipAddress.Spec.Address); err != nil {
288288
return fmt.Errorf("delete floating IP %q: %w", ipAddress.Spec.Address, err)
289289
}
290290
} else {
291291
pool.Status.AvailableIPs = append(pool.Status.AvailableIPs, ipAddress.Spec.Address)
292292
}
293293
}
294-
controllerutil.RemoveFinalizer(ipAddress, v1alpha1.DeleteFloatingIPFinalizer)
294+
controllerutil.RemoveFinalizer(ipAddress, infrav1alpha1.DeleteFloatingIPFinalizer)
295295
if err := r.Client.Update(ctx, ipAddress); err != nil {
296296
return err
297297
}
@@ -302,7 +302,7 @@ func (r *OpenStackFloatingIPPoolReconciler) reconcileIPAddresses(ctx context.Con
302302
return nil
303303
}
304304

305-
func (r *OpenStackFloatingIPPoolReconciler) getIP(scope scope.Scope, pool *v1alpha1.OpenStackFloatingIPPool) (string, error) {
305+
func (r *OpenStackFloatingIPPoolReconciler) getIP(ctx context.Context, scope scope.Scope, pool *infrav1alpha1.OpenStackFloatingIPPool) (string, error) {
306306
// There's a potential leak of IPs here, if the reconcile loop fails after we claim an IP but before we create the IPAddress object.
307307
var ip string
308308

@@ -314,17 +314,19 @@ func (r *OpenStackFloatingIPPoolReconciler) getIP(scope scope.Scope, pool *v1alp
314314

315315
// Get tagged floating IPs and add them to the available IPs if they are not present in either the available IPs or the claimed IPs
316316
// This is done to prevent leaking floating IPs if to prevent leaking floating IPs if the floating IP was created but the IPAddress object was not
317-
taggedIPs, err := networkingService.GetFloatingIPsByTag(pool.GetFloatingIPTag())
318-
if err != nil {
319-
scope.Logger().Error(err, "Failed to get floating IPs by tag", "pool", pool.Name)
320-
return "", err
321-
}
322-
for _, taggedIP := range taggedIPs {
323-
if contains(pool.Status.AvailableIPs, taggedIP.FloatingIP) || contains(pool.Status.ClaimedIPs, taggedIP.FloatingIP) {
324-
continue
317+
if len(pool.Status.AvailableIPs) == 0 {
318+
taggedIPs, err := networkingService.GetFloatingIPsByTag(pool.GetFloatingIPTag())
319+
if err != nil {
320+
scope.Logger().Error(err, "Failed to get floating IPs by tag", "pool", pool.Name)
321+
return "", err
322+
}
323+
for _, taggedIP := range taggedIPs {
324+
if contains(pool.Status.AvailableIPs, taggedIP.FloatingIP) || contains(pool.Status.ClaimedIPs, taggedIP.FloatingIP) {
325+
continue
326+
}
327+
scope.Logger().Info("Tagged floating IP found that was not known to the pool, adding it to the pool", "ip", taggedIP.FloatingIP)
328+
pool.Status.AvailableIPs = append(pool.Status.AvailableIPs, taggedIP.FloatingIP)
325329
}
326-
scope.Logger().Info("Tagged floating IP found that was not known to the pool, adding it to the pool", "ip", taggedIP.FloatingIP)
327-
pool.Status.AvailableIPs = append(pool.Status.AvailableIPs, taggedIP.FloatingIP)
328330
}
329331

330332
if len(pool.Status.AvailableIPs) > 0 {
@@ -345,7 +347,7 @@ func (r *OpenStackFloatingIPPoolReconciler) getIP(scope scope.Scope, pool *v1alp
345347
fp, err := networkingService.CreateFloatingIPForPool(pool)
346348
if err != nil {
347349
scope.Logger().Error(err, "Failed to create floating IP", "pool", pool.Name)
348-
conditions.MarkFalse(pool, v1alpha1.OpenstackFloatingIPPoolReadyCondition, infrav1.OpenStackErrorReason, clusterv1.ConditionSeverityError, "Failed to create floating IP: %v", err)
350+
conditions.MarkFalse(pool, infrav1alpha1.OpenstackFloatingIPPoolReadyCondition, infrav1.OpenStackErrorReason, clusterv1.ConditionSeverityError, "Failed to create floating IP: %v", err)
349351
if ip != "" {
350352
pool.Status.FailedIPs = append(pool.Status.FailedIPs, ip)
351353
}
@@ -354,7 +356,7 @@ func (r *OpenStackFloatingIPPoolReconciler) getIP(scope scope.Scope, pool *v1alp
354356
defer func() {
355357
tag := pool.GetFloatingIPTag()
356358

357-
err := wait.ExponentialBackoff(backoff, func() (bool, error) {
359+
err := wait.ExponentialBackoffWithContext(ctx, backoff, func(ctx context.Context) (bool, error) {
358360
if err := networkingService.TagFloatingIP(fp.FloatingIP, tag); err != nil {
359361
scope.Logger().Error(err, "Failed to tag floating, retrying", "ip", fp.FloatingIP, "tag", tag)
360362
return false, err
@@ -366,14 +368,14 @@ func (r *OpenStackFloatingIPPoolReconciler) getIP(scope scope.Scope, pool *v1alp
366368
}
367369
}()
368370

369-
conditions.MarkTrue(pool, v1alpha1.OpenstackFloatingIPPoolReadyCondition)
371+
conditions.MarkTrue(pool, infrav1alpha1.OpenstackFloatingIPPoolReadyCondition)
370372

371373
ip = fp.FloatingIP
372374
pool.Status.ClaimedIPs = append(pool.Status.ClaimedIPs, ip)
373375
return ip, nil
374376
}
375377

376-
func (r *OpenStackFloatingIPPoolReconciler) reconcileFloatingIPNetwork(scope scope.Scope, pool *v1alpha1.OpenStackFloatingIPPool) error {
378+
func (r *OpenStackFloatingIPPoolReconciler) reconcileFloatingIPNetwork(scope scope.Scope, pool *infrav1alpha1.OpenStackFloatingIPPool) error {
377379
// If the pool already has a network, we don't need to do anything
378380
if pool.Status.FloatingIPNetwork != nil {
379381
return nil
@@ -397,7 +399,7 @@ func (r *OpenStackFloatingIPPoolReconciler) reconcileFloatingIPNetwork(scope sco
397399
return fmt.Errorf("found multiple networks, expects filter to match one (result: %v)", networkList)
398400
}
399401

400-
pool.Status.FloatingIPNetwork = &v1alpha7.NetworkStatus{
402+
pool.Status.FloatingIPNetwork = &infrav1alpha7.NetworkStatus{
401403
ID: networkList[0].ID,
402404
Name: networkList[0].Name,
403405
Tags: networkList[0].Tags,
@@ -442,7 +444,7 @@ func (r *OpenStackFloatingIPPoolReconciler) ipAddressToPoolMapper(_ context.Cont
442444
}
443445

444446
func (r *OpenStackFloatingIPPoolReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager) error {
445-
if err := mgr.GetFieldIndexer().IndexField(ctx, &ipamv1.IPAddressClaim{}, v1alpha1.OpenStackFloatingIPPoolNameIndex, func(rawObj client.Object) []string {
447+
if err := mgr.GetFieldIndexer().IndexField(ctx, &ipamv1.IPAddressClaim{}, infrav1alpha1.OpenStackFloatingIPPoolNameIndex, func(rawObj client.Object) []string {
446448
claim := rawObj.(*ipamv1.IPAddressClaim)
447449
if claim.Spec.PoolRef.Kind != openStackFloatingIPPool {
448450
return nil
@@ -452,15 +454,15 @@ func (r *OpenStackFloatingIPPoolReconciler) SetupWithManager(ctx context.Context
452454
return err
453455
}
454456

455-
if err := mgr.GetFieldIndexer().IndexField(ctx, &ipamv1.IPAddress{}, v1alpha1.OpenStackFloatingIPPoolNameIndex, func(rawObj client.Object) []string {
457+
if err := mgr.GetFieldIndexer().IndexField(ctx, &ipamv1.IPAddress{}, infrav1alpha1.OpenStackFloatingIPPoolNameIndex, func(rawObj client.Object) []string {
456458
ip := rawObj.(*ipamv1.IPAddress)
457459
return []string{ip.Spec.PoolRef.Name}
458460
}); err != nil {
459461
return err
460462
}
461463

462464
return ctrl.NewControllerManagedBy(mgr).
463-
For(&v1alpha1.OpenStackFloatingIPPool{}).
465+
For(&infrav1alpha1.OpenStackFloatingIPPool{}).
464466
Watches(
465467
&ipamv1.IPAddressClaim{},
466468
handler.EnqueueRequestsFromMapFunc(r.ipAddressClaimToPoolMapper),

0 commit comments

Comments
 (0)