From 2367569f138ddb35385aed5e7e485eed425c73a9 Mon Sep 17 00:00:00 2001 From: liuxu Date: Sat, 23 May 2020 13:36:56 +0800 Subject: [PATCH] fix if don't set ephemeral-storage limit emptyDir's sizeLimit doesn't work --- pkg/kubelet/volumemanager/cache/BUILD | 1 + .../cache/desired_state_of_world.go | 2 +- .../cache/desired_state_of_world_test.go | 164 ++++++++++++++++++ 3 files changed, 166 insertions(+), 1 deletion(-) diff --git a/pkg/kubelet/volumemanager/cache/BUILD b/pkg/kubelet/volumemanager/cache/BUILD index 50a28eca9cc..6a526caf3c8 100644 --- a/pkg/kubelet/volumemanager/cache/BUILD +++ b/pkg/kubelet/volumemanager/cache/BUILD @@ -43,6 +43,7 @@ go_test( "//pkg/volume/util/operationexecutor:go_default_library", "//pkg/volume/util/types:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", ], diff --git a/pkg/kubelet/volumemanager/cache/desired_state_of_world.go b/pkg/kubelet/volumemanager/cache/desired_state_of_world.go index 7d4ee41be37..8445e8ea3c6 100644 --- a/pkg/kubelet/volumemanager/cache/desired_state_of_world.go +++ b/pkg/kubelet/volumemanager/cache/desired_state_of_world.go @@ -263,7 +263,7 @@ func (dsw *desiredStateOfWorld) AddPodToVolume( if volumeSpec.Volume.EmptyDir != nil && volumeSpec.Volume.EmptyDir.SizeLimit != nil && volumeSpec.Volume.EmptyDir.SizeLimit.Value() > 0 && - volumeSpec.Volume.EmptyDir.SizeLimit.Value() < sizeLimit.Value() { + (sizeLimit.Value() == 0 || volumeSpec.Volume.EmptyDir.SizeLimit.Value() < sizeLimit.Value()) { sizeLimit = resource.NewQuantity(volumeSpec.Volume.EmptyDir.SizeLimit.Value(), resource.BinarySI) } } diff --git a/pkg/kubelet/volumemanager/cache/desired_state_of_world_test.go b/pkg/kubelet/volumemanager/cache/desired_state_of_world_test.go index e09ad51428c..6bc28027762 100644 --- a/pkg/kubelet/volumemanager/cache/desired_state_of_world_test.go +++ b/pkg/kubelet/volumemanager/cache/desired_state_of_world_test.go @@ -17,6 +17,7 @@ limitations under the License. package cache import ( + "k8s.io/apimachinery/pkg/api/resource" "testing" "k8s.io/api/core/v1" @@ -460,6 +461,141 @@ func Test_MarkVolumesReportedInUse_Positive_NewPodNewVolume(t *testing.T) { verifyPodExistsInVolumeDsw(t, pod3Name, generatedVolume3Name, dsw) } +func Test_AddPodToVolume_WithEmptyDirSizeLimit(t *testing.T) { + volumePluginMgr, _ := volumetesting.GetTestVolumePluginMgr(t) + dsw := NewDesiredStateOfWorld(volumePluginMgr) + quantity1Gi := resource.MustParse("1Gi") + quantity2Gi := resource.MustParse("2Gi") + quantity3Gi := resource.MustParse("3Gi") + + pod1 := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod1", + UID: "pod1uid", + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Resources: v1.ResourceRequirements{ + Limits: v1.ResourceList{ + v1.ResourceEphemeralStorage: quantity1Gi, + }, + }, + }, + { + Resources: v1.ResourceRequirements{ + Limits: v1.ResourceList{ + v1.ResourceEphemeralStorage: quantity1Gi, + }, + }, + }, + }, + Volumes: []v1.Volume{ + { + Name: "emptyDir1", + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{ + SizeLimit: &quantity1Gi, + }, + }, + }, + { + Name: "emptyDir2", + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{ + SizeLimit: &quantity2Gi, + }, + }, + }, + { + Name: "emptyDir3", + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{ + SizeLimit: &quantity3Gi, + }, + }, + }, + { + Name: "emptyDir4", + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{}, + }, + }, + }, + }, + } + pod1Name := util.GetUniquePodName(pod1) + pod1DesiredSizeLimitMap := map[string]*resource.Quantity{ + "emptyDir1": &quantity1Gi, + "emptyDir2": &quantity2Gi, + "emptyDir3": &quantity2Gi, + "emptyDir4": &quantity2Gi, + } + pod2 := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod2", + UID: "pod2uid", + }, + Spec: v1.PodSpec{ + Volumes: []v1.Volume{ + { + Name: "emptyDir5", + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{ + SizeLimit: &quantity1Gi, + }, + }, + }, + { + Name: "emptyDir6", + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{ + SizeLimit: &quantity2Gi, + }, + }, + }, + { + Name: "emptyDir7", + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{ + SizeLimit: &quantity3Gi, + }, + }, + }, + { + Name: "emptyDir8", + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{}, + }, + }, + }, + }, + } + pod2Name := util.GetUniquePodName(pod2) + pod2DesiredSizeLimitMap := map[string]*resource.Quantity{ + "emptyDir5": &quantity1Gi, + "emptyDir6": &quantity2Gi, + "emptyDir7": &quantity3Gi, + "emptyDir8": resource.NewQuantity(0, resource.BinarySI), + } + for i := range pod1.Spec.Volumes { + volumeSpec := &volume.Spec{Volume: &pod1.Spec.Volumes[i]} + _, err := dsw.AddPodToVolume(pod1Name, pod1, volumeSpec, volumeSpec.Name(), "") + if err != nil { + t.Fatalf("AddPodToVolume failed. Expected: Actual: <%v>", err) + } + } + for i := range pod2.Spec.Volumes { + volumeSpec := &volume.Spec{Volume: &pod2.Spec.Volumes[i]} + _, err := dsw.AddPodToVolume(pod2Name, pod2, volumeSpec, volumeSpec.Name(), "") + if err != nil { + t.Fatalf("AddPodToVolume failed. Expected: Actual: <%v>", err) + } + } + verifyDesiredSizeLimitInVolumeDsw(t, pod1Name, pod1DesiredSizeLimitMap, dsw) + verifyDesiredSizeLimitInVolumeDsw(t, pod2Name, pod2DesiredSizeLimitMap, dsw) +} + func verifyVolumeExistsDsw( t *testing.T, expectedVolumeName v1.UniqueVolumeName, dsw DesiredStateOfWorld) { volumeExists := dsw.VolumeExists(expectedVolumeName) @@ -571,3 +707,31 @@ func verifyVolumeDoesntExistWithSpecNameInVolumeDsw( podExistsInVolume) } } + +func verifyDesiredSizeLimitInVolumeDsw( + t *testing.T, + expectedPodName volumetypes.UniquePodName, + expectedDesiredSizeMap map[string]*resource.Quantity, + dsw DesiredStateOfWorld) { + volumesToMount := dsw.GetVolumesToMount() + for volumeName, expectedDesiredSize := range expectedDesiredSizeMap { + if podExistsInVolume := dsw.VolumeExistsWithSpecName( + expectedPodName, volumeName); !podExistsInVolume { + t.Fatalf( + "DSW VolumeExistsWithSpecName returned incorrect value. Expected: Actual: <%v>", + podExistsInVolume) + } + for _, v := range volumesToMount { + if v.VolumeSpec.Name() == volumeName && v.PodName == expectedPodName { + if v.DesiredSizeLimit == nil || v.DesiredSizeLimit.Value() != expectedDesiredSize.Value() { + t.Fatalf( + "Found volume %v in the list of VolumesToMount, but DesiredSizeLimit incorrect. Expected: <%v> Actual: <%v>", + volumeName, + expectedDesiredSize, + v.DesiredSizeLimit) + + } + } + } + } +}