diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 3328c46fb11..b9bc64f6577 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -484,6 +484,12 @@ func ValidatePersistentVolume(pv *api.PersistentVolume) errs.ValidationErrorList allErrs = append(allErrs, errs.NewFieldRequired("persistentVolume.AccessModes")) } + for _, mode := range pv.Spec.AccessModes { + if mode != api.ReadWriteOnce && mode != api.ReadOnlyMany && mode != api.ReadWriteMany { + allErrs = append(allErrs, errs.NewFieldInvalid("persistentVolume.Spec.AccessModes", mode, fmt.Sprintf("only %s, %s, and %s are valid", api.ReadWriteOnce, api.ReadOnlyMany, api.ReadWriteMany))) + } + } + if len(pv.Spec.Capacity) == 0 { allErrs = append(allErrs, errs.NewFieldRequired("persistentVolume.Capacity")) } @@ -557,6 +563,11 @@ func ValidatePersistentVolumeClaim(pvc *api.PersistentVolumeClaim) errs.Validati if len(pvc.Spec.AccessModes) == 0 { allErrs = append(allErrs, errs.NewFieldInvalid("persistentVolumeClaim.Spec.AccessModes", pvc.Spec.AccessModes, "at least 1 PersistentVolumeAccessMode is required")) } + for _, mode := range pvc.Spec.AccessModes { + if mode != api.ReadWriteOnce && mode != api.ReadOnlyMany && mode != api.ReadWriteMany { + allErrs = append(allErrs, errs.NewFieldInvalid("persistentVolumeClaim.Spec.AccessModes", mode, fmt.Sprintf("only %s, %s, and %s are valid", api.ReadWriteOnce, api.ReadOnlyMany, api.ReadWriteMany))) + } + } if _, ok := pvc.Spec.Resources.Requests[api.ResourceStorage]; !ok { allErrs = append(allErrs, errs.NewFieldInvalid("persistentVolumeClaim.Spec.Resources.Requests", pvc.Spec.Resources.Requests, "No Storage size specified")) } diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index cad441b91cf..1f1b7a5dd89 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -264,6 +264,18 @@ func TestValidatePersistentVolumes(t *testing.T) { }, }), }, + "invalid-accessmode": { + isExpectedFailure: true, + volume: testVolume("foo", "", api.PersistentVolumeSpec{ + Capacity: api.ResourceList{ + api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), + }, + AccessModes: []api.PersistentVolumeAccessMode{"fakemode"}, + PersistentVolumeSource: api.PersistentVolumeSource{ + HostPath: &api.HostPathVolumeSource{Path: "/foo"}, + }, + }), + }, "unexpected-namespace": { isExpectedFailure: true, volume: testVolume("foo", "unexpected-namespace", api.PersistentVolumeSpec{ @@ -365,6 +377,17 @@ func TestValidatePersistentVolumeClaim(t *testing.T) { }, }), }, + "invalid-accessmode": { + isExpectedFailure: true, + claim: testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ + AccessModes: []api.PersistentVolumeAccessMode{"fakemode"}, + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{ + api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), + }, + }, + }), + }, "missing-namespace": { isExpectedFailure: true, claim: testVolumeClaim("foo", "", api.PersistentVolumeClaimSpec{