Skip to content

Commit 39f55e1

Browse files
committed
[KEP-4817] Add data length limit (from kubernetes#128601)
Signed-off-by: Lionel Jouin <[email protected]>
1 parent 7e0035e commit 39f55e1

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

pkg/apis/resource/validation/validation.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ func validateDeviceConfiguration(config resource.DeviceConfiguration, fldPath *f
256256
func validateOpaqueConfiguration(config resource.OpaqueDeviceConfiguration, fldPath *field.Path, stored bool) field.ErrorList {
257257
var allErrs field.ErrorList
258258
allErrs = append(allErrs, validateDriverName(config.Driver, fldPath.Child("driver"))...)
259-
allErrs = append(allErrs, validateRawExtension(config.Parameters, fldPath.Child("parameters"))...)
259+
allErrs = append(allErrs, validateRawExtension(config.Parameters, fldPath.Child("parameters"), stored)...)
260260
return allErrs
261261
}
262262

@@ -750,18 +750,24 @@ func validateDeviceStatus(device resource.AllocatedDeviceStatus, fldPath *field.
750750
}
751751
allErrs = append(allErrs, metav1validation.ValidateConditions(device.Conditions, fldPath.Child("conditions"))...)
752752
if len(device.Data.Raw) > 0 { // Data is an optional field.
753-
allErrs = append(allErrs, validateRawExtension(device.Data, fldPath.Child("data"))...)
753+
allErrs = append(allErrs, validateRawExtension(device.Data, fldPath.Child("data"), false)...)
754754
}
755755
allErrs = append(allErrs, validateNetworkDeviceData(device.NetworkData, fldPath.Child("networkData"))...)
756756
return allErrs
757757
}
758758

759759
// validateRawExtension validates RawExtension as in https://github.com/kubernetes/kubernetes/pull/125549/
760-
func validateRawExtension(rawExtension runtime.RawExtension, fldPath *field.Path) field.ErrorList {
760+
func validateRawExtension(rawExtension runtime.RawExtension, fldPath *field.Path, stored bool) field.ErrorList {
761761
var allErrs field.ErrorList
762762
var v any
763763
if len(rawExtension.Raw) == 0 {
764764
allErrs = append(allErrs, field.Required(fldPath, ""))
765+
} else if !stored && len(rawExtension.Raw) > resource.OpaqueParametersMaxLength {
766+
// Don't even bother with parsing when too large.
767+
// Only applies on create. Existing parameters are grand-fathered in
768+
// because the limit was introduced in 1.32. This also means that it
769+
// can be changed in the future.
770+
allErrs = append(allErrs, field.TooLong(fldPath, "" /* unused */, resource.OpaqueParametersMaxLength))
765771
} else if err := json.Unmarshal(rawExtension.Raw, &v); err != nil {
766772
allErrs = append(allErrs, field.Invalid(fldPath, "<value omitted>", fmt.Sprintf("error parsing data as JSON: %v", err.Error())))
767773
} else if v == nil {

pkg/apis/resource/validation/validation_resourceclaim_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,6 +1096,24 @@ func TestValidateClaimStatusUpdate(t *testing.T) {
10961096
},
10971097
deviceStatusFeatureGate: true,
10981098
},
1099+
"invalid-data-device-status-too-long": {
1100+
wantFailures: field.ErrorList{
1101+
field.TooLong(field.NewPath("status", "devices").Index(0).Child("data"), "" /* unused */, resource.OpaqueParametersMaxLength),
1102+
},
1103+
oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(),
1104+
update: func(claim *resource.ResourceClaim) *resource.ResourceClaim {
1105+
claim.Status.Devices = []resource.AllocatedDeviceStatus{
1106+
{
1107+
Driver: goodName,
1108+
Pool: goodName,
1109+
Device: goodName,
1110+
Data: runtime.RawExtension{Raw: []byte(`{"str": "` + strings.Repeat("x", resource.OpaqueParametersMaxLength-9-2+1 /* too large by one */) + `"}`)},
1111+
},
1112+
}
1113+
return claim
1114+
},
1115+
deviceStatusFeatureGate: true,
1116+
},
10991117
"invalid-device-status-no-device": {
11001118
wantFailures: field.ErrorList{
11011119
field.Invalid(field.NewPath("status", "devices").Index(0), structured.MakeDeviceID("b", "a", "r"), "must be an allocated device in the claim"),
@@ -1188,6 +1206,24 @@ func TestValidateClaimStatusUpdate(t *testing.T) {
11881206
},
11891207
deviceStatusFeatureGate: false,
11901208
},
1209+
"invalid-data-device-status-too-long-feature-gate": {
1210+
wantFailures: field.ErrorList{
1211+
field.TooLong(field.NewPath("status", "devices").Index(0).Child("data"), "" /* unused */, resource.OpaqueParametersMaxLength),
1212+
},
1213+
oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(),
1214+
update: func(claim *resource.ResourceClaim) *resource.ResourceClaim {
1215+
claim.Status.Devices = []resource.AllocatedDeviceStatus{
1216+
{
1217+
Driver: goodName,
1218+
Pool: goodName,
1219+
Device: goodName,
1220+
Data: runtime.RawExtension{Raw: []byte(`{"str": "` + strings.Repeat("x", resource.OpaqueParametersMaxLength-9-2+1 /* too large by one */) + `"}`)},
1221+
},
1222+
}
1223+
return claim
1224+
},
1225+
deviceStatusFeatureGate: false,
1226+
},
11911227
"invalid-device-status-no-device-disabled-feature-gate": {
11921228
wantFailures: field.ErrorList{
11931229
field.Invalid(field.NewPath("status", "devices").Index(0), structured.MakeDeviceID("b", "a", "r"), "must be an allocated device in the claim"),

0 commit comments

Comments
 (0)