func TestSelectWrongPlugin(t *testing.T) { // install some random plugin under testPluginPath pluginName := fmt.Sprintf("test%d", rand.Intn(1000)) defer tearDownPlugin(pluginName) installPluginUnderTest(t, "", pluginName) wrongPlugin := "abcd" plug, err := network.InitNetworkPlugin(probeNetworkPluginsWithExecDir(testPluginPath), wrongPlugin, network.NewFakeHost(nil)) if plug != nil || err == nil { t.Errorf("Expected to see an error. Wrong plugin selected.") } }
func TestSelectPlugin(t *testing.T) { // install some random plugin under testPluginPath pluginName := fmt.Sprintf("test%d", rand.Intn(1000)) defer tearDownPlugin(pluginName) installPluginUnderTest(t, "", pluginName) plug, err := network.InitNetworkPlugin(probeNetworkPluginsWithExecDir(testPluginPath), pluginName, network.NewFakeHost(nil)) if err != nil { t.Errorf("Failed to select the desired plugin: %v", err) } if plug.Name() != pluginName { t.Errorf("Wrong plugin selected, chose %s, got %s\n", pluginName, plug.Name()) } }
func TestPluginTearDownHook(t *testing.T) { pluginName := fmt.Sprintf("test%d", rand.Intn(1000)) defer tearDownPlugin(pluginName) installPluginUnderTest(t, "", pluginName) plug, err := network.InitNetworkPlugin(probeNetworkPluginsWithExecDir(testPluginPath), pluginName, network.NewFakeHost(nil)) err = plug.TearDownPod("podNamespace", "podName", "dockerid2345") if err != nil { t.Errorf("Expected nil") } // check output of setup hook output, err := ioutil.ReadFile(path.Join(testPluginPath, pluginName, pluginName+".out")) if err != nil { t.Errorf("Expected nil") } expectedOutput := "teardown podNamespace podName dockerid2345" if string(output) != expectedOutput { t.Errorf("Mismatch in expected output for teardown hook. Expected '%s', got '%s'", expectedOutput, string(output)) } }
func TestPluginValidation(t *testing.T) { pluginName := fmt.Sprintf("test%d", rand.Intn(1000)) defer tearDownPlugin(pluginName) installPluginUnderTest(t, "", pluginName) // modify the perms of the pluginExecutable f, err := os.Open(path.Join(testPluginPath, pluginName, pluginName)) if err != nil { t.Errorf("Nil value expected.") } err = f.Chmod(0444) if err != nil { t.Errorf("Failed to set perms on plugin exec") } f.Close() _, err = network.InitNetworkPlugin(probeNetworkPluginsWithExecDir(testPluginPath), pluginName, network.NewFakeHost(nil)) if err == nil { // we expected an error here because validation would have failed t.Errorf("Expected non-nil value.") } }
func TestFindContainersByPod(t *testing.T) { tests := []struct { containerList []docker.APIContainers exitedContainerList []docker.APIContainers all bool expectedPods []*qingcontainer.Pod }{ { []docker.APIContainers{ { ID: "foobar", Names: []string{"/k8s_foobar.1234_qux_ns_1234_42"}, }, { ID: "barbar", Names: []string{"/k8s_barbar.1234_qux_ns_2343_42"}, }, { ID: "baz", Names: []string{"/k8s_baz.1234_qux_ns_1234_42"}, }, }, []docker.APIContainers{ { ID: "barfoo", Names: []string{"/k8s_barfoo.1234_qux_ns_1234_42"}, }, { ID: "bazbaz", Names: []string{"/k8s_bazbaz.1234_qux_ns_5678_42"}, }, }, false, []*qingcontainer.Pod{ { ID: "1234", Name: "qux", Namespace: "ns", Containers: []*qingcontainer.Container{ { ID: "foobar", Name: "foobar", Hash: 0x1234, }, { ID: "baz", Name: "baz", Hash: 0x1234, }, }, }, { ID: "2343", Name: "qux", Namespace: "ns", Containers: []*qingcontainer.Container{ { ID: "barbar", Name: "barbar", Hash: 0x1234, }, }, }, }, }, { []docker.APIContainers{ { ID: "foobar", Names: []string{"/k8s_foobar.1234_qux_ns_1234_42"}, }, { ID: "barbar", Names: []string{"/k8s_barbar.1234_qux_ns_2343_42"}, }, { ID: "baz", Names: []string{"/k8s_baz.1234_qux_ns_1234_42"}, }, }, []docker.APIContainers{ { ID: "barfoo", Names: []string{"/k8s_barfoo.1234_qux_ns_1234_42"}, }, { ID: "bazbaz", Names: []string{"/k8s_bazbaz.1234_qux_ns_5678_42"}, }, }, true, []*qingcontainer.Pod{ { ID: "1234", Name: "qux", Namespace: "ns", Containers: []*qingcontainer.Container{ { ID: "foobar", Name: "foobar", Hash: 0x1234, }, { ID: "barfoo", Name: "barfoo", Hash: 0x1234, }, { ID: "baz", Name: "baz", Hash: 0x1234, }, }, }, { ID: "2343", Name: "qux", Namespace: "ns", Containers: []*qingcontainer.Container{ { ID: "barbar", Name: "barbar", Hash: 0x1234, }, }, }, { ID: "5678", Name: "qux", Namespace: "ns", Containers: []*qingcontainer.Container{ { ID: "bazbaz", Name: "bazbaz", Hash: 0x1234, }, }, }, }, }, { []docker.APIContainers{}, []docker.APIContainers{}, true, nil, }, } fakeClient := &FakeDockerClient{} np, _ := network.InitNetworkPlugin([]network.NetworkPlugin{}, "", network.NewFakeHost(nil)) containerManager := NewFakeDockerManager(fakeClient, &record.FakeRecorder{}, nil, nil, PodInfraContainerImage, 0, 0, "", qingcontainer.FakeOS{}, np, nil, nil, nil) for i, test := range tests { fakeClient.ContainerList = test.containerList fakeClient.ExitedContainerList = test.exitedContainerList result, _ := containerManager.GetPods(test.all) for i := range result { sort.Sort(containersByID(result[i].Containers)) } for i := range test.expectedPods { sort.Sort(containersByID(test.expectedPods[i].Containers)) } sort.Sort(podsByID(result)) sort.Sort(podsByID(test.expectedPods)) if !reflect.DeepEqual(test.expectedPods, result) { t.Errorf("%d: expected: %#v, saw: %#v", i, test.expectedPods, result) } } }
func TestRunOnce(t *testing.T) { cadvisor := &cadvisor.Mock{} cadvisor.On("MachineInfo").Return(&cadvisorApi.MachineInfo{}, nil) podManager, _ := newFakePodManager() kb := &Qinglet{ rootDirectory: "/tmp/qinglet", recorder: &record.FakeRecorder{}, cadvisor: cadvisor, nodeLister: testNodeLister{}, statusManager: newStatusManager(nil), containerRefManager: qingcontainer.NewRefManager(), readinessManager: qingcontainer.NewReadinessManager(), podManager: podManager, os: qingcontainer.FakeOS{}, volumeManager: newVolumeManager(), } kb.containerManager, _ = newContainerManager(cadvisor, "", "", "") kb.networkPlugin, _ = network.InitNetworkPlugin([]network.NetworkPlugin{}, "", network.NewFakeHost(nil)) if err := kb.setupDataDirs(); err != nil { t.Errorf("Failed to init data dirs: %v", err) } podContainers := []docker.APIContainers{ { Names: []string{"/k8s_bar." + strconv.FormatUint(qingcontainer.HashContainer(&api.Container{Name: "bar"}), 16) + "_foo_new_12345678_42"}, ID: "1234", Status: "running", }, { Names: []string{"/k8s_net_foo.new.test_abcdefgh_42"}, ID: "9876", Status: "running", }, } kb.dockerClient = &testDocker{ listContainersResults: []listContainersResult{ {label: "list pod container", containers: []docker.APIContainers{}}, {label: "syncPod", containers: []docker.APIContainers{}}, {label: "list pod container", containers: []docker.APIContainers{}}, {label: "syncPod", containers: podContainers}, {label: "list pod container", containers: podContainers}, {label: "list pod container", containers: podContainers}, }, inspectContainersResults: []inspectContainersResult{ { label: "syncPod", container: docker.Container{ Config: &docker.Config{Image: "someimage"}, State: docker.State{Running: true, Pid: 42}, }, }, { label: "syncPod", container: docker.Container{ Config: &docker.Config{Image: "someimage"}, State: docker.State{Running: true, Pid: 42}, }, }, { label: "syncPod", container: docker.Container{ Config: &docker.Config{Image: "someimage"}, State: docker.State{Running: true, Pid: 42}, }, }, { label: "syncPod", container: docker.Container{ Config: &docker.Config{Image: "someimage"}, State: docker.State{Running: true, Pid: 42}, }, }, }, t: t, } kb.containerRuntime = dockertools.NewFakeDockerManager( kb.dockerClient, kb.recorder, kb.readinessManager, kb.containerRefManager, dockertools.PodInfraContainerImage, 0, 0, "", qingcontainer.FakeOS{}, kb.networkPlugin, kb, nil, newQingletRuntimeHooks(kb.recorder)) pods := []*api.Pod{ { ObjectMeta: api.ObjectMeta{ UID: "12345678", Name: "foo", Namespace: "new", }, Spec: api.PodSpec{ Containers: []api.Container{ {Name: "bar"}, }, }, }, } podManager.SetPods(pods) results, err := kb.runOnce(pods, time.Millisecond) if err != nil { t.Errorf("unexpected error: %v", err) } if results[0].Err != nil { t.Errorf("unexpected run pod error: %v", results[0].Err) } if results[0].Pod.Name != "foo" { t.Errorf("unexpected pod: %q", results[0].Pod.Name) } }
func createFakeRuntimeCache(fakeRecorder *record.FakeRecorder) qingcontainer.RuntimeCache { fakeDocker := &dockertools.FakeDockerClient{} np, _ := network.InitNetworkPlugin([]network.NetworkPlugin{}, "", network.NewFakeHost(nil)) dockerManager := dockertools.NewFakeDockerManager(fakeDocker, fakeRecorder, nil, nil, dockertools.PodInfraContainerImage, 0, 0, "", qingcontainer.FakeOS{}, np, nil, nil, newQingletRuntimeHooks(fakeRecorder)) return qingcontainer.NewFakeRuntimeCache(dockerManager) }
// TestFakePodWorkers verifies that the fakePodWorkers behaves the same way as the real podWorkers // for their invocation of the syncPodFn. func TestFakePodWorkers(t *testing.T) { // Create components for pod workers. fakeDocker := &dockertools.FakeDockerClient{} fakeRecorder := &record.FakeRecorder{} np, _ := network.InitNetworkPlugin([]network.NetworkPlugin{}, "", network.NewFakeHost(nil)) dockerManager := dockertools.NewFakeDockerManager(fakeDocker, fakeRecorder, nil, nil, dockertools.PodInfraContainerImage, 0, 0, "", qingcontainer.FakeOS{}, np, nil, nil, newQingletRuntimeHooks(fakeRecorder)) fakeRuntimeCache := qingcontainer.NewFakeRuntimeCache(dockerManager) qingletForRealWorkers := &simpleFakeQinglet{} qingletForFakeWorkers := &simpleFakeQinglet{} realPodWorkers := newPodWorkers(fakeRuntimeCache, qingletForRealWorkers.syncPodWithWaitGroup, fakeRecorder) fakePodWorkers := &fakePodWorkers{qingletForFakeWorkers.syncPod, fakeRuntimeCache, t} tests := []struct { pod *api.Pod mirrorPod *api.Pod containerList []docker.APIContainers containersInRunningPod int }{ { &api.Pod{}, &api.Pod{}, []docker.APIContainers{}, 0, }, { &api.Pod{ ObjectMeta: api.ObjectMeta{ UID: "12345678", Name: "foo", Namespace: "new", }, Spec: api.PodSpec{ Containers: []api.Container{ { Name: "fooContainer", }, }, }, }, &api.Pod{ ObjectMeta: api.ObjectMeta{ UID: "12345678", Name: "fooMirror", Namespace: "new", }, Spec: api.PodSpec{ Containers: []api.Container{ { Name: "fooContainerMirror", }, }, }, }, []docker.APIContainers{ { // format is // k8s_<container-id>_<pod-fullname>_<pod-uid>_<random> Names: []string{"/k8s_bar.hash123_foo_new_12345678_0"}, ID: "1234", }, { // pod infra container Names: []string{"/k8s_POD.hash123_foo_new_12345678_0"}, ID: "9876", }, }, 2, }, { &api.Pod{ ObjectMeta: api.ObjectMeta{ UID: "98765", Name: "bar", Namespace: "new", }, Spec: api.PodSpec{ Containers: []api.Container{ { Name: "fooContainer", }, }, }, }, &api.Pod{ ObjectMeta: api.ObjectMeta{ UID: "98765", Name: "fooMirror", Namespace: "new", }, Spec: api.PodSpec{ Containers: []api.Container{ { Name: "fooContainerMirror", }, }, }, }, []docker.APIContainers{ { // format is // k8s_<container-id>_<pod-fullname>_<pod-uid>_<random> Names: []string{"/k8s_bar.hash123_bar_new_98765_0"}, ID: "1234", }, { // pod infra container Names: []string{"/k8s_POD.hash123_foo_new_12345678_0"}, ID: "9876", }, }, 1, }, // Empty running pod. { &api.Pod{ ObjectMeta: api.ObjectMeta{ UID: "98765", Name: "baz", Namespace: "new", }, Spec: api.PodSpec{ Containers: []api.Container{ { Name: "bazContainer", }, }, }, }, &api.Pod{ ObjectMeta: api.ObjectMeta{ UID: "98765", Name: "bazMirror", Namespace: "new", }, Spec: api.PodSpec{ Containers: []api.Container{ { Name: "bazContainerMirror", }, }, }, }, []docker.APIContainers{ { // format is // k8s_<container-id>_<pod-fullname>_<pod-uid>_<random> Names: []string{"/k8s_bar.hash123_bar_new_12345678_0"}, ID: "1234", }, { // pod infra container Names: []string{"/k8s_POD.hash123_foo_new_12345678_0"}, ID: "9876", }, }, 0, }, } for i, tt := range tests { qingletForRealWorkers.wg.Add(1) fakeDocker.ContainerList = tt.containerList realPodWorkers.UpdatePod(tt.pod, tt.mirrorPod, func() {}) fakePodWorkers.UpdatePod(tt.pod, tt.mirrorPod, func() {}) qingletForRealWorkers.wg.Wait() if !reflect.DeepEqual(qingletForRealWorkers.pod, qingletForFakeWorkers.pod) { t.Errorf("%d: Expected: %#v, Actual: %#v", i, qingletForRealWorkers.pod, qingletForFakeWorkers.pod) } if !reflect.DeepEqual(qingletForRealWorkers.mirrorPod, qingletForFakeWorkers.mirrorPod) { t.Errorf("%d: Expected: %#v, Actual: %#v", i, qingletForRealWorkers.mirrorPod, qingletForFakeWorkers.mirrorPod) } if tt.containersInRunningPod != len(qingletForFakeWorkers.runningPod.Containers) { t.Errorf("%d: Expected: %#v, Actual: %#v", i, tt.containersInRunningPod, len(qingletForFakeWorkers.runningPod.Containers)) } sort.Sort(byContainerName(qingletForRealWorkers.runningPod)) sort.Sort(byContainerName(qingletForFakeWorkers.runningPod)) if !reflect.DeepEqual(qingletForRealWorkers.runningPod, qingletForFakeWorkers.runningPod) { t.Errorf("%d: Expected: %#v, Actual: %#v", i, qingletForRealWorkers.runningPod, qingletForFakeWorkers.runningPod) } } }