mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-01 07:47:56 +00:00
update allocated resources status validation to account for claims
This commit is contained in:
parent
aed81e5d47
commit
5cfaf47448
@ -8260,17 +8260,39 @@ func validateContainerStatusAllocatedResourcesStatus(containerStatuses []core.Co
|
|||||||
// ignore missing container, see https://github.com/kubernetes/kubernetes/issues/124915
|
// ignore missing container, see https://github.com/kubernetes/kubernetes/issues/124915
|
||||||
if containerFound {
|
if containerFound {
|
||||||
found := false
|
found := false
|
||||||
|
var errorStr string
|
||||||
|
|
||||||
// get container resources from the spec
|
if strings.HasPrefix(string(allocatedResource.Name), "claim:") {
|
||||||
containerResources := container.Resources
|
// assume it is a claim name
|
||||||
for resourceName := range containerResources.Requests {
|
|
||||||
|
errorStr = "must match one of the container's resource claims in a format 'claim:<claimName>/<request>' or 'claim:<claimName>' if request is empty"
|
||||||
|
|
||||||
|
for _, c := range container.Resources.Claims {
|
||||||
|
name := "claim:" + c.Name
|
||||||
|
if c.Request != "" {
|
||||||
|
name += "/" + c.Request
|
||||||
|
}
|
||||||
|
|
||||||
|
if name == string(allocatedResource.Name) {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// assume it is a resource name
|
||||||
|
|
||||||
|
errorStr = "must match one of the container's resource requests"
|
||||||
|
|
||||||
|
for resourceName := range container.Resources.Requests {
|
||||||
if resourceName == allocatedResource.Name {
|
if resourceName == allocatedResource.Name {
|
||||||
found = true
|
found = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if !found {
|
if !found {
|
||||||
allErrors = append(allErrors, field.Invalid(fldPath.Index(i).Child("allocatedResourcesStatus").Index(j).Child("name"), allocatedResource.Name, "must match one of the container's resource requirements"))
|
allErrors = append(allErrors, field.Invalid(fldPath.Index(i).Child("allocatedResourcesStatus").Index(j).Child("name"), allocatedResource.Name, errorStr))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24772,7 +24772,109 @@ func TestValidateContainerStatusAllocatedResourcesStatus(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
wantFieldErrors: field.ErrorList{
|
wantFieldErrors: field.ErrorList{
|
||||||
field.Invalid(fldPath.Index(0).Child("allocatedResourcesStatus").Index(1).Child("name"), core.ResourceName("test.device/test2"), "must match one of the container's resource requirements"),
|
field.Invalid(fldPath.Index(0).Child("allocatedResourcesStatus").Index(1).Child("name"), core.ResourceName("test.device/test2"), "must match one of the container's resource requests"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
"allow claims and request that are in spec": {
|
||||||
|
containers: []core.Container{
|
||||||
|
{
|
||||||
|
Name: "container-1",
|
||||||
|
Resources: core.ResourceRequirements{
|
||||||
|
Claims: []core.ResourceClaim{
|
||||||
|
{
|
||||||
|
Name: "claim.name",
|
||||||
|
Request: "request.name",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
containerStatuses: []core.ContainerStatus{
|
||||||
|
{
|
||||||
|
Name: "container-1",
|
||||||
|
AllocatedResourcesStatus: []core.ResourceStatus{
|
||||||
|
{
|
||||||
|
Name: "claim:claim.name/request.name",
|
||||||
|
Resources: []core.ResourceHealth{
|
||||||
|
{
|
||||||
|
ResourceID: "driver/pool/device-name",
|
||||||
|
Health: core.ResourceHealthStatusHealthy,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantFieldErrors: field.ErrorList{},
|
||||||
|
},
|
||||||
|
|
||||||
|
"allow claims that are in spec without the request": {
|
||||||
|
containers: []core.Container{
|
||||||
|
{
|
||||||
|
Name: "container-1",
|
||||||
|
Resources: core.ResourceRequirements{
|
||||||
|
Claims: []core.ResourceClaim{
|
||||||
|
{
|
||||||
|
Name: "claim.name",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
containerStatuses: []core.ContainerStatus{
|
||||||
|
{
|
||||||
|
Name: "container-1",
|
||||||
|
AllocatedResourcesStatus: []core.ResourceStatus{
|
||||||
|
{
|
||||||
|
Name: "claim:claim.name",
|
||||||
|
Resources: []core.ResourceHealth{
|
||||||
|
{
|
||||||
|
ResourceID: "driver/pool/device-name",
|
||||||
|
Health: core.ResourceHealthStatusHealthy,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantFieldErrors: field.ErrorList{},
|
||||||
|
},
|
||||||
|
|
||||||
|
"don't allow claims that are not in spec": {
|
||||||
|
containers: []core.Container{
|
||||||
|
{
|
||||||
|
Name: "container-1",
|
||||||
|
Resources: core.ResourceRequirements{
|
||||||
|
Claims: []core.ResourceClaim{
|
||||||
|
{
|
||||||
|
Name: "other-claim.name",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Requests: core.ResourceList{
|
||||||
|
"claim.name": resource.MustParse("1"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
containerStatuses: []core.ContainerStatus{
|
||||||
|
{
|
||||||
|
Name: "container-1",
|
||||||
|
AllocatedResourcesStatus: []core.ResourceStatus{
|
||||||
|
{
|
||||||
|
Name: "claim:claim.name",
|
||||||
|
Resources: []core.ResourceHealth{
|
||||||
|
{
|
||||||
|
ResourceID: "driver/pool/device-name",
|
||||||
|
Health: core.ResourceHealthStatusHealthy,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantFieldErrors: field.ErrorList{
|
||||||
|
field.Invalid(fldPath.Index(0).Child("allocatedResourcesStatus").Index(0).Child("name"), core.ResourceName("claim:claim.name"), "must match one of the container's resource claims in a format 'claim:<claimName>/<request>' or 'claim:<claimName>' if request is empty"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user