Add selector to PersistentVolumeClaim
This commit is contained in:
@@ -364,6 +364,8 @@ type PersistentVolumeClaimList struct {
|
|||||||
type PersistentVolumeClaimSpec struct {
|
type PersistentVolumeClaimSpec struct {
|
||||||
// Contains the types of access modes required
|
// Contains the types of access modes required
|
||||||
AccessModes []PersistentVolumeAccessMode `json:"accessModes,omitempty"`
|
AccessModes []PersistentVolumeAccessMode `json:"accessModes,omitempty"`
|
||||||
|
// A label query over volumes to consider for binding
|
||||||
|
Selector *unversioned.LabelSelector `json:"selector,omitempty"`
|
||||||
// Resources represents the minimum resources required
|
// Resources represents the minimum resources required
|
||||||
Resources ResourceRequirements `json:"resources,omitempty"`
|
Resources ResourceRequirements `json:"resources,omitempty"`
|
||||||
// VolumeName is the binding reference to the PersistentVolume backing this claim
|
// VolumeName is the binding reference to the PersistentVolume backing this claim
|
||||||
|
@@ -456,6 +456,8 @@ type PersistentVolumeClaimSpec struct {
|
|||||||
// AccessModes contains the desired access modes the volume should have.
|
// AccessModes contains the desired access modes the volume should have.
|
||||||
// More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1
|
// More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1
|
||||||
AccessModes []PersistentVolumeAccessMode `json:"accessModes,omitempty" protobuf:"bytes,1,rep,name=accessModes,casttype=PersistentVolumeAccessMode"`
|
AccessModes []PersistentVolumeAccessMode `json:"accessModes,omitempty" protobuf:"bytes,1,rep,name=accessModes,casttype=PersistentVolumeAccessMode"`
|
||||||
|
// A label query over volumes to consider for binding.
|
||||||
|
Selector *unversioned.LabelSelector `json:"selector,omitempty"`
|
||||||
// Resources represents the minimum resources the volume should have.
|
// Resources represents the minimum resources the volume should have.
|
||||||
// More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources
|
// More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources
|
||||||
Resources ResourceRequirements `json:"resources,omitempty" protobuf:"bytes,2,opt,name=resources"`
|
Resources ResourceRequirements `json:"resources,omitempty" protobuf:"bytes,2,opt,name=resources"`
|
||||||
|
@@ -992,6 +992,9 @@ func ValidatePersistentVolumeClaim(pvc *api.PersistentVolumeClaim) field.ErrorLi
|
|||||||
if len(pvc.Spec.AccessModes) == 0 {
|
if len(pvc.Spec.AccessModes) == 0 {
|
||||||
allErrs = append(allErrs, field.Required(specPath.Child("accessModes"), "at least 1 accessMode is required"))
|
allErrs = append(allErrs, field.Required(specPath.Child("accessModes"), "at least 1 accessMode is required"))
|
||||||
}
|
}
|
||||||
|
if pvc.Spec.Selector != nil {
|
||||||
|
allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(pvc.Spec.Selector, specPath.Child("selector"))...)
|
||||||
|
}
|
||||||
for _, mode := range pvc.Spec.AccessModes {
|
for _, mode := range pvc.Spec.AccessModes {
|
||||||
if mode != api.ReadWriteOnce && mode != api.ReadOnlyMany && mode != api.ReadWriteMany {
|
if mode != api.ReadWriteOnce && mode != api.ReadOnlyMany && mode != api.ReadWriteMany {
|
||||||
allErrs = append(allErrs, field.NotSupported(specPath.Child("accessModes"), mode, supportedAccessModes.List()))
|
allErrs = append(allErrs, field.NotSupported(specPath.Child("accessModes"), mode, supportedAccessModes.List()))
|
||||||
|
@@ -459,6 +459,37 @@ func TestValidatePersistentVolumeClaim(t *testing.T) {
|
|||||||
"good-claim": {
|
"good-claim": {
|
||||||
isExpectedFailure: false,
|
isExpectedFailure: false,
|
||||||
claim: testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{
|
claim: testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{
|
||||||
|
Selector: &unversioned.LabelSelector{
|
||||||
|
MatchExpressions: []unversioned.LabelSelectorRequirement{
|
||||||
|
{
|
||||||
|
Key: "key2",
|
||||||
|
Operator: "Exists",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
AccessModes: []api.PersistentVolumeAccessMode{
|
||||||
|
api.ReadWriteOnce,
|
||||||
|
api.ReadOnlyMany,
|
||||||
|
},
|
||||||
|
Resources: api.ResourceRequirements{
|
||||||
|
Requests: api.ResourceList{
|
||||||
|
api.ResourceName(api.ResourceStorage): resource.MustParse("10G"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
"invalid-label-selector": {
|
||||||
|
isExpectedFailure: true,
|
||||||
|
claim: testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{
|
||||||
|
Selector: &unversioned.LabelSelector{
|
||||||
|
MatchExpressions: []unversioned.LabelSelectorRequirement{
|
||||||
|
{
|
||||||
|
Key: "key2",
|
||||||
|
Operator: "InvalidOp",
|
||||||
|
Values: []string{"value1", "value2"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
AccessModes: []api.PersistentVolumeAccessMode{
|
AccessModes: []api.PersistentVolumeAccessMode{
|
||||||
api.ReadWriteOnce,
|
api.ReadWriteOnce,
|
||||||
api.ReadOnlyMany,
|
api.ReadOnlyMany,
|
||||||
|
@@ -228,8 +228,8 @@ func TestAllPossibleAccessModes(t *testing.T) {
|
|||||||
|
|
||||||
// the mock PVs creates contain 2 types of accessmodes: RWO+ROX and RWO+ROW+RWX
|
// the mock PVs creates contain 2 types of accessmodes: RWO+ROX and RWO+ROW+RWX
|
||||||
possibleModes := index.allPossibleMatchingAccessModes([]api.PersistentVolumeAccessMode{api.ReadWriteOnce})
|
possibleModes := index.allPossibleMatchingAccessModes([]api.PersistentVolumeAccessMode{api.ReadWriteOnce})
|
||||||
if len(possibleModes) != 2 {
|
if len(possibleModes) != 3 {
|
||||||
t.Errorf("Expected 2 arrays of modes that match RWO, but got %v", len(possibleModes))
|
t.Errorf("Expected 3 arrays of modes that match RWO, but got %v", len(possibleModes))
|
||||||
}
|
}
|
||||||
for _, m := range possibleModes {
|
for _, m := range possibleModes {
|
||||||
if !contains(m, api.ReadWriteOnce) {
|
if !contains(m, api.ReadWriteOnce) {
|
||||||
|
Reference in New Issue
Block a user