@@ -25,7 +25,9 @@ import (
25
25
"k8s.io/apimachinery/pkg/util/sets"
26
26
"k8s.io/apimachinery/pkg/util/validation/field"
27
27
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
28
+ kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
28
29
kubeadmapiv1beta2 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2"
30
+ "k8s.io/kubernetes/cmd/kubeadm/app/features"
29
31
)
30
32
31
33
func TestValidateToken (t * testing.T ) {
@@ -231,6 +233,60 @@ func TestValidateIPNetFromString(t *testing.T) {
231
233
}
232
234
}
233
235
236
+ func TestValidatePodSubnetNodeMask (t * testing.T ) {
237
+ var tests = []struct {
238
+ name string
239
+ subnet string
240
+ cmExtraArgs map [string ]string
241
+ checkDualStack bool
242
+ expected bool
243
+ }{
244
+ {"single IPv4, but mask too small. Default node-mask" , "10.0.0.16/29" , nil , false , false },
245
+ {"single IPv4, but mask too small. Configured node-mask" , "10.0.0.16/24" , map [string ]string {"node-cidr-mask-size" : "23" }, false , false },
246
+ {"single IPv6, but mask too small. Default node-mask" , "2001:db8::1/112" , nil , false , false },
247
+ {"single IPv6, but mask too small. Configured node-mask" , "2001:db8::1/64" , map [string ]string {"node-cidr-mask-size" : "24" }, false , false },
248
+ {"single IPv6, but mask difference greater than 16. Default node-mask" , "2001:db8::1/12" , nil , false , false },
249
+ {"single IPv6, but mask difference greater than 16. Configured node-mask" , "2001:db8::1/64" , map [string ]string {"node-cidr-mask-size" : "120" }, false , false },
250
+ {"single IPv4 CIDR" , "10.0.0.16/12" , nil , false , true },
251
+ {"single IPv6 CIDR" , "2001:db8::/48" , nil , false , true },
252
+ // dual-stack:
253
+ {"dual IPv4 only, but mask too small. Default node-mask" , "10.0.0.16/29" , nil , true , false },
254
+ {"dual IPv4 only, but mask too small. Configured node-mask" , "10.0.0.16/24" , map [string ]string {"node-cidr-mask-size-ipv4" : "23" }, true , false },
255
+ {"dual IPv6 only, but mask too small. Default node-mask" , "2001:db8::1/112" , nil , true , false },
256
+ {"dual IPv6 only, but mask too small. Configured node-mask" , "2001:db8::1/64" , map [string ]string {"node-cidr-mask-size-ipv6" : "24" }, true , false },
257
+ {"dual IPv6 only, but mask difference greater than 16. Default node-mask" , "2001:db8::1/12" , nil , true , false },
258
+ {"dual IPv6 only, but mask difference greater than 16. Configured node-mask" , "2001:db8::1/64" , map [string ]string {"node-cidr-mask-size-ipv6" : "120" }, true , false },
259
+ {"dual IPv4 only CIDR" , "10.0.0.16/12" , nil , true , true },
260
+ {"dual IPv6 only CIDR" , "2001:db8::/48" , nil , true , true },
261
+ {"dual, but IPv4 mask too small. Default node-mask" , "10.0.0.16/29,2001:db8::/48" , nil , true , false },
262
+ {"dual, but IPv4 mask too small. Configured node-mask" , "10.0.0.16/24,2001:db8::/48" , map [string ]string {"node-cidr-mask-size-ipv4" : "23" }, true , false },
263
+ {"dual, but IPv6 mask too small. Default node-mask" , "2001:db8::1/112,10.0.0.16/16" , nil , true , false },
264
+ {"dual, but IPv6 mask too small. Configured node-mask" , "10.0.0.16/16,2001:db8::1/64" , map [string ]string {"node-cidr-mask-size-ipv6" : "24" }, true , false },
265
+ {"dual, but mask difference greater than 16. Default node-mask" , "2001:db8::1/12,10.0.0.16/16" , nil , true , false },
266
+ {"dual, but mask difference greater than 16. Configured node-mask" , "10.0.0.16/16,2001:db8::1/64" , map [string ]string {"node-cidr-mask-size-ipv6" : "120" }, true , false },
267
+ {"dual IPv4 IPv6" , "2001:db8::/48,10.0.0.16/12" , nil , true , true },
268
+ {"dual IPv6 IPv4" , "2001:db8::/48,10.0.0.16/12" , nil , true , true },
269
+ }
270
+ for _ , rt := range tests {
271
+ cfg := & kubeadmapi.ClusterConfiguration {
272
+ FeatureGates : map [string ]bool {features .IPv6DualStack : rt .checkDualStack },
273
+ ControllerManager : kubeadmapi.ControlPlaneComponent {
274
+ ExtraArgs : rt .cmExtraArgs ,
275
+ },
276
+ }
277
+ actual := ValidatePodSubnetNodeMask (rt .subnet , cfg , nil )
278
+ if (len (actual ) == 0 ) != rt .expected {
279
+ t .Errorf (
280
+ "%s test case failed :\n \t expected: %t\n \t actual: %t\n \t err(s): %v\n \t " ,
281
+ rt .name ,
282
+ rt .expected ,
283
+ (len (actual ) == 0 ),
284
+ actual ,
285
+ )
286
+ }
287
+ }
288
+ }
289
+
234
290
func TestValidateHostPort (t * testing.T ) {
235
291
var tests = []struct {
236
292
name string
@@ -1040,3 +1096,123 @@ func TestValidateEtcd(t *testing.T) {
1040
1096
}
1041
1097
}
1042
1098
}
1099
+
1100
+ func TestGetClusterNodeMask (t * testing.T ) {
1101
+ tests := []struct {
1102
+ name string
1103
+ cfg * kubeadmapi.ClusterConfiguration
1104
+ isIPv6 bool
1105
+ expectedMask int
1106
+ }{
1107
+ {
1108
+ name : "ipv4 default mask" ,
1109
+ cfg : & kubeadmapi.ClusterConfiguration {},
1110
+ isIPv6 : false ,
1111
+ expectedMask : 24 ,
1112
+ },
1113
+ {
1114
+ name : "ipv4 custom mask" ,
1115
+ cfg : & kubeadmapi.ClusterConfiguration {
1116
+ ControllerManager : kubeadmapi.ControlPlaneComponent {
1117
+ ExtraArgs : map [string ]string {"node-cidr-mask-size" : "23" },
1118
+ },
1119
+ },
1120
+ isIPv6 : false ,
1121
+ expectedMask : 23 ,
1122
+ },
1123
+ {
1124
+ name : "ipv6 default mask" ,
1125
+ cfg : & kubeadmapi.ClusterConfiguration {},
1126
+ isIPv6 : true ,
1127
+ expectedMask : 64 ,
1128
+ },
1129
+ {
1130
+ name : "ipv6 custom mask" ,
1131
+ cfg : & kubeadmapi.ClusterConfiguration {
1132
+ ControllerManager : kubeadmapi.ControlPlaneComponent {
1133
+ ExtraArgs : map [string ]string {"node-cidr-mask-size" : "83" },
1134
+ },
1135
+ },
1136
+ isIPv6 : true ,
1137
+ expectedMask : 83 ,
1138
+ },
1139
+ {
1140
+ name : "dual ipv4 default mask" ,
1141
+ cfg : & kubeadmapi.ClusterConfiguration {
1142
+ FeatureGates : map [string ]bool {features .IPv6DualStack : true },
1143
+ },
1144
+ isIPv6 : false ,
1145
+ expectedMask : 24 ,
1146
+ },
1147
+ {
1148
+ name : "dual ipv4 custom mask" ,
1149
+ cfg : & kubeadmapi.ClusterConfiguration {
1150
+ FeatureGates : map [string ]bool {features .IPv6DualStack : true },
1151
+ ControllerManager : kubeadmapi.ControlPlaneComponent {
1152
+ ExtraArgs : map [string ]string {"node-cidr-mask-size" : "21" , "node-cidr-mask-size-ipv4" : "23" },
1153
+ },
1154
+ },
1155
+ isIPv6 : false ,
1156
+ expectedMask : 23 ,
1157
+ },
1158
+ {
1159
+ name : "dual ipv6 default mask" ,
1160
+ cfg : & kubeadmapi.ClusterConfiguration {
1161
+ FeatureGates : map [string ]bool {features .IPv6DualStack : true },
1162
+ },
1163
+ isIPv6 : true ,
1164
+ expectedMask : 64 ,
1165
+ },
1166
+ {
1167
+ name : "dual ipv6 custom mask" ,
1168
+ cfg : & kubeadmapi.ClusterConfiguration {
1169
+ FeatureGates : map [string ]bool {features .IPv6DualStack : true },
1170
+ ControllerManager : kubeadmapi.ControlPlaneComponent {
1171
+ ExtraArgs : map [string ]string {"node-cidr-mask-size-ipv6" : "83" },
1172
+ },
1173
+ },
1174
+ isIPv6 : true ,
1175
+ expectedMask : 83 ,
1176
+ },
1177
+ {
1178
+ name : "dual ipv4 custom mask" ,
1179
+ cfg : & kubeadmapi.ClusterConfiguration {
1180
+ FeatureGates : map [string ]bool {features .IPv6DualStack : true },
1181
+ ControllerManager : kubeadmapi.ControlPlaneComponent {
1182
+ ExtraArgs : map [string ]string {"node-cidr-mask-size-ipv4" : "23" },
1183
+ },
1184
+ },
1185
+ isIPv6 : false ,
1186
+ expectedMask : 23 ,
1187
+ },
1188
+ {
1189
+ name : "dual ipv6 default mask and legacy flag" ,
1190
+ cfg : & kubeadmapi.ClusterConfiguration {
1191
+ FeatureGates : map [string ]bool {features .IPv6DualStack : true },
1192
+ ControllerManager : kubeadmapi.ControlPlaneComponent {
1193
+ ExtraArgs : map [string ]string {"node-cidr-mask-size" : "23" },
1194
+ },
1195
+ },
1196
+ isIPv6 : true ,
1197
+ expectedMask : 64 ,
1198
+ },
1199
+ {
1200
+ name : "dual ipv6 custom mask and legacy flag" ,
1201
+ cfg : & kubeadmapi.ClusterConfiguration {
1202
+ FeatureGates : map [string ]bool {features .IPv6DualStack : true },
1203
+ ControllerManager : kubeadmapi.ControlPlaneComponent {
1204
+ ExtraArgs : map [string ]string {"node-cidr-mask-size" : "23" , "node-cidr-mask-size-ipv6" : "83" },
1205
+ },
1206
+ },
1207
+ isIPv6 : true ,
1208
+ expectedMask : 83 ,
1209
+ },
1210
+ }
1211
+ for _ , test := range tests {
1212
+ t .Run (test .name , func (t * testing.T ) {
1213
+ if mask := getClusterNodeMask (test .cfg , test .isIPv6 ); mask != test .expectedMask {
1214
+ t .Errorf ("expected mask: %d, got %d" , test .expectedMask , mask )
1215
+ }
1216
+ })
1217
+ }
1218
+ }
0 commit comments