mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-10-31 13:50:01 +00:00 
			
		
		
		
	PersistentLocalVolumes validation and tests
Signed-off-by: Serguei Bezverkhi <sbezverk@cisco.com>
This commit is contained in:
		| @@ -17,6 +17,7 @@ limitations under the License. | ||||
| package persistentvolume | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| @@ -152,3 +153,99 @@ func TestDropDisabledFields(t *testing.T) { | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestDropDisabledFieldsPersistentLocalVolume(t *testing.T) { | ||||
| 	pvWithoutLocalVolume := func() *api.PersistentVolume { | ||||
| 		return &api.PersistentVolume{ | ||||
| 			Spec: api.PersistentVolumeSpec{ | ||||
| 				PersistentVolumeSource: api.PersistentVolumeSource{ | ||||
| 					Local: nil, | ||||
| 				}, | ||||
| 			}, | ||||
| 		} | ||||
| 	} | ||||
| 	pvWithLocalVolume := func() *api.PersistentVolume { | ||||
| 		fsType := "ext4" | ||||
| 		return &api.PersistentVolume{ | ||||
| 			Spec: api.PersistentVolumeSpec{ | ||||
| 				PersistentVolumeSource: api.PersistentVolumeSource{ | ||||
| 					Local: &api.LocalVolumeSource{ | ||||
| 						Path:   "/a/b/c", | ||||
| 						FSType: &fsType, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	pvInfo := []struct { | ||||
| 		description    string | ||||
| 		hasLocalVolume bool | ||||
| 		pv             func() *api.PersistentVolume | ||||
| 	}{ | ||||
| 		{ | ||||
| 			description:    "pv without LocalVolume", | ||||
| 			hasLocalVolume: false, | ||||
| 			pv:             pvWithoutLocalVolume, | ||||
| 		}, | ||||
| 		{ | ||||
| 			description:    "pv with LocalVolume", | ||||
| 			hasLocalVolume: true, | ||||
| 			pv:             pvWithLocalVolume, | ||||
| 		}, | ||||
| 		{ | ||||
| 			description:    "is nil", | ||||
| 			hasLocalVolume: false, | ||||
| 			pv:             func() *api.PersistentVolume { return nil }, | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	for _, enabled := range []bool{true, false} { | ||||
| 		for _, oldpvInfo := range pvInfo { | ||||
| 			for _, newpvInfo := range pvInfo { | ||||
| 				oldpvHasLocalVolume, oldpv := oldpvInfo.hasLocalVolume, oldpvInfo.pv() | ||||
| 				newpvHasLocalVolume, newpv := newpvInfo.hasLocalVolume, newpvInfo.pv() | ||||
| 				if newpv == nil { | ||||
| 					continue | ||||
| 				} | ||||
|  | ||||
| 				t.Run(fmt.Sprintf("feature enabled=%v, old pvc %v, new pvc %v", enabled, oldpvInfo.description, newpvInfo.description), func(t *testing.T) { | ||||
| 					defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PersistentLocalVolumes, enabled)() | ||||
|  | ||||
| 					var oldpvSpec *api.PersistentVolumeSpec | ||||
| 					if oldpv != nil { | ||||
| 						oldpvSpec = &oldpv.Spec | ||||
| 					} | ||||
| 					DropDisabledFields(&newpv.Spec, oldpvSpec) | ||||
|  | ||||
| 					// old pv should never be changed | ||||
| 					if !reflect.DeepEqual(oldpv, oldpvInfo.pv()) { | ||||
| 						t.Errorf("old pv changed: %v", diff.ObjectReflectDiff(oldpv, oldpvInfo.pv())) | ||||
| 					} | ||||
|  | ||||
| 					switch { | ||||
| 					case enabled || oldpvHasLocalVolume: | ||||
| 						// new pv should not be changed if the feature is enabled, or if the old pv had LocalVolume source | ||||
| 						if !reflect.DeepEqual(newpv, newpvInfo.pv()) { | ||||
| 							t.Errorf("new pv changed: %v", diff.ObjectReflectDiff(newpv, newpvInfo.pv())) | ||||
| 						} | ||||
| 					case newpvHasLocalVolume: | ||||
| 						// new pv should be changed | ||||
| 						if reflect.DeepEqual(newpv, newpvInfo.pv()) { | ||||
| 							t.Errorf("new pv was not changed") | ||||
| 						} | ||||
| 						// new pv should not have LocalVolume | ||||
| 						if !reflect.DeepEqual(newpv, pvWithoutLocalVolume()) { | ||||
| 							t.Errorf("new pv had LocalVolume source: %v", diff.ObjectReflectDiff(newpv, pvWithoutLocalVolume())) | ||||
| 						} | ||||
| 					default: | ||||
| 						// new pv should not need to be changed | ||||
| 						if !reflect.DeepEqual(newpv, newpvInfo.pv()) { | ||||
| 							t.Errorf("new pv changed: %v", diff.ObjectReflectDiff(newpv, newpvInfo.pv())) | ||||
| 						} | ||||
| 					} | ||||
| 				}) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user