proxy/conntrack: interface update

Signed-off-by: Daman Arora <aroradaman@gmail.com>
This commit is contained in:
Daman Arora 2024-09-13 00:56:32 +05:30
parent 9ec52fc063
commit ba3940c2e0
4 changed files with 18 additions and 13 deletions

View File

@ -75,8 +75,10 @@ func deleteStaleServiceConntrackEntries(ct Interface, ipFamily v1.IPFamily, svcP
filters = append(filters, filterForPort(nodePort, v1.ProtocolUDP)) filters = append(filters, filterForPort(nodePort, v1.ProtocolUDP))
} }
if err := ct.ClearEntries(ipFamilyMap[ipFamily], filters...); err != nil { if n, err := ct.ClearEntries(ipFamilyMap[ipFamily], filters...); err != nil {
klog.ErrorS(err, "Failed to delete stale service connections") klog.ErrorS(err, "Failed to delete stale service connections")
} else {
klog.V(4).InfoS("Deleted conntrack stale entries for services", "count", n)
} }
} }
@ -103,8 +105,10 @@ func deleteStaleEndpointConntrackEntries(ct Interface, ipFamily v1.IPFamily, svc
} }
} }
if err := ct.ClearEntries(ipFamilyMap[ipFamily], filters...); err != nil { if n, err := ct.ClearEntries(ipFamilyMap[ipFamily], filters...); err != nil {
klog.ErrorS(err, "Failed to delete stale endpoint connections") klog.ErrorS(err, "Failed to delete stale endpoint connections")
} else {
klog.V(4).InfoS("Deleted conntrack stale entries for endpoints", "count", n)
} }
} }

View File

@ -31,7 +31,7 @@ import (
type Interface interface { type Interface interface {
// ClearEntries deletes conntrack entries for connections of the given IP family, // ClearEntries deletes conntrack entries for connections of the given IP family,
// filtered by the given filters. // filtered by the given filters.
ClearEntries(ipFamily uint8, filters ...netlink.CustomConntrackFilter) error ClearEntries(ipFamily uint8, filters ...netlink.CustomConntrackFilter) (int, error)
} }
// netlinkHandler allows consuming real and mockable implementation for testing. // netlinkHandler allows consuming real and mockable implementation for testing.
@ -56,16 +56,16 @@ func newConntracker(handler netlinkHandler) Interface {
// ClearEntries deletes conntrack entries for connections of the given IP family, // ClearEntries deletes conntrack entries for connections of the given IP family,
// filtered by the given filters. // filtered by the given filters.
func (ct *conntracker) ClearEntries(ipFamily uint8, filters ...netlink.CustomConntrackFilter) error { func (ct *conntracker) ClearEntries(ipFamily uint8, filters ...netlink.CustomConntrackFilter) (int, error) {
if len(filters) == 0 { if len(filters) == 0 {
klog.V(7).InfoS("no conntrack filters provided") klog.V(7).InfoS("no conntrack filters provided")
return nil return 0, nil
} }
n, err := ct.handler.ConntrackDeleteFilters(netlink.ConntrackTable, netlink.InetFamily(ipFamily), filters...) n, err := ct.handler.ConntrackDeleteFilters(netlink.ConntrackTable, netlink.InetFamily(ipFamily), filters...)
if err != nil { if err != nil {
return fmt.Errorf("error deleting conntrack entries, error: %w", err) return 0, fmt.Errorf("error deleting conntrack entries, error: %w", err)
} }
klog.V(4).InfoS("Cleared conntrack entries", "count", n) klog.V(4).InfoS("Cleared conntrack entries", "count", n)
return nil return int(n), nil
} }

View File

@ -91,7 +91,8 @@ func TestConntracker_ClearEntries(t *testing.T) {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
handler := &fakeHandler{} handler := &fakeHandler{}
ct := newConntracker(handler) ct := newConntracker(handler)
require.NoError(t, ct.ClearEntries(tc.ipFamily, tc.filters...)) _, err := ct.ClearEntries(tc.ipFamily, tc.filters...)
require.NoError(t, err)
require.Equal(t, netlink.ConntrackTableType(netlink.ConntrackTable), handler.tableType) require.Equal(t, netlink.ConntrackTableType(netlink.ConntrackTable), handler.tableType)
require.Equal(t, netlink.InetFamily(tc.ipFamily), handler.ipFamily) require.Equal(t, netlink.InetFamily(tc.ipFamily), handler.ipFamily)
require.Equal(t, len(tc.filters), len(handler.filters)) require.Equal(t, len(tc.filters), len(handler.filters))

View File

@ -54,11 +54,11 @@ func (fake *FakeInterface) Reset() {
} }
// ClearEntries is part of Interface // ClearEntries is part of Interface
func (fake *FakeInterface) ClearEntries(_ uint8, filters ...netlink.CustomConntrackFilter) error { func (fake *FakeInterface) ClearEntries(_ uint8, filters ...netlink.CustomConntrackFilter) (int, error) {
for _, anyFilter := range filters { for _, anyFilter := range filters {
filter := anyFilter.(*conntrackFilter) filter := anyFilter.(*conntrackFilter)
if filter.protocol != protocolMap[v1.ProtocolUDP] { if filter.protocol != protocolMap[v1.ProtocolUDP] {
return fmt.Errorf("FakeInterface currently only supports UDP") return 0, fmt.Errorf("FakeInterface currently only supports UDP")
} }
// record IP and Port entries // record IP and Port entries
@ -77,7 +77,7 @@ func (fake *FakeInterface) ClearEntries(_ uint8, filters ...netlink.CustomConntr
origin := filter.original.dstIP.String() origin := filter.original.dstIP.String()
dest := filter.reply.srcIP.String() dest := filter.reply.srcIP.String()
if previous, exists := fake.ClearedNATs[origin]; exists && previous != dest { if previous, exists := fake.ClearedNATs[origin]; exists && previous != dest {
return fmt.Errorf("filter for NAT passed with same origin (%s), different destination (%s / %s)", origin, previous, dest) return 0, fmt.Errorf("filter for NAT passed with same origin (%s), different destination (%s / %s)", origin, previous, dest)
} }
fake.ClearedNATs[filter.original.dstIP.String()] = filter.reply.srcIP.String() fake.ClearedNATs[filter.original.dstIP.String()] = filter.reply.srcIP.String()
} }
@ -86,11 +86,11 @@ func (fake *FakeInterface) ClearEntries(_ uint8, filters ...netlink.CustomConntr
dest := filter.reply.srcIP.String() dest := filter.reply.srcIP.String()
port := int(filter.original.dstPort) port := int(filter.original.dstPort)
if previous, exists := fake.ClearedPortNATs[port]; exists && previous != dest { if previous, exists := fake.ClearedPortNATs[port]; exists && previous != dest {
return fmt.Errorf("filter for PortNAT passed with same port (%d), different destination (%s / %s)", port, previous, dest) return 0, fmt.Errorf("filter for PortNAT passed with same port (%d), different destination (%s / %s)", port, previous, dest)
} }
fake.ClearedPortNATs[port] = dest fake.ClearedPortNATs[port] = dest
} }
} }
} }
return nil return 0, nil
} }