Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions pkg/apis/resource/v1/zz_generated.validations.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 14 additions & 2 deletions pkg/apis/resource/v1beta1/zz_generated.validations.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 14 additions & 2 deletions pkg/apis/resource/v1beta2/zz_generated.validations.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions pkg/apis/resource/validation/validation.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ func validateDeviceClaim(deviceClaim *resource.DeviceClaim, fldPath *field.Path,
func(request resource.DeviceRequest) string {
return request.Name
},
fldPath.Child("requests"), sizeCovered)...)
fldPath.Child("requests"), sizeCovered, uniquenessCovered)...)
allErrs = append(allErrs, validateSlice(deviceClaim.Constraints, resource.DeviceConstraintsMaxSize,
func(constraint resource.DeviceConstraint, fldPath *field.Path) field.ErrorList {
return validateDeviceConstraint(constraint, fldPath, requestNames)
Expand Down Expand Up @@ -218,7 +218,7 @@ func validateDeviceRequest(request resource.DeviceRequest, fldPath *field.Path,
func(subRequest resource.DeviceSubRequest) string {
return subRequest.Name
},
fldPath.Child("firstAvailable"), sizeCovered)...)
fldPath.Child("firstAvailable"), sizeCovered, uniquenessCovered)...)
case hasExactly:
allErrs = append(allErrs, validateExactDeviceRequest(*request.Exactly, fldPath.Child("exactly"), stored)...)
}
Expand Down Expand Up @@ -335,7 +335,7 @@ func validateDeviceConstraint(constraint resource.DeviceConstraint, fldPath *fie
func(name string, fldPath *field.Path) field.ErrorList {
return validateRequestNameRef(name, fldPath, requestNames)
},
stringKey, fldPath.Child("requests"), sizeCovered)...)
stringKey, fldPath.Child("requests"), sizeCovered, uniquenessCovered)...)
if constraint.MatchAttribute != nil {
allErrs = append(allErrs, validateFullyQualifiedName(*constraint.MatchAttribute, fldPath.Child("matchAttribute"))...)
} else if constraint.DistinctAttribute != nil {
Expand All @@ -353,7 +353,7 @@ func validateDeviceClaimConfiguration(config resource.DeviceClaimConfiguration,
allErrs = append(allErrs, validateSet(config.Requests, resource.DeviceRequestsMaxSize,
func(name string, fldPath *field.Path) field.ErrorList {
return validateRequestNameRef(name, fldPath, requestNames)
}, stringKey, fldPath.Child("requests"), sizeCovered)...)
}, stringKey, fldPath.Child("requests"), sizeCovered, uniquenessCovered)...)
allErrs = append(allErrs, validateDeviceConfiguration(config.DeviceConfiguration, fldPath, stored)...)
return allErrs
}
Expand Down
4 changes: 2 additions & 2 deletions pkg/apis/resource/validation/validation_resourceclaim_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,7 @@ func TestValidateClaim(t *testing.T) {
field.Invalid(field.NewPath("spec", "devices", "requests").Index(2).Child("exactly", "count"), int64(-1), "must be greater than zero"),
field.NotSupported(field.NewPath("spec", "devices", "requests").Index(3).Child("exactly", "allocationMode"), resource.DeviceAllocationMode("other"), []resource.DeviceAllocationMode{resource.DeviceAllocationModeAll, resource.DeviceAllocationModeExactCount}),
field.Invalid(field.NewPath("spec", "devices", "requests").Index(4).Child("exactly", "count"), int64(2), "must not be specified when allocationMode is 'All'"),
field.Duplicate(field.NewPath("spec", "devices", "requests").Index(5), "foo"),
field.Duplicate(field.NewPath("spec", "devices", "requests").Index(5), "foo").MarkCoveredByDeclarative(),
},
claim: func() *resource.ResourceClaim {
claim := testClaim(goodName, goodNS, validClaimSpec)
Expand Down Expand Up @@ -648,7 +648,7 @@ func TestValidateClaim(t *testing.T) {
},
"prioritized-list-nested-requests-same-name": {
wantFailures: field.ErrorList{
field.Duplicate(field.NewPath("spec", "devices", "requests").Index(0).Child("firstAvailable").Index(1), "foo"),
field.Duplicate(field.NewPath("spec", "devices", "requests").Index(0).Child("firstAvailable").Index(1), "foo").MarkCoveredByDeclarative(),
},
claim: func() *resource.ResourceClaim {
claim := testClaim(goodName, goodNS, validClaimSpecWithFirstAvailable)
Expand Down
66 changes: 66 additions & 0 deletions pkg/registry/resource/resourceclaim/declarative_validation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,12 @@ func testDeclarativeValidate(t *testing.T, apiVersion string) {
field.TooMany(field.NewPath("spec", "devices", "requests"), 33, 32).WithOrigin("maxItems"),
},
},
"invalid requests, duplicate name": {
input: mkValidResourceClaim(tweakDuplicateRequestName("req-0")),
expectedErrs: field.ErrorList{
field.Duplicate(field.NewPath("spec", "devices", "requests").Index(1), "req-0"),
},
},
"invalid constraints, too many": {
input: mkValidResourceClaim(tweakDevicesConstraints(33)),
expectedErrs: field.ErrorList{
Expand All @@ -100,6 +106,12 @@ func testDeclarativeValidate(t *testing.T, apiVersion string) {
field.TooMany(field.NewPath("spec", "devices", "requests").Index(0).Child("firstAvailable"), 9, 8).WithOrigin("maxItems"),
},
},
"invalid firstAvailable, duplicate name": {
input: mkValidResourceClaim(tweakDuplicateFirstAvailableName("sub-0")),
expectedErrs: field.ErrorList{
field.Duplicate(field.NewPath("spec", "devices", "requests").Index(0).Child("firstAvailable").Index(1), "sub-0"),
},
},
"invalid selectors, too many": {
input: mkValidResourceClaim(tweakExactlySelectors(33)),
expectedErrs: field.ErrorList{
Expand All @@ -126,6 +138,18 @@ func testDeclarativeValidate(t *testing.T, apiVersion string) {
field.TooMany(field.NewPath("spec", "devices", "config").Index(0).Child("requests"), 33, 32).WithOrigin("maxItems"),
},
},
"invalid constraint requests, duplicate name": {
input: mkValidResourceClaim(tweakDuplicateConstraintRequest("req-0")),
expectedErrs: field.ErrorList{
field.Duplicate(field.NewPath("spec", "devices", "constraints").Index(0).Child("requests").Index(1), "req-0"),
},
},
"invalid config requests, duplicate name": {
input: mkValidResourceClaim(tweakDuplicateConfigRequest("req-0")),
expectedErrs: field.ErrorList{
field.Duplicate(field.NewPath("spec", "devices", "config").Index(0).Child("requests").Index(1), "req-0"),
},
},
"valid firstAvailable, max allowed": {
input: mkValidResourceClaim(tweakFirstAvailable(8)),
},
Expand Down Expand Up @@ -208,6 +232,30 @@ func tweakDevicesRequests(items int) func(*resource.ResourceClaim) {
}
}

func tweakDuplicateRequestName(name string) func(*resource.ResourceClaim) {
return func(rc *resource.ResourceClaim) {
rc.Spec.Devices.Requests = append(rc.Spec.Devices.Requests, mkDeviceRequest(name))
}
}

func tweakDuplicateFirstAvailableName(name string) func(*resource.ResourceClaim) {
return func(rc *resource.ResourceClaim) {
rc.Spec.Devices.Requests[0].Exactly = nil
rc.Spec.Devices.Requests[0].FirstAvailable = []resource.DeviceSubRequest{
{
Name: name,
DeviceClassName: "class",
AllocationMode: resource.DeviceAllocationModeAll,
},
{
Name: name,
DeviceClassName: "class",
AllocationMode: resource.DeviceAllocationModeAll,
},
}
}
}

func tweakExactlySelectors(items int) func(*resource.ResourceClaim) {
return func(rc *resource.ResourceClaim) {
for i := 0; i < items; i++ {
Expand Down Expand Up @@ -270,6 +318,24 @@ func tweakConfigRequests(count int) func(*resource.ResourceClaim) {
}
}

func tweakDuplicateConstraintRequest(name string) func(*resource.ResourceClaim) {
return func(rc *resource.ResourceClaim) {
if len(rc.Spec.Devices.Constraints) == 0 {
rc.Spec.Devices.Constraints = append(rc.Spec.Devices.Constraints, mkDeviceConstraint())
}
rc.Spec.Devices.Constraints[0].Requests = append(rc.Spec.Devices.Constraints[0].Requests, name)
}
}

func tweakDuplicateConfigRequest(name string) func(*resource.ResourceClaim) {
return func(rc *resource.ResourceClaim) {
if len(rc.Spec.Devices.Config) == 0 {
rc.Spec.Devices.Config = append(rc.Spec.Devices.Config, mkDeviceClaimConfiguration())
}
rc.Spec.Devices.Config[0].Requests = append(rc.Spec.Devices.Config[0].Requests, name)
}
}

func tweakFirstAvailable(items int) func(*resource.ResourceClaim) {
return func(rc *resource.ResourceClaim) {
rc.Spec.Devices.Requests[0].Exactly = nil
Expand Down
10 changes: 10 additions & 0 deletions staging/src/k8s.io/api/resource/v1/generated.proto

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions staging/src/k8s.io/api/resource/v1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -725,6 +725,9 @@ type DeviceClaim struct {
//
// +optional
// +listType=atomic
// +k8s:listType=atomic
// +k8s:unique=map
// +k8s:listMapKey=name
// +k8s:maxItems=32
Requests []DeviceRequest `json:"requests" protobuf:"bytes,1,name=requests"`

Expand Down Expand Up @@ -814,6 +817,9 @@ type DeviceRequest struct {
// +oneOf=deviceRequestType
// +listType=atomic
// +featureGate=DRAPrioritizedList
// +k8s:listType=atomic
// +k8s:unique=map
// +k8s:listMapKey=name
// +k8s:maxItems=8
FirstAvailable []DeviceSubRequest `json:"firstAvailable,omitempty" protobuf:"bytes,3,name=firstAvailable"`
}
Expand Down Expand Up @@ -1195,6 +1201,8 @@ type DeviceConstraint struct {
//
// +optional
// +listType=atomic
// +k8s:listType=atomic
// +k8s:unique=set
// +k8s:maxItems=32
Requests []string `json:"requests,omitempty" protobuf:"bytes,1,opt,name=requests"`

Expand Down Expand Up @@ -1253,6 +1261,8 @@ type DeviceClaimConfiguration struct {
//
// +optional
// +listType=atomic
// +k8s:listType=atomic
// +k8s:unique=set
// +k8s:maxItems=32
Requests []string `json:"requests,omitempty" protobuf:"bytes,1,opt,name=requests"`

Expand Down
Loading