Add selector to PersistentVolumeClaim

This commit is contained in:
Paul Morie
2016-05-06 23:18:54 -04:00
parent dff1ed1497
commit faa112bad1
5 changed files with 40 additions and 2 deletions

View File

@@ -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

View File

@@ -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"`

View File

@@ -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()))

View File

@@ -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,

View File

@@ -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) {