@@ -29,11 +29,14 @@ import (
29
29
"k8s.io/utils/ptr"
30
30
ctrl "sigs.k8s.io/controller-runtime"
31
31
"sigs.k8s.io/controller-runtime/pkg/client"
32
+ "sigs.k8s.io/controller-runtime/pkg/client/fake"
32
33
"sigs.k8s.io/controller-runtime/pkg/handler"
33
34
"sigs.k8s.io/controller-runtime/pkg/reconcile"
34
35
35
36
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
36
37
"sigs.k8s.io/cluster-api/controllers/remote"
38
+ "sigs.k8s.io/cluster-api/internal/test/builder"
39
+ "sigs.k8s.io/cluster-api/internal/topology/ownerrefs"
37
40
"sigs.k8s.io/cluster-api/util"
38
41
"sigs.k8s.io/cluster-api/util/kubeconfig"
39
42
)
@@ -770,6 +773,49 @@ func TestPatchNode(t *testing.T) {
770
773
ms : newFakeMachineSet (metav1 .NamespaceDefault , clusterName ),
771
774
md : newFakeMachineDeployment (metav1 .NamespaceDefault , clusterName ),
772
775
},
776
+ {
777
+ name : "Ensure Labels and Annotations still get patched if MachineSet and Machinedeployment cannot be found" ,
778
+ oldNode : & corev1.Node {
779
+ ObjectMeta : metav1.ObjectMeta {
780
+ Name : fmt .Sprintf ("node-%s" , util .RandomString (6 )),
781
+ },
782
+ },
783
+ newLabels : map [string ]string {
784
+ "label-from-machine" : "foo" ,
785
+ },
786
+ newAnnotations : map [string ]string {
787
+ "annotation-from-machine" : "foo" ,
788
+ },
789
+ expectedLabels : map [string ]string {
790
+ "label-from-machine" : "foo" ,
791
+ },
792
+ expectedAnnotations : map [string ]string {
793
+ "annotation-from-machine" : "foo" ,
794
+ clusterv1 .LabelsFromMachineAnnotation : "label-from-machine" ,
795
+ },
796
+ expectedTaints : []corev1.Taint {
797
+ {Key : "node.kubernetes.io/not-ready" , Effect : "NoSchedule" }, // Added by the API server
798
+ },
799
+ machine : & clusterv1.Machine {
800
+ ObjectMeta : metav1.ObjectMeta {
801
+ Name : fmt .Sprintf ("ma-%s" , util .RandomString (6 )),
802
+ Namespace : metav1 .NamespaceDefault ,
803
+ Labels : map [string ]string {
804
+ clusterv1 .MachineSetNameLabel : "test-ms-missing" ,
805
+ clusterv1 .MachineDeploymentNameLabel : "test-md" ,
806
+ },
807
+ OwnerReferences : []metav1.OwnerReference {{
808
+ Kind : "MachineSet" ,
809
+ Name : "test-ms-missing" ,
810
+ APIVersion : clusterv1 .GroupVersion .String (),
811
+ UID : "uid" ,
812
+ }},
813
+ },
814
+ Spec : newFakeMachineSpec (metav1 .NamespaceDefault , clusterName ),
815
+ },
816
+ ms : nil ,
817
+ md : nil ,
818
+ },
773
819
{
774
820
name : "Ensure NodeOutdatedRevisionTaint to be set if a node is associated to an outdated machineset" ,
775
821
oldNode : & corev1.Node {
@@ -913,8 +959,12 @@ func TestPatchNode(t *testing.T) {
913
959
914
960
g .Expect (env .CreateAndWait (ctx , oldNode )).To (Succeed ())
915
961
g .Expect (env .CreateAndWait (ctx , machine )).To (Succeed ())
916
- g .Expect (env .CreateAndWait (ctx , ms )).To (Succeed ())
917
- g .Expect (env .CreateAndWait (ctx , md )).To (Succeed ())
962
+ if ms != nil {
963
+ g .Expect (env .CreateAndWait (ctx , ms )).To (Succeed ())
964
+ }
965
+ if md != nil {
966
+ g .Expect (env .CreateAndWait (ctx , md )).To (Succeed ())
967
+ }
918
968
t .Cleanup (func () {
919
969
_ = env .CleanupAndWait (ctx , oldNode , machine , ms , md )
920
970
})
@@ -994,3 +1044,104 @@ func newFakeMachineDeployment(namespace, clusterName string) *clusterv1.MachineD
994
1044
},
995
1045
}
996
1046
}
1047
+
1048
+ func Test_shouldNodeHaveOutdatedTaint (t * testing.T ) {
1049
+ namespaceName := "test"
1050
+ namespace := & corev1.Namespace {ObjectMeta : metav1.ObjectMeta {Name : namespaceName }}
1051
+
1052
+ testMachineDeployment := builder .MachineDeployment (namespaceName , "my-md" ).
1053
+ WithAnnotations (map [string ]string {clusterv1 .RevisionAnnotation : "1" }).
1054
+ Build ()
1055
+ testMachineDeploymentNew := testMachineDeployment .DeepCopy ()
1056
+ testMachineDeploymentNew .Annotations = map [string ]string {clusterv1 .RevisionAnnotation : "2" }
1057
+
1058
+ testMachineSet := builder .MachineSet (namespaceName , "my-ms" ).
1059
+ WithOwnerReferences ([]metav1.OwnerReference {* ownerrefs .OwnerReferenceTo (testMachineDeployment , testMachineDeployment .GroupVersionKind ())}).
1060
+ Build ()
1061
+ testMachineSet .Annotations = map [string ]string {clusterv1 .RevisionAnnotation : "1" }
1062
+
1063
+ labels := map [string ]string {
1064
+ clusterv1 .MachineDeploymentNameLabel : "my-md" ,
1065
+ }
1066
+ testMachine := builder .Machine (namespaceName , "my-machine" ).WithLabels (labels ).Build ()
1067
+ testMachine .SetOwnerReferences ([]metav1.OwnerReference {* ownerrefs .OwnerReferenceTo (testMachineSet , testMachineSet .GroupVersionKind ())})
1068
+
1069
+ tests := []struct {
1070
+ name string
1071
+ machine * clusterv1.Machine
1072
+ objects []client.Object
1073
+ wantOutdated bool
1074
+ wantNotFound bool
1075
+ wantErr bool
1076
+ }{
1077
+ {
1078
+ name : "Machineset not outdated" ,
1079
+ machine : testMachine ,
1080
+ objects : []client.Object {testMachineSet , testMachineDeployment },
1081
+ wantOutdated : false ,
1082
+ wantNotFound : false ,
1083
+ wantErr : false ,
1084
+ },
1085
+ {
1086
+ name : "Machineset outdated" ,
1087
+ machine : testMachine ,
1088
+ objects : []client.Object {testMachineSet , testMachineDeploymentNew },
1089
+ wantOutdated : true ,
1090
+ wantNotFound : false ,
1091
+ wantErr : false ,
1092
+ },
1093
+ {
1094
+ name : "Machine without MachineDeployment label" ,
1095
+ machine : builder .Machine (namespaceName , "no-deploy" ).Build (),
1096
+ objects : nil ,
1097
+ wantOutdated : false ,
1098
+ wantNotFound : false ,
1099
+ wantErr : false ,
1100
+ },
1101
+ {
1102
+ name : "Machine without OwnerReference" ,
1103
+ machine : builder .Machine (namespaceName , "no-ownerref" ).WithLabels (labels ).Build (),
1104
+ objects : nil ,
1105
+ wantOutdated : false ,
1106
+ wantNotFound : true ,
1107
+ wantErr : false ,
1108
+ },
1109
+ {
1110
+ name : "Machine without existing MachineSet" ,
1111
+ machine : testMachine ,
1112
+ objects : nil ,
1113
+ wantOutdated : false ,
1114
+ wantNotFound : true ,
1115
+ wantErr : false ,
1116
+ },
1117
+ {
1118
+ name : "Machine without existing MachineDeployment" ,
1119
+ machine : testMachine ,
1120
+ objects : []client.Object {testMachineSet },
1121
+ wantOutdated : false ,
1122
+ wantNotFound : true ,
1123
+ wantErr : false ,
1124
+ },
1125
+ }
1126
+ for _ , tt := range tests {
1127
+ t .Run (tt .name , func (t * testing.T ) {
1128
+ objects := []client.Object {namespace }
1129
+ objects = append (objects , tt .machine )
1130
+ objects = append (objects , tt .objects ... )
1131
+ c := fake .NewClientBuilder ().
1132
+ WithObjects (objects ... ).Build ()
1133
+
1134
+ gotOutdated , gotNotFound , err := shouldNodeHaveOutdatedTaint (ctx , c , tt .machine )
1135
+ if (err != nil ) != tt .wantErr {
1136
+ t .Errorf ("shouldNodeHaveOutdatedTaint() error = %v, wantErr %v" , err , tt .wantErr )
1137
+ return
1138
+ }
1139
+ if gotOutdated != tt .wantOutdated {
1140
+ t .Errorf ("shouldNodeHaveOutdatedTaint() = %v, want %v" , gotOutdated , tt .wantOutdated )
1141
+ }
1142
+ if gotNotFound != tt .wantNotFound {
1143
+ t .Errorf ("shouldNodeHaveOutdatedTaint() = %v, want %v" , gotNotFound , tt .wantNotFound )
1144
+ }
1145
+ })
1146
+ }
1147
+ }
0 commit comments