api: introduce separate VolumeResourceRequirements struct

PVC and containers shared the same ResourceRequirements struct to define their
API. When resource claims were added, that struct got extended, which
accidentally also changed the PVC API. To avoid such a mistake from happening
again, PVC now uses its own VolumeResourceRequirements struct.

The `Claims` field gets removed because risk of breaking someone is low:
theoretically, YAML files which have a claims field for volumes now
get rejected when validating against the OpenAPI. Such files
have never made sense and should be fixed.

Code that uses the struct definitions needs to be updated.
This commit is contained in:
Patrick Ohly 2023-06-14 10:26:56 +02:00
parent bcbceea117
commit 2472291790
48 changed files with 192 additions and 202 deletions

View file

@ -51,10 +51,6 @@ func DropDisabledFields(pvcSpec, oldPVCSpec *core.PersistentVolumeClaimSpec) {
pvcSpec.DataSourceRef = nil
}
}
// Setting VolumeClaimTemplate.Resources.Claims should have been caught by validation when
// extending ResourceRequirements in 1.26. Now we can only accept it and drop the field.
pvcSpec.Resources.Claims = nil
}
// EnforceDataSourceBackwardsCompatibility drops the data source field under certain conditions

View file

@ -262,10 +262,7 @@ func TestDataSourceFilter(t *testing.T) {
spec: core.PersistentVolumeClaimSpec{DataSourceRef: xnsVolumeDataSourceRef},
oldSpec: core.PersistentVolumeClaimSpec{DataSourceRef: volumeDataSourceRef},
anyEnabled: true,
wantRef: xnsVolumeDataSourceRef, // existing field isn't dropped.
},
"clear Resources.Claims": {
spec: core.PersistentVolumeClaimSpec{Resources: core.ResourceRequirements{Claims: []core.ResourceClaim{{Name: "dra"}}}},
wantRef: xnsVolumeDataSourceRef, // existing field isn't dropped.8
},
}
@ -282,9 +279,6 @@ func TestDataSourceFilter(t *testing.T) {
t.Errorf("expected condition was not met, test: %s, anyEnabled: %v, xnsEnabled: %v, spec: %+v, expected DataSourceRef: %+v",
testName, test.anyEnabled, test.xnsEnabled, test.spec, test.wantRef)
}
if test.spec.Resources.Claims != nil {
t.Errorf("expected Resources.Claims to be cleared")
}
})
}
}
@ -515,7 +509,7 @@ func TestWarnings(t *testing.T) {
name: "200Mi requests no warning",
template: &core.PersistentVolumeClaim{
Spec: core.PersistentVolumeClaimSpec{
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceStorage: resource.MustParse("200Mi"),
},
@ -531,7 +525,7 @@ func TestWarnings(t *testing.T) {
name: "200m warning",
template: &core.PersistentVolumeClaim{
Spec: core.PersistentVolumeClaimSpec{
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceStorage: resource.MustParse("200m"),
},
@ -550,7 +544,7 @@ func TestWarnings(t *testing.T) {
name: "integer no warning",
template: &core.PersistentVolumeClaim{
Spec: core.PersistentVolumeClaimSpec{
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceStorage: resource.MustParse("200"),
},

View file

@ -608,16 +608,6 @@ func dropDisabledDynamicResourceAllocationFields(podSpec, oldPodSpec *api.PodSpe
dropEphemeralResourceClaimRequests(podSpec.EphemeralContainers)
podSpec.ResourceClaims = nil
}
// Setting VolumeClaimTemplate.Resources.Claims should have been
// treated as an error by validation when extending
// ResourceRequirements in 1.26. Now we can only accept it and drop the
// field.
for i := range podSpec.Volumes {
if podSpec.Volumes[i].Ephemeral != nil && podSpec.Volumes[i].Ephemeral.VolumeClaimTemplate != nil {
podSpec.Volumes[i].Ephemeral.VolumeClaimTemplate.Spec.Resources.Claims = nil
}
}
}
func dynamicResourceAllocationInUse(podSpec *api.PodSpec) bool {

View file

@ -1889,44 +1889,6 @@ func TestValidateTopologySpreadConstraintLabelSelectorOption(t *testing.T) {
}
}
func TestDropVolumesClaimField(t *testing.T) {
pod := &api.Pod{
Spec: api.PodSpec{
Volumes: []api.Volume{
{},
{
VolumeSource: api.VolumeSource{
Ephemeral: &api.EphemeralVolumeSource{},
},
},
{
VolumeSource: api.VolumeSource{
Ephemeral: &api.EphemeralVolumeSource{
VolumeClaimTemplate: &api.PersistentVolumeClaimTemplate{
Spec: api.PersistentVolumeClaimSpec{
Resources: api.ResourceRequirements{
Claims: []api.ResourceClaim{
{Name: "dra"},
},
},
},
},
},
},
},
},
},
}
DropDisabledPodFields(pod, nil)
for i, volume := range pod.Spec.Volumes {
if volume.Ephemeral != nil && volume.Ephemeral.VolumeClaimTemplate != nil && volume.Ephemeral.VolumeClaimTemplate.Spec.Resources.Claims != nil {
t.Errorf("volume #%d: Resources.Claim should be nil", i)
}
}
}
func TestDropInPlacePodVerticalScaling(t *testing.T) {
podWithInPlaceVerticalScaling := func() *api.Pod {
return &api.Pod{

View file

@ -504,7 +504,7 @@ func TestWarnings(t *testing.T) {
Spec: api.PodSpec{Volumes: []api.Volume{
{Name: "ephemeral-volume", VolumeSource: api.VolumeSource{Ephemeral: &api.EphemeralVolumeSource{
VolumeClaimTemplate: &api.PersistentVolumeClaimTemplate{
Spec: api.PersistentVolumeClaimSpec{Resources: api.ResourceRequirements{
Spec: api.PersistentVolumeClaimSpec{Resources: api.VolumeResourceRequirements{
Requests: api.ResourceList{api.ResourceStorage: resource.MustParse("200Mi")}}},
},
}}}}},
@ -518,7 +518,7 @@ func TestWarnings(t *testing.T) {
Spec: api.PodSpec{Volumes: []api.Volume{
{Name: "ephemeral-volume", VolumeSource: api.VolumeSource{Ephemeral: &api.EphemeralVolumeSource{
VolumeClaimTemplate: &api.PersistentVolumeClaimTemplate{
Spec: api.PersistentVolumeClaimSpec{Resources: api.ResourceRequirements{
Spec: api.PersistentVolumeClaimSpec{Resources: api.VolumeResourceRequirements{
Requests: api.ResourceList{api.ResourceStorage: resource.MustParse("200m")}}},
},
}}}}},

View file

@ -781,7 +781,7 @@ func TestValidateStatefulSetUpdate(t *testing.T) {
},
Spec: api.PersistentVolumeClaimSpec{
StorageClassName: &storageClass,
Resources: api.ResourceRequirements{
Resources: api.VolumeResourceRequirements{
Requests: api.ResourceList{
api.ResourceStorage: resource.MustParse("1Gi"),
},
@ -800,7 +800,7 @@ func TestValidateStatefulSetUpdate(t *testing.T) {
},
Spec: api.PersistentVolumeClaimSpec{
StorageClassName: &storageClass2,
Resources: api.ResourceRequirements{
Resources: api.VolumeResourceRequirements{
Requests: api.ResourceList{
api.ResourceStorage: resource.MustParse("2Gi"),
},

View file

@ -440,7 +440,7 @@ type PersistentVolumeClaimSpec struct {
// that are lower than previous value but must still be higher than capacity recorded in the
// status field of the claim.
// +optional
Resources ResourceRequirements
Resources VolumeResourceRequirements
// VolumeName is the binding reference to the PersistentVolume backing this
// claim. When set to non-empty value Selector is not evaluated
// +optional
@ -2282,6 +2282,18 @@ type ResourceRequirements struct {
Claims []ResourceClaim
}
// VolumeResourceRequirements describes the storage resource requirements for a volume.
type VolumeResourceRequirements struct {
// Limits describes the maximum amount of compute resources allowed.
// +optional
Limits ResourceList
// Requests describes the minimum amount of compute resources required.
// If Request is omitted for a container, it defaults to Limits if that is explicitly specified,
// otherwise to an implementation-defined value
// +optional
Requests ResourceList
}
// ResourceClaim references one entry in PodSpec.ResourceClaims.
type ResourceClaim struct {
// Name must match the name of one entry in pod.spec.resourceClaims of

View file

@ -1479,7 +1479,7 @@ func testVolumeSnapshotDataSourceInSpec(name string, kind string, apiGroup strin
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -1565,7 +1565,7 @@ func testValidatePVC(t *testing.T, ephemeral bool) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -1722,7 +1722,7 @@ func testValidatePVC(t *testing.T, ephemeral bool) {
enableReadWriteOncePod: true,
claim: testVolumeClaim(goodName, goodNS, core.PersistentVolumeClaimSpec{
AccessModes: []core.PersistentVolumeAccessMode{"ReadWriteOncePod"},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -1734,7 +1734,7 @@ func testValidatePVC(t *testing.T, ephemeral bool) {
enableReadWriteOncePod: false,
claim: testVolumeClaim(goodName, goodNS, core.PersistentVolumeClaimSpec{
AccessModes: []core.PersistentVolumeAccessMode{"ReadWriteOncePod"},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -1746,7 +1746,7 @@ func testValidatePVC(t *testing.T, ephemeral bool) {
enableReadWriteOncePod: true,
claim: testVolumeClaim(goodName, goodNS, core.PersistentVolumeClaimSpec{
AccessModes: []core.PersistentVolumeAccessMode{"ReadWriteOncePod", "ReadWriteMany"},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -1766,7 +1766,7 @@ func testValidatePVC(t *testing.T, ephemeral bool) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("0G"),
},
@ -1788,7 +1788,7 @@ func testValidatePVC(t *testing.T, ephemeral bool) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -1799,7 +1799,7 @@ func testValidatePVC(t *testing.T, ephemeral bool) {
isExpectedFailure: true,
claim: testVolumeClaim(goodName, goodNS, core.PersistentVolumeClaimSpec{
AccessModes: []core.PersistentVolumeAccessMode{"fakemode"},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -1809,7 +1809,7 @@ func testValidatePVC(t *testing.T, ephemeral bool) {
"no-access-modes": {
isExpectedFailure: true,
claim: testVolumeClaim(goodName, goodNS, core.PersistentVolumeClaimSpec{
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -1830,7 +1830,7 @@ func testValidatePVC(t *testing.T, ephemeral bool) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadWriteOnce,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceMemory): resource.MustParse("10G"),
},
@ -1850,7 +1850,7 @@ func testValidatePVC(t *testing.T, ephemeral bool) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("-10G"),
},
@ -1870,7 +1870,7 @@ func testValidatePVC(t *testing.T, ephemeral bool) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("0G"),
},
@ -1890,7 +1890,7 @@ func testValidatePVC(t *testing.T, ephemeral bool) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -1905,7 +1905,7 @@ func testValidatePVC(t *testing.T, ephemeral bool) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -1919,7 +1919,7 @@ func testValidatePVC(t *testing.T, ephemeral bool) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadWriteOnce,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2063,7 +2063,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2076,7 +2076,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2086,7 +2086,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2097,7 +2097,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2109,7 +2109,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("20G"),
},
@ -2120,7 +2120,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadWriteOnce,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2132,7 +2132,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
core.ReadWriteOnce,
},
VolumeMode: &file,
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2144,7 +2144,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
core.ReadWriteOnce,
},
VolumeMode: &block,
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2156,7 +2156,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
core.ReadWriteOnce,
},
VolumeMode: nil,
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2167,7 +2167,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2178,7 +2178,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2190,7 +2190,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2202,7 +2202,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("15G"),
},
@ -2216,7 +2216,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("5G"),
},
@ -2230,7 +2230,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("12G"),
},
@ -2243,7 +2243,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2254,7 +2254,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2265,7 +2265,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2276,7 +2276,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2288,7 +2288,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2300,7 +2300,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2312,7 +2312,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2323,7 +2323,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadWriteOncePod,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2335,7 +2335,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadWriteOncePod,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -2347,7 +2347,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("15G"),
},
@ -2364,7 +2364,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("12G"),
},
@ -2381,7 +2381,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceStorage: resource.MustParse("13G"),
},
@ -2398,7 +2398,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceStorage: resource.MustParse("10G"),
},
@ -2415,7 +2415,7 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceStorage: resource.MustParse("3G"),
},
@ -5346,7 +5346,7 @@ func createTestVolModePVC(vmode *core.PersistentVolumeMode) *core.PersistentVolu
Namespace: "default",
},
Spec: core.PersistentVolumeClaimSpec{
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -6125,7 +6125,7 @@ func TestValidateVolumeMounts(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadWriteOnce,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -6433,7 +6433,7 @@ func TestAlphaValidateVolumeDevices(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadWriteOnce,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -9418,7 +9418,7 @@ func TestValidatePod(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadWriteOnce,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -18416,7 +18416,7 @@ func TestValidatePersistentVolumeClaimStatusUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -18427,7 +18427,7 @@ func TestValidatePersistentVolumeClaimStatusUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -18443,7 +18443,7 @@ func TestValidatePersistentVolumeClaimStatusUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -18463,7 +18463,7 @@ func TestValidatePersistentVolumeClaimStatusUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -18482,7 +18482,7 @@ func TestValidatePersistentVolumeClaimStatusUpdate(t *testing.T) {
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadWriteOnce,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -18599,7 +18599,7 @@ func TestValidatePersistentVolumeClaimStatusUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -18619,7 +18619,7 @@ func TestValidatePersistentVolumeClaimStatusUpdate(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -21147,7 +21147,7 @@ func testDataSourceInSpec(name, kind, apiGroup string) *core.PersistentVolumeCla
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},
@ -21272,7 +21272,7 @@ func pvcSpecWithCrossNamespaceSource(apiGroup *string, kind string, namespace *s
AccessModes: []core.PersistentVolumeAccessMode{
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
},

View file

@ -26,7 +26,7 @@ import (
"time"
apps "k8s.io/api/apps/v1"
"k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes/fake"
clientscheme "k8s.io/client-go/kubernetes/scheme"
@ -1679,7 +1679,7 @@ func newStatefulSet(replicas int, name string, uid types.UID, labels map[string]
{
ObjectMeta: metav1.ObjectMeta{Name: "datadir"},
Spec: v1.PersistentVolumeClaimSpec{
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceStorage: *resource.NewQuantity(1, resource.BinarySI),
},

View file

@ -788,7 +788,7 @@ func newPVC(name string) v1.PersistentVolumeClaim {
Name: name,
},
Spec: v1.PersistentVolumeClaimSpec{
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceStorage: *resource.NewQuantity(1, resource.BinarySI),
},
@ -933,7 +933,7 @@ func newStatefulSetWithLabels(replicas int, name string, uid types.UID, labels m
{
ObjectMeta: metav1.ObjectMeta{Namespace: "default", Name: "datadir"},
Spec: v1.PersistentVolumeClaimSpec{
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceStorage: *resource.NewQuantity(1, resource.BinarySI),
},

View file

@ -78,7 +78,7 @@ func TestVolumesInUseMetricCollection(t *testing.T) {
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadOnlyMany, v1.ReadWriteOnce},
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse("2G"),
},

View file

@ -205,7 +205,7 @@ func getFakePersistentVolumeClaim(pvcName, volumeName, statusSize, requestSize s
pvc := &v1.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{Name: pvcName, Namespace: "default", UID: uid},
Spec: v1.PersistentVolumeClaimSpec{
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: map[v1.ResourceName]resource.Quantity{
v1.ResourceStorage: resource.MustParse(requestSize),
},

View file

@ -457,7 +457,7 @@ func newClaim(name, claimUID, capacity, boundToVolume string, phase v1.Persisten
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce, v1.ReadOnlyMany},
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse(capacity),
},

View file

@ -38,7 +38,7 @@ func makePVC(size string, modfn func(*v1.PersistentVolumeClaim)) *v1.PersistentV
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadOnlyMany, v1.ReadWriteOnce},
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse(size),
},
@ -61,7 +61,7 @@ func makeVolumeModePVC(size string, mode *v1.PersistentVolumeMode, modfn func(*v
Spec: v1.PersistentVolumeClaimSpec{
VolumeMode: mode,
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse(size),
},
@ -251,7 +251,7 @@ func TestMatchingWithBoundVolumes(t *testing.T) {
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadOnlyMany, v1.ReadWriteOnce},
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse("1G"),
},
@ -387,7 +387,7 @@ func TestFindingVolumeWithDifferentAccessModes(t *testing.T) {
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
Resources: v1.ResourceRequirements{Requests: v1.ResourceList{v1.ResourceName(v1.ResourceStorage): resource.MustParse("1G")}},
Resources: v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceName(v1.ResourceStorage): resource.MustParse("1G")}},
VolumeMode: &fs,
},
}
@ -1236,7 +1236,7 @@ func TestStorageObjectInUseProtectionFiltering(t *testing.T) {
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
Resources: v1.ResourceRequirements{Requests: v1.ResourceList{v1.ResourceName(v1.ResourceStorage): resource.MustParse("1G")}},
Resources: v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceName(v1.ResourceStorage): resource.MustParse("1G")}},
VolumeMode: &fs,
},
}
@ -1318,7 +1318,7 @@ func TestFindingPreboundVolumes(t *testing.T) {
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
Resources: v1.ResourceRequirements{Requests: v1.ResourceList{v1.ResourceName(v1.ResourceStorage): resource.MustParse("1Gi")}},
Resources: v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceName(v1.ResourceStorage): resource.MustParse("1Gi")}},
VolumeMode: &fs,
},
}

View file

@ -1295,7 +1295,7 @@ func TestCheckVolumeSELinux(t *testing.T) {
pvc := &v1.PersistentVolumeClaim{
Spec: v1.PersistentVolumeClaimSpec{
VolumeName: pv.Name,
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: pv.Spec.Capacity,
},
AccessModes: tc.accessModes,
@ -1392,7 +1392,7 @@ func createResizeRelatedVolumes(volumeMode *v1.PersistentVolumeMode) (pv *v1.Per
pvc = &v1.PersistentVolumeClaim{
Spec: v1.PersistentVolumeClaimSpec{
VolumeName: pv.Name,
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: pv.Spec.Capacity,
},
},
@ -1561,7 +1561,7 @@ func createEphemeralVolumeObjects(podName, volumeName string, owned bool, volume
},
Spec: v1.PersistentVolumeClaimSpec{
VolumeName: volumeName,
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: pv.Spec.Capacity,
},
},

View file

@ -1395,7 +1395,7 @@ func getTestPVC(pvName string, volumeMode *v1.PersistentVolumeMode, specSize, st
UID: "pvcuid",
},
Spec: v1.PersistentVolumeClaimSpec{
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceStorage: specSize,
},

View file

@ -54,7 +54,7 @@ func TestPersistentVolumeClaimEvaluatorUsage(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10Gi"),
},
@ -73,7 +73,7 @@ func TestPersistentVolumeClaimEvaluatorUsage(t *testing.T) {
core.ReadWriteOnce,
core.ReadOnlyMany,
},
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceName(core.ResourceStorage): resource.MustParse("10Gi"),
},
@ -170,7 +170,7 @@ func TestPersistentVolumeClaimEvaluatorUsage(t *testing.T) {
func getPVCWithAllocatedResource(pvcSize, allocatedSize string) *core.PersistentVolumeClaim {
validPVCWithAllocatedResources := testVolumeClaim("foo", "ns", core.PersistentVolumeClaimSpec{
Resources: core.ResourceRequirements{
Resources: core.VolumeResourceRequirements{
Requests: core.ResourceList{
core.ResourceStorage: resource.MustParse(pvcSize),
},

View file

@ -62,7 +62,7 @@ func validNewPersistentVolumeClaim(name, ns string) *api.PersistentVolumeClaim {
},
Spec: api.PersistentVolumeClaimSpec{
AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce},
Resources: api.ResourceRequirements{
Resources: api.VolumeResourceRequirements{
Requests: api.ResourceList{
api.ResourceName(api.ResourceStorage): resource.MustParse("10G"),
},
@ -178,7 +178,7 @@ func TestUpdateStatus(t *testing.T) {
},
Spec: api.PersistentVolumeClaimSpec{
AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce},
Resources: api.ResourceRequirements{
Resources: api.VolumeResourceRequirements{
Requests: api.ResourceList{
api.ResourceName(api.ResourceStorage): resource.MustParse("3Gi"),
},

View file

@ -627,7 +627,7 @@ func makeTestPVC(name, size, node string, pvcBoundState int, pvName, resourceVer
ResourceVersion: resourceVersion,
},
Spec: v1.PersistentVolumeClaimSpec{
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse(size),
},

View file

@ -127,7 +127,7 @@ func (pvcb pvcBuilder) withBoundPV(pvName string) pvcBuilder {
}
func (pvcb pvcBuilder) withRequestStorage(request resource.Quantity) pvcBuilder {
pvcb.PersistentVolumeClaim.Spec.Resources = v1.ResourceRequirements{
pvcb.PersistentVolumeClaim.Spec.Resources = v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): request,
},

View file

@ -801,7 +801,7 @@ func (p *PersistentVolumeClaimWrapper) AccessModes(accessModes []v1.PersistentVo
// Resources sets `resources` as the resource requirements of the inner
// PersistentVolumeClaim.
func (p *PersistentVolumeClaimWrapper) Resources(resources v1.ResourceRequirements) *PersistentVolumeClaimWrapper {
func (p *PersistentVolumeClaimWrapper) Resources(resources v1.VolumeResourceRequirements) *PersistentVolumeClaimWrapper {
p.PersistentVolumeClaim.Spec.Resources = resources
return p
}

View file

@ -18,7 +18,6 @@ package testing
import (
"fmt"
"k8s.io/klog/v2"
"os"
"path/filepath"
goruntime "runtime"
@ -27,6 +26,8 @@ import (
"testing"
"time"
"k8s.io/klog/v2"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/utils/exec"
testingexec "k8s.io/utils/exec/testing"
@ -1706,7 +1707,7 @@ func CreateTestPVC(capacity string, accessModes []v1.PersistentVolumeAccessMode)
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: accessModes,
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse(capacity),
},

View file

@ -350,7 +350,7 @@ func getTestPVC(volumeName string, specSize, statusSize, allocatedSize string, r
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
Resources: v1.ResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse(specSize)}},
Resources: v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse(specSize)}},
VolumeName: volumeName,
},
Status: v1.PersistentVolumeClaimStatus{

View file

@ -264,7 +264,7 @@ func makePVC(conditions []v1.PersistentVolumeClaimCondition) pvcModifier {
v1.ReadWriteOnce,
v1.ReadOnlyMany,
},
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse("2Gi"),
},

View file

@ -69,6 +69,13 @@ func getResourceRequirements(requests, limits api.ResourceList) api.ResourceRequ
return res
}
func getVolumeResourceRequirements(requests, limits api.ResourceList) api.VolumeResourceRequirements {
res := api.VolumeResourceRequirements{}
res.Requests = requests
res.Limits = limits
return res
}
// createLimitRange creates a limit range with the specified data
func createLimitRange(limitType api.LimitType, min, max, defaultLimit, defaultRequest, maxLimitRequestRatio api.ResourceList) corev1.LimitRange {
internalLimitRage := api.LimitRange{
@ -816,7 +823,7 @@ func newHandlerForTest(c clientset.Interface) (*LimitRanger, informers.SharedInf
return handler, f, err
}
func validPersistentVolumeClaim(name string, resources api.ResourceRequirements) api.PersistentVolumeClaim {
func validPersistentVolumeClaim(name string, resources api.VolumeResourceRequirements) api.PersistentVolumeClaim {
pvc := api.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: "test"},
Spec: api.PersistentVolumeClaimSpec{
@ -834,19 +841,19 @@ func TestPersistentVolumeClaimLimitFunc(t *testing.T) {
successCases := []testCase{
{
pvc: validPersistentVolumeClaim("pvc-is-min-storage-request", getResourceRequirements(getStorageResourceList("1Gi"), getStorageResourceList(""))),
pvc: validPersistentVolumeClaim("pvc-is-min-storage-request", getVolumeResourceRequirements(getStorageResourceList("1Gi"), getStorageResourceList(""))),
limitRange: createLimitRange(api.LimitTypePersistentVolumeClaim, getStorageResourceList("1Gi"), api.ResourceList{}, api.ResourceList{}, api.ResourceList{}, api.ResourceList{}),
},
{
pvc: validPersistentVolumeClaim("pvc-is-max-storage-request", getResourceRequirements(getStorageResourceList("1Gi"), getStorageResourceList(""))),
pvc: validPersistentVolumeClaim("pvc-is-max-storage-request", getVolumeResourceRequirements(getStorageResourceList("1Gi"), getStorageResourceList(""))),
limitRange: createLimitRange(api.LimitTypePersistentVolumeClaim, api.ResourceList{}, getStorageResourceList("1Gi"), api.ResourceList{}, api.ResourceList{}, api.ResourceList{}),
},
{
pvc: validPersistentVolumeClaim("pvc-no-minmax-storage-request", getResourceRequirements(getStorageResourceList("100Gi"), getStorageResourceList(""))),
pvc: validPersistentVolumeClaim("pvc-no-minmax-storage-request", getVolumeResourceRequirements(getStorageResourceList("100Gi"), getStorageResourceList(""))),
limitRange: createLimitRange(api.LimitTypePersistentVolumeClaim, getStorageResourceList(""), getStorageResourceList(""), api.ResourceList{}, api.ResourceList{}, api.ResourceList{}),
},
{
pvc: validPersistentVolumeClaim("pvc-within-minmax-storage-request", getResourceRequirements(getStorageResourceList("5Gi"), getStorageResourceList(""))),
pvc: validPersistentVolumeClaim("pvc-within-minmax-storage-request", getVolumeResourceRequirements(getStorageResourceList("5Gi"), getStorageResourceList(""))),
limitRange: createLimitRange(api.LimitTypePersistentVolumeClaim, getStorageResourceList("1Gi"), getStorageResourceList("10Gi"), api.ResourceList{}, api.ResourceList{}, api.ResourceList{}),
},
}
@ -860,11 +867,11 @@ func TestPersistentVolumeClaimLimitFunc(t *testing.T) {
errorCases := []testCase{
{
pvc: validPersistentVolumeClaim("pvc-below-min-storage-request", getResourceRequirements(getStorageResourceList("500Mi"), getStorageResourceList(""))),
pvc: validPersistentVolumeClaim("pvc-below-min-storage-request", getVolumeResourceRequirements(getStorageResourceList("500Mi"), getStorageResourceList(""))),
limitRange: createLimitRange(api.LimitTypePersistentVolumeClaim, getStorageResourceList("1Gi"), api.ResourceList{}, api.ResourceList{}, api.ResourceList{}, api.ResourceList{}),
},
{
pvc: validPersistentVolumeClaim("pvc-exceeds-max-storage-request", getResourceRequirements(getStorageResourceList("100Gi"), getStorageResourceList(""))),
pvc: validPersistentVolumeClaim("pvc-exceeds-max-storage-request", getVolumeResourceRequirements(getStorageResourceList("100Gi"), getStorageResourceList(""))),
limitRange: createLimitRange(api.LimitTypePersistentVolumeClaim, getStorageResourceList("1Gi"), getStorageResourceList("1Gi"), api.ResourceList{}, api.ResourceList{}, api.ResourceList{}),
},
}

View file

@ -1552,7 +1552,7 @@ func makeTestPVC(
pvc := &api.PersistentVolumeClaim{
Spec: api.PersistentVolumeClaimSpec{
VolumeName: "volume1",
Resources: api.ResourceRequirements{
Resources: api.VolumeResourceRequirements{
Requests: api.ResourceList{
api.ResourceStorage: resource.MustParse("10G"),
},

View file

@ -62,6 +62,13 @@ func getResourceRequirements(requests, limits api.ResourceList) api.ResourceRequ
return res
}
func getVolumeResourceRequirements(requests, limits api.ResourceList) api.VolumeResourceRequirements {
res := api.VolumeResourceRequirements{}
res.Requests = requests
res.Limits = limits
return res
}
func validPod(name string, numContainers int, resources api.ResourceRequirements) *api.Pod {
pod := &api.Pod{
ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: "test"},
@ -85,7 +92,7 @@ func validPodWithPriority(name string, numContainers int, resources api.Resource
return pod
}
func validPersistentVolumeClaim(name string, resources api.ResourceRequirements) *api.PersistentVolumeClaim {
func validPersistentVolumeClaim(name string, resources api.VolumeResourceRequirements) *api.PersistentVolumeClaim {
return &api.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: "test"},
Spec: api.PersistentVolumeClaimSpec{
@ -426,14 +433,14 @@ func TestAdmitHandlesNegativePVCUpdates(t *testing.T) {
oldPVC := &api.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{Name: "pvc-to-update", Namespace: "test", ResourceVersion: "1"},
Spec: api.PersistentVolumeClaimSpec{
Resources: getResourceRequirements(api.ResourceList{api.ResourceStorage: resource.MustParse("10Gi")}, api.ResourceList{}),
Resources: getVolumeResourceRequirements(api.ResourceList{api.ResourceStorage: resource.MustParse("10Gi")}, api.ResourceList{}),
},
}
newPVC := &api.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{Name: "pvc-to-update", Namespace: "test"},
Spec: api.PersistentVolumeClaimSpec{
Resources: getResourceRequirements(api.ResourceList{api.ResourceStorage: resource.MustParse("5Gi")}, api.ResourceList{}),
Resources: getVolumeResourceRequirements(api.ResourceList{api.ResourceStorage: resource.MustParse("5Gi")}, api.ResourceList{}),
},
}
@ -478,14 +485,14 @@ func TestAdmitHandlesPVCUpdates(t *testing.T) {
oldPVC := &api.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{Name: "pvc-to-update", Namespace: "test", ResourceVersion: "1"},
Spec: api.PersistentVolumeClaimSpec{
Resources: getResourceRequirements(api.ResourceList{api.ResourceStorage: resource.MustParse("10Gi")}, api.ResourceList{}),
Resources: getVolumeResourceRequirements(api.ResourceList{api.ResourceStorage: resource.MustParse("10Gi")}, api.ResourceList{}),
},
}
newPVC := &api.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{Name: "pvc-to-update", Namespace: "test"},
Spec: api.PersistentVolumeClaimSpec{
Resources: getResourceRequirements(api.ResourceList{api.ResourceStorage: resource.MustParse("15Gi")}, api.ResourceList{}),
Resources: getVolumeResourceRequirements(api.ResourceList{api.ResourceStorage: resource.MustParse("15Gi")}, api.ResourceList{}),
},
}
@ -1069,14 +1076,14 @@ func TestAdmitRejectsNegativeUsage(t *testing.T) {
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
// verify quota rejects negative pvc storage requests
newPvc := validPersistentVolumeClaim("not-allowed-pvc", getResourceRequirements(api.ResourceList{api.ResourceStorage: resource.MustParse("-1Gi")}, api.ResourceList{}))
newPvc := validPersistentVolumeClaim("not-allowed-pvc", getVolumeResourceRequirements(api.ResourceList{api.ResourceStorage: resource.MustParse("-1Gi")}, api.ResourceList{}))
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPvc, nil, api.Kind("PersistentVolumeClaim").WithVersion("version"), newPvc.Namespace, newPvc.Name, corev1.Resource("persistentvolumeclaims").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
if err == nil {
t.Errorf("Expected an error because the pvc has negative storage usage")
}
// verify quota accepts non-negative pvc storage requests
newPvc = validPersistentVolumeClaim("not-allowed-pvc", getResourceRequirements(api.ResourceList{api.ResourceStorage: resource.MustParse("1Gi")}, api.ResourceList{}))
newPvc = validPersistentVolumeClaim("not-allowed-pvc", getVolumeResourceRequirements(api.ResourceList{api.ResourceStorage: resource.MustParse("1Gi")}, api.ResourceList{}))
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPvc, nil, api.Kind("PersistentVolumeClaim").WithVersion("version"), newPvc.Namespace, newPvc.Name, corev1.Resource("persistentvolumeclaims").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
if err != nil {
t.Errorf("Unexpected error: %v", err)

View file

@ -88,7 +88,7 @@ func TestPVCResizeAdmission(t *testing.T) {
oldObj: &api.PersistentVolumeClaim{
Spec: api.PersistentVolumeClaimSpec{
VolumeName: "volume1",
Resources: api.ResourceRequirements{
Resources: api.VolumeResourceRequirements{
Requests: getResourceList("1Gi"),
},
StorageClassName: &goldClassName,
@ -101,7 +101,7 @@ func TestPVCResizeAdmission(t *testing.T) {
newObj: &api.PersistentVolumeClaim{
Spec: api.PersistentVolumeClaimSpec{
VolumeName: "volume1",
Resources: api.ResourceRequirements{
Resources: api.VolumeResourceRequirements{
Requests: getResourceList("2Gi"),
},
StorageClassName: &goldClassName,
@ -119,7 +119,7 @@ func TestPVCResizeAdmission(t *testing.T) {
oldObj: &api.PersistentVolumeClaim{
Spec: api.PersistentVolumeClaimSpec{
VolumeName: "volume3",
Resources: api.ResourceRequirements{
Resources: api.VolumeResourceRequirements{
Requests: getResourceList("1Gi"),
},
},
@ -131,7 +131,7 @@ func TestPVCResizeAdmission(t *testing.T) {
newObj: &api.PersistentVolumeClaim{
Spec: api.PersistentVolumeClaimSpec{
VolumeName: "volume3",
Resources: api.ResourceRequirements{
Resources: api.VolumeResourceRequirements{
Requests: getResourceList("2Gi"),
},
},
@ -148,7 +148,7 @@ func TestPVCResizeAdmission(t *testing.T) {
oldObj: &api.PersistentVolumeClaim{
Spec: api.PersistentVolumeClaimSpec{
VolumeName: "volume4",
Resources: api.ResourceRequirements{
Resources: api.VolumeResourceRequirements{
Requests: getResourceList("1Gi"),
},
StorageClassName: &silverClassName,
@ -161,7 +161,7 @@ func TestPVCResizeAdmission(t *testing.T) {
newObj: &api.PersistentVolumeClaim{
Spec: api.PersistentVolumeClaimSpec{
VolumeName: "volume4",
Resources: api.ResourceRequirements{
Resources: api.VolumeResourceRequirements{
Requests: getResourceList("2Gi"),
},
StorageClassName: &silverClassName,
@ -178,7 +178,7 @@ func TestPVCResizeAdmission(t *testing.T) {
resource: api.SchemeGroupVersion.WithResource("persistentvolumeclaims"),
oldObj: &api.PersistentVolumeClaim{
Spec: api.PersistentVolumeClaimSpec{
Resources: api.ResourceRequirements{
Resources: api.VolumeResourceRequirements{
Requests: getResourceList("1Gi"),
},
StorageClassName: &silverClassName,
@ -191,7 +191,7 @@ func TestPVCResizeAdmission(t *testing.T) {
newObj: &api.PersistentVolumeClaim{
Spec: api.PersistentVolumeClaimSpec{
VolumeName: "volume4",
Resources: api.ResourceRequirements{
Resources: api.VolumeResourceRequirements{
Requests: getResourceList("1Gi"),
},
StorageClassName: &silverClassName,
@ -208,7 +208,7 @@ func TestPVCResizeAdmission(t *testing.T) {
resource: api.SchemeGroupVersion.WithResource("persistentvolumeclaims"),
oldObj: &api.PersistentVolumeClaim{
Spec: api.PersistentVolumeClaimSpec{
Resources: api.ResourceRequirements{
Resources: api.VolumeResourceRequirements{
Requests: getResourceList("1Gi"),
},
StorageClassName: &silverClassName,
@ -220,7 +220,7 @@ func TestPVCResizeAdmission(t *testing.T) {
},
newObj: &api.PersistentVolumeClaim{
Spec: api.PersistentVolumeClaimSpec{
Resources: api.ResourceRequirements{
Resources: api.VolumeResourceRequirements{
Requests: getResourceList("2Gi"),
},
StorageClassName: &silverClassName,

View file

@ -486,7 +486,7 @@ type PersistentVolumeClaimSpec struct {
// status field of the claim.
// More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
// +optional
Resources ResourceRequirements `json:"resources,omitempty" protobuf:"bytes,2,opt,name=resources"`
Resources VolumeResourceRequirements `json:"resources,omitempty" protobuf:"bytes,2,opt,name=resources"`
// volumeName is the binding reference to the PersistentVolume backing this claim.
// +optional
VolumeName string `json:"volumeName,omitempty" protobuf:"bytes,3,opt,name=volumeName"`
@ -2417,6 +2417,27 @@ type ResourceRequirements struct {
Claims []ResourceClaim `json:"claims,omitempty" protobuf:"bytes,3,opt,name=claims"`
}
// VolumeResourceRequirements describes the storage resource requirements for a volume.
type VolumeResourceRequirements struct {
// Limits describes the maximum amount of compute resources allowed.
// More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
// +optional
Limits ResourceList `json:"limits,omitempty" protobuf:"bytes,1,rep,name=limits,casttype=ResourceList,castkey=ResourceName"`
// Requests describes the minimum amount of compute resources required.
// If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,
// otherwise to an implementation-defined value. Requests cannot exceed Limits.
// More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
// +optional
Requests ResourceList `json:"requests,omitempty" protobuf:"bytes,2,rep,name=requests,casttype=ResourceList,castkey=ResourceName"`
// Claims got added by accident when volumes shared the ResourceRequirements struct
// with containers. Stripping the field got added in 1.27 and was backported to 1.26.
// Starting with Kubernetes 1.28, this field is not part of the volume API anymore.
//
// Future extensions must not use "claims" or field number 3.
// Claims []ResourceClaim `json:"claims,omitempty" protobuf:"bytes,3,opt,name=claims"`
}
// ResourceClaim references one entry in PodSpec.ResourceClaims.
type ResourceClaim struct {
// Name must match the name of one entry in pod.spec.resourceClaims of

View file

@ -270,7 +270,7 @@ func makeTestPersistentVolumeClaim(name string, size string, accessMode []v1.Per
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: accessMode,
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse(size),
},

View file

@ -1977,7 +1977,7 @@ func newTestPersistentVolumeClaimForQuota(name string) *v1.PersistentVolumeClaim
v1.ReadWriteOnce,
v1.ReadOnlyMany,
},
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse("1Gi"),
},

View file

@ -648,7 +648,7 @@ func MakePersistentVolumeClaim(cfg PersistentVolumeClaimConfig, ns string) *v1.P
Spec: v1.PersistentVolumeClaimSpec{
Selector: cfg.Selector,
AccessModes: cfg.AccessModes,
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceStorage: resource.MustParse(cfg.ClaimSize),
},

View file

@ -105,7 +105,7 @@ func NewStatefulSetPVC(name string) v1.PersistentVolumeClaim {
AccessModes: []v1.PersistentVolumeAccessMode{
v1.ReadWriteOnce,
},
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceStorage: *resource.NewQuantity(1, resource.BinarySI),
},

View file

@ -155,7 +155,7 @@ func createEphemeralVolumeSource(scName string, volMode v1.PersistentVolumeMode,
StorageClassName: &scName,
AccessModes: accessModes,
VolumeMode: &volMode,
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceStorage: resource.MustParse(claimSize),
},

View file

@ -1069,7 +1069,7 @@ func newLocalClaimWithName(config *localTestConfig, name string) *v1.PersistentV
AccessModes: []v1.PersistentVolumeAccessMode{
v1.ReadWriteOnce,
},
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse(testRequestSize),
},

View file

@ -523,7 +523,7 @@ func GenericEphemeralVolumesEnabled(ctx context.Context, c clientset.Interface,
Spec: v1.PersistentVolumeClaimSpec{
StorageClassName: &storageClassName,
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceStorage: resource.MustParse("1Gi"),
},

View file

@ -183,7 +183,7 @@ func getVSpherePersistentVolumeClaimSpec(namespace string, labels map[string]str
AccessModes: []v1.PersistentVolumeAccessMode{
v1.ReadWriteOnce,
},
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse("2Gi"),
},
@ -252,7 +252,7 @@ func getVSphereClaimSpecWithStorageClass(ns string, diskSize string, storageclas
AccessModes: []v1.PersistentVolumeAccessMode{
v1.ReadWriteOnce,
},
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse(diskSize),
},

View file

@ -129,7 +129,7 @@ func TestNodeAuthorizer(t *testing.T) {
ObjectMeta: metav1.ObjectMeta{Name: "mypvc"},
Spec: corev1.PersistentVolumeClaimSpec{
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadOnlyMany},
Resources: corev1.ResourceRequirements{Requests: corev1.ResourceList{corev1.ResourceStorage: resource.MustParse("1")}},
Resources: corev1.VolumeResourceRequirements{Requests: corev1.ResourceList{corev1.ResourceStorage: resource.MustParse("1")}},
},
}, metav1.CreateOptions{}); err != nil {
t.Fatal(err)

View file

@ -67,7 +67,7 @@ func test_UpgradePVC(t *testing.T, featureEnabled bool) {
UID: "08675309-9376-9376-9376-086753099999",
},
Spec: v1.PersistentVolumeClaimSpec{
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse("10G"),
},

View file

@ -1710,7 +1710,7 @@ func TestUnschedulablePodBecomesSchedulable(t *testing.T) {
return fmt.Errorf("cannot create node: %v", err)
}
storage := v1.ResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}}
storage := v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}}
volType := v1.HostPathDirectoryOrCreate
pv, err := testutils.CreatePV(cs, st.MakePersistentVolume().
Name("pv-with-read-write-once-pod").

View file

@ -1677,7 +1677,7 @@ func TestReadWriteOncePodPreemption(t *testing.T) {
cs := testCtx.ClientSet
storage := v1.ResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}}
storage := v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}}
volType := v1.HostPathDirectoryOrCreate
pv1 := st.MakePersistentVolume().
Name("pv-with-read-write-once-pod-1").

View file

@ -151,7 +151,7 @@ func newStatefulSetPVC(name string) v1.PersistentVolumeClaim {
AccessModes: []v1.PersistentVolumeAccessMode{
v1.ReadWriteOnce,
},
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceStorage: *resource.NewQuantity(1, resource.BinarySI),
},

View file

@ -22,7 +22,7 @@ import (
"context"
"testing"
"k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
storage "k8s.io/api/storage/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -72,7 +72,7 @@ func DoTestStorageClasses(t *testing.T, client clientset.Interface, ns *v1.Names
Namespace: ns.Name,
},
Spec: v1.PersistentVolumeClaimSpec{
Resources: v1.ResourceRequirements{Requests: v1.ResourceList{v1.ResourceName(v1.ResourceStorage): resource.MustParse("1G")}},
Resources: v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceName(v1.ResourceStorage): resource.MustParse("1G")}},
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
StorageClassName: &classGold,
},

View file

@ -120,7 +120,7 @@ func fakePodWithPVC(name, pvcName, namespace string) (*v1.Pod, *v1.PersistentVol
AccessModes: []v1.PersistentVolumeAccessMode{
v1.ReadWriteOnce,
},
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse("5Gi"),
},

View file

@ -25,7 +25,7 @@ import (
"testing"
"time"
"k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
storage "k8s.io/api/storage/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -1417,7 +1417,7 @@ func createPVC(name, namespace, cap string, mode []v1.PersistentVolumeAccessMode
Namespace: namespace,
},
Spec: v1.PersistentVolumeClaimSpec{
Resources: v1.ResourceRequirements{Requests: v1.ResourceList{v1.ResourceName(v1.ResourceStorage): resource.MustParse(cap)}},
Resources: v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceName(v1.ResourceStorage): resource.MustParse(cap)}},
AccessModes: mode,
StorageClassName: &class,
},
@ -1431,7 +1431,7 @@ func createPVCWithNilStorageClass(name, namespace, cap string, mode []v1.Persist
Namespace: namespace,
},
Spec: v1.PersistentVolumeClaimSpec{
Resources: v1.ResourceRequirements{Requests: v1.ResourceList{v1.ResourceName(v1.ResourceStorage): resource.MustParse(cap)}},
Resources: v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceName(v1.ResourceStorage): resource.MustParse(cap)}},
AccessModes: mode,
},
}

View file

@ -1218,7 +1218,7 @@ func makePVC(name, ns string, scName *string, volumeName string) *v1.PersistentV
AccessModes: []v1.PersistentVolumeAccessMode{
v1.ReadWriteOnce,
},
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse("5Gi"),
},

View file

@ -304,7 +304,7 @@ func setPVCapacity(pv *v1.PersistentVolume, capacity resource.Quantity) *v1.Pers
}
func setPVCRequestStorage(pvc *v1.PersistentVolumeClaim, request resource.Quantity) *v1.PersistentVolumeClaim {
pvc.Spec.Resources = v1.ResourceRequirements{
pvc.Spec.Resources = v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): request,
},

View file

@ -1502,7 +1502,7 @@ func makeUnboundPersistentVolumeClaim(storageClass string) *v1.PersistentVolumeC
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadOnlyMany},
StorageClassName: &storageClass,
Resources: v1.ResourceRequirements{
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse("1Gi"),
},