diff --git a/controllers/azuremanagedmachinepool_controller.go b/controllers/azuremanagedmachinepool_controller.go index c99715dcce4..3eb5b0fb8d8 100644 --- a/controllers/azuremanagedmachinepool_controller.go +++ b/controllers/azuremanagedmachinepool_controller.go @@ -18,6 +18,7 @@ package controllers import ( "context" + "fmt" "time" "github.com/pkg/errors" @@ -329,6 +330,16 @@ func (ammpr *AzureManagedMachinePoolReconciler) reconcileDelete(ctx context.Cont } if err := svc.Delete(ctx); err != nil { + // Handle transient errors + var reconcileError azure.ReconcileError + if errors.As(err, &reconcileError) && reconcileError.IsTransient() { + if azure.IsOperationNotDoneError(reconcileError) { + log.V(2).Info(fmt.Sprintf("AzureManagedMachinePool delete not done: %s", reconcileError.Error())) + } else { + log.V(2).Info("transient failure to delete AzureManagedMachinePool, retrying") + } + return reconcile.Result{RequeueAfter: reconcileError.RequeueAfter()}, nil + } return reconcile.Result{}, errors.Wrapf(err, "error deleting AzureManagedMachinePool %s/%s", scope.InfraMachinePool.Namespace, scope.InfraMachinePool.Name) } // Machine pool successfully deleted, remove the finalizer. diff --git a/controllers/azuremanagedmachinepool_controller_test.go b/controllers/azuremanagedmachinepool_controller_test.go index 001960bc207..7ea250db317 100644 --- a/controllers/azuremanagedmachinepool_controller_test.go +++ b/controllers/azuremanagedmachinepool_controller_test.go @@ -25,6 +25,7 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5" "github.com/Azure/go-autorest/autorest/azure/auth" . "github.com/onsi/gomega" + "github.com/pkg/errors" "go.uber.org/mock/gomock" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -115,6 +116,22 @@ func TestAzureManagedMachinePoolReconcile(t *testing.T) { g.Expect(err).NotTo(HaveOccurred()) }, }, + { + name: "Reconcile delete transient error", + Setup: func(cb *fake.ClientBuilder, reconciler pausingReconciler, agentpools *mock_agentpools.MockAgentPoolScopeMockRecorder, _ *MockNodeListerMockRecorder) { + cluster, azManagedCluster, azManagedControlPlane, ammp, mp := newReadyAzureManagedMachinePoolCluster() + reconciler.MockReconciler.EXPECT().Delete(gomock2.AContext()).Return(azure.WithTransientError(errors.New("transient"), 76*time.Second)) + agentpools.Name() + ammp.DeletionTimestamp = &metav1.Time{ + Time: time.Now(), + } + cb.WithObjects(cluster, azManagedCluster, azManagedControlPlane, ammp, mp) + }, + Verify: func(g *WithT, result ctrl.Result, err error) { + g.Expect(err).NotTo(HaveOccurred()) + g.Expect(result.RequeueAfter).To(Equal(76 * time.Second)) + }, + }, } for _, c := range cases {