mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 05:27:21 +00:00
Add unit tests
This commit is contained in:
parent
c11427fef5
commit
8536787133
@ -1148,7 +1148,6 @@ func Test_Run_Positive_VolumeFSResizeControllerAttachEnabled(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func Test_UncertainDeviceGlobalMounts(t *testing.T) {
|
func Test_UncertainDeviceGlobalMounts(t *testing.T) {
|
||||||
fsMode := v1.PersistentVolumeFilesystem
|
|
||||||
var tests = []struct {
|
var tests = []struct {
|
||||||
name string
|
name string
|
||||||
deviceState operationexecutor.DeviceMountState
|
deviceState operationexecutor.DeviceMountState
|
||||||
@ -1190,8 +1189,10 @@ func Test_UncertainDeviceGlobalMounts(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, mode := range []v1.PersistentVolumeMode{v1.PersistentVolumeBlock, v1.PersistentVolumeFilesystem} {
|
||||||
for _, tc := range tests {
|
for _, tc := range tests {
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
testName := fmt.Sprintf("%s [%s]", tc.name, mode)
|
||||||
|
t.Run(testName+"[", func(t *testing.T) {
|
||||||
|
|
||||||
pv := &v1.PersistentVolume{
|
pv := &v1.PersistentVolume{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
@ -1200,7 +1201,7 @@ func Test_UncertainDeviceGlobalMounts(t *testing.T) {
|
|||||||
},
|
},
|
||||||
Spec: v1.PersistentVolumeSpec{
|
Spec: v1.PersistentVolumeSpec{
|
||||||
ClaimRef: &v1.ObjectReference{Name: "pvc"},
|
ClaimRef: &v1.ObjectReference{Name: "pvc"},
|
||||||
VolumeMode: &fsMode,
|
VolumeMode: &mode,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
pvc := &v1.PersistentVolumeClaim{
|
pvc := &v1.PersistentVolumeClaim{
|
||||||
@ -1210,6 +1211,7 @@ func Test_UncertainDeviceGlobalMounts(t *testing.T) {
|
|||||||
},
|
},
|
||||||
Spec: v1.PersistentVolumeClaimSpec{
|
Spec: v1.PersistentVolumeClaimSpec{
|
||||||
VolumeName: tc.volumeName,
|
VolumeName: tc.volumeName,
|
||||||
|
VolumeMode: &mode,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
pod := &v1.Pod{
|
pod := &v1.Pod{
|
||||||
@ -1281,7 +1283,7 @@ func Test_UncertainDeviceGlobalMounts(t *testing.T) {
|
|||||||
}()
|
}()
|
||||||
waitForVolumeToExistInASW(t, volumeName, asw)
|
waitForVolumeToExistInASW(t, volumeName, asw)
|
||||||
if tc.volumeName == volumetesting.TimeoutAndFailOnMountDeviceVolumeName {
|
if tc.volumeName == volumetesting.TimeoutAndFailOnMountDeviceVolumeName {
|
||||||
// Wait upto 10s for reconciler to catchup
|
// Wait upto 10s for reconciler to catch up
|
||||||
time.Sleep(reconcilerSyncWaitDuration)
|
time.Sleep(reconcilerSyncWaitDuration)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1303,16 +1305,24 @@ func Test_UncertainDeviceGlobalMounts(t *testing.T) {
|
|||||||
|
|
||||||
dsw.DeletePodFromVolume(podName, volumeName)
|
dsw.DeletePodFromVolume(podName, volumeName)
|
||||||
waitForDetach(t, volumeName, asw)
|
waitForDetach(t, volumeName, asw)
|
||||||
|
if mode == v1.PersistentVolumeFilesystem {
|
||||||
err = volumetesting.VerifyUnmountDeviceCallCount(tc.unmountDeviceCallCount, fakePlugin)
|
err = volumetesting.VerifyUnmountDeviceCallCount(tc.unmountDeviceCallCount, fakePlugin)
|
||||||
|
} else {
|
||||||
|
if tc.unmountDeviceCallCount == 0 {
|
||||||
|
err = volumetesting.VerifyZeroTearDownDeviceCallCount(fakePlugin)
|
||||||
|
} else {
|
||||||
|
err = volumetesting.VerifyTearDownDeviceCallCount(tc.unmountDeviceCallCount, fakePlugin)
|
||||||
|
}
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Error verifying UnMountDeviceCallCount: %v", err)
|
t.Errorf("Error verifying UnMountDeviceCallCount: %v", err)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_UncertainVolumeMountState(t *testing.T) {
|
func Test_UncertainVolumeMountState(t *testing.T) {
|
||||||
fsMode := v1.PersistentVolumeFilesystem
|
|
||||||
var tests = []struct {
|
var tests = []struct {
|
||||||
name string
|
name string
|
||||||
volumeState operationexecutor.VolumeMountState
|
volumeState operationexecutor.VolumeMountState
|
||||||
@ -1331,14 +1341,14 @@ func Test_UncertainVolumeMountState(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "failed operation should result in not-mounted volume",
|
name: "failed operation should result in not-mounted volume",
|
||||||
volumeState: operationexecutor.VolumeNotMounted,
|
volumeState: operationexecutor.VolumeNotMounted,
|
||||||
unmountDeviceCallCount: 0,
|
unmountDeviceCallCount: 1,
|
||||||
unmountVolumeCount: 0,
|
unmountVolumeCount: 0,
|
||||||
volumeName: volumetesting.FailOnSetupVolumeName,
|
volumeName: volumetesting.FailOnSetupVolumeName,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "timeout followed by failed operation should result in non-mounted volume",
|
name: "timeout followed by failed operation should result in non-mounted volume",
|
||||||
volumeState: operationexecutor.VolumeNotMounted,
|
volumeState: operationexecutor.VolumeNotMounted,
|
||||||
unmountDeviceCallCount: 0,
|
unmountDeviceCallCount: 1,
|
||||||
unmountVolumeCount: 0,
|
unmountVolumeCount: 0,
|
||||||
volumeName: volumetesting.TimeoutAndFailOnSetupVolumeName,
|
volumeName: volumetesting.TimeoutAndFailOnSetupVolumeName,
|
||||||
},
|
},
|
||||||
@ -1360,8 +1370,10 @@ func Test_UncertainVolumeMountState(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, mode := range []v1.PersistentVolumeMode{v1.PersistentVolumeBlock, v1.PersistentVolumeFilesystem} {
|
||||||
for _, tc := range tests {
|
for _, tc := range tests {
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
testName := fmt.Sprintf("%s [%s]", tc.name, mode)
|
||||||
|
t.Run(testName, func(t *testing.T) {
|
||||||
pv := &v1.PersistentVolume{
|
pv := &v1.PersistentVolume{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: tc.volumeName,
|
Name: tc.volumeName,
|
||||||
@ -1369,7 +1381,7 @@ func Test_UncertainVolumeMountState(t *testing.T) {
|
|||||||
},
|
},
|
||||||
Spec: v1.PersistentVolumeSpec{
|
Spec: v1.PersistentVolumeSpec{
|
||||||
ClaimRef: &v1.ObjectReference{Name: "pvc"},
|
ClaimRef: &v1.ObjectReference{Name: "pvc"},
|
||||||
VolumeMode: &fsMode,
|
VolumeMode: &mode,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
pvc := &v1.PersistentVolumeClaim{
|
pvc := &v1.PersistentVolumeClaim{
|
||||||
@ -1379,6 +1391,7 @@ func Test_UncertainVolumeMountState(t *testing.T) {
|
|||||||
},
|
},
|
||||||
Spec: v1.PersistentVolumeClaimSpec{
|
Spec: v1.PersistentVolumeClaimSpec{
|
||||||
VolumeName: tc.volumeName,
|
VolumeName: tc.volumeName,
|
||||||
|
VolumeMode: &mode,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
pod := &v1.Pod{
|
pod := &v1.Pod{
|
||||||
@ -1472,11 +1485,36 @@ func Test_UncertainVolumeMountState(t *testing.T) {
|
|||||||
dsw.DeletePodFromVolume(podName, volumeName)
|
dsw.DeletePodFromVolume(podName, volumeName)
|
||||||
waitForDetach(t, volumeName, asw)
|
waitForDetach(t, volumeName, asw)
|
||||||
|
|
||||||
volumetesting.VerifyUnmountDeviceCallCount(tc.unmountDeviceCallCount, fakePlugin)
|
if mode == v1.PersistentVolumeFilesystem {
|
||||||
volumetesting.VerifyTearDownCallCount(tc.unmountVolumeCount, fakePlugin)
|
if err := volumetesting.VerifyUnmountDeviceCallCount(tc.unmountDeviceCallCount, fakePlugin); err != nil {
|
||||||
|
t.Errorf("Error verifying UnMountDeviceCallCount: %v", err)
|
||||||
|
}
|
||||||
|
if err := volumetesting.VerifyTearDownCallCount(tc.unmountVolumeCount, fakePlugin); err != nil {
|
||||||
|
t.Errorf("Error verifying UnMountDeviceCallCount: %v", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if tc.unmountVolumeCount == 0 {
|
||||||
|
if err := volumetesting.VerifyZeroUnmapPodDeviceCallCount(fakePlugin); err != nil {
|
||||||
|
t.Errorf("Error verifying UnMountDeviceCallCount: %v", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err := volumetesting.VerifyUnmapPodDeviceCallCount(tc.unmountVolumeCount, fakePlugin); err != nil {
|
||||||
|
t.Errorf("Error verifying UnMountDeviceCallCount: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if tc.unmountDeviceCallCount == 0 {
|
||||||
|
if err := volumetesting.VerifyZeroTearDownDeviceCallCount(fakePlugin); err != nil {
|
||||||
|
t.Errorf("Error verifying UnMountDeviceCallCount: %v", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err := volumetesting.VerifyTearDownDeviceCallCount(tc.unmountDeviceCallCount, fakePlugin); err != nil {
|
||||||
|
t.Errorf("Error verifying UnMountDeviceCallCount: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func waitForUncertainGlobalMount(t *testing.T, volumeName v1.UniqueVolumeName, asw cache.ActualStateOfWorld) {
|
func waitForUncertainGlobalMount(t *testing.T, volumeName v1.UniqueVolumeName, asw cache.ActualStateOfWorld) {
|
||||||
|
@ -959,7 +959,42 @@ func (fv *FakeVolume) TearDownAt(dir string) error {
|
|||||||
func (fv *FakeVolume) SetUpDevice() error {
|
func (fv *FakeVolume) SetUpDevice() error {
|
||||||
fv.Lock()
|
fv.Lock()
|
||||||
defer fv.Unlock()
|
defer fv.Unlock()
|
||||||
|
if fv.VolName == TimeoutOnMountDeviceVolumeName {
|
||||||
|
fv.DeviceMountState[fv.VolName] = deviceMountUncertain
|
||||||
|
return volumetypes.NewUncertainProgressError("mount failed")
|
||||||
|
}
|
||||||
|
if fv.VolName == FailMountDeviceVolumeName {
|
||||||
|
fv.DeviceMountState[fv.VolName] = deviceNotMounted
|
||||||
|
return fmt.Errorf("error mapping disk: %s", fv.VolName)
|
||||||
|
}
|
||||||
|
|
||||||
|
if fv.VolName == TimeoutAndFailOnMountDeviceVolumeName {
|
||||||
|
_, ok := fv.DeviceMountState[fv.VolName]
|
||||||
|
if !ok {
|
||||||
|
fv.DeviceMountState[fv.VolName] = deviceMountUncertain
|
||||||
|
return volumetypes.NewUncertainProgressError("timed out mounting error")
|
||||||
|
}
|
||||||
|
fv.DeviceMountState[fv.VolName] = deviceNotMounted
|
||||||
|
return fmt.Errorf("error mapping disk: %s", fv.VolName)
|
||||||
|
}
|
||||||
|
|
||||||
|
if fv.VolName == SuccessAndTimeoutDeviceName {
|
||||||
|
_, ok := fv.DeviceMountState[fv.VolName]
|
||||||
|
if ok {
|
||||||
|
fv.DeviceMountState[fv.VolName] = deviceMountUncertain
|
||||||
|
return volumetypes.NewUncertainProgressError("error mounting state")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if fv.VolName == SuccessAndFailOnMountDeviceName {
|
||||||
|
_, ok := fv.DeviceMountState[fv.VolName]
|
||||||
|
if ok {
|
||||||
|
return fmt.Errorf("error mapping disk: %s", fv.VolName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fv.DeviceMountState[fv.VolName] = deviceMounted
|
||||||
fv.SetUpDeviceCallCount++
|
fv.SetUpDeviceCallCount++
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1044,6 +1079,45 @@ func (fv *FakeVolume) GetUnmapPodDeviceCallCount() int {
|
|||||||
func (fv *FakeVolume) MapPodDevice() (string, error) {
|
func (fv *FakeVolume) MapPodDevice() (string, error) {
|
||||||
fv.Lock()
|
fv.Lock()
|
||||||
defer fv.Unlock()
|
defer fv.Unlock()
|
||||||
|
|
||||||
|
if fv.VolName == TimeoutOnSetupVolumeName {
|
||||||
|
fv.VolumeMountState[fv.VolName] = volumeMountUncertain
|
||||||
|
return "", volumetypes.NewUncertainProgressError("time out on setup")
|
||||||
|
}
|
||||||
|
|
||||||
|
if fv.VolName == FailOnSetupVolumeName {
|
||||||
|
fv.VolumeMountState[fv.VolName] = volumeNotMounted
|
||||||
|
return "", fmt.Errorf("mounting volume failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
if fv.VolName == TimeoutAndFailOnSetupVolumeName {
|
||||||
|
_, ok := fv.VolumeMountState[fv.VolName]
|
||||||
|
if !ok {
|
||||||
|
fv.VolumeMountState[fv.VolName] = volumeMountUncertain
|
||||||
|
return "", volumetypes.NewUncertainProgressError("time out on setup")
|
||||||
|
}
|
||||||
|
fv.VolumeMountState[fv.VolName] = volumeNotMounted
|
||||||
|
return "", fmt.Errorf("mounting volume failed")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if fv.VolName == SuccessAndFailOnSetupVolumeName {
|
||||||
|
_, ok := fv.VolumeMountState[fv.VolName]
|
||||||
|
if ok {
|
||||||
|
fv.VolumeMountState[fv.VolName] = volumeNotMounted
|
||||||
|
return "", fmt.Errorf("mounting volume failed")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if fv.VolName == SuccessAndTimeoutSetupVolumeName {
|
||||||
|
_, ok := fv.VolumeMountState[fv.VolName]
|
||||||
|
if ok {
|
||||||
|
fv.VolumeMountState[fv.VolName] = volumeMountUncertain
|
||||||
|
return "", volumetypes.NewUncertainProgressError("time out on setup")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fv.VolumeMountState[fv.VolName] = volumeMounted
|
||||||
fv.MapPodDeviceCallCount++
|
fv.MapPodDeviceCallCount++
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
@ -1624,6 +1698,39 @@ func VerifyZeroTearDownDeviceCallCount(fakeVolumePlugin *FakeVolumePlugin) error
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// VerifyUnmapPodDeviceCallCount ensures that at least one of the Unmappers for this
|
||||||
|
// plugin has the expected number of UnmapPodDevice calls. Otherwise it
|
||||||
|
// returns an error.
|
||||||
|
func VerifyUnmapPodDeviceCallCount(
|
||||||
|
expectedUnmapPodDeviceCallCount int,
|
||||||
|
fakeVolumePlugin *FakeVolumePlugin) error {
|
||||||
|
for _, unmapper := range fakeVolumePlugin.GetBlockVolumeUnmapper() {
|
||||||
|
actualCallCount := unmapper.GetUnmapPodDeviceCallCount()
|
||||||
|
if actualCallCount >= expectedUnmapPodDeviceCallCount {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf(
|
||||||
|
"No Unmapper have expected UnmapPodDeviceCallCount. Expected: <%v>.",
|
||||||
|
expectedUnmapPodDeviceCallCount)
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerifyZeroUnmapPodDeviceCallCount ensures that all Mappers for this plugin have a
|
||||||
|
// zero UnmapPodDevice calls. Otherwise it returns an error.
|
||||||
|
func VerifyZeroUnmapPodDeviceCallCount(fakeVolumePlugin *FakeVolumePlugin) error {
|
||||||
|
for _, unmapper := range fakeVolumePlugin.GetBlockVolumeUnmapper() {
|
||||||
|
actualCallCount := unmapper.GetUnmapPodDeviceCallCount()
|
||||||
|
if actualCallCount != 0 {
|
||||||
|
return fmt.Errorf(
|
||||||
|
"At least one unmapper has non-zero UnmapPodDeviceCallCount: <%v>.",
|
||||||
|
actualCallCount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// VerifyGetGlobalMapPathCallCount ensures that at least one of the Mappers for this
|
// VerifyGetGlobalMapPathCallCount ensures that at least one of the Mappers for this
|
||||||
// plugin has the expectedGlobalMapPathCallCount number of calls. Otherwise it returns
|
// plugin has the expectedGlobalMapPathCallCount number of calls. Otherwise it returns
|
||||||
// an error.
|
// an error.
|
||||||
|
Loading…
Reference in New Issue
Block a user