@@ -451,14 +451,6 @@ func TestKubeadmControlPlaneValidateUpdate(t *testing.T) {
451
451
kubernetesVersion := before .DeepCopy ()
452
452
kubernetesVersion .Spec .KubeadmConfigSpec .ClusterConfiguration .KubernetesVersion = "some kubernetes version"
453
453
454
- prevKCPWithVersion := func (version string ) * KubeadmControlPlane {
455
- prev := before .DeepCopy ()
456
- prev .Spec .Version = version
457
- return prev
458
- }
459
- skipMinorControlPlaneVersion := prevKCPWithVersion ("v1.18.1" )
460
- emptyControlPlaneVersion := prevKCPWithVersion ("" )
461
-
462
454
controlPlaneEndpoint := before .DeepCopy ()
463
455
controlPlaneEndpoint .Spec .KubeadmConfigSpec .ClusterConfiguration .ControlPlaneEndpoint = "some control plane endpoint"
464
456
@@ -611,13 +603,6 @@ func TestKubeadmControlPlaneValidateUpdate(t *testing.T) {
611
603
DataDir : "/data" ,
612
604
}
613
605
614
- disallowedUpgrade118Prev := prevKCPWithVersion ("v1.18.8" )
615
- disallowedUpgrade119Version := before .DeepCopy ()
616
- disallowedUpgrade119Version .Spec .Version = "v1.19.0"
617
-
618
- disallowedUpgrade120AlphaVersion := before .DeepCopy ()
619
- disallowedUpgrade120AlphaVersion .Spec .Version = "v1.20.0-alpha.0.734_ba502ee555924a"
620
-
621
606
updateNTPServers := before .DeepCopy ()
622
607
updateNTPServers .Spec .KubeadmConfigSpec .NTP .Servers = []string {"new-server" }
623
608
@@ -925,36 +910,6 @@ func TestKubeadmControlPlaneValidateUpdate(t *testing.T) {
925
910
before : withoutClusterConfiguration ,
926
911
kcp : afterEtcdLocalDirAddition ,
927
912
},
928
- {
929
- name : "should fail when skipping control plane minor versions" ,
930
- expectErr : true ,
931
- before : before ,
932
- kcp : skipMinorControlPlaneVersion ,
933
- },
934
- {
935
- name : "should fail when no control plane version is passed" ,
936
- expectErr : true ,
937
- before : before ,
938
- kcp : emptyControlPlaneVersion ,
939
- },
940
- {
941
- name : "should pass if control plane version is the same" ,
942
- expectErr : false ,
943
- before : before ,
944
- kcp : before .DeepCopy (),
945
- },
946
- {
947
- name : "should return error when trying to upgrade to v1.19.0" ,
948
- expectErr : true ,
949
- before : disallowedUpgrade118Prev ,
950
- kcp : disallowedUpgrade119Version ,
951
- },
952
- {
953
- name : "should return error when trying to upgrade two minor versions" ,
954
- expectErr : true ,
955
- before : disallowedUpgrade118Prev ,
956
- kcp : disallowedUpgrade120AlphaVersion ,
957
- },
958
913
{
959
914
name : "should not return an error when maxSurge value is updated to 0" ,
960
915
expectErr : false ,
@@ -1051,6 +1006,162 @@ func TestKubeadmControlPlaneValidateUpdate(t *testing.T) {
1051
1006
}
1052
1007
}
1053
1008
1009
+ func TestValidateVersion (t * testing.T ) {
1010
+ tests := []struct {
1011
+ name string
1012
+ clusterConfiguration * bootstrapv1.ClusterConfiguration
1013
+ oldVersion string
1014
+ newVersion string
1015
+ expectErr bool
1016
+ }{
1017
+ // Basic validation of old and new version.
1018
+ {
1019
+ name : "error when old version is empty" ,
1020
+ oldVersion : "" ,
1021
+ newVersion : "v1.16.6" ,
1022
+ expectErr : true ,
1023
+ },
1024
+ {
1025
+ name : "error when old version is invalid" ,
1026
+ oldVersion : "invalid-version" ,
1027
+ newVersion : "v1.18.1" ,
1028
+ expectErr : true ,
1029
+ },
1030
+ {
1031
+ name : "error when new version is empty" ,
1032
+ oldVersion : "v1.16.6" ,
1033
+ newVersion : "" ,
1034
+ expectErr : true ,
1035
+ },
1036
+ {
1037
+ name : "error when new version is invalid" ,
1038
+ oldVersion : "v1.18.1" ,
1039
+ newVersion : "invalid-version" ,
1040
+ expectErr : true ,
1041
+ },
1042
+ // Validation that we block upgrade to v1.19.0.
1043
+ // Note: Upgrading to v1.19.0 is not supported, because of issues in v1.19.0,
1044
+ // see: https://github.com/kubernetes-sigs/cluster-api/issues/3564
1045
+ {
1046
+ name : "error when upgrading to v1.19.0" ,
1047
+ oldVersion : "v1.18.8" ,
1048
+ newVersion : "v1.19.0" ,
1049
+ expectErr : true ,
1050
+ },
1051
+ {
1052
+ name : "pass when both versions are v1.19.0" ,
1053
+ oldVersion : "v1.19.0" ,
1054
+ newVersion : "v1.19.0" ,
1055
+ expectErr : false ,
1056
+ },
1057
+ // Validation for skip-level upgrades.
1058
+ {
1059
+ name : "error when upgrading two minor versions" ,
1060
+ oldVersion : "v1.18.8" ,
1061
+ newVersion : "v1.20.0-alpha.0.734_ba502ee555924a" ,
1062
+ expectErr : true ,
1063
+ },
1064
+ {
1065
+ name : "pass when upgrading one minor version" ,
1066
+ oldVersion : "v1.20.1" ,
1067
+ newVersion : "v1.21.18" ,
1068
+ expectErr : false ,
1069
+ },
1070
+ // Validation for usage of the old registry.
1071
+ // Notes:
1072
+ // * kubeadm versions < v1.22 are always using the old registry.
1073
+ // * kubeadm versions >= v1.25.0 are always using the new registry.
1074
+ // * kubeadm versions in between are using the new registry
1075
+ // starting with certain patch versions.
1076
+ // This test validates that we don't block upgrades for < v1.22.0 and >= v1.25.0
1077
+ // and block upgrades to kubeadm versions in between with the old registry.
1078
+ {
1079
+ name : "pass when imageRepository is set" ,
1080
+ clusterConfiguration : & bootstrapv1.ClusterConfiguration {
1081
+ ImageRepository : "k8s.gcr.io" ,
1082
+ },
1083
+ oldVersion : "v1.21.1" ,
1084
+ newVersion : "v1.22.16" ,
1085
+ expectErr : false ,
1086
+ },
1087
+ {
1088
+ name : "pass when version didn't change" ,
1089
+ oldVersion : "v1.22.16" ,
1090
+ newVersion : "v1.22.16" ,
1091
+ expectErr : false ,
1092
+ },
1093
+ {
1094
+ name : "pass when new version is < v1.22.0" ,
1095
+ oldVersion : "v1.20.10" ,
1096
+ newVersion : "v1.21.5" ,
1097
+ expectErr : false ,
1098
+ },
1099
+ {
1100
+ name : "error when new version is using old registry (v1.22.0 <= version <= v1.22.16)" ,
1101
+ oldVersion : "v1.21.1" ,
1102
+ newVersion : "v1.22.16" , // last patch release using old registry
1103
+ expectErr : true ,
1104
+ },
1105
+ {
1106
+ name : "pass when new version is using new registry (>= v1.22.17)" ,
1107
+ oldVersion : "v1.21.1" ,
1108
+ newVersion : "v1.22.17" , // first patch release using new registry
1109
+ expectErr : false ,
1110
+ },
1111
+ {
1112
+ name : "error when new version is using old registry (v1.23.0 <= version <= v1.23.14)" ,
1113
+ oldVersion : "v1.22.17" ,
1114
+ newVersion : "v1.23.14" , // last patch release using old registry
1115
+ expectErr : true ,
1116
+ },
1117
+ {
1118
+ name : "pass when new version is using new registry (>= v1.23.15)" ,
1119
+ oldVersion : "v1.22.17" ,
1120
+ newVersion : "v1.23.15" , // first patch release using new registry
1121
+ expectErr : false ,
1122
+ },
1123
+ {
1124
+ name : "error when new version is using old registry (v1.24.0 <= version <= v1.24.8)" ,
1125
+ oldVersion : "v1.23.1" ,
1126
+ newVersion : "v1.24.8" , // last patch release using old registry
1127
+ expectErr : true ,
1128
+ },
1129
+ {
1130
+ name : "pass when new version is using new registry (>= v1.24.9)" ,
1131
+ oldVersion : "v1.23.1" ,
1132
+ newVersion : "v1.24.9" , // first patch release using new registry
1133
+ expectErr : false ,
1134
+ },
1135
+ {
1136
+ name : "pass when new version is using new registry (>= v1.25.0)" ,
1137
+ oldVersion : "v1.24.8" ,
1138
+ newVersion : "v1.25.0" , // uses new registry
1139
+ expectErr : false ,
1140
+ },
1141
+ }
1142
+
1143
+ for _ , tt := range tests {
1144
+ t .Run (tt .name , func (t * testing.T ) {
1145
+ g := NewWithT (t )
1146
+
1147
+ kcp := KubeadmControlPlane {
1148
+ Spec : KubeadmControlPlaneSpec {
1149
+ KubeadmConfigSpec : bootstrapv1.KubeadmConfigSpec {
1150
+ ClusterConfiguration : tt .clusterConfiguration ,
1151
+ },
1152
+ Version : tt .newVersion ,
1153
+ },
1154
+ }
1155
+
1156
+ allErrs := kcp .validateVersion (tt .oldVersion )
1157
+ if tt .expectErr {
1158
+ g .Expect (allErrs ).ToNot (HaveLen (0 ))
1159
+ } else {
1160
+ g .Expect (allErrs ).To (HaveLen (0 ))
1161
+ }
1162
+ })
1163
+ }
1164
+ }
1054
1165
func TestKubeadmControlPlaneValidateUpdateAfterDefaulting (t * testing.T ) {
1055
1166
before := & KubeadmControlPlane {
1056
1167
ObjectMeta : metav1.ObjectMeta {
0 commit comments