@@ -784,3 +784,176 @@ func Test_clusterToActiveMachines(t *testing.T) {
784
784
g .Expect (got ).To (Equal (tt .want ))
785
785
}
786
786
}
787
+
788
+ func TestIsDeleteNodeAllowed (t * testing.T ) {
789
+ testCases := []struct {
790
+ name string
791
+ machine * clusterv1.Machine
792
+ expected bool
793
+ expectedError error
794
+ }{
795
+ {
796
+ name : "machine without nodeRef" ,
797
+ machine : & clusterv1.Machine {
798
+ ObjectMeta : metav1.ObjectMeta {
799
+ Name : "created" ,
800
+ Namespace : "default" ,
801
+ Finalizers : []string {clusterv1 .MachineFinalizer , metav1 .FinalizerDeleteDependents },
802
+ },
803
+ Spec : clusterv1.MachineSpec {
804
+ ClusterName : "test-cluster" ,
805
+ InfrastructureRef : corev1.ObjectReference {},
806
+ Bootstrap : clusterv1.Bootstrap {Data : pointer .StringPtr ("data" )},
807
+ },
808
+ Status : clusterv1.MachineStatus {},
809
+ },
810
+ expected : false ,
811
+ expectedError : errNilNodeRef ,
812
+ },
813
+ {
814
+ name : "no control plane members" ,
815
+ machine : & clusterv1.Machine {
816
+ ObjectMeta : metav1.ObjectMeta {
817
+ Name : "created" ,
818
+ Namespace : "default" ,
819
+ Finalizers : []string {clusterv1 .MachineFinalizer , metav1 .FinalizerDeleteDependents },
820
+ },
821
+ Spec : clusterv1.MachineSpec {
822
+ ClusterName : "test-cluster" ,
823
+ InfrastructureRef : corev1.ObjectReference {},
824
+ Bootstrap : clusterv1.Bootstrap {Data : pointer .StringPtr ("data" )},
825
+ },
826
+ Status : clusterv1.MachineStatus {
827
+ NodeRef : & corev1.ObjectReference {
828
+ Name : "test" ,
829
+ },
830
+ },
831
+ },
832
+ expected : false ,
833
+ expectedError : errNoControlPlaneNodes ,
834
+ },
835
+ {
836
+ name : "is last control plane members" ,
837
+ machine : & clusterv1.Machine {
838
+ ObjectMeta : metav1.ObjectMeta {
839
+ Name : "created" ,
840
+ Namespace : "default" ,
841
+ Labels : map [string ]string {
842
+ clusterv1 .ClusterLabelName : "test" ,
843
+ clusterv1 .MachineControlPlaneLabelName : "" ,
844
+ },
845
+ Finalizers : []string {clusterv1 .MachineFinalizer , metav1 .FinalizerDeleteDependents },
846
+ },
847
+ Spec : clusterv1.MachineSpec {
848
+ ClusterName : "test-cluster" ,
849
+ InfrastructureRef : corev1.ObjectReference {},
850
+ Bootstrap : clusterv1.Bootstrap {Data : pointer .StringPtr ("data" )},
851
+ },
852
+ Status : clusterv1.MachineStatus {
853
+ NodeRef : & corev1.ObjectReference {
854
+ Name : "test" ,
855
+ },
856
+ },
857
+ },
858
+ expected : false ,
859
+ expectedError : errLastControlPlaneNode ,
860
+ },
861
+ {
862
+ name : "has nodeRef and control plane is healthy" ,
863
+ machine : & clusterv1.Machine {
864
+ ObjectMeta : metav1.ObjectMeta {
865
+ Name : "created" ,
866
+ Namespace : "default" ,
867
+ Labels : map [string ]string {
868
+ clusterv1 .ClusterLabelName : "test" ,
869
+ },
870
+ Finalizers : []string {clusterv1 .MachineFinalizer , metav1 .FinalizerDeleteDependents },
871
+ },
872
+ Spec : clusterv1.MachineSpec {
873
+ ClusterName : "test-cluster" ,
874
+ InfrastructureRef : corev1.ObjectReference {},
875
+ Bootstrap : clusterv1.Bootstrap {Data : pointer .StringPtr ("data" )},
876
+ },
877
+ Status : clusterv1.MachineStatus {
878
+ NodeRef : & corev1.ObjectReference {
879
+ Name : "test" ,
880
+ },
881
+ },
882
+ },
883
+ expected : true ,
884
+ expectedError : nil ,
885
+ },
886
+ }
887
+
888
+ for _ , tc := range testCases {
889
+ t .Run (tc .name , func (t * testing.T ) {
890
+ g := NewWithT (t )
891
+
892
+ m1 := & clusterv1.Machine {
893
+ ObjectMeta : metav1.ObjectMeta {
894
+ Name : "cp1" ,
895
+ Namespace : "default" ,
896
+ Labels : map [string ]string {
897
+ clusterv1 .ClusterLabelName : "test" ,
898
+ },
899
+ Finalizers : []string {clusterv1 .MachineFinalizer , metav1 .FinalizerDeleteDependents },
900
+ },
901
+ Spec : clusterv1.MachineSpec {
902
+ ClusterName : "test-cluster" ,
903
+ InfrastructureRef : corev1.ObjectReference {},
904
+ Bootstrap : clusterv1.Bootstrap {Data : pointer .StringPtr ("data" )},
905
+ },
906
+ Status : clusterv1.MachineStatus {
907
+ NodeRef : & corev1.ObjectReference {
908
+ Name : "test1" ,
909
+ },
910
+ },
911
+ }
912
+ m2 := & clusterv1.Machine {
913
+ ObjectMeta : metav1.ObjectMeta {
914
+ Name : "cp2" ,
915
+ Namespace : "default" ,
916
+ Labels : map [string ]string {
917
+ clusterv1 .ClusterLabelName : "test" ,
918
+ },
919
+ Finalizers : []string {clusterv1 .MachineFinalizer , metav1 .FinalizerDeleteDependents },
920
+ },
921
+ Spec : clusterv1.MachineSpec {
922
+ ClusterName : "test-cluster" ,
923
+ InfrastructureRef : corev1.ObjectReference {},
924
+ Bootstrap : clusterv1.Bootstrap {Data : pointer .StringPtr ("data" )},
925
+ },
926
+ Status : clusterv1.MachineStatus {
927
+ NodeRef : & corev1.ObjectReference {
928
+ Name : "test2" ,
929
+ },
930
+ },
931
+ }
932
+ // For isDeleteNodeAllowed to be true we assume a healthy control plane.
933
+ if tc .expected {
934
+ m1 .Labels [clusterv1 .MachineControlPlaneLabelName ] = ""
935
+ m2 .Labels [clusterv1 .MachineControlPlaneLabelName ] = ""
936
+ }
937
+
938
+ mr := & MachineReconciler {
939
+ Client : fake .NewFakeClientWithScheme (
940
+ scheme .Scheme ,
941
+ tc .machine ,
942
+ m1 ,
943
+ m2 ,
944
+ ),
945
+ Log : log .Log ,
946
+ scheme : scheme .Scheme ,
947
+ }
948
+
949
+ isDeleteNodeAllowed , err := mr .isDeleteNodeAllowed (context .TODO (), tc .machine );
950
+ g .Expect (isDeleteNodeAllowed ).To (Equal (tc .expected ))
951
+ if tc .expectedError == nil {
952
+ g .Expect (err ).To (BeNil ())
953
+ } else {
954
+ g .Expect (err ).To (Equal (tc .expectedError ))
955
+ }
956
+
957
+ })
958
+ }
959
+ }
0 commit comments