mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	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