From fa94105866c22f50eabad88bd9ff13bd838486b4 Mon Sep 17 00:00:00 2001 From: m1093782566 Date: Tue, 17 Oct 2017 16:33:12 +0800 Subject: [PATCH] implement dummy device operation by netlink --- pkg/proxy/ipvs/netlink.go | 4 ++++ pkg/proxy/ipvs/netlink_linux.go | 24 ++++++++++++++++++++++++ pkg/proxy/ipvs/netlink_unsupported.go | 10 ++++++++++ pkg/proxy/ipvs/testing/fake.go | 10 ++++++++++ 4 files changed, 48 insertions(+) diff --git a/pkg/proxy/ipvs/netlink.go b/pkg/proxy/ipvs/netlink.go index a4e859f2b29..4f66f706ee5 100644 --- a/pkg/proxy/ipvs/netlink.go +++ b/pkg/proxy/ipvs/netlink.go @@ -22,4 +22,8 @@ type NetLinkHandle interface { EnsureAddressBind(address, devName string) (exist bool, err error) // UnbindAddress unbind address from the interface UnbindAddress(address, devName string) error + // EnsureDummyDevice checks if dummy device is exist and, if not, create one. If the dummy device is already exist, return true. + EnsureDummyDevice(devName string) (exist bool, err error) + // DeleteDummyDevice deletes the given dummy device by name. + DeleteDummyDevice(devName string) error } diff --git a/pkg/proxy/ipvs/netlink_linux.go b/pkg/proxy/ipvs/netlink_linux.go index df5b2f779a3..28aee2e846b 100644 --- a/pkg/proxy/ipvs/netlink_linux.go +++ b/pkg/proxy/ipvs/netlink_linux.go @@ -70,3 +70,27 @@ func (h *netlinkHandle) UnbindAddress(address, devName string) error { } return nil } + +// EnsureDummyDevice is part of interface +func (h *netlinkHandle) EnsureDummyDevice(devName string) (bool, error) { + _, err := h.LinkByName(devName) + if err == nil { + // found dummy device + return true, nil + } + dummy := &netlink.Dummy{netlink.LinkAttrs{Name: devName}} + return false, h.LinkAdd(dummy) +} + +// DeleteDummyDevice is part of interface. +func (h *netlinkHandle) DeleteDummyDevice(devName string) error { + link, err := h.LinkByName(devName) + if err != nil { + return fmt.Errorf("error deleting a non-exist dummy device: %s", devName) + } + dummy, ok := link.(*netlink.Dummy) + if !ok { + return fmt.Errorf("expect dummy device, got device type: %s", link.Type()) + } + return h.LinkDel(dummy) +} diff --git a/pkg/proxy/ipvs/netlink_unsupported.go b/pkg/proxy/ipvs/netlink_unsupported.go index 6fec7de4a6e..1e22685b279 100644 --- a/pkg/proxy/ipvs/netlink_unsupported.go +++ b/pkg/proxy/ipvs/netlink_unsupported.go @@ -39,3 +39,13 @@ func (h *emptyHandle) EnsureAddressBind(address, devName string) (exist bool, er func (h *emptyHandle) UnbindAddress(address, devName string) error { return fmt.Errorf("netlink not supported for this platform") } + +// EnsureDummyDevice is part of interface +func (h *emptyHandle) EnsureDummyDevice(devName string) (bool, error) { + return false, fmt.Errorf("netlink is not supported in this platform") +} + +// DeleteDummyDevice is part of interface. +func (h *emptyHandle) DeleteDummyDevice(devName string) error { + return fmt.Errorf("netlink is not supported in this platform") +} diff --git a/pkg/proxy/ipvs/testing/fake.go b/pkg/proxy/ipvs/testing/fake.go index e1dc62929e3..9af5888f5c6 100644 --- a/pkg/proxy/ipvs/testing/fake.go +++ b/pkg/proxy/ipvs/testing/fake.go @@ -36,3 +36,13 @@ func (h *FakeNetlinkHandle) EnsureAddressBind(address, devName string) (exist bo func (h *FakeNetlinkHandle) UnbindAddress(address, devName string) error { return nil } + +// EnsureDummyDevice is a mock implementation +func (h *FakeNetlinkHandle) EnsureDummyDevice(devName string) (bool, error) { + return false, nil +} + +// DeleteDummyDevice is a mock implementation +func (h *FakeNetlinkHandle) DeleteDummyDevice(devName string) error { + return nil +}