chore: add more error info for validateResourceSliceSpec

This commit is contained in:
googs1025 2024-12-31 11:10:24 +08:00
parent 71f32f9930
commit f540197768
2 changed files with 12 additions and 12 deletions

View File

@ -383,14 +383,14 @@ func validateAllocationConfigSource(source resource.AllocationConfigSource, fldP
return allErrs return allErrs
} }
// ValidateClass validates a DeviceClass. // ValidateDeviceClass validates a DeviceClass.
func ValidateDeviceClass(class *resource.DeviceClass) field.ErrorList { func ValidateDeviceClass(class *resource.DeviceClass) field.ErrorList {
allErrs := corevalidation.ValidateObjectMeta(&class.ObjectMeta, false, corevalidation.ValidateClassName, field.NewPath("metadata")) allErrs := corevalidation.ValidateObjectMeta(&class.ObjectMeta, false, corevalidation.ValidateClassName, field.NewPath("metadata"))
allErrs = append(allErrs, validateDeviceClassSpec(&class.Spec, nil, field.NewPath("spec"))...) allErrs = append(allErrs, validateDeviceClassSpec(&class.Spec, nil, field.NewPath("spec"))...)
return allErrs return allErrs
} }
// ValidateClassUpdate tests if an update to DeviceClass is valid. // ValidateDeviceClassUpdate tests if an update to DeviceClass is valid.
func ValidateDeviceClassUpdate(class, oldClass *resource.DeviceClass) field.ErrorList { func ValidateDeviceClassUpdate(class, oldClass *resource.DeviceClass) field.ErrorList {
allErrs := corevalidation.ValidateObjectMetaUpdate(&class.ObjectMeta, &oldClass.ObjectMeta, field.NewPath("metadata")) allErrs := corevalidation.ValidateObjectMetaUpdate(&class.ObjectMeta, &oldClass.ObjectMeta, field.NewPath("metadata"))
allErrs = append(allErrs, validateDeviceClassSpec(&class.Spec, &oldClass.Spec, field.NewPath("spec"))...) allErrs = append(allErrs, validateDeviceClassSpec(&class.Spec, &oldClass.Spec, field.NewPath("spec"))...)
@ -466,7 +466,7 @@ func ValidateResourceSlice(slice *resource.ResourceSlice) field.ErrorList {
return allErrs return allErrs
} }
// ValidateResourceSlice tests if a ResourceSlice update is valid. // ValidateResourceSliceUpdate tests if a ResourceSlice update is valid.
func ValidateResourceSliceUpdate(resourceSlice, oldResourceSlice *resource.ResourceSlice) field.ErrorList { func ValidateResourceSliceUpdate(resourceSlice, oldResourceSlice *resource.ResourceSlice) field.ErrorList {
allErrs := corevalidation.ValidateObjectMetaUpdate(&resourceSlice.ObjectMeta, &oldResourceSlice.ObjectMeta, field.NewPath("metadata")) allErrs := corevalidation.ValidateObjectMetaUpdate(&resourceSlice.ObjectMeta, &oldResourceSlice.ObjectMeta, field.NewPath("metadata"))
allErrs = append(allErrs, validateResourceSliceSpec(&resourceSlice.Spec, &oldResourceSlice.Spec, field.NewPath("spec"))...) allErrs = append(allErrs, validateResourceSliceSpec(&resourceSlice.Spec, &oldResourceSlice.Spec, field.NewPath("spec"))...)
@ -483,13 +483,13 @@ func validateResourceSliceSpec(spec, oldSpec *resource.ResourceSliceSpec, fldPat
allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(spec.NodeName, oldSpec.NodeName, fldPath.Child("nodeName"))...) allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(spec.NodeName, oldSpec.NodeName, fldPath.Child("nodeName"))...)
} }
numNodeSelectionFields := 0 setFields := make([]string, 0, 3)
if spec.NodeName != "" { if spec.NodeName != "" {
numNodeSelectionFields++ setFields = append(setFields, "`nodeName`")
allErrs = append(allErrs, validateNodeName(spec.NodeName, fldPath.Child("nodeName"))...) allErrs = append(allErrs, validateNodeName(spec.NodeName, fldPath.Child("nodeName"))...)
} }
if spec.NodeSelector != nil { if spec.NodeSelector != nil {
numNodeSelectionFields++ setFields = append(setFields, "`nodeSelector`")
allErrs = append(allErrs, corevalidation.ValidateNodeSelector(spec.NodeSelector, false, fldPath.Child("nodeSelector"))...) allErrs = append(allErrs, corevalidation.ValidateNodeSelector(spec.NodeSelector, false, fldPath.Child("nodeSelector"))...)
if len(spec.NodeSelector.NodeSelectorTerms) != 1 { if len(spec.NodeSelector.NodeSelectorTerms) != 1 {
// This additional constraint simplifies merging of different selectors // This additional constraint simplifies merging of different selectors
@ -498,14 +498,15 @@ func validateResourceSliceSpec(spec, oldSpec *resource.ResourceSliceSpec, fldPat
} }
} }
if spec.AllNodes { if spec.AllNodes {
numNodeSelectionFields++ setFields = append(setFields, "`allNodes`")
} }
switch numNodeSelectionFields { switch len(setFields) {
case 0: case 0:
allErrs = append(allErrs, field.Required(fldPath, "exactly one of `nodeName`, `nodeSelector`, or `allNodes` is required")) allErrs = append(allErrs, field.Required(fldPath, "exactly one of `nodeName`, `nodeSelector`, or `allNodes` is required"))
case 1: case 1:
default: default:
allErrs = append(allErrs, field.Invalid(fldPath, nil, "exactly one of `nodeName`, `nodeSelector`, or `allNodes` is required")) allErrs = append(allErrs, field.Invalid(fldPath, fmt.Sprintf("{%s}", strings.Join(setFields, ", ")),
"exactly one of `nodeName`, `nodeSelector`, or `allNodes` is required, but multiple fields are set"))
} }
allErrs = append(allErrs, validateSet(spec.Devices, resource.ResourceSliceMaxDevices, validateDevice, allErrs = append(allErrs, validateSet(spec.Devices, resource.ResourceSliceMaxDevices, validateDevice,
@ -569,7 +570,6 @@ var (
// optional dot-separated build identifier segments (e.g. +build.id.20240305) // optional dot-separated build identifier segments (e.g. +build.id.20240305)
`(\+` + buildIdentifier + `(\.` + buildIdentifier + `)*)?` + `(\+` + buildIdentifier + `(\.` + buildIdentifier + `)*)?` +
`$`) `$`)
) )

View File

@ -273,7 +273,7 @@ func TestValidateResourceSlice(t *testing.T) {
}(), }(),
}, },
"bad-node-selection": { "bad-node-selection": {
wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec"), nil, "exactly one of `nodeName`, `nodeSelector`, or `allNodes` is required")}, wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec"), "{`nodeName`, `nodeSelector`}", "exactly one of `nodeName`, `nodeSelector`, or `allNodes` is required, but multiple fields are set")},
slice: func() *resourceapi.ResourceSlice { slice: func() *resourceapi.ResourceSlice {
slice := testResourceSlice(goodName, goodName, driverName, 1) slice := testResourceSlice(goodName, goodName, driverName, 1)
slice.Spec.NodeName = "worker" slice.Spec.NodeName = "worker"
@ -284,7 +284,7 @@ func TestValidateResourceSlice(t *testing.T) {
}(), }(),
}, },
"bad-node-selection-all-nodes": { "bad-node-selection-all-nodes": {
wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec"), nil, "exactly one of `nodeName`, `nodeSelector`, or `allNodes` is required")}, wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec"), "{`nodeName`, `allNodes`}", "exactly one of `nodeName`, `nodeSelector`, or `allNodes` is required, but multiple fields are set")},
slice: func() *resourceapi.ResourceSlice { slice: func() *resourceapi.ResourceSlice {
slice := testResourceSlice(goodName, goodName, driverName, 1) slice := testResourceSlice(goodName, goodName, driverName, 1)
slice.Spec.NodeName = "worker" slice.Spec.NodeName = "worker"