migrate ip cmd to netlink

pull/6/head
m1093782566 2017-10-17 16:18:11 +08:00
parent fa94105866
commit 876c73024c
6 changed files with 13 additions and 106 deletions

View File

@ -429,7 +429,7 @@ func (s *ProxyServer) Run() error {
if s.CleanupAndExit {
encounteredError := userspace.CleanupLeftovers(s.IptInterface)
encounteredError = iptables.CleanupLeftovers(s.IptInterface) || encounteredError
encounteredError = ipvs.CleanupLeftovers(s.execer, s.IpvsInterface, s.IptInterface) || encounteredError
encounteredError = ipvs.CleanupLeftovers(s.IpvsInterface, s.IptInterface) || encounteredError
if encounteredError {
return errors.New("encountered an error while tearing down rules.")
}

View File

@ -153,7 +153,7 @@ func NewProxyServer(config *componentconfig.KubeProxyConfiguration, cleanupAndEx
userspace.CleanupLeftovers(iptInterface)
// IPVS Proxier will generate some iptables rules,
// need to clean them before switching to other proxy mode.
ipvs.CleanupLeftovers(execer, ipvsInterface, iptInterface)
ipvs.CleanupLeftovers(ipvsInterface, iptInterface)
} else if proxyMode == proxyModeIPVS {
glog.V(0).Info("Using ipvs Proxier.")
proxierIPVS, err := ipvs.NewProxier(
@ -213,7 +213,7 @@ func NewProxyServer(config *componentconfig.KubeProxyConfiguration, cleanupAndEx
iptables.CleanupLeftovers(iptInterface)
// IPVS Proxier will generate some iptables rules,
// need to clean them before switching to other proxy mode.
ipvs.CleanupLeftovers(execer, ipvsInterface, iptInterface)
ipvs.CleanupLeftovers(ipvsInterface, iptInterface)
}
iptInterface.AddReloadFunc(proxier.Sync)

View File

@ -8,7 +8,9 @@ load(
go_test(
name = "go_default_test",
srcs = ["proxier_test.go"],
srcs = [
"proxier_test.go",
],
importpath = "k8s.io/kubernetes/pkg/proxy/ipvs",
library = ":go_default_library",
deps = [

View File

@ -78,7 +78,9 @@ func (h *netlinkHandle) EnsureDummyDevice(devName string) (bool, error) {
// found dummy device
return true, nil
}
dummy := &netlink.Dummy{netlink.LinkAttrs{Name: devName}}
dummy := &netlink.Dummy{
LinkAttrs: netlink.LinkAttrs{Name: devName},
}
return false, h.LinkAdd(dummy)
}

View File

@ -738,7 +738,7 @@ func cleanupIptablesLeftovers(ipt utiliptables.Interface) (encounteredError bool
}
// CleanupLeftovers clean up all ipvs and iptables rules created by ipvs Proxier.
func CleanupLeftovers(execer utilexec.Interface, ipvs utilipvs.Interface, ipt utiliptables.Interface) (encounteredError bool) {
func CleanupLeftovers(ipvs utilipvs.Interface, ipt utiliptables.Interface) (encounteredError bool) {
// Return immediately when ipvs interface is nil - Probably initialization failed in somewhere.
if ipvs == nil {
return true
@ -751,7 +751,8 @@ func CleanupLeftovers(execer utilexec.Interface, ipvs utilipvs.Interface, ipt ut
encounteredError = true
}
// Delete dummy interface created by ipvs Proxier.
err = deleteDummyDevice(execer, DefaultDummyDevice)
nl := NewNetLinkHandle()
err = nl.DeleteDummyDevice(DefaultDummyDevice)
if err != nil {
encounteredError = true
}
@ -945,7 +946,7 @@ func (proxier *Proxier) syncProxyRules() {
// End install iptables
// make sure dummy interface exists in the system where ipvs Proxier will bind service address on it
_, err = ensureDummyDevice(proxier.exec, DefaultDummyDevice)
_, err = proxier.netlinkHandle.EnsureDummyDevice(DefaultDummyDevice)
if err != nil {
glog.Errorf("Failed to create dummy interface: %s, error: %v", DefaultDummyDevice, err)
return
@ -1520,32 +1521,6 @@ func openLocalPort(lp *utilproxy.LocalPort) (utilproxy.Closeable, error) {
return socket, nil
}
const cmdIP = "ip"
func ensureDummyDevice(execer utilexec.Interface, dummyDev string) (exist bool, err error) {
args := []string{"link", "add", dummyDev, "type", "dummy"}
out, err := execer.Command(cmdIP, args...).CombinedOutput()
if err != nil {
// "exit status code 2" will be returned if the device already exists
if ee, ok := err.(utilexec.ExitError); ok {
if ee.Exited() && ee.ExitStatus() == 2 {
return true, nil
}
}
return false, fmt.Errorf("error creating dummy interface %q: %v: %s", dummyDev, err, out)
}
return false, nil
}
func deleteDummyDevice(execer utilexec.Interface, dummyDev string) error {
args := []string{"link", "del", dummyDev}
out, err := execer.Command(cmdIP, args...).CombinedOutput()
if err != nil {
return fmt.Errorf("error deleting dummy interface %q: %v: %s", dummyDev, err, out)
}
return nil
}
// ipvs Proxier fall back on iptables when it needs to do SNAT for engress packets
// It will only operate iptables *nat table.
// Create and link the kube postrouting chain for SNAT packets.

View File

@ -2213,75 +2213,3 @@ func Test_endpointsToEndpointsMap(t *testing.T) {
}
}
}
func Test_ensureDummyDevice(t *testing.T) {
fcmd := fakeexec.FakeCmd{
CombinedOutputScript: []fakeexec.FakeCombinedOutputAction{
// Success.
func() ([]byte, error) { return []byte{}, nil },
// Exists.
func() ([]byte, error) { return nil, &fakeexec.FakeExitError{Status: 2} },
},
}
fexec := fakeexec.FakeExec{
CommandScript: []fakeexec.FakeCommandAction{
func(cmd string, args ...string) exec.Cmd { return fakeexec.InitFakeCmd(&fcmd, cmd, args...) },
func(cmd string, args ...string) exec.Cmd { return fakeexec.InitFakeCmd(&fcmd, cmd, args...) },
},
}
// Success.
exists, err := ensureDummyDevice(&fexec, DefaultDummyDevice)
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() calls, got %d", fcmd.CombinedOutputCalls)
}
if !sets.NewString(fcmd.CombinedOutputLog[0]...).HasAll("ip", "link", "add", "kube-ipvs0", "type", "dummy") {
t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[0])
}
// Exists.
exists, err = ensureDummyDevice(&fexec, DefaultDummyDevice)
if err != nil {
t.Errorf("expected success, got %v", err)
}
if !exists {
t.Errorf("expected exists = true")
}
}
func Test_deleteDummyDevice(t *testing.T) {
fcmd := fakeexec.FakeCmd{
CombinedOutputScript: []fakeexec.FakeCombinedOutputAction{
// Success.
func() ([]byte, error) { return []byte{}, nil },
// Failure.
func() ([]byte, error) { return nil, &fakeexec.FakeExitError{Status: 1} },
},
}
fexec := fakeexec.FakeExec{
CommandScript: []fakeexec.FakeCommandAction{
func(cmd string, args ...string) exec.Cmd { return fakeexec.InitFakeCmd(&fcmd, cmd, args...) },
func(cmd string, args ...string) exec.Cmd { return fakeexec.InitFakeCmd(&fcmd, cmd, args...) },
},
}
// Success.
err := deleteDummyDevice(&fexec, DefaultDummyDevice)
if err != nil {
t.Errorf("expected success, got %v", err)
}
if fcmd.CombinedOutputCalls != 1 {
t.Errorf("expected 1 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls)
}
if !sets.NewString(fcmd.CombinedOutputLog[0]...).HasAll("ip", "link", "del", "kube-ipvs0") {
t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[0])
}
// Failure.
err = deleteDummyDevice(&fexec, DefaultDummyDevice)
if err == nil {
t.Errorf("expected failure")
}
}