From d4034f9c436d652f2b20676e2c6722db506df4ff Mon Sep 17 00:00:00 2001 From: Yu-Ju Hong Date: Mon, 1 Jun 2015 12:30:51 -0700 Subject: [PATCH] Move more docker-specific tests to dockertools/manager_test.go --- pkg/kubelet/dockertools/manager_test.go | 137 ++++++++++++++++- pkg/kubelet/kubelet_test.go | 193 ++---------------------- 2 files changed, 145 insertions(+), 185 deletions(-) diff --git a/pkg/kubelet/dockertools/manager_test.go b/pkg/kubelet/dockertools/manager_test.go index 38b89301915..617faad5283 100644 --- a/pkg/kubelet/dockertools/manager_test.go +++ b/pkg/kubelet/dockertools/manager_test.go @@ -88,7 +88,7 @@ func (*fakeOptionGenerator) GenerateRunContainerOptions(pod *api.Pod, container return &kubecontainer.RunContainerOptions{}, nil } -func newTestDockerManager() (*DockerManager, *FakeDockerClient) { +func newTestDockerManagerWithHTTPClient(fakeHTTPClient *fakeHTTP) (*DockerManager, *FakeDockerClient) { fakeDocker := &FakeDockerClient{VersionInfo: docker.Env{"Version=1.1.3", "ApiVersion=1.15"}, Errors: make(map[string]error), RemovedImages: util.StringSet{}} fakeRecorder := &record.FakeRecorder{} readinessManager := kubecontainer.NewReadinessManager() @@ -106,12 +106,16 @@ func newTestDockerManager() (*DockerManager, *FakeDockerClient) { kubecontainer.FakeOS{}, networkPlugin, optionGenerator, - &fakeHTTP{}, + fakeHTTPClient, runtimeHooks) return dockerManager, fakeDocker } +func newTestDockerManager() (*DockerManager, *FakeDockerClient) { + return newTestDockerManagerWithHTTPClient(&fakeHTTP{}) +} + func matchString(t *testing.T, pattern, str string) bool { match, err := regexp.MatchString(pattern, str) if err != nil { @@ -1779,3 +1783,132 @@ func TestGetRestartCount(t *testing.T) { fakeDocker.ExitedContainerList = []docker.APIContainers{} verifyRestartCount(&pod, 2) } + +func TestSyncPodWithPodInfraCreatesContainerCallsHandler(t *testing.T) { + fakeHTTPClient := &fakeHTTP{} + dm, fakeDocker := newTestDockerManagerWithHTTPClient(fakeHTTPClient) + + pod := &api.Pod{ + ObjectMeta: api.ObjectMeta{ + UID: "12345678", + Name: "foo", + Namespace: "new", + }, + Spec: api.PodSpec{ + Containers: []api.Container{ + { + Name: "bar", + Lifecycle: &api.Lifecycle{ + PostStart: &api.Handler{ + HTTPGet: &api.HTTPGetAction{ + Host: "foo", + Port: util.IntOrString{IntVal: 8080, Kind: util.IntstrInt}, + Path: "bar", + }, + }, + }, + }, + }, + }, + } + fakeDocker.ContainerList = []docker.APIContainers{ + { + // pod infra container + Names: []string{"/k8s_POD." + strconv.FormatUint(generatePodInfraContainerHash(pod), 16) + "_foo_new_12345678_0"}, + ID: "9876", + }, + } + fakeDocker.ContainerMap = map[string]*docker.Container{ + "9876": { + ID: "9876", + Config: &docker.Config{}, + HostConfig: &docker.HostConfig{}, + }, + } + + runSyncPod(t, dm, fakeDocker, pod) + + verifyCalls(t, fakeDocker, []string{ + // Check the pod infra container. + "inspect_container", + // Create container. + "create", "start", + }) + + fakeDocker.Lock() + if len(fakeDocker.Created) != 1 || + !matchString(t, "k8s_bar\\.[a-f0-9]+_foo_new_", fakeDocker.Created[0]) { + t.Errorf("Unexpected containers created %v", fakeDocker.Created) + } + fakeDocker.Unlock() + if fakeHTTPClient.url != "http://foo:8080/bar" { + t.Errorf("Unexpected handler: %q", fakeHTTPClient.url) + } +} + +func TestSyncPodEventHandlerFails(t *testing.T) { + // Simulate HTTP failure. + fakeHTTPClient := &fakeHTTP{err: fmt.Errorf("test error")} + dm, fakeDocker := newTestDockerManagerWithHTTPClient(fakeHTTPClient) + + pod := &api.Pod{ + ObjectMeta: api.ObjectMeta{ + UID: "12345678", + Name: "foo", + Namespace: "new", + }, + Spec: api.PodSpec{ + Containers: []api.Container{ + {Name: "bar", + Lifecycle: &api.Lifecycle{ + PostStart: &api.Handler{ + HTTPGet: &api.HTTPGetAction{ + Host: "does.no.exist", + Port: util.IntOrString{IntVal: 8080, Kind: util.IntstrInt}, + Path: "bar", + }, + }, + }, + }, + }, + }, + } + + fakeDocker.ContainerList = []docker.APIContainers{ + { + // pod infra container + Names: []string{"/k8s_POD." + strconv.FormatUint(generatePodInfraContainerHash(pod), 16) + "_foo_new_12345678_42"}, + ID: "9876", + }, + } + fakeDocker.ContainerMap = map[string]*docker.Container{ + "9876": { + ID: "9876", + Config: &docker.Config{}, + HostConfig: &docker.HostConfig{}, + }, + } + + runSyncPod(t, dm, fakeDocker, pod) + + verifyCalls(t, fakeDocker, []string{ + // Check the pod infra container. + "inspect_container", + // Create the container. + "create", "start", + // Kill the container since event handler fails. + "inspect_container", "stop", + }) + + // TODO(yifan): Check the stopped container's name. + if len(fakeDocker.Stopped) != 1 { + t.Fatalf("Wrong containers were stopped: %v", fakeDocker.Stopped) + } + dockerName, _, err := ParseDockerName(fakeDocker.Stopped[0]) + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + if dockerName.ContainerName != "bar" { + t.Errorf("Wrong stopped container, expected: bar, get: %q", dockerName.ContainerName) + } +} diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index f55f69e453b..bfd7cb10898 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -73,6 +73,16 @@ type TestKubelet struct { const testKubeletHostname = "127.0.0.1" +type fakeHTTP struct { + url string + err error +} + +func (f *fakeHTTP) Get(url string) (*http.Response, error) { + f.url = url + return nil, f.err +} + func newTestKubelet(t *testing.T) *TestKubelet { fakeDocker := &dockertools.FakeDockerClient{Errors: make(map[string]error), RemovedImages: util.StringSet{}} fakeDocker.VersionInfo = []string{"ApiVersion=1.15"} @@ -530,100 +540,6 @@ func TestSyncPodsStartPod(t *testing.T) { fakeRuntime.AssertStartedPods([]string{string(pods[0].UID)}) } -type fakeHTTP struct { - url string - err error -} - -func (f *fakeHTTP) Get(url string) (*http.Response, error) { - f.url = url - return nil, f.err -} - -func TestSyncPodsWithPodInfraCreatesContainerCallsHandler(t *testing.T) { - testKubelet := newTestKubelet(t) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorApi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("DockerImagesFsInfo").Return(cadvisorApiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorApiv2.FsInfo{}, nil) - kubelet := testKubelet.kubelet - fakeDocker := testKubelet.fakeDocker - fakeHttp := fakeHTTP{} - - // Simulate HTTP failure. Re-create the containerRuntime to inject the failure. - kubelet.httpClient = &fakeHttp - runtimeHooks := newKubeletRuntimeHooks(kubelet.recorder) - kubelet.containerRuntime = dockertools.NewFakeDockerManager(kubelet.dockerClient, kubelet.recorder, kubelet.readinessManager, kubelet.containerRefManager, dockertools.PodInfraContainerImage, 0, 0, "", kubelet.os, kubelet.networkPlugin, kubelet, kubelet.httpClient, runtimeHooks) - - pods := []*api.Pod{ - { - ObjectMeta: api.ObjectMeta{ - UID: "12345678", - Name: "foo", - Namespace: "new", - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "bar", - Lifecycle: &api.Lifecycle{ - PostStart: &api.Handler{ - HTTPGet: &api.HTTPGetAction{ - Host: "foo", - Port: util.IntOrString{IntVal: 8080, Kind: util.IntstrInt}, - Path: "bar", - }, - }, - }, - }, - }, - }, - }, - } - fakeDocker.ContainerList = []docker.APIContainers{ - { - // pod infra container - Names: []string{"/k8s_POD." + strconv.FormatUint(generatePodInfraContainerHash(pods[0]), 16) + "_foo_new_12345678_0"}, - ID: "9876", - }, - } - fakeDocker.ContainerMap = map[string]*docker.Container{ - "9876": { - ID: "9876", - Config: &docker.Config{}, - HostConfig: &docker.HostConfig{}, - }, - } - kubelet.podManager.SetPods(pods) - err := kubelet.SyncPods(pods, emptyPodUIDs, map[string]*api.Pod{}, time.Now()) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - verifyCalls(t, fakeDocker, []string{ - "list", "list", - // Get pod status. - "list", "inspect_container", "inspect_image", - // Check the pod infra container. - "inspect_container", - // Create container. - "create", "start", - // Get pod status. - "list", "inspect_container", "inspect_container", - // Get pods for deleting orphaned volumes. - "list", - }) - - fakeDocker.Lock() - if len(fakeDocker.Created) != 1 || - !matchString(t, "k8s_bar\\.[a-f0-9]+_foo_new_", fakeDocker.Created[0]) { - t.Errorf("Unexpected containers created %v", fakeDocker.Created) - } - fakeDocker.Unlock() - if fakeHttp.url != "http://foo:8080/bar" { - t.Errorf("Unexpected handler: %q", fakeHttp.url) - } -} - func TestSyncPodsDeletesWhenSourcesAreReady(t *testing.T) { ready := false @@ -1086,95 +1002,6 @@ func TestRunInContainer(t *testing.T) { } } -func TestSyncPodEventHandlerFails(t *testing.T) { - testKubelet := newTestKubelet(t) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorApi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("DockerImagesFsInfo").Return(cadvisorApiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorApiv2.FsInfo{}, nil) - kubelet := testKubelet.kubelet - fakeDocker := testKubelet.fakeDocker - - // Simulate HTTP failure. Re-create the containerRuntime to inject the failure. - kubelet.httpClient = &fakeHTTP{ - err: fmt.Errorf("test error"), - } - runtimeHooks := newKubeletRuntimeHooks(kubelet.recorder) - kubelet.containerRuntime = dockertools.NewFakeDockerManager(kubelet.dockerClient, kubelet.recorder, kubelet.readinessManager, kubelet.containerRefManager, dockertools.PodInfraContainerImage, 0, 0, "", kubelet.os, kubelet.networkPlugin, kubelet, kubelet.httpClient, runtimeHooks) - - pods := []*api.Pod{ - { - ObjectMeta: api.ObjectMeta{ - UID: "12345678", - Name: "foo", - Namespace: "new", - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - {Name: "bar", - Lifecycle: &api.Lifecycle{ - PostStart: &api.Handler{ - HTTPGet: &api.HTTPGetAction{ - Host: "does.no.exist", - Port: util.IntOrString{IntVal: 8080, Kind: util.IntstrInt}, - Path: "bar", - }, - }, - }, - }, - }, - }, - }, - } - - fakeDocker.ContainerList = []docker.APIContainers{ - { - // pod infra container - Names: []string{"/k8s_POD." + strconv.FormatUint(generatePodInfraContainerHash(pods[0]), 16) + "_foo_new_12345678_42"}, - ID: "9876", - }, - } - fakeDocker.ContainerMap = map[string]*docker.Container{ - "9876": { - ID: "9876", - Config: &docker.Config{}, - HostConfig: &docker.HostConfig{}, - }, - } - kubelet.podManager.SetPods(pods) - err := kubelet.SyncPods(pods, emptyPodUIDs, map[string]*api.Pod{}, time.Now()) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - verifyCalls(t, fakeDocker, []string{ - "list", "list", - // Get pod status. - "list", "inspect_container", "inspect_image", - // Check the pod infra container. - "inspect_container", - // Create the container. - "create", "start", - // Kill the container since event handler fails. - "inspect_container", "stop", - // Get pod status. - "list", "inspect_container", "inspect_container", - // Get pods for deleting orphaned volumes. - "list", - }) - - // TODO(yifan): Check the stopped container's name. - if len(fakeDocker.Stopped) != 1 { - t.Fatalf("Wrong containers were stopped: %v", fakeDocker.Stopped) - } - dockerName, _, err := dockertools.ParseDockerName(fakeDocker.Stopped[0]) - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - if dockerName.ContainerName != "bar" { - t.Errorf("Wrong stopped container, expected: bar, get: %q", dockerName.ContainerName) - } -} - func TestParseResolvConf(t *testing.T) { testCases := []struct { data string