Skip to content

Commit ca5f1de

Browse files
committed
Fix ResourceClaim status API inconsistency
* Add constant for limits * Fix comments in API Signed-off-by: Lionel Jouin <[email protected]>
1 parent 8a39b60 commit ca5f1de

File tree

5 files changed

+60
-33
lines changed

5 files changed

+60
-33
lines changed

pkg/apis/resource/types.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -988,6 +988,14 @@ type ResourceClaimTemplateList struct {
988988
Items []ResourceClaimTemplate
989989
}
990990

991+
const (
992+
AllocatedDeviceStatusMaxConditions int = 8
993+
AllocatedDeviceStatusDataMaxLength int = OpaqueParametersMaxLength
994+
NetworkDeviceDataMaxIPs int = 16
995+
NetworkDeviceDataInterfaceNameMaxLength int = 256
996+
NetworkDeviceDataHardwareAddressMaxLength int = 128
997+
)
998+
991999
// AllocatedDeviceStatus contains the status of an allocated device, if the
9921000
// driver chooses to report it. This may include driver-specific information.
9931001
type AllocatedDeviceStatus struct {

pkg/apis/resource/validation/validation.go

Lines changed: 12 additions & 17 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"), stored)...)
259+
allErrs = append(allErrs, validateRawExtension(config.Parameters, fldPath.Child("parameters"), stored, resource.OpaqueParametersMaxLength)...)
260260
return allErrs
261261
}
262262

@@ -748,29 +748,29 @@ func validateDeviceStatus(device resource.AllocatedDeviceStatus, fldPath *field.
748748
if !allocatedDevices.Has(deviceID) {
749749
allErrs = append(allErrs, field.Invalid(fldPath, deviceID, "must be an allocated device in the claim"))
750750
}
751-
if len(device.Conditions) > maxConditions {
752-
allErrs = append(allErrs, field.TooMany(fldPath.Child("conditions"), len(device.Conditions), maxConditions))
751+
if len(device.Conditions) > resource.AllocatedDeviceStatusMaxConditions {
752+
allErrs = append(allErrs, field.TooMany(fldPath.Child("conditions"), len(device.Conditions), resource.AllocatedDeviceStatusMaxConditions))
753753
}
754754
allErrs = append(allErrs, metav1validation.ValidateConditions(device.Conditions, fldPath.Child("conditions"))...)
755755
if len(device.Data.Raw) > 0 { // Data is an optional field.
756-
allErrs = append(allErrs, validateRawExtension(device.Data, fldPath.Child("data"), false)...)
756+
allErrs = append(allErrs, validateRawExtension(device.Data, fldPath.Child("data"), false, resource.AllocatedDeviceStatusDataMaxLength)...)
757757
}
758758
allErrs = append(allErrs, validateNetworkDeviceData(device.NetworkData, fldPath.Child("networkData"))...)
759759
return allErrs
760760
}
761761

762762
// validateRawExtension validates RawExtension as in https://github.com/kubernetes/kubernetes/pull/125549/
763-
func validateRawExtension(rawExtension runtime.RawExtension, fldPath *field.Path, stored bool) field.ErrorList {
763+
func validateRawExtension(rawExtension runtime.RawExtension, fldPath *field.Path, stored bool, rawExtensionMaxLength int) field.ErrorList {
764764
var allErrs field.ErrorList
765765
var v any
766766
if len(rawExtension.Raw) == 0 {
767767
allErrs = append(allErrs, field.Required(fldPath, ""))
768-
} else if !stored && len(rawExtension.Raw) > resource.OpaqueParametersMaxLength {
768+
} else if !stored && len(rawExtension.Raw) > rawExtensionMaxLength {
769769
// Don't even bother with parsing when too large.
770770
// Only applies on create. Existing parameters are grand-fathered in
771771
// because the limit was introduced in 1.32. This also means that it
772772
// can be changed in the future.
773-
allErrs = append(allErrs, field.TooLong(fldPath, "" /* unused */, resource.OpaqueParametersMaxLength))
773+
allErrs = append(allErrs, field.TooLong(fldPath, "" /* unused */, rawExtensionMaxLength))
774774
} else if err := json.Unmarshal(rawExtension.Raw, &v); err != nil {
775775
allErrs = append(allErrs, field.Invalid(fldPath, "<value omitted>", fmt.Sprintf("error parsing data as JSON: %v", err.Error())))
776776
} else if v == nil {
@@ -781,26 +781,21 @@ func validateRawExtension(rawExtension runtime.RawExtension, fldPath *field.Path
781781
return allErrs
782782
}
783783

784-
const maxConditions int = 8
785-
const maxIPs int = 16
786-
const interfaceNameMaxLength int = 256
787-
const hardwareAddressMaxLength int = 128
788-
789784
func validateNetworkDeviceData(networkDeviceData *resource.NetworkDeviceData, fldPath *field.Path) field.ErrorList {
790785
var allErrs field.ErrorList
791786
if networkDeviceData == nil {
792787
return allErrs
793788
}
794789

795-
if len(networkDeviceData.InterfaceName) > interfaceNameMaxLength {
796-
allErrs = append(allErrs, field.TooLong(fldPath.Child("interfaceName"), "" /* unused */, interfaceNameMaxLength))
790+
if len(networkDeviceData.InterfaceName) > resource.NetworkDeviceDataInterfaceNameMaxLength {
791+
allErrs = append(allErrs, field.TooLong(fldPath.Child("interfaceName"), "" /* unused */, resource.NetworkDeviceDataInterfaceNameMaxLength))
797792
}
798793

799-
if len(networkDeviceData.HardwareAddress) > hardwareAddressMaxLength {
800-
allErrs = append(allErrs, field.TooLong(fldPath.Child("hardwareAddress"), "" /* unused */, hardwareAddressMaxLength))
794+
if len(networkDeviceData.HardwareAddress) > resource.NetworkDeviceDataHardwareAddressMaxLength {
795+
allErrs = append(allErrs, field.TooLong(fldPath.Child("hardwareAddress"), "" /* unused */, resource.NetworkDeviceDataHardwareAddressMaxLength))
801796
}
802797

803-
allErrs = append(allErrs, validateSet(networkDeviceData.IPs, maxIPs,
798+
allErrs = append(allErrs, validateSet(networkDeviceData.IPs, resource.NetworkDeviceDataMaxIPs,
804799
func(address string, fldPath *field.Path) field.ErrorList {
805800
return validation.IsValidCIDR(fldPath, address)
806801
},

pkg/apis/resource/validation/validation_resourceclaim_test.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,8 +1055,8 @@ func TestValidateClaimStatusUpdate(t *testing.T) {
10551055
},
10561056
"invalid-network-device-status": {
10571057
wantFailures: field.ErrorList{
1058-
field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "interfaceName"), "", interfaceNameMaxLength),
1059-
field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "hardwareAddress"), "", hardwareAddressMaxLength),
1058+
field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "interfaceName"), "", resource.NetworkDeviceDataInterfaceNameMaxLength),
1059+
field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "hardwareAddress"), "", resource.NetworkDeviceDataHardwareAddressMaxLength),
10601060
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)"),
10611061
},
10621062
oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(),
@@ -1067,8 +1067,8 @@ func TestValidateClaimStatusUpdate(t *testing.T) {
10671067
Pool: goodName,
10681068
Device: goodName,
10691069
NetworkData: &resource.NetworkDeviceData{
1070-
InterfaceName: strings.Repeat("x", interfaceNameMaxLength+1),
1071-
HardwareAddress: strings.Repeat("x", hardwareAddressMaxLength+1),
1070+
InterfaceName: strings.Repeat("x", resource.NetworkDeviceDataInterfaceNameMaxLength+1),
1071+
HardwareAddress: strings.Repeat("x", resource.NetworkDeviceDataHardwareAddressMaxLength+1),
10721072
IPs: []string{
10731073
"300.9.8.0/24",
10741074
},
@@ -1101,9 +1101,9 @@ func TestValidateClaimStatusUpdate(t *testing.T) {
11011101
},
11021102
"invalid-data-device-status-limits": {
11031103
wantFailures: field.ErrorList{
1104-
field.TooMany(field.NewPath("status", "devices").Index(0).Child("conditions"), maxConditions+1, maxConditions),
1105-
field.TooLong(field.NewPath("status", "devices").Index(0).Child("data"), "" /* unused */, resource.OpaqueParametersMaxLength),
1106-
field.TooMany(field.NewPath("status", "devices").Index(0).Child("networkData", "ips"), maxIPs+1, maxIPs),
1104+
field.TooMany(field.NewPath("status", "devices").Index(0).Child("conditions"), resource.AllocatedDeviceStatusMaxConditions+1, resource.AllocatedDeviceStatusMaxConditions),
1105+
field.TooLong(field.NewPath("status", "devices").Index(0).Child("data"), "" /* unused */, resource.AllocatedDeviceStatusDataMaxLength),
1106+
field.TooMany(field.NewPath("status", "devices").Index(0).Child("networkData", "ips"), resource.NetworkDeviceDataMaxIPs+1, resource.NetworkDeviceDataMaxIPs),
11071107
},
11081108
oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(),
11091109
update: func(claim *resource.ResourceClaim) *resource.ResourceClaim {
@@ -1112,7 +1112,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) {
11121112
Driver: goodName,
11131113
Pool: goodName,
11141114
Device: goodName,
1115-
Data: runtime.RawExtension{Raw: []byte(`{"str": "` + strings.Repeat("x", resource.OpaqueParametersMaxLength-9-2+1 /* too large by one */) + `"}`)},
1115+
Data: runtime.RawExtension{Raw: []byte(`{"str": "` + strings.Repeat("x", resource.AllocatedDeviceStatusDataMaxLength-9-2+1 /* too large by one */) + `"}`)},
11161116
Conditions: []metav1.Condition{
11171117
{Type: "test-0", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0},
11181118
{Type: "test-1", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0},
@@ -1184,8 +1184,8 @@ func TestValidateClaimStatusUpdate(t *testing.T) {
11841184
},
11851185
"invalid-network-device-status-disabled-feature-gate": {
11861186
wantFailures: field.ErrorList{
1187-
field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "interfaceName"), "", interfaceNameMaxLength),
1188-
field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "hardwareAddress"), "", hardwareAddressMaxLength),
1187+
field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "interfaceName"), "", resource.NetworkDeviceDataInterfaceNameMaxLength),
1188+
field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "hardwareAddress"), "", resource.NetworkDeviceDataHardwareAddressMaxLength),
11891189
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)"),
11901190
},
11911191
oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(),
@@ -1196,8 +1196,8 @@ func TestValidateClaimStatusUpdate(t *testing.T) {
11961196
Pool: goodName,
11971197
Device: goodName,
11981198
NetworkData: &resource.NetworkDeviceData{
1199-
InterfaceName: strings.Repeat("x", interfaceNameMaxLength+1),
1200-
HardwareAddress: strings.Repeat("x", hardwareAddressMaxLength+1),
1199+
InterfaceName: strings.Repeat("x", resource.NetworkDeviceDataInterfaceNameMaxLength+1),
1200+
HardwareAddress: strings.Repeat("x", resource.NetworkDeviceDataHardwareAddressMaxLength+1),
12011201
IPs: []string{
12021202
"300.9.8.0/24",
12031203
},
@@ -1230,9 +1230,9 @@ func TestValidateClaimStatusUpdate(t *testing.T) {
12301230
},
12311231
"invalid-data-device-status-limits-feature-gate": {
12321232
wantFailures: field.ErrorList{
1233-
field.TooMany(field.NewPath("status", "devices").Index(0).Child("conditions"), maxConditions+1, maxConditions),
1234-
field.TooLong(field.NewPath("status", "devices").Index(0).Child("data"), "" /* unused */, resource.OpaqueParametersMaxLength),
1235-
field.TooMany(field.NewPath("status", "devices").Index(0).Child("networkData", "ips"), maxIPs+1, maxIPs),
1233+
field.TooMany(field.NewPath("status", "devices").Index(0).Child("conditions"), resource.AllocatedDeviceStatusMaxConditions+1, resource.AllocatedDeviceStatusMaxConditions),
1234+
field.TooLong(field.NewPath("status", "devices").Index(0).Child("data"), "" /* unused */, resource.AllocatedDeviceStatusDataMaxLength),
1235+
field.TooMany(field.NewPath("status", "devices").Index(0).Child("networkData", "ips"), resource.NetworkDeviceDataMaxIPs+1, resource.NetworkDeviceDataMaxIPs),
12361236
},
12371237
oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(),
12381238
update: func(claim *resource.ResourceClaim) *resource.ResourceClaim {
@@ -1241,7 +1241,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) {
12411241
Driver: goodName,
12421242
Pool: goodName,
12431243
Device: goodName,
1244-
Data: runtime.RawExtension{Raw: []byte(`{"str": "` + strings.Repeat("x", resource.OpaqueParametersMaxLength-9-2+1 /* too large by one */) + `"}`)},
1244+
Data: runtime.RawExtension{Raw: []byte(`{"str": "` + strings.Repeat("x", resource.AllocatedDeviceStatusDataMaxLength-9-2+1 /* too large by one */) + `"}`)},
12451245
Conditions: []metav1.Condition{
12461246
{Type: "test-0", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0},
12471247
{Type: "test-1", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0},

staging/src/k8s.io/api/resource/v1alpha3/types.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -999,6 +999,14 @@ type ResourceClaimTemplateList struct {
999999
Items []ResourceClaimTemplate `json:"items" protobuf:"bytes,2,rep,name=items"`
10001000
}
10011001

1002+
const (
1003+
AllocatedDeviceStatusMaxConditions int = 8
1004+
AllocatedDeviceStatusDataMaxLength int = OpaqueParametersMaxLength
1005+
NetworkDeviceDataMaxIPs int = 16
1006+
NetworkDeviceDataInterfaceNameMaxLength int = 256
1007+
NetworkDeviceDataHardwareAddressMaxLength int = 128
1008+
)
1009+
10021010
// AllocatedDeviceStatus contains the status of an allocated device, if the
10031011
// driver chooses to report it. This may include driver-specific information.
10041012
type AllocatedDeviceStatus struct {
@@ -1031,6 +1039,8 @@ type AllocatedDeviceStatus struct {
10311039
// If the device has been configured according to the class and claim
10321040
// config references, the `Ready` condition should be True.
10331041
//
1042+
// Must not contain more than 8 entries.
1043+
//
10341044
// +optional
10351045
// +listType=map
10361046
// +listMapKey=type
@@ -1068,6 +1078,8 @@ type NetworkDeviceData struct {
10681078
// associated subnet mask.
10691079
// e.g.: "192.0.2.5/24" for IPv4 and "2001:db8::5/64" for IPv6.
10701080
//
1081+
// Must not contain more than 16 entries.
1082+
//
10711083
// +optional
10721084
// +listType=atomic
10731085
IPs []string `json:"ips,omitempty" protobuf:"bytes,2,opt,name=ips"`

staging/src/k8s.io/api/resource/v1beta1/types.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,6 +1002,14 @@ type ResourceClaimTemplateList struct {
10021002
Items []ResourceClaimTemplate `json:"items" protobuf:"bytes,2,rep,name=items"`
10031003
}
10041004

1005+
const (
1006+
AllocatedDeviceStatusMaxConditions int = 8
1007+
AllocatedDeviceStatusDataMaxLength int = OpaqueParametersMaxLength
1008+
NetworkDeviceDataMaxIPs int = 16
1009+
NetworkDeviceDataInterfaceNameMaxLength int = 256
1010+
NetworkDeviceDataHardwareAddressMaxLength int = 128
1011+
)
1012+
10051013
// AllocatedDeviceStatus contains the status of an allocated device, if the
10061014
// driver chooses to report it. This may include driver-specific information.
10071015
type AllocatedDeviceStatus struct {
@@ -1034,6 +1042,8 @@ type AllocatedDeviceStatus struct {
10341042
// If the device has been configured according to the class and claim
10351043
// config references, the `Ready` condition should be True.
10361044
//
1045+
// Must not contain more than 8 entries.
1046+
//
10371047
// +optional
10381048
// +listType=map
10391049
// +listMapKey=type
@@ -1071,6 +1081,8 @@ type NetworkDeviceData struct {
10711081
// associated subnet mask.
10721082
// e.g.: "192.0.2.5/24" for IPv4 and "2001:db8::5/64" for IPv6.
10731083
//
1084+
// Must not contain more than 16 entries.
1085+
//
10741086
// +optional
10751087
// +listType=atomic
10761088
IPs []string `json:"ips,omitempty" protobuf:"bytes,2,opt,name=ips"`

0 commit comments

Comments
 (0)