mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-15 23:03:40 +00:00
Add test for checking ephemeral volume expansion
This commit is contained in:
parent
a5c961f4a8
commit
4bf500eb92
@ -545,7 +545,8 @@ func TestFindAndRemoveNonattachableVolumes(t *testing.T) {
|
|||||||
|
|
||||||
func TestEphemeralVolumeOwnerCheck(t *testing.T) {
|
func TestEphemeralVolumeOwnerCheck(t *testing.T) {
|
||||||
// create dswp
|
// create dswp
|
||||||
pod, pv, pvc := createEphemeralVolumeObjects("dswp-test-pod", "dswp-test-volume-name", false /* not owned */)
|
mode := v1.PersistentVolumeFilesystem
|
||||||
|
pod, pv, pvc := createEphemeralVolumeObjects("dswp-test-pod", "dswp-test-volume-name", false /* not owned */, &mode)
|
||||||
dswp, fakePodManager, _, _, _ := createDswpWithVolume(t, pv, pvc)
|
dswp, fakePodManager, _, _, _ := createDswpWithVolume(t, pv, pvc)
|
||||||
fakePodManager.AddPod(pod)
|
fakePodManager.AddPod(pod)
|
||||||
|
|
||||||
@ -913,6 +914,7 @@ func TestCheckVolumeFSResize(t *testing.T) {
|
|||||||
verify func(*testing.T, []v1.UniqueVolumeName, v1.UniqueVolumeName)
|
verify func(*testing.T, []v1.UniqueVolumeName, v1.UniqueVolumeName)
|
||||||
readOnlyVol bool
|
readOnlyVol bool
|
||||||
volumeMode v1.PersistentVolumeMode
|
volumeMode v1.PersistentVolumeMode
|
||||||
|
volumeType string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
// No resize request for volume, volumes in ASW shouldn't be marked as fsResizeRequired
|
// No resize request for volume, volumes in ASW shouldn't be marked as fsResizeRequired
|
||||||
@ -988,60 +990,65 @@ func TestCheckVolumeFSResize(t *testing.T) {
|
|||||||
},
|
},
|
||||||
volumeMode: v1.PersistentVolumeBlock,
|
volumeMode: v1.PersistentVolumeBlock,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// volume in ASW should be marked as fsResizeRequired
|
||||||
|
resize: func(_ *testing.T, pv *v1.PersistentVolume, pvc *v1.PersistentVolumeClaim, _ *desiredStateOfWorldPopulator) {
|
||||||
|
setCapacity(pv, pvc, 2)
|
||||||
|
},
|
||||||
|
verify: func(t *testing.T, vols []v1.UniqueVolumeName, volName v1.UniqueVolumeName) {
|
||||||
|
if len(vols) == 0 {
|
||||||
|
t.Fatalf("Requested resize for volume, but volume in ASW hasn't been marked as fsResizeRequired")
|
||||||
|
}
|
||||||
|
if len(vols) != 1 {
|
||||||
|
t.Errorf("Some unexpected volumes are marked as fsResizeRequired: %v", vols)
|
||||||
|
}
|
||||||
|
if vols[0] != volName {
|
||||||
|
t.Fatalf("Mark wrong volume as fsResizeRequired: %s", vols[0])
|
||||||
|
}
|
||||||
|
},
|
||||||
|
volumeMode: v1.PersistentVolumeFilesystem,
|
||||||
|
volumeType: "ephemeral",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range testcases {
|
for _, tc := range testcases {
|
||||||
pv := &v1.PersistentVolume{
|
var pod *v1.Pod
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
var pvc *v1.PersistentVolumeClaim
|
||||||
Name: "dswp-test-volume-name",
|
var pv *v1.PersistentVolume
|
||||||
},
|
|
||||||
Spec: v1.PersistentVolumeSpec{
|
if tc.volumeType == "ephemeral" {
|
||||||
PersistentVolumeSource: v1.PersistentVolumeSource{RBD: &v1.RBDPersistentVolumeSource{}},
|
pod, pv, pvc = createEphemeralVolumeObjects("dswp-test-pod", "dswp-test-volume-name", true, &tc.volumeMode)
|
||||||
Capacity: volumeCapacity(1),
|
} else {
|
||||||
ClaimRef: &v1.ObjectReference{Namespace: "ns", Name: "file-bound"},
|
pv, pvc = createResizeRelatedVolumes(&tc.volumeMode)
|
||||||
VolumeMode: &tc.volumeMode,
|
containers := []v1.Container{}
|
||||||
},
|
|
||||||
}
|
if tc.volumeMode == v1.PersistentVolumeFilesystem {
|
||||||
pvc := &v1.PersistentVolumeClaim{
|
containers = append(containers, v1.Container{
|
||||||
Spec: v1.PersistentVolumeClaimSpec{
|
VolumeMounts: []v1.VolumeMount{
|
||||||
VolumeName: pv.Name,
|
{
|
||||||
Resources: v1.ResourceRequirements{
|
Name: pv.Name,
|
||||||
Requests: pv.Spec.Capacity,
|
MountPath: "/mnt",
|
||||||
},
|
ReadOnly: tc.readOnlyVol,
|
||||||
},
|
},
|
||||||
Status: v1.PersistentVolumeClaimStatus{
|
},
|
||||||
Phase: v1.ClaimBound,
|
})
|
||||||
Capacity: pv.Spec.Capacity,
|
} else {
|
||||||
},
|
containers = append(containers, v1.Container{
|
||||||
|
VolumeDevices: []v1.VolumeDevice{
|
||||||
|
{
|
||||||
|
Name: pv.Name,
|
||||||
|
DevicePath: "/mnt/foobar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pod = createPodWithVolume("dswp-test-pod", "dswp-test-volume-name", "file-bound", containers)
|
||||||
|
pod.Spec.Volumes[0].VolumeSource.PersistentVolumeClaim.ReadOnly = tc.readOnlyVol
|
||||||
}
|
}
|
||||||
|
|
||||||
dswp, fakePodManager, fakeDSW, _, _ := createDswpWithVolume(t, pv, pvc)
|
dswp, fakePodManager, fakeDSW, _, _ := createDswpWithVolume(t, pv, pvc)
|
||||||
fakeASW := dswp.actualStateOfWorld
|
fakeASW := dswp.actualStateOfWorld
|
||||||
containers := []v1.Container{}
|
|
||||||
|
|
||||||
if tc.volumeMode == v1.PersistentVolumeFilesystem {
|
|
||||||
containers = append(containers, v1.Container{
|
|
||||||
VolumeMounts: []v1.VolumeMount{
|
|
||||||
{
|
|
||||||
Name: pv.Name,
|
|
||||||
MountPath: "/mnt",
|
|
||||||
ReadOnly: tc.readOnlyVol,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
containers = append(containers, v1.Container{
|
|
||||||
VolumeDevices: []v1.VolumeDevice{
|
|
||||||
{
|
|
||||||
Name: pv.Name,
|
|
||||||
DevicePath: "/mnt/foobar",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
pod := createPodWithVolume("dswp-test-pod", "dswp-test-volume-name", "file-bound", containers)
|
|
||||||
pod.Spec.Volumes[0].VolumeSource.PersistentVolumeClaim.ReadOnly = tc.readOnlyVol
|
|
||||||
uniquePodName := types.UniquePodName(pod.UID)
|
uniquePodName := types.UniquePodName(pod.UID)
|
||||||
uniqueVolumeName := v1.UniqueVolumeName("fake-plugin/" + pod.Spec.Volumes[0].Name)
|
uniqueVolumeName := v1.UniqueVolumeName("fake-plugin/" + pod.Spec.Volumes[0].Name)
|
||||||
|
|
||||||
@ -1060,6 +1067,33 @@ func TestCheckVolumeFSResize(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func createResizeRelatedVolumes(volumeMode *v1.PersistentVolumeMode) (pv *v1.PersistentVolume, pvc *v1.PersistentVolumeClaim) {
|
||||||
|
pv = &v1.PersistentVolume{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "dswp-test-volume-name",
|
||||||
|
},
|
||||||
|
Spec: v1.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeSource: v1.PersistentVolumeSource{RBD: &v1.RBDPersistentVolumeSource{}},
|
||||||
|
Capacity: volumeCapacity(1),
|
||||||
|
ClaimRef: &v1.ObjectReference{Namespace: "ns", Name: "file-bound"},
|
||||||
|
VolumeMode: volumeMode,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
pvc = &v1.PersistentVolumeClaim{
|
||||||
|
Spec: v1.PersistentVolumeClaimSpec{
|
||||||
|
VolumeName: pv.Name,
|
||||||
|
Resources: v1.ResourceRequirements{
|
||||||
|
Requests: pv.Spec.Capacity,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: v1.PersistentVolumeClaimStatus{
|
||||||
|
Phase: v1.ClaimBound,
|
||||||
|
Capacity: pv.Spec.Capacity,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func volumeCapacity(size int) v1.ResourceList {
|
func volumeCapacity(size int) v1.ResourceList {
|
||||||
return v1.ResourceList{v1.ResourceStorage: resource.MustParse(fmt.Sprintf("%dGi", size))}
|
return v1.ResourceList{v1.ResourceStorage: resource.MustParse(fmt.Sprintf("%dGi", size))}
|
||||||
}
|
}
|
||||||
@ -1166,7 +1200,7 @@ func createPodWithVolume(pod, pv, pvc string, containers []v1.Container) *v1.Pod
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func createEphemeralVolumeObjects(podName, volumeName string, owned bool) (pod *v1.Pod, pv *v1.PersistentVolume, pvc *v1.PersistentVolumeClaim) {
|
func createEphemeralVolumeObjects(podName, volumeName string, owned bool, volumeMode *v1.PersistentVolumeMode) (pod *v1.Pod, pv *v1.PersistentVolume, pvc *v1.PersistentVolumeClaim) {
|
||||||
pod = &v1.Pod{
|
pod = &v1.Pod{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: podName,
|
Name: podName,
|
||||||
@ -1199,14 +1233,14 @@ func createEphemeralVolumeObjects(podName, volumeName string, owned bool) (pod *
|
|||||||
Phase: v1.PodPhase("Running"),
|
Phase: v1.PodPhase("Running"),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
mode := v1.PersistentVolumeFilesystem
|
|
||||||
pv = &v1.PersistentVolume{
|
pv = &v1.PersistentVolume{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: volumeName,
|
Name: volumeName,
|
||||||
},
|
},
|
||||||
Spec: v1.PersistentVolumeSpec{
|
Spec: v1.PersistentVolumeSpec{
|
||||||
ClaimRef: &v1.ObjectReference{Namespace: "ns", Name: "file-bound"},
|
ClaimRef: &v1.ObjectReference{Namespace: "ns", Name: "file-bound"},
|
||||||
VolumeMode: &mode,
|
Capacity: volumeCapacity(1),
|
||||||
|
VolumeMode: volumeMode,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
pvc = &v1.PersistentVolumeClaim{
|
pvc = &v1.PersistentVolumeClaim{
|
||||||
@ -1215,10 +1249,14 @@ func createEphemeralVolumeObjects(podName, volumeName string, owned bool) (pod *
|
|||||||
Namespace: pod.Namespace,
|
Namespace: pod.Namespace,
|
||||||
},
|
},
|
||||||
Spec: v1.PersistentVolumeClaimSpec{
|
Spec: v1.PersistentVolumeClaimSpec{
|
||||||
VolumeName: "dswp-test-volume-name",
|
VolumeName: volumeName,
|
||||||
|
Resources: v1.ResourceRequirements{
|
||||||
|
Requests: pv.Spec.Capacity,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Status: v1.PersistentVolumeClaimStatus{
|
Status: v1.PersistentVolumeClaimStatus{
|
||||||
Phase: v1.ClaimBound,
|
Phase: v1.ClaimBound,
|
||||||
|
Capacity: pv.Spec.Capacity,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if owned {
|
if owned {
|
||||||
|
Loading…
Reference in New Issue
Block a user