Revert "Refactor image manager for client/server implementation of the container runtime"

This commit is contained in:
Brian Grant
2015-09-25 15:24:18 -07:00
parent 15c585e3ad
commit efd19143f7
3 changed files with 98 additions and 126 deletions

View File

@@ -21,27 +21,30 @@ import (
"testing"
"time"
docker "github.com/fsouza/go-dockerclient"
cadvisorApiV2 "github.com/google/cadvisor/info/v2"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"k8s.io/kubernetes/pkg/client/record"
"k8s.io/kubernetes/pkg/kubelet/cadvisor"
"k8s.io/kubernetes/pkg/kubelet/container"
"k8s.io/kubernetes/pkg/types"
"k8s.io/kubernetes/pkg/kubelet/dockertools"
"k8s.io/kubernetes/pkg/util/sets"
)
var zero time.Time
func newRealImageManager(policy ImageGCPolicy) (*realImageManager, *container.FakeRuntime, *cadvisor.Mock) {
fakeRuntime := &container.FakeRuntime{}
func newRealImageManager(policy ImageGCPolicy) (*realImageManager, *dockertools.FakeDockerClient, *cadvisor.Mock) {
fakeDocker := &dockertools.FakeDockerClient{
RemovedImages: sets.NewString(),
}
mockCadvisor := new(cadvisor.Mock)
return &realImageManager{
runtime: fakeRuntime,
dockerClient: fakeDocker,
policy: policy,
imageRecords: make(map[string]*imageRecord),
cadvisor: mockCadvisor,
recorder: &record.FakeRecorder{},
}, fakeRuntime, mockCadvisor
}, fakeDocker, mockCadvisor
}
// Accessors used for thread-safe testing.
@@ -64,33 +67,29 @@ func imageName(id int) string {
}
// Make an image with the specified ID.
func makeImage(id int, size int64) container.Image {
return container.Image{
ID: imageName(id),
Size: size,
func makeImage(id int, size int64) docker.APIImages {
return docker.APIImages{
ID: imageName(id),
VirtualSize: size,
}
}
// Make a container with the specified ID. It will use the image with the same ID.
func makeContainer(id int) *container.Container {
return &container.Container{
ID: types.UID(fmt.Sprintf("container-%d", id)),
func makeContainer(id int) docker.APIContainers {
return docker.APIContainers{
ID: fmt.Sprintf("container-%d", id),
Image: imageName(id),
}
}
func TestDetectImagesInitialDetect(t *testing.T) {
manager, fakeRuntime, _ := newRealImageManager(ImageGCPolicy{})
fakeRuntime.ImageList = []container.Image{
manager, fakeDocker, _ := newRealImageManager(ImageGCPolicy{})
fakeDocker.Images = []docker.APIImages{
makeImage(0, 1024),
makeImage(1, 2048),
}
fakeRuntime.PodList = []*container.Pod{
{
Containers: []*container.Container{
makeContainer(1),
},
},
fakeDocker.ContainerList = []docker.APIContainers{
makeContainer(1),
}
startTime := time.Now().Add(-time.Millisecond)
@@ -110,17 +109,13 @@ func TestDetectImagesInitialDetect(t *testing.T) {
func TestDetectImagesWithNewImage(t *testing.T) {
// Just one image initially.
manager, fakeRuntime, _ := newRealImageManager(ImageGCPolicy{})
fakeRuntime.ImageList = []container.Image{
manager, fakeDocker, _ := newRealImageManager(ImageGCPolicy{})
fakeDocker.Images = []docker.APIImages{
makeImage(0, 1024),
makeImage(1, 2048),
}
fakeRuntime.PodList = []*container.Pod{
{
Containers: []*container.Container{
makeContainer(1),
},
},
fakeDocker.ContainerList = []docker.APIContainers{
makeContainer(1),
}
err := manager.detectImages(zero)
@@ -129,7 +124,7 @@ func TestDetectImagesWithNewImage(t *testing.T) {
assert.Equal(manager.imageRecordsLen(), 2)
// Add a new image.
fakeRuntime.ImageList = []container.Image{
fakeDocker.Images = []docker.APIImages{
makeImage(0, 1024),
makeImage(1, 1024),
makeImage(2, 1024),
@@ -155,17 +150,13 @@ func TestDetectImagesWithNewImage(t *testing.T) {
}
func TestDetectImagesContainerStopped(t *testing.T) {
manager, fakeRuntime, _ := newRealImageManager(ImageGCPolicy{})
fakeRuntime.ImageList = []container.Image{
manager, fakeDocker, _ := newRealImageManager(ImageGCPolicy{})
fakeDocker.Images = []docker.APIImages{
makeImage(0, 1024),
makeImage(1, 2048),
}
fakeRuntime.PodList = []*container.Pod{
{
Containers: []*container.Container{
makeContainer(1),
},
},
fakeDocker.ContainerList = []docker.APIContainers{
makeContainer(1),
}
err := manager.detectImages(zero)
@@ -176,8 +167,7 @@ func TestDetectImagesContainerStopped(t *testing.T) {
require.True(t, ok)
// Simulate container being stopped.
fakeRuntime.ContainerList = []*container.Container{}
fakeRuntime.PodList = []*container.Pod{}
fakeDocker.ContainerList = []docker.APIContainers{}
err = manager.detectImages(time.Now())
require.NoError(t, err)
assert.Equal(manager.imageRecordsLen(), 2)
@@ -192,17 +182,13 @@ func TestDetectImagesContainerStopped(t *testing.T) {
}
func TestDetectImagesWithRemovedImages(t *testing.T) {
manager, fakeRuntime, _ := newRealImageManager(ImageGCPolicy{})
fakeRuntime.ImageList = []container.Image{
manager, fakeDocker, _ := newRealImageManager(ImageGCPolicy{})
fakeDocker.Images = []docker.APIImages{
makeImage(0, 1024),
makeImage(1, 2048),
}
fakeRuntime.PodList = []*container.Pod{
{
Containers: []*container.Container{
makeContainer(1),
},
},
fakeDocker.ContainerList = []docker.APIContainers{
makeContainer(1),
}
err := manager.detectImages(zero)
@@ -211,63 +197,48 @@ func TestDetectImagesWithRemovedImages(t *testing.T) {
assert.Equal(manager.imageRecordsLen(), 2)
// Simulate both images being removed.
fakeRuntime.ImageList = []container.Image{}
fakeDocker.Images = []docker.APIImages{}
err = manager.detectImages(time.Now())
require.NoError(t, err)
assert.Equal(manager.imageRecordsLen(), 0)
}
func TestFreeSpaceImagesInUseContainersAreIgnored(t *testing.T) {
manager, fakeRuntime, _ := newRealImageManager(ImageGCPolicy{})
fakeRuntime.ImageList = []container.Image{
manager, fakeDocker, _ := newRealImageManager(ImageGCPolicy{})
fakeDocker.Images = []docker.APIImages{
makeImage(0, 1024),
makeImage(1, 2048),
}
fakeRuntime.PodList = []*container.Pod{
{
Containers: []*container.Container{
makeContainer(1),
},
},
fakeDocker.ContainerList = []docker.APIContainers{
makeContainer(1),
}
spaceFreed, err := manager.freeSpace(2048)
assert := assert.New(t)
require.NoError(t, err)
assert.EqualValues(1024, spaceFreed)
assert.Len(fakeRuntime.ImageList, 1)
assert.Len(fakeDocker.RemovedImages, 1)
assert.True(fakeDocker.RemovedImages.Has(imageName(0)))
}
func TestFreeSpaceRemoveByLeastRecentlyUsed(t *testing.T) {
manager, fakeRuntime, _ := newRealImageManager(ImageGCPolicy{})
fakeRuntime.ImageList = []container.Image{
manager, fakeDocker, _ := newRealImageManager(ImageGCPolicy{})
fakeDocker.Images = []docker.APIImages{
makeImage(0, 1024),
makeImage(1, 2048),
}
fakeRuntime.PodList = []*container.Pod{
{
Containers: []*container.Container{
makeContainer(0),
makeContainer(1),
},
},
fakeDocker.ContainerList = []docker.APIContainers{
makeContainer(0),
makeContainer(1),
}
// Make 1 be more recently used than 0.
require.NoError(t, manager.detectImages(zero))
fakeRuntime.PodList = []*container.Pod{
{
Containers: []*container.Container{
makeContainer(1),
},
},
fakeDocker.ContainerList = []docker.APIContainers{
makeContainer(1),
}
require.NoError(t, manager.detectImages(time.Now()))
fakeRuntime.PodList = []*container.Pod{
{
Containers: []*container.Container{},
},
}
fakeDocker.ContainerList = []docker.APIContainers{}
require.NoError(t, manager.detectImages(time.Now()))
require.Equal(t, manager.imageRecordsLen(), 2)
@@ -275,51 +246,53 @@ func TestFreeSpaceRemoveByLeastRecentlyUsed(t *testing.T) {
assert := assert.New(t)
require.NoError(t, err)
assert.EqualValues(1024, spaceFreed)
assert.Len(fakeRuntime.ImageList, 1)
assert.Len(fakeDocker.RemovedImages, 1)
assert.True(fakeDocker.RemovedImages.Has(imageName(0)))
}
func TestFreeSpaceTiesBrokenByDetectedTime(t *testing.T) {
manager, fakeRuntime, _ := newRealImageManager(ImageGCPolicy{})
fakeRuntime.ImageList = []container.Image{
manager, fakeDocker, _ := newRealImageManager(ImageGCPolicy{})
fakeDocker.Images = []docker.APIImages{
makeImage(0, 1024),
}
fakeRuntime.PodList = []*container.Pod{
{
Containers: []*container.Container{
makeContainer(0),
},
},
fakeDocker.ContainerList = []docker.APIContainers{
makeContainer(0),
}
// Make 1 more recently detected but used at the same time as 0.
require.NoError(t, manager.detectImages(zero))
fakeRuntime.ImageList = []container.Image{
fakeDocker.Images = []docker.APIImages{
makeImage(0, 1024),
makeImage(1, 2048),
}
fakeDocker.ContainerList = []docker.APIContainers{
makeContainer(0),
makeContainer(1),
}
require.NoError(t, manager.detectImages(time.Now()))
fakeRuntime.PodList = []*container.Pod{}
fakeDocker.ContainerList = []docker.APIContainers{}
require.NoError(t, manager.detectImages(time.Now()))
require.Equal(t, manager.imageRecordsLen(), 2)
spaceFreed, err := manager.freeSpace(1024)
assert := assert.New(t)
require.NoError(t, err)
assert.EqualValues(2048, spaceFreed)
assert.Len(fakeRuntime.ImageList, 1)
assert.EqualValues(1024, spaceFreed)
assert.Len(fakeDocker.RemovedImages, 1)
assert.True(fakeDocker.RemovedImages.Has(imageName(0)))
}
func TestFreeSpaceImagesAlsoDoesLookupByRepoTags(t *testing.T) {
manager, fakeRuntime, _ := newRealImageManager(ImageGCPolicy{})
fakeRuntime.ImageList = []container.Image{
manager, fakeDocker, _ := newRealImageManager(ImageGCPolicy{})
fakeDocker.Images = []docker.APIImages{
makeImage(0, 1024),
{
ID: "5678",
Tags: []string{"potato", "salad"},
Size: 2048,
ID: "5678",
RepoTags: []string{"potato", "salad"},
VirtualSize: 2048,
},
}
fakeRuntime.ContainerList = []*container.Container{
fakeDocker.ContainerList = []docker.APIContainers{
{
ID: "c5678",
Image: "salad",
@@ -330,7 +303,8 @@ func TestFreeSpaceImagesAlsoDoesLookupByRepoTags(t *testing.T) {
assert := assert.New(t)
require.NoError(t, err)
assert.EqualValues(1024, spaceFreed)
assert.Len(fakeRuntime.ImageList, 1)
assert.Len(fakeDocker.RemovedImages, 1)
assert.True(fakeDocker.RemovedImages.Has(imageName(0)))
}
func TestGarbageCollectBelowLowThreshold(t *testing.T) {
@@ -365,14 +339,14 @@ func TestGarbageCollectBelowSuccess(t *testing.T) {
HighThresholdPercent: 90,
LowThresholdPercent: 80,
}
manager, fakeRuntime, mockCadvisor := newRealImageManager(policy)
manager, fakeDocker, mockCadvisor := newRealImageManager(policy)
// Expect 95% usage and most of it gets freed.
mockCadvisor.On("DockerImagesFsInfo").Return(cadvisorApiV2.FsInfo{
Usage: 950,
Capacity: 1000,
}, nil)
fakeRuntime.ImageList = []container.Image{
fakeDocker.Images = []docker.APIImages{
makeImage(0, 450),
}
@@ -384,14 +358,14 @@ func TestGarbageCollectNotEnoughFreed(t *testing.T) {
HighThresholdPercent: 90,
LowThresholdPercent: 80,
}
manager, fakeRuntime, mockCadvisor := newRealImageManager(policy)
manager, fakeDocker, mockCadvisor := newRealImageManager(policy)
// Expect 95% usage and little of it gets freed.
mockCadvisor.On("DockerImagesFsInfo").Return(cadvisorApiV2.FsInfo{
Usage: 950,
Capacity: 1000,
}, nil)
fakeRuntime.ImageList = []container.Image{
fakeDocker.Images = []docker.APIImages{
makeImage(0, 50),
}