99 lines
2.9 KiB
Go
99 lines
2.9 KiB
Go
//go:build linux
|
|
// +build linux
|
|
|
|
/*
|
|
Copyright 2016 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package conntrack
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
v1 "k8s.io/api/core/v1"
|
|
"k8s.io/apimachinery/pkg/util/sets"
|
|
)
|
|
|
|
// FakeInterface implements Interface by just recording entries that have been cleared.
|
|
type FakeInterface struct {
|
|
ClearedIPs sets.Set[string]
|
|
ClearedPorts sets.Set[int]
|
|
ClearedNATs map[string]string // origin -> dest
|
|
ClearedPortNATs map[int]string // port -> dest
|
|
}
|
|
|
|
var _ Interface = &FakeInterface{}
|
|
|
|
// NewFake creates a new FakeInterface
|
|
func NewFake() *FakeInterface {
|
|
fake := &FakeInterface{}
|
|
fake.Reset()
|
|
return fake
|
|
}
|
|
|
|
// Reset clears fake's sets/maps
|
|
func (fake *FakeInterface) Reset() {
|
|
fake.ClearedIPs = sets.New[string]()
|
|
fake.ClearedPorts = sets.New[int]()
|
|
fake.ClearedNATs = make(map[string]string)
|
|
fake.ClearedPortNATs = make(map[int]string)
|
|
}
|
|
|
|
// ClearEntriesForIP is part of Interface
|
|
func (fake *FakeInterface) ClearEntriesForIP(ip string, protocol v1.Protocol) error {
|
|
if protocol != v1.ProtocolUDP {
|
|
return fmt.Errorf("FakeInterface currently only supports UDP")
|
|
}
|
|
|
|
fake.ClearedIPs.Insert(ip)
|
|
return nil
|
|
}
|
|
|
|
// ClearEntriesForPort is part of Interface
|
|
func (fake *FakeInterface) ClearEntriesForPort(port int, isIPv6 bool, protocol v1.Protocol) error {
|
|
if protocol != v1.ProtocolUDP {
|
|
return fmt.Errorf("FakeInterface currently only supports UDP")
|
|
}
|
|
|
|
fake.ClearedPorts.Insert(port)
|
|
return nil
|
|
}
|
|
|
|
// ClearEntriesForNAT is part of Interface
|
|
func (fake *FakeInterface) ClearEntriesForNAT(origin, dest string, protocol v1.Protocol) error {
|
|
if protocol != v1.ProtocolUDP {
|
|
return fmt.Errorf("FakeInterface currently only supports UDP")
|
|
}
|
|
if previous, exists := fake.ClearedNATs[origin]; exists && previous != dest {
|
|
return fmt.Errorf("ClearEntriesForNAT called with same origin (%s), different destination (%s / %s)", origin, previous, dest)
|
|
}
|
|
|
|
fake.ClearedNATs[origin] = dest
|
|
return nil
|
|
}
|
|
|
|
// ClearEntriesForPortNAT is part of Interface
|
|
func (fake *FakeInterface) ClearEntriesForPortNAT(dest string, port int, protocol v1.Protocol) error {
|
|
if protocol != v1.ProtocolUDP {
|
|
return fmt.Errorf("FakeInterface currently only supports UDP")
|
|
}
|
|
if previous, exists := fake.ClearedPortNATs[port]; exists && previous != dest {
|
|
return fmt.Errorf("ClearEntriesForPortNAT called with same port (%d), different destination (%s / %s)", port, previous, dest)
|
|
}
|
|
|
|
fake.ClearedPortNATs[port] = dest
|
|
return nil
|
|
}
|