func TestWaitFlagNew(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.4.22"), nil }, // Success. func() ([]byte, error) { return []byte{}, nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) defer runner.Destroy() err := runner.DeleteChain(TableNAT, Chain("FOOBAR")) if err != nil { t.Errorf("expected success, got %v", err) } if fcmd.CombinedOutputCalls != 2 { t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) } if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-w2") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) } if sets.NewString(fcmd.CombinedOutputLog[1]...).HasAny("-w") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) } }
func TestDeleteRuleNew(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, // Success on the first call. func() ([]byte, error) { return []byte{}, nil }, // Success on the second call. func() ([]byte, error) { return []byte{}, nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ // iptables version check func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, // The second Command() call is checking the rule. Success of that means delete it. func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) defer runner.Destroy() err := runner.DeleteRule(TableNAT, ChainOutput, "abc", "123") if err != nil { t.Errorf("expected success, got %v", err) } if fcmd.CombinedOutputCalls != 3 { t.Errorf("expected 3 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) } if !sets.NewString(fcmd.CombinedOutputLog[2]...).HasAll("iptables", "-t", "nat", "-D", "OUTPUT", "abc", "123") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[2]) } }
func TestDeleteRuleErrorCreating(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, // Success on the first call. func() ([]byte, error) { return []byte{}, nil }, // Status 1 on the second call. func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 1} }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ // iptables version check func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, // The second Command() call is checking the rule. Success of that means delete it. func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) defer runner.Destroy() err := runner.DeleteRule(TableNAT, ChainOutput, "abc", "123") if err == nil { t.Errorf("expected failure") } if fcmd.CombinedOutputCalls != 3 { t.Errorf("expected 3 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) } }
func TestEnsureRuleAlreadyExists(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, // Success. func() ([]byte, error) { return []byte{}, nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ // iptables version check func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, // The second Command() call is checking the rule. Success of that exec means "done". func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) defer runner.Destroy() exists, err := runner.EnsureRule(Append, TableNAT, ChainOutput, "abc", "123") if err != nil { t.Errorf("expected success, got %v", err) } if !exists { t.Errorf("expected exists = true") } if fcmd.CombinedOutputCalls != 2 { t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) } if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-t", "nat", "-C", "OUTPUT", "abc", "123") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) } }
func testEnsureChain(t *testing.T, protocol Protocol) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, // Success. func() ([]byte, error) { return []byte{}, nil }, // Exists. func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 1} }, // Failure. func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 2} }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, dbus.NewFake(nil, nil), protocol) defer runner.Destroy() // Success. exists, err := runner.EnsureChain(TableNAT, Chain("FOOBAR")) if err != nil { t.Errorf("expected success, got %v", err) } if exists { t.Errorf("expected exists = false") } if fcmd.CombinedOutputCalls != 2 { t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) } cmd := getIptablesCommand(protocol) if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll(cmd, "-t", "nat", "-N", "FOOBAR") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) } // Exists. exists, err = runner.EnsureChain(TableNAT, Chain("FOOBAR")) if err != nil { t.Errorf("expected success, got %v", err) } if !exists { t.Errorf("expected exists = true") } // Failure. _, err = runner.EnsureChain(TableNAT, Chain("FOOBAR")) if err == nil { t.Errorf("expected failure") } }
func TestFindPairInterfaceOfContainerInterface(t *testing.T) { // there should be at least "lo" on any system interfaces, _ := net.Interfaces() validOutput := fmt.Sprintf("garbage\n peer_ifindex: %d", interfaces[0].Index) invalidOutput := fmt.Sprintf("garbage\n unknown: %d", interfaces[0].Index) tests := []struct { output string err error expectedName string expectErr bool }{ { output: validOutput, expectedName: interfaces[0].Name, }, { output: invalidOutput, expectErr: true, }, { output: validOutput, err: errors.New("error"), expectErr: true, }, } for _, test := range tests { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte(test.output), test.err }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, LookPathFunc: func(file string) (string, error) { return fmt.Sprintf("/fake-bin/%s", file), nil }, } nsenterArgs := []string{"-t", "123", "-n"} name, err := findPairInterfaceOfContainerInterface(&fexec, "eth0", "123", nsenterArgs) if test.expectErr { if err == nil { t.Errorf("unexpected non-error") } } else { if err != nil { t.Errorf("unexpected error: %v", err) } } if name != test.expectedName { t.Errorf("unexpected name: %s (expected: %s)", name, test.expectedName) } } }
func TestCheckRuleWithoutCheckAbsent(t *testing.T) { iptables_save_output := `# Generated by iptables-save v1.4.7 on Wed Oct 29 14:56:01 2014 *nat :PREROUTING ACCEPT [2136997:197881818] :POSTROUTING ACCEPT [4284525:258542680] :OUTPUT ACCEPT [5901660:357267963] -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER COMMIT # Completed on Wed Oct 29 14:56:01 2014` fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // Success. func() ([]byte, error) { return []byte(iptables_save_output), nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ // The first Command() call is checking the rule. Success of that exec means "done". func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := &runner{exec: &fexec} exists, err := runner.checkRuleWithoutCheck(TableNAT, ChainPrerouting, "-m", "addrtype", "-j", "DOCKER") if err != nil { t.Errorf("expected success, got %v", err) } if exists { t.Errorf("expected exists = false") } if fcmd.CombinedOutputCalls != 1 { t.Errorf("expected 1 CombinedOutput() call, got %d", fcmd.CombinedOutputCalls) } if !sets.NewString(fcmd.CombinedOutputLog[0]...).HasAll("iptables-save", "-t", "nat") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[0]) } }
func TestGetIptablesHasCheckCommand(t *testing.T) { testCases := []struct { Version string Err bool Expected bool }{ {"iptables v1.4.7", false, false}, {"iptables v1.4.11", false, true}, {"iptables v1.4.19.1", false, true}, {"iptables v2.0.0", false, true}, {"total junk", true, false}, } for _, testCase := range testCases { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte(testCase.Version), nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } version, err := getIptablesVersionString(&fexec) if (err != nil) != testCase.Err { t.Errorf("Expected error: %v, Got error: %v", testCase.Err, err) } if err == nil { check := getIptablesHasCheckCommand(version) if testCase.Expected != check { t.Errorf("Expected result: %v, Got result: %v", testCase.Expected, check) } } } }
func TestReload(t *testing.T) { dbusConn := dbus.NewFakeConnection() dbusConn.SetBusObject(func(method string, args ...interface{}) ([]interface{}, error) { return nil, nil }) dbusConn.AddObject(firewalldName, firewalldPath, func(method string, args ...interface{}) ([]interface{}, error) { return nil, nil }) fdbus := dbus.NewFake(dbusConn, nil) reloaded := make(chan bool, 2) fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.4.22"), nil }, // first reload // EnsureChain func() ([]byte, error) { return []byte{}, nil }, // EnsureRule abc check func() ([]byte, error) { return []byte{}, &exec.FakeExitError{Status: 1} }, // EnsureRule abc func() ([]byte, error) { return []byte{}, nil }, // second reload // EnsureChain func() ([]byte, error) { return []byte{}, nil }, // EnsureRule abc check func() ([]byte, error) { return []byte{}, &exec.FakeExitError{Status: 1} }, // EnsureRule abc func() ([]byte, error) { return []byte{}, nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, fdbus, ProtocolIpv4) defer runner.Destroy() runner.AddReloadFunc(func() { exists, err := runner.EnsureChain(TableNAT, Chain("FOOBAR")) if err != nil { t.Errorf("expected success, got %v", err) } if exists { t.Errorf("expected exists = false") } reloaded <- true }) runner.AddReloadFunc(func() { exists, err := runner.EnsureRule(Append, TableNAT, ChainOutput, "abc", "123") if err != nil { t.Errorf("expected success, got %v", err) } if exists { t.Errorf("expected exists = false") } reloaded <- true }) dbusConn.EmitSignal("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "NameOwnerChanged", firewalldName, "", ":1.1") <-reloaded <-reloaded if fcmd.CombinedOutputCalls != 4 { t.Errorf("expected 4 CombinedOutput() calls total, got %d", fcmd.CombinedOutputCalls) } if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-t", "nat", "-N", "FOOBAR") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) } if !sets.NewString(fcmd.CombinedOutputLog[2]...).HasAll("iptables", "-t", "nat", "-C", "OUTPUT", "abc", "123") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[2]) } if !sets.NewString(fcmd.CombinedOutputLog[3]...).HasAll("iptables", "-t", "nat", "-A", "OUTPUT", "abc", "123") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[3]) } go func() { time.Sleep(time.Second / 100); reloaded <- true }() dbusConn.EmitSignal(firewalldName, firewalldPath, firewalldInterface, "DefaultZoneChanged", "public") dbusConn.EmitSignal("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "NameOwnerChanged", "io.k8s.Something", "", ":1.1") <-reloaded if fcmd.CombinedOutputCalls != 4 { t.Errorf("Incorrect signal caused a reload") } dbusConn.EmitSignal(firewalldName, firewalldPath, firewalldInterface, "Reloaded") <-reloaded <-reloaded if fcmd.CombinedOutputCalls != 7 { t.Errorf("expected 7 CombinedOutput() calls total, got %d", fcmd.CombinedOutputCalls) } if !sets.NewString(fcmd.CombinedOutputLog[4]...).HasAll("iptables", "-t", "nat", "-N", "FOOBAR") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[4]) } if !sets.NewString(fcmd.CombinedOutputLog[5]...).HasAll("iptables", "-t", "nat", "-C", "OUTPUT", "abc", "123") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[5]) } if !sets.NewString(fcmd.CombinedOutputLog[6]...).HasAll("iptables", "-t", "nat", "-A", "OUTPUT", "abc", "123") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[6]) } }
func TestSafeFormatAndMount(t *testing.T) { if runtime.GOOS == "darwin" || runtime.GOOS == "windows" { t.Skipf("not supported on GOOS=%s", runtime.GOOS) } tests := []struct { description string fstype string mountOptions []string execScripts []ExecArgs mountErrs []error expectedError error }{ { description: "Test a read only mount", fstype: "ext4", mountOptions: []string{"ro"}, }, { description: "Test a normal mount", fstype: "ext4", execScripts: []ExecArgs{ {"fsck", []string{"-a", "/dev/foo"}, "", nil}, }, }, { description: "Test 'fsck' fails with exit status 4", fstype: "ext4", execScripts: []ExecArgs{ {"fsck", []string{"-a", "/dev/foo"}, "", &exec.FakeExitError{Status: 4}}, }, expectedError: fmt.Errorf("'fsck' found errors on device /dev/foo but could not correct them: ."), }, { description: "Test 'fsck' fails with exit status 1 (errors found and corrected)", fstype: "ext4", execScripts: []ExecArgs{ {"fsck", []string{"-a", "/dev/foo"}, "", &exec.FakeExitError{Status: 1}}, }, }, { description: "Test 'fsck' fails with exit status other than 1 and 4 (likely unformatted device)", fstype: "ext4", execScripts: []ExecArgs{ {"fsck", []string{"-a", "/dev/foo"}, "", &exec.FakeExitError{Status: 8}}, }, }, { description: "Test that 'lsblk' is called and fails", fstype: "ext4", mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'")}, execScripts: []ExecArgs{ {"fsck", []string{"-a", "/dev/foo"}, "", nil}, {"lsblk", []string{"-nd", "-o", "FSTYPE", "/dev/foo"}, "ext4", nil}, }, expectedError: fmt.Errorf("unknown filesystem type '(null)'"), }, { description: "Test that 'lsblk' is called and confirms unformatted disk, format fails", fstype: "ext4", mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'")}, execScripts: []ExecArgs{ {"fsck", []string{"-a", "/dev/foo"}, "", nil}, {"lsblk", []string{"-nd", "-o", "FSTYPE", "/dev/foo"}, "", nil}, {"mkfs.ext4", []string{"-E", "lazy_itable_init=0,lazy_journal_init=0", "-F", "/dev/foo"}, "", fmt.Errorf("formatting failed")}, }, expectedError: fmt.Errorf("formatting failed"), }, { description: "Test that 'lsblk' is called and confirms unformatted disk, format passes, second mount fails", fstype: "ext4", mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), fmt.Errorf("Still cannot mount")}, execScripts: []ExecArgs{ {"fsck", []string{"-a", "/dev/foo"}, "", nil}, {"lsblk", []string{"-nd", "-o", "FSTYPE", "/dev/foo"}, "", nil}, {"mkfs.ext4", []string{"-E", "lazy_itable_init=0,lazy_journal_init=0", "-F", "/dev/foo"}, "", nil}, }, expectedError: fmt.Errorf("Still cannot mount"), }, { description: "Test that 'lsblk' is called and confirms unformatted disk, format passes, second mount passes", fstype: "ext4", mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), nil}, execScripts: []ExecArgs{ {"fsck", []string{"-a", "/dev/foo"}, "", nil}, {"lsblk", []string{"-nd", "-o", "FSTYPE", "/dev/foo"}, "", nil}, {"mkfs.ext4", []string{"-E", "lazy_itable_init=0,lazy_journal_init=0", "-F", "/dev/foo"}, "", nil}, }, expectedError: nil, }, { description: "Test that 'lsblk' is called and confirms unformatted disk, format passes, second mount passes with ext3", fstype: "ext3", mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), nil}, execScripts: []ExecArgs{ {"fsck", []string{"-a", "/dev/foo"}, "", nil}, {"lsblk", []string{"-nd", "-o", "FSTYPE", "/dev/foo"}, "", nil}, {"mkfs.ext3", []string{"-E", "lazy_itable_init=0,lazy_journal_init=0", "-F", "/dev/foo"}, "", nil}, }, expectedError: nil, }, { description: "test that none ext4 fs does not get called with ext4 options.", fstype: "xfs", mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), nil}, execScripts: []ExecArgs{ {"fsck", []string{"-a", "/dev/foo"}, "", nil}, {"lsblk", []string{"-nd", "-o", "FSTYPE", "/dev/foo"}, "", nil}, {"mkfs.xfs", []string{"/dev/foo"}, "", nil}, }, expectedError: nil, }, } for _, test := range tests { commandScripts := []exec.FakeCommandAction{} for _, expected := range test.execScripts { ecmd := expected.command eargs := expected.args output := expected.output err := expected.err commandScript := func(cmd string, args ...string) exec.Cmd { if cmd != ecmd { t.Errorf("Unexpected command %s. Expecting %s", cmd, ecmd) } for j := range args { if args[j] != eargs[j] { t.Errorf("Unexpected args %v. Expecting %v", args, eargs) } } fake := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte(output), err }, }, } return exec.InitFakeCmd(&fake, cmd, args...) } commandScripts = append(commandScripts, commandScript) } fake := exec.FakeExec{ CommandScript: commandScripts, } fakeMounter := ErrorMounter{&FakeMounter{}, 0, test.mountErrs} mounter := SafeFormatAndMount{ Interface: &fakeMounter, Runner: &fake, } device := "/dev/foo" dest := "/mnt/bar" err := mounter.FormatAndMount(device, dest, test.fstype, test.mountOptions) if test.expectedError == nil { if err != nil { t.Errorf("test \"%s\" unexpected non-error: %v", test.description, err) } // Check that something was mounted on the directory isNotMountPoint, err := fakeMounter.IsLikelyNotMountPoint(dest) if err != nil || isNotMountPoint { t.Errorf("test \"%s\" the directory was not mounted", test.description) } //check that the correct device was mounted mountedDevice, _, err := GetDeviceNameFromMount(fakeMounter.FakeMounter, dest) if err != nil || mountedDevice != device { t.Errorf("test \"%s\" the correct device was not mounted", test.description) } } else { if err == nil || test.expectedError.Error() != err.Error() { t.Errorf("test \"%s\" unexpected error: \n [%v]. \nExpecting [%v]", test.description, err, test.expectedError) } } } }
func TestCNIPlugin(t *testing.T) { // install some random plugin pluginName := fmt.Sprintf("test%d", rand.Intn(1000)) vendorName := fmt.Sprintf("test_vendor%d", rand.Intn(1000)) podIP := "10.0.0.2" podIPOutput := fmt.Sprintf("4: eth0 inet %s/24 scope global dynamic eth0\\ valid_lft forever preferred_lft forever", podIP) fakeCmds := []utilexec.FakeCommandAction{ func(cmd string, args ...string) utilexec.Cmd { return utilexec.InitFakeCmd(&utilexec.FakeCmd{ CombinedOutputScript: []utilexec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte(podIPOutput), nil }, }, }, cmd, args...) }, } fexec := &utilexec.FakeExec{ CommandScript: fakeCmds, LookPathFunc: func(file string) (string, error) { return fmt.Sprintf("/fake-bin/%s", file), nil }, } tmpDir := utiltesting.MkTmpdirOrDie("cni-test") testNetworkConfigPath := path.Join(tmpDir, "plugins", "net", "cni") testVendorCNIDirPrefix := tmpDir defer tearDownPlugin(tmpDir) installPluginUnderTest(t, testVendorCNIDirPrefix, testNetworkConfigPath, vendorName, pluginName) containerID := kubecontainer.ContainerID{Type: "test", ID: "test_infra_container"} pods := []*containertest.FakePod{{ Pod: &kubecontainer.Pod{ Containers: []*kubecontainer.Container{ {ID: containerID}, }, }, NetnsPath: "/proc/12345/ns/net", }} plugins := probeNetworkPluginsWithVendorCNIDirPrefix(path.Join(testNetworkConfigPath, pluginName), testVendorCNIDirPrefix) if len(plugins) != 1 { t.Fatalf("Expected only one network plugin, got %d", len(plugins)) } if plugins[0].Name() != "cni" { t.Fatalf("Expected CNI network plugin, got %q", plugins[0].Name()) } cniPlugin, ok := plugins[0].(*cniNetworkPlugin) if !ok { t.Fatalf("Not a CNI network plugin!") } cniPlugin.execer = fexec plug, err := network.InitNetworkPlugin(plugins, "cni", NewFakeHost(nil, pods), componentconfig.HairpinNone, "10.0.0.0/8") if err != nil { t.Fatalf("Failed to select the desired plugin: %v", err) } // Set up the pod err = plug.SetUpPod("podNamespace", "podName", containerID) if err != nil { t.Errorf("Expected nil: %v", err) } outputEnv := path.Join(testNetworkConfigPath, pluginName, pluginName+".env") eo, eerr := ioutil.ReadFile(outputEnv) outputFile := path.Join(testNetworkConfigPath, pluginName, pluginName+".out") output, err := ioutil.ReadFile(outputFile) if err != nil { t.Errorf("Failed to read output file %s: %v (env %s err %v)", outputFile, err, eo, eerr) } expectedOutput := "ADD /proc/12345/ns/net podNamespace podName test_infra_container" if string(output) != expectedOutput { t.Errorf("Mismatch in expected output for setup hook. Expected '%s', got '%s'", expectedOutput, string(output)) } // Get its IP address status, err := plug.GetPodNetworkStatus("podNamespace", "podName", containerID) if err != nil { t.Errorf("Failed to read pod network status: %v", err) } if status.IP.String() != podIP { t.Errorf("Expected pod IP %q but got %q", podIP, status.IP.String()) } // Tear it down err = plug.TearDownPod("podNamespace", "podName", containerID) if err != nil { t.Errorf("Expected nil: %v", err) } output, err = ioutil.ReadFile(path.Join(testNetworkConfigPath, pluginName, pluginName+".out")) expectedOutput = "DEL /proc/12345/ns/net podNamespace podName test_infra_container" if string(output) != expectedOutput { t.Errorf("Mismatch in expected output for setup hook. Expected '%s', got '%s'", expectedOutput, string(output)) } }