Merge pull request #129219 from danwinship/networkdevicedata-validation

Require canonicalization of NetworkDeviceData IPs
This commit is contained in:
Kubernetes Prow Robot 2025-02-20 16:14:26 -08:00 committed by GitHub
commit 9bf60d06e0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 18 additions and 7 deletions

View File

@ -802,17 +802,24 @@ func validateNetworkDeviceData(networkDeviceData *resource.NetworkDeviceData, fl
allErrs = append(allErrs, validateSet(networkDeviceData.IPs, maxIPs,
func(address string, fldPath *field.Path) field.ErrorList {
return validation.IsValidCIDR(fldPath, address)
},
func(address string) (string, string) {
// reformat CIDR to handle different ways IPs can be written
// (e.g. 2001:db8::1/64 == 2001:0db8::1/64)
ip, ipNet, err := netutils.ParseCIDRSloppy(address)
if err != nil {
return "", "" // will fail at IsValidCIDR
// must fail
return validation.IsValidCIDR(fldPath, address)
}
maskSize, _ := ipNet.Mask.Size()
return fmt.Sprintf("%s/%d", ip.String(), maskSize), ""
canonical := fmt.Sprintf("%s/%d", ip.String(), maskSize)
if address != canonical {
return field.ErrorList{
field.Invalid(fldPath, address, fmt.Sprintf("must be in canonical form (%s)", canonical)),
}
}
return nil
},
func(address string) (string, string) {
return address, ""
},
fldPath.Child("ips"))...)
return allErrs

View File

@ -1040,7 +1040,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) {
NetworkData: &resource.NetworkDeviceData{
IPs: []string{
"2001:db8::1/64",
"2001:0db8::1/64",
"2001:db8::1/64",
},
},
},
@ -1059,6 +1059,8 @@ func TestValidateClaimStatusUpdate(t *testing.T) {
field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "interfaceName"), "", interfaceNameMaxLength),
field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "hardwareAddress"), "", hardwareAddressMaxLength),
field.Invalid(field.NewPath("status", "devices").Index(0).Child("networkData", "ips").Index(0), "300.9.8.0/24", "must be a valid CIDR value, (e.g. 10.9.8.0/24 or 2001:db8::/64)"),
field.Invalid(field.NewPath("status", "devices").Index(0).Child("networkData", "ips").Index(1), "010.009.008.000/24", "must be in canonical form (10.9.8.0/24)"),
field.Invalid(field.NewPath("status", "devices").Index(0).Child("networkData", "ips").Index(2), "2001:0db8::1/64", "must be in canonical form (2001:db8::1/64)"),
},
oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(),
update: func(claim *resource.ResourceClaim) *resource.ResourceClaim {
@ -1072,6 +1074,8 @@ func TestValidateClaimStatusUpdate(t *testing.T) {
HardwareAddress: strings.Repeat("x", hardwareAddressMaxLength+1),
IPs: []string{
"300.9.8.0/24",
"010.009.008.000/24",
"2001:0db8::1/64",
},
},
},
@ -1169,7 +1173,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) {
NetworkData: &resource.NetworkDeviceData{
IPs: []string{
"2001:db8::1/64",
"2001:0db8::1/64",
"2001:db8::1/64",
},
},
},