@@ -89,6 +89,24 @@ func TestAzureMachinePoolMachineReconciler_Reconcile(t *testing.T) {
8989 g .Expect (err .Error ()).Should (ContainSubstring ("not found" ))
9090 },
9191 },
92+ {
93+ Name : "should remove finalizer if Machine is not found and AzureMachinePool has deletionTimestamp set" ,
94+ Setup : func (cb * fake.ClientBuilder , reconciler * mock_azure.MockReconcilerMockRecorder ) {
95+ objects := getDeletingMachinePoolObjects ()
96+ cb .WithObjects (objects ... )
97+ },
98+ Verify : func (g * WithT , c client.Client , result ctrl.Result , err error ) {
99+ g .Expect (err ).NotTo (HaveOccurred ())
100+
101+ ampm := & infrav1exp.AzureMachinePoolMachine {}
102+ err = c .Get (context .Background (), types.NamespacedName {
103+ Name : "ampm1" ,
104+ Namespace : "default" ,
105+ }, ampm )
106+ g .Expect (err ).To (HaveOccurred ())
107+ g .Expect (err .Error ()).Should (ContainSubstring ("not found" ))
108+ },
109+ },
92110 }
93111
94112 for _ , c := range cases {
@@ -282,3 +300,131 @@ func getReadyMachinePoolMachineClusterObjects(ampmIsDeleting bool, ampmProvision
282300
283301 return []client.Object {cluster , azCluster , mp , amp , ma , ampm , fakeIdentity , fakeSecret }
284302}
303+
304+ func getDeletingMachinePoolObjects () []client.Object {
305+ azCluster := & infrav1.AzureCluster {
306+ TypeMeta : metav1.TypeMeta {
307+ Kind : "AzureCluster" ,
308+ },
309+ ObjectMeta : metav1.ObjectMeta {
310+ Name : "azCluster1" ,
311+ Namespace : "default" ,
312+ },
313+ Spec : infrav1.AzureClusterSpec {
314+ AzureClusterClassSpec : infrav1.AzureClusterClassSpec {
315+ SubscriptionID : "subID" ,
316+ IdentityRef : & corev1.ObjectReference {
317+ Name : "fake-identity" ,
318+ Namespace : "default" ,
319+ Kind : "AzureClusterIdentity" ,
320+ },
321+ },
322+ },
323+ }
324+
325+ cluster := & clusterv1.Cluster {
326+ TypeMeta : metav1.TypeMeta {
327+ Kind : "Cluster" ,
328+ },
329+ ObjectMeta : metav1.ObjectMeta {
330+ Name : "cluster1" ,
331+ Namespace : "default" ,
332+ },
333+ Spec : clusterv1.ClusterSpec {
334+ InfrastructureRef : & corev1.ObjectReference {
335+ Name : azCluster .Name ,
336+ Namespace : "default" ,
337+ Kind : "AzureCluster" ,
338+ },
339+ },
340+ Status : clusterv1.ClusterStatus {
341+ InfrastructureReady : true ,
342+ },
343+ }
344+
345+ mp := & expv1.MachinePool {
346+ TypeMeta : metav1.TypeMeta {
347+ Kind : "MachinePool" ,
348+ },
349+ ObjectMeta : metav1.ObjectMeta {
350+ Name : "mp1" ,
351+ Namespace : "default" ,
352+ Finalizers : []string {"test" },
353+ DeletionTimestamp : & metav1.Time {
354+ Time : time .Now (),
355+ },
356+ Labels : map [string ]string {
357+ "cluster.x-k8s.io/cluster-name" : cluster .Name ,
358+ },
359+ },
360+ }
361+
362+ amp := & infrav1exp.AzureMachinePool {
363+ TypeMeta : metav1.TypeMeta {
364+ Kind : "AzureMachinePool" ,
365+ },
366+ ObjectMeta : metav1.ObjectMeta {
367+ Name : "amp1" ,
368+ Namespace : "default" ,
369+ Finalizers : []string {"test" },
370+ DeletionTimestamp : & metav1.Time {
371+ Time : time .Now (),
372+ },
373+ OwnerReferences : []metav1.OwnerReference {
374+ {
375+ Name : mp .Name ,
376+ Kind : "MachinePool" ,
377+ APIVersion : expv1 .GroupVersion .String (),
378+ },
379+ },
380+ },
381+ }
382+
383+ ampm := & infrav1exp.AzureMachinePoolMachine {
384+ ObjectMeta : metav1.ObjectMeta {
385+ Name : "ampm1" ,
386+ Namespace : "default" ,
387+ DeletionTimestamp : & metav1.Time {
388+ Time : time .Now (),
389+ },
390+ Finalizers : []string {infrav1exp .AzureMachinePoolMachineFinalizer },
391+ Labels : map [string ]string {
392+ clusterv1 .ClusterNameLabel : cluster .Name ,
393+ },
394+ OwnerReferences : []metav1.OwnerReference {
395+ {
396+ Name : amp .Name ,
397+ Kind : infrav1 .AzureMachinePoolKind ,
398+ APIVersion : infrav1exp .GroupVersion .String (),
399+ },
400+ },
401+ },
402+ }
403+
404+ fakeIdentity := & infrav1.AzureClusterIdentity {
405+ ObjectMeta : metav1.ObjectMeta {
406+ Name : "fake-identity" ,
407+ Namespace : "default" ,
408+ },
409+ Spec : infrav1.AzureClusterIdentitySpec {
410+ Type : infrav1 .ServicePrincipal ,
411+ ClientSecret : corev1.SecretReference {
412+ Name : "fooSecret" ,
413+ Namespace : "default" ,
414+ },
415+ TenantID : "fake-tenantid" ,
416+ },
417+ }
418+
419+ fakeSecret := & corev1.Secret {
420+ ObjectMeta : metav1.ObjectMeta {
421+ Name : "fooSecret" ,
422+ Namespace : "default" ,
423+ },
424+ Data : map [string ][]byte {
425+ "clientSecret" : []byte ("fooSecret" ),
426+ },
427+ }
428+
429+ return []client.Object {cluster , azCluster , mp , amp , ampm , fakeIdentity , fakeSecret }
430+ }
0 commit comments