Cleanup container_gc_test.go

This commit is contained in:
Random-Liu 2015-11-23 14:22:53 -08:00
parent 581a1ad1af
commit c6d02b83e5

View File

@ -28,7 +28,6 @@ import (
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
) )
// TODO (random-liu) Cleanup the test soon
func newTestContainerGC(t *testing.T) (*containerGC, *FakeDockerClient) { func newTestContainerGC(t *testing.T) (*containerGC, *FakeDockerClient) {
fakeDocker := new(FakeDockerClient) fakeDocker := new(FakeDockerClient)
gc := NewContainerGC(fakeDocker, "") gc := NewContainerGC(fakeDocker, "")
@ -41,36 +40,30 @@ func makeTime(id int) time.Time {
return zero.Add(time.Duration(id) * time.Second) return zero.Add(time.Duration(id) * time.Second)
} }
// Makes an API object with the specified Docker ID and pod UID. // Makes a container with the specified properties.
func makeAPIContainer(uid, name, dockerID string) docker.APIContainers { func makeContainer(id, uid, name string, running bool, created time.Time) *docker.Container {
return docker.APIContainers{ return &docker.Container{
Names: []string{fmt.Sprintf("/k8s_%s_bar_new_%s_42", name, uid)}, Name: fmt.Sprintf("/k8s_%s_bar_new_%s_42", name, uid),
ID: dockerID, State: docker.State{
Running: running,
},
ID: id,
Created: created,
} }
} }
// Makes a function that adds to a map a detailed container with the specified properties. // Makes a container with unidentified name and specified properties.
func makeContainerDetail(id string, running bool, created time.Time) func(map[string]*docker.Container) { func makeUndefinedContainer(id string, running bool, created time.Time) *docker.Container {
return func(m map[string]*docker.Container) { return &docker.Container{
m[id] = &docker.Container{ Name: "/k8s_unidentified",
State: docker.State{ State: docker.State{
Running: running, Running: running,
}, },
ID: id, ID: id,
Created: created, Created: created,
}
} }
} }
// Makes a detailed container map from the specified functions.
func makeContainerDetailMap(funcs ...func(map[string]*docker.Container)) map[string]*docker.Container {
m := make(map[string]*docker.Container, len(funcs))
for _, f := range funcs {
f(m)
}
return m
}
func verifyStringArrayEqualsAnyOrder(t *testing.T, actual, expected []string) { func verifyStringArrayEqualsAnyOrder(t *testing.T, actual, expected []string) {
act := make([]string, len(actual)) act := make([]string, len(actual))
exp := make([]string, len(expected)) exp := make([]string, len(expected))
@ -87,12 +80,9 @@ func verifyStringArrayEqualsAnyOrder(t *testing.T, actual, expected []string) {
func TestGarbageCollectZeroMaxContainers(t *testing.T) { func TestGarbageCollectZeroMaxContainers(t *testing.T) {
gc, fakeDocker := newTestContainerGC(t) gc, fakeDocker := newTestContainerGC(t)
fakeDocker.ContainerList = []docker.APIContainers{ fakeDocker.SetFakeContainers([]*docker.Container{
makeAPIContainer("foo", "POD", "1876"), makeContainer("1876", "foo", "POD", false, makeTime(0)),
} })
fakeDocker.ContainerMap = makeContainerDetailMap(
makeContainerDetail("1876", false, makeTime(0)),
)
assert.Nil(t, gc.GarbageCollect(kubecontainer.ContainerGCPolicy{time.Minute, 1, 0})) assert.Nil(t, gc.GarbageCollect(kubecontainer.ContainerGCPolicy{time.Minute, 1, 0}))
assert.Len(t, fakeDocker.Removed, 1) assert.Len(t, fakeDocker.Removed, 1)
@ -100,20 +90,13 @@ func TestGarbageCollectZeroMaxContainers(t *testing.T) {
func TestGarbageCollectNoMaxPerPodContainerLimit(t *testing.T) { func TestGarbageCollectNoMaxPerPodContainerLimit(t *testing.T) {
gc, fakeDocker := newTestContainerGC(t) gc, fakeDocker := newTestContainerGC(t)
fakeDocker.ContainerList = []docker.APIContainers{ fakeDocker.SetFakeContainers([]*docker.Container{
makeAPIContainer("foo", "POD", "1876"), makeContainer("1876", "foo", "POD", false, makeTime(0)),
makeAPIContainer("foo1", "POD", "2876"), makeContainer("2876", "foo1", "POD", false, makeTime(1)),
makeAPIContainer("foo2", "POD", "3876"), makeContainer("3876", "foo2", "POD", false, makeTime(2)),
makeAPIContainer("foo3", "POD", "4876"), makeContainer("4876", "foo3", "POD", false, makeTime(3)),
makeAPIContainer("foo4", "POD", "5876"), makeContainer("5876", "foo4", "POD", false, makeTime(4)),
} })
fakeDocker.ContainerMap = makeContainerDetailMap(
makeContainerDetail("1876", false, makeTime(0)),
makeContainerDetail("2876", false, makeTime(1)),
makeContainerDetail("3876", false, makeTime(2)),
makeContainerDetail("4876", false, makeTime(3)),
makeContainerDetail("5876", false, makeTime(4)),
)
assert.Nil(t, gc.GarbageCollect(kubecontainer.ContainerGCPolicy{time.Minute, -1, 4})) assert.Nil(t, gc.GarbageCollect(kubecontainer.ContainerGCPolicy{time.Minute, -1, 4}))
assert.Len(t, fakeDocker.Removed, 1) assert.Len(t, fakeDocker.Removed, 1)
@ -121,20 +104,13 @@ func TestGarbageCollectNoMaxPerPodContainerLimit(t *testing.T) {
func TestGarbageCollectNoMaxLimit(t *testing.T) { func TestGarbageCollectNoMaxLimit(t *testing.T) {
gc, fakeDocker := newTestContainerGC(t) gc, fakeDocker := newTestContainerGC(t)
fakeDocker.ContainerList = []docker.APIContainers{ fakeDocker.SetFakeContainers([]*docker.Container{
makeAPIContainer("foo", "POD", "1876"), makeContainer("1876", "foo", "POD", false, makeTime(0)),
makeAPIContainer("foo1", "POD", "2876"), makeContainer("2876", "foo1", "POD", false, makeTime(0)),
makeAPIContainer("foo2", "POD", "3876"), makeContainer("3876", "foo2", "POD", false, makeTime(0)),
makeAPIContainer("foo3", "POD", "4876"), makeContainer("4876", "foo3", "POD", false, makeTime(0)),
makeAPIContainer("foo4", "POD", "5876"), makeContainer("5876", "foo4", "POD", false, makeTime(0)),
} })
fakeDocker.ContainerMap = makeContainerDetailMap(
makeContainerDetail("1876", false, makeTime(0)),
makeContainerDetail("2876", false, makeTime(0)),
makeContainerDetail("3876", false, makeTime(0)),
makeContainerDetail("4876", false, makeTime(0)),
makeContainerDetail("5876", false, makeTime(0)),
)
assert.Nil(t, gc.GarbageCollect(kubecontainer.ContainerGCPolicy{time.Minute, 1, -1})) assert.Nil(t, gc.GarbageCollect(kubecontainer.ContainerGCPolicy{time.Minute, 1, -1}))
assert.Len(t, fakeDocker.Removed, 0) assert.Len(t, fakeDocker.Removed, 0)
@ -142,172 +118,103 @@ func TestGarbageCollectNoMaxLimit(t *testing.T) {
func TestGarbageCollect(t *testing.T) { func TestGarbageCollect(t *testing.T) {
tests := []struct { tests := []struct {
containers []docker.APIContainers containers []*docker.Container
containerDetails map[string]*docker.Container expectedRemoved []string
expectedRemoved []string
}{ }{
// Don't remove containers started recently. // Don't remove containers started recently.
{ {
containers: []docker.APIContainers{ containers: []*docker.Container{
makeAPIContainer("foo", "POD", "1876"), makeContainer("1876", "foo", "POD", false, time.Now()),
makeAPIContainer("foo", "POD", "2876"), makeContainer("2876", "foo", "POD", false, time.Now()),
makeAPIContainer("foo", "POD", "3876"), makeContainer("3876", "foo", "POD", false, time.Now()),
}, },
containerDetails: makeContainerDetailMap(
makeContainerDetail("1876", false, time.Now()),
makeContainerDetail("2876", false, time.Now()),
makeContainerDetail("3876", false, time.Now()),
),
}, },
// Remove oldest containers. // Remove oldest containers.
{ {
containers: []docker.APIContainers{ containers: []*docker.Container{
makeAPIContainer("foo", "POD", "1876"), makeContainer("1876", "foo", "POD", false, makeTime(0)),
makeAPIContainer("foo", "POD", "2876"), makeContainer("2876", "foo", "POD", false, makeTime(1)),
makeAPIContainer("foo", "POD", "3876"), makeContainer("3876", "foo", "POD", false, makeTime(2)),
}, },
containerDetails: makeContainerDetailMap(
makeContainerDetail("1876", false, makeTime(0)),
makeContainerDetail("2876", false, makeTime(1)),
makeContainerDetail("3876", false, makeTime(2)),
),
expectedRemoved: []string{"1876"}, expectedRemoved: []string{"1876"},
}, },
// Only remove non-running containers. // Only remove non-running containers.
{ {
containers: []docker.APIContainers{ containers: []*docker.Container{
makeAPIContainer("foo", "POD", "1876"), makeContainer("1876", "foo", "POD", true, makeTime(0)),
makeAPIContainer("foo", "POD", "2876"), makeContainer("2876", "foo", "POD", false, makeTime(1)),
makeAPIContainer("foo", "POD", "3876"), makeContainer("3876", "foo", "POD", false, makeTime(2)),
makeAPIContainer("foo", "POD", "4876"), makeContainer("4876", "foo", "POD", false, makeTime(3)),
}, },
containerDetails: makeContainerDetailMap(
makeContainerDetail("1876", true, makeTime(0)),
makeContainerDetail("2876", false, makeTime(1)),
makeContainerDetail("3876", false, makeTime(2)),
makeContainerDetail("4876", false, makeTime(3)),
),
expectedRemoved: []string{"2876"}, expectedRemoved: []string{"2876"},
}, },
// Less than maxContainerCount doesn't delete any. // Less than maxContainerCount doesn't delete any.
{ {
containers: []docker.APIContainers{ containers: []*docker.Container{
makeAPIContainer("foo", "POD", "1876"), makeContainer("1876", "foo", "POD", false, makeTime(0)),
}, },
containerDetails: makeContainerDetailMap(
makeContainerDetail("1876", false, makeTime(0)),
),
}, },
// maxContainerCount applies per (UID,container) pair. // maxContainerCount applies per (UID,container) pair.
{ {
containers: []docker.APIContainers{ containers: []*docker.Container{
makeAPIContainer("foo", "POD", "1876"), makeContainer("1876", "foo", "POD", false, makeTime(0)),
makeAPIContainer("foo", "POD", "2876"), makeContainer("2876", "foo", "POD", false, makeTime(1)),
makeAPIContainer("foo", "POD", "3876"), makeContainer("3876", "foo", "POD", false, makeTime(2)),
makeAPIContainer("foo", "bar", "1076"), makeContainer("1076", "foo", "bar", false, makeTime(0)),
makeAPIContainer("foo", "bar", "2076"), makeContainer("2076", "foo", "bar", false, makeTime(1)),
makeAPIContainer("foo", "bar", "3076"), makeContainer("3076", "foo", "bar", false, makeTime(2)),
makeAPIContainer("foo2", "POD", "1176"), makeContainer("1176", "foo2", "POD", false, makeTime(0)),
makeAPIContainer("foo2", "POD", "2176"), makeContainer("2176", "foo2", "POD", false, makeTime(1)),
makeAPIContainer("foo2", "POD", "3176"), makeContainer("3176", "foo2", "POD", false, makeTime(2)),
}, },
containerDetails: makeContainerDetailMap(
makeContainerDetail("1876", false, makeTime(0)),
makeContainerDetail("2876", false, makeTime(1)),
makeContainerDetail("3876", false, makeTime(2)),
makeContainerDetail("1076", false, makeTime(0)),
makeContainerDetail("2076", false, makeTime(1)),
makeContainerDetail("3076", false, makeTime(2)),
makeContainerDetail("1176", false, makeTime(0)),
makeContainerDetail("2176", false, makeTime(1)),
makeContainerDetail("3176", false, makeTime(2)),
),
expectedRemoved: []string{"1076", "1176", "1876"}, expectedRemoved: []string{"1076", "1176", "1876"},
}, },
// Remove non-running unidentified Kubernetes containers. // Remove non-running unidentified Kubernetes containers.
{ {
containers: []docker.APIContainers{ containers: []*docker.Container{
{ makeUndefinedContainer("1876", true, makeTime(0)),
// Unidentified Kubernetes container. makeUndefinedContainer("2876", false, makeTime(0)),
Names: []string{"/k8s_unidentified"}, makeContainer("3876", "foo", "POD", false, makeTime(0)),
ID: "1876",
},
{
// Unidentified (non-running) Kubernetes container.
Names: []string{"/k8s_unidentified"},
ID: "2876",
},
makeAPIContainer("foo", "POD", "3876"),
}, },
containerDetails: makeContainerDetailMap(
makeContainerDetail("1876", true, makeTime(0)),
makeContainerDetail("2876", false, makeTime(0)),
makeContainerDetail("3876", false, makeTime(0)),
),
expectedRemoved: []string{"2876"}, expectedRemoved: []string{"2876"},
}, },
// Max limit applied and tries to keep from every pod. // Max limit applied and tries to keep from every pod.
{ {
containers: []docker.APIContainers{ containers: []*docker.Container{
makeAPIContainer("foo", "POD", "1876"), makeContainer("1876", "foo", "POD", false, makeTime(0)),
makeAPIContainer("foo", "POD", "2876"), makeContainer("2876", "foo", "POD", false, makeTime(1)),
makeAPIContainer("foo1", "POD", "3876"), makeContainer("3876", "foo1", "POD", false, makeTime(0)),
makeAPIContainer("foo1", "POD", "4876"), makeContainer("4876", "foo1", "POD", false, makeTime(1)),
makeAPIContainer("foo2", "POD", "5876"), makeContainer("5876", "foo2", "POD", false, makeTime(0)),
makeAPIContainer("foo2", "POD", "6876"), makeContainer("6876", "foo2", "POD", false, makeTime(1)),
makeAPIContainer("foo3", "POD", "7876"), makeContainer("7876", "foo3", "POD", false, makeTime(0)),
makeAPIContainer("foo3", "POD", "8876"), makeContainer("8876", "foo3", "POD", false, makeTime(1)),
makeAPIContainer("foo4", "POD", "9876"), makeContainer("9876", "foo4", "POD", false, makeTime(0)),
makeAPIContainer("foo4", "POD", "10876"), makeContainer("10876", "foo4", "POD", false, makeTime(1)),
}, },
containerDetails: makeContainerDetailMap(
makeContainerDetail("1876", false, makeTime(0)),
makeContainerDetail("2876", false, makeTime(1)),
makeContainerDetail("3876", false, makeTime(0)),
makeContainerDetail("4876", false, makeTime(1)),
makeContainerDetail("5876", false, makeTime(0)),
makeContainerDetail("6876", false, makeTime(1)),
makeContainerDetail("7876", false, makeTime(0)),
makeContainerDetail("8876", false, makeTime(1)),
makeContainerDetail("9876", false, makeTime(0)),
makeContainerDetail("10876", false, makeTime(1)),
),
expectedRemoved: []string{"1876", "3876", "5876", "7876", "9876"}, expectedRemoved: []string{"1876", "3876", "5876", "7876", "9876"},
}, },
// If more pods than limit allows, evicts oldest pod. // If more pods than limit allows, evicts oldest pod.
{ {
containers: []docker.APIContainers{ containers: []*docker.Container{
makeAPIContainer("foo", "POD", "1876"), makeContainer("1876", "foo", "POD", false, makeTime(1)),
makeAPIContainer("foo", "POD", "2876"), makeContainer("2876", "foo", "POD", false, makeTime(2)),
makeAPIContainer("foo1", "POD", "3876"), makeContainer("3876", "foo1", "POD", false, makeTime(1)),
makeAPIContainer("foo1", "POD", "4876"), makeContainer("4876", "foo1", "POD", false, makeTime(2)),
makeAPIContainer("foo2", "POD", "5876"), makeContainer("5876", "foo2", "POD", false, makeTime(0)),
makeAPIContainer("foo3", "POD", "6876"), makeContainer("6876", "foo3", "POD", false, makeTime(1)),
makeAPIContainer("foo4", "POD", "7876"), makeContainer("7876", "foo4", "POD", false, makeTime(0)),
makeAPIContainer("foo5", "POD", "8876"), makeContainer("8876", "foo5", "POD", false, makeTime(1)),
makeAPIContainer("foo6", "POD", "9876"), makeContainer("9876", "foo6", "POD", false, makeTime(2)),
makeAPIContainer("foo7", "POD", "10876"), makeContainer("10876", "foo7", "POD", false, makeTime(1)),
}, },
containerDetails: makeContainerDetailMap(
makeContainerDetail("1876", false, makeTime(1)),
makeContainerDetail("2876", false, makeTime(2)),
makeContainerDetail("3876", false, makeTime(1)),
makeContainerDetail("4876", false, makeTime(2)),
makeContainerDetail("5876", false, makeTime(0)),
makeContainerDetail("6876", false, makeTime(1)),
makeContainerDetail("7876", false, makeTime(0)),
makeContainerDetail("8876", false, makeTime(1)),
makeContainerDetail("9876", false, makeTime(2)),
makeContainerDetail("10876", false, makeTime(1)),
),
expectedRemoved: []string{"1876", "3876", "5876", "7876"}, expectedRemoved: []string{"1876", "3876", "5876", "7876"},
}, },
} }
for i, test := range tests { for i, test := range tests {
t.Logf("Running test case with index %d", i) t.Logf("Running test case with index %d", i)
gc, fakeDocker := newTestContainerGC(t) gc, fakeDocker := newTestContainerGC(t)
fakeDocker.ContainerList = test.containers fakeDocker.SetFakeContainers(test.containers)
fakeDocker.ContainerMap = test.containerDetails
assert.Nil(t, gc.GarbageCollect(kubecontainer.ContainerGCPolicy{time.Hour, 2, 6})) assert.Nil(t, gc.GarbageCollect(kubecontainer.ContainerGCPolicy{time.Hour, 2, 6}))
verifyStringArrayEqualsAnyOrder(t, fakeDocker.Removed, test.expectedRemoved) verifyStringArrayEqualsAnyOrder(t, fakeDocker.Removed, test.expectedRemoved)
} }