diff --git a/pkg/kubelet/image_manager.go b/pkg/kubelet/image_manager.go index 478d1246063..c1f72acdc3f 100644 --- a/pkg/kubelet/image_manager.go +++ b/pkg/kubelet/image_manager.go @@ -18,6 +18,7 @@ package kubelet import ( "fmt" + "math" "sort" "sync" "time" @@ -46,6 +47,9 @@ type imageManager interface { GetImageList() ([]kubecontainer.Image, error) + // Delete all unused images and returns the number of bytes freed. The number of bytes freed is always returned. + DeleteUnusedImages() (int64, error) + // TODO(vmarmol): Have this subsume pulls as well. } @@ -248,6 +252,10 @@ func (im *realImageManager) GarbageCollect() error { return nil } +func (im *realImageManager) DeleteUnusedImages() (int64, error) { + return im.freeSpace(math.MaxInt64, time.Now()) +} + // Tries to free bytesToFree worth of images on the disk. // // Returns the number of bytes free and an error if any occurred. The number of diff --git a/pkg/kubelet/image_manager_test.go b/pkg/kubelet/image_manager_test.go index 1dabf28c36a..5dd43896720 100644 --- a/pkg/kubelet/image_manager_test.go +++ b/pkg/kubelet/image_manager_test.go @@ -238,6 +238,28 @@ func TestFreeSpaceImagesInUseContainersAreIgnored(t *testing.T) { assert.Len(fakeRuntime.ImageList, 1) } +func TestDeleteUnusedImagesRemoveAllUnusedImages(t *testing.T) { + manager, fakeRuntime, _ := newRealImageManager(ImageGCPolicy{}) + fakeRuntime.ImageList = []container.Image{ + makeImage(0, 1024), + makeImage(1, 2048), + makeImage(2, 2048), + } + fakeRuntime.AllPodList = []*containertest.FakePod{ + {Pod: &container.Pod{ + Containers: []*container.Container{ + makeContainer(2), + }, + }}, + } + + spaceFreed, err := manager.DeleteUnusedImages() + assert := assert.New(t) + require.NoError(t, err) + assert.EqualValues(3072, spaceFreed) + assert.Len(fakeRuntime.ImageList, 1) +} + func TestFreeSpaceRemoveByLeastRecentlyUsed(t *testing.T) { manager, fakeRuntime, _ := newRealImageManager(ImageGCPolicy{}) fakeRuntime.ImageList = []container.Image{