Skip to content

Commit c335a2a

Browse files
author
k8s-merge-robot
authored
Merge pull request kubernetes#29142 from Clarifai/automated-cherry-pick-of-#28743-upstream-release-1.3
Automatic merge from submit-queue Automated cherry pick of kubernetes#28743 Cherry pick of kubernetes#28743 on release-1.3.
2 parents 40f1033 + 4fc720f commit c335a2a

File tree

2 files changed

+28
-11
lines changed

2 files changed

+28
-11
lines changed

Diff for: pkg/api/validation/validation.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -1180,11 +1180,11 @@ func validateContainerResourceDivisor(rName string, divisor resource.Quantity, f
11801180
switch rName {
11811181
case "limits.cpu", "requests.cpu":
11821182
if !validContainerResourceDivisorForCPU.Has(divisor.String()) {
1183-
allErrs = append(allErrs, field.Invalid(fldPath.Child("divisor"), rName, fmt.Sprintf("only divisor's values 1m and 1 are supported with the cpu resource")))
1183+
allErrs = append(allErrs, field.Invalid(fldPath.Child("divisor"), rName, "only divisor's values 1m and 1 are supported with the cpu resource"))
11841184
}
11851185
case "limits.memory", "requests.memory":
11861186
if !validContainerResourceDivisorForMemory.Has(divisor.String()) {
1187-
allErrs = append(allErrs, field.Invalid(fldPath.Child("divisor"), rName, fmt.Sprintf("only divisor's values 1, 1k, 1M, 1G, 1T, 1P, 1E, 1Ki, 1Mi, 1Gi, 1Ti, 1Pi, 1Ei are supported with the memory resource")))
1187+
allErrs = append(allErrs, field.Invalid(fldPath.Child("divisor"), rName, "only divisor's values 1, 1k, 1M, 1G, 1T, 1P, 1E, 1Ki, 1Mi, 1Gi, 1Ti, 1Pi, 1Ei are supported with the memory resource"))
11881188
}
11891189
}
11901190
return allErrs
@@ -2768,11 +2768,11 @@ func ValidateResourceRequirements(requirements *api.ResourceRequirements, fldPat
27682768
// Check that request <= limit.
27692769
requestQuantity, exists := requirements.Requests[resourceName]
27702770
if exists {
2771-
// For GPUs, require that no request be set.
2772-
if resourceName == api.ResourceNvidiaGPU {
2773-
allErrs = append(allErrs, field.Invalid(reqPath, requestQuantity.String(), "cannot be set"))
2771+
// For GPUs, not only requests can't exceed limits, they also can't be lower, i.e. must be equal.
2772+
if resourceName == api.ResourceNvidiaGPU && quantity.Cmp(requestQuantity) != 0 {
2773+
allErrs = append(allErrs, field.Invalid(reqPath, requestQuantity.String(), fmt.Sprintf("must be equal to %s limit", api.ResourceNvidiaGPU)))
27742774
} else if quantity.Cmp(requestQuantity) < 0 {
2775-
allErrs = append(allErrs, field.Invalid(fldPath, quantity.String(), "must be greater than or equal to request"))
2775+
allErrs = append(allErrs, field.Invalid(limPath, quantity.String(), fmt.Sprintf("must be greater than or equal to %s request", resourceName)))
27762776
}
27772777
}
27782778
}
@@ -2936,7 +2936,7 @@ func validateFinalizerName(stringValue string, fldPath *field.Path) field.ErrorL
29362936

29372937
if len(strings.Split(stringValue, "/")) == 1 {
29382938
if !api.IsStandardFinalizerName(stringValue) {
2939-
return append(allErrs, field.Invalid(fldPath, stringValue, fmt.Sprintf("name is neither a standard finalizer name nor is it fully qualified")))
2939+
return append(allErrs, field.Invalid(fldPath, stringValue, "name is neither a standard finalizer name nor is it fully qualified"))
29402940
}
29412941
}
29422942

Diff for: pkg/api/validation/validation_test.go

+21-4
Original file line numberDiff line numberDiff line change
@@ -1503,7 +1503,24 @@ func TestValidateContainers(t *testing.T) {
15031503
ImagePullPolicy: "IfNotPresent",
15041504
},
15051505
{
1506-
Name: "resources-test-with-gpu",
1506+
Name: "resources-test-with-gpu-with-request",
1507+
Image: "image",
1508+
Resources: api.ResourceRequirements{
1509+
Requests: api.ResourceList{
1510+
api.ResourceName(api.ResourceCPU): resource.MustParse("10"),
1511+
api.ResourceName(api.ResourceMemory): resource.MustParse("10G"),
1512+
api.ResourceName(api.ResourceNvidiaGPU): resource.MustParse("1"),
1513+
},
1514+
Limits: api.ResourceList{
1515+
api.ResourceName(api.ResourceCPU): resource.MustParse("10"),
1516+
api.ResourceName(api.ResourceMemory): resource.MustParse("10G"),
1517+
api.ResourceName(api.ResourceNvidiaGPU): resource.MustParse("1"),
1518+
},
1519+
},
1520+
ImagePullPolicy: "IfNotPresent",
1521+
},
1522+
{
1523+
Name: "resources-test-with-gpu-without-request",
15071524
Image: "image",
15081525
Resources: api.ResourceRequirements{
15091526
Requests: api.ResourceList{
@@ -1741,15 +1758,15 @@ func TestValidateContainers(t *testing.T) {
17411758
ImagePullPolicy: "IfNotPresent",
17421759
},
17431760
},
1744-
"Resource can only have GPU limit": {
1761+
"Resource GPU limit must match request": {
17451762
{
1746-
Name: "resources-request-limit-edge",
1763+
Name: "gpu-resource-request-limit",
17471764
Image: "image",
17481765
Resources: api.ResourceRequirements{
17491766
Requests: api.ResourceList{
17501767
api.ResourceName(api.ResourceCPU): resource.MustParse("10"),
17511768
api.ResourceName(api.ResourceMemory): resource.MustParse("10G"),
1752-
api.ResourceName(api.ResourceNvidiaGPU): resource.MustParse("1"),
1769+
api.ResourceName(api.ResourceNvidiaGPU): resource.MustParse("0"),
17531770
},
17541771
Limits: api.ResourceList{
17551772
api.ResourceName(api.ResourceCPU): resource.MustParse("10"),

0 commit comments

Comments
 (0)