Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nodeid map: provide map via hive cell #25574

Merged
merged 1 commit into from
May 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 13 additions & 1 deletion cilium/cmd/bpf_nodeid_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
package cmd

import (
"errors"
"fmt"
"io/fs"
"net"
"os"
"text/tabwriter"
Expand Down Expand Up @@ -45,7 +47,17 @@ var bpfNodeIDListCmd = &cobra.Command{
})
}

if err := nodemap.NodeMap().IterateWithCallback(parse); err != nil {
nodeMap, err := nodemap.LoadNodeMap()
if err != nil {
if errors.Is(err, fs.ErrNotExist) {
fmt.Fprintln(os.Stderr, "Cannot find node bpf map")
return
}

Fatalf("Cannot load node bpf map: %s", err)
}

if err := nodeMap.IterateWithCallback(parse); err != nil {
Fatalf("Error dumping contents of the node ID map: %s\n", err)
}

Expand Down
5 changes: 0 additions & 5 deletions daemon/cmd/datapath.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ import (
"github.com/cilium/cilium/pkg/maps/metricsmap"
"github.com/cilium/cilium/pkg/maps/nat"
"github.com/cilium/cilium/pkg/maps/neighborsmap"
"github.com/cilium/cilium/pkg/maps/nodemap"
"github.com/cilium/cilium/pkg/maps/policymap"
"github.com/cilium/cilium/pkg/maps/srv6map"
"github.com/cilium/cilium/pkg/maps/tunnel"
Expand Down Expand Up @@ -325,10 +324,6 @@ func (d *Daemon) initMaps() error {
return fmt.Errorf("initializing ipcache map: %w", err)
}

if err := nodemap.NodeMap().OpenOrCreate(); err != nil {
return err
}

if err := metricsmap.Metrics.OpenOrCreate(); err != nil {
return fmt.Errorf("initializing metrics map: %w", err)
}
Expand Down
5 changes: 4 additions & 1 deletion pkg/datapath/cells.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
ipcache "github.com/cilium/cilium/pkg/ipcache/types"
"github.com/cilium/cilium/pkg/maps"
"github.com/cilium/cilium/pkg/maps/eventsmap"
"github.com/cilium/cilium/pkg/maps/nodemap"
monitorAgent "github.com/cilium/cilium/pkg/monitor/agent"
"github.com/cilium/cilium/pkg/option"
wg "github.com/cilium/cilium/pkg/wireguard/agent"
Expand Down Expand Up @@ -100,7 +101,7 @@ func newDatapath(params datapathParams) types.Datapath {
return nil
}})

datapath := linuxdatapath.NewDatapath(datapathConfig, iptablesManager, params.WgAgent)
datapath := linuxdatapath.NewDatapath(datapathConfig, iptablesManager, params.WgAgent, params.NodeMap)

params.LC.Append(hive.Hook{
OnStart: func(hive.HookContext) error {
Expand All @@ -121,4 +122,6 @@ type datapathParams struct {
// Force map initialisation before loader. You should not use these otherwise.
// Some of the entries in this slice may be nil.
BpfMaps []bpf.BpfMap `group:"bpf-maps"`

NodeMap nodemap.Map
}
5 changes: 3 additions & 2 deletions pkg/datapath/linux/datapath.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/cilium/cilium/pkg/datapath/loader"
datapath "github.com/cilium/cilium/pkg/datapath/types"
"github.com/cilium/cilium/pkg/maps/lbmap"
"github.com/cilium/cilium/pkg/maps/nodemap"
)

// DatapathConfiguration is the static configuration of the datapath. The
Expand All @@ -31,7 +32,7 @@ type linuxDatapath struct {
}

// NewDatapath creates a new Linux datapath
func NewDatapath(cfg DatapathConfiguration, ruleManager datapath.IptablesManager, wgAgent datapath.WireguardAgent) datapath.Datapath {
func NewDatapath(cfg DatapathConfiguration, ruleManager datapath.IptablesManager, wgAgent datapath.WireguardAgent, nodeMap nodemap.Map) datapath.Datapath {
dp := &linuxDatapath{
ConfigWriter: &config.HeaderfileWriter{},
IptablesManager: ruleManager,
Expand All @@ -42,7 +43,7 @@ func NewDatapath(cfg DatapathConfiguration, ruleManager datapath.IptablesManager
lbmap: lbmap.New(),
}

dp.node = NewNodeHandler(cfg, dp.nodeAddressing)
dp.node = NewNodeHandler(cfg, dp.nodeAddressing, nodeMap)
return dp
}

Expand Down
2 changes: 1 addition & 1 deletion pkg/datapath/linux/datapath_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ type linuxTestSuite struct{}
var _ = check.Suite(&linuxTestSuite{})

func (s *linuxTestSuite) TestNewDatapath(c *check.C) {
dp := NewDatapath(DatapathConfiguration{}, nil, nil)
dp := NewDatapath(DatapathConfiguration{}, nil, nil, nil)
c.Assert(dp, check.Not(check.IsNil))

c.Assert(dp.Node(), check.Not(check.IsNil))
Expand Down
2 changes: 1 addition & 1 deletion pkg/datapath/linux/fuzz_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func FuzzNodeHandler(f *testing.F) {
}
dpConfig := DatapathConfiguration{HostDevice: "veth0"}
fakeNodeAddressing := fake.NewNodeAddressing()
linuxNodeHandler := NewNodeHandler(dpConfig, fakeNodeAddressing)
linuxNodeHandler := NewNodeHandler(dpConfig, fakeNodeAddressing, nil)
if linuxNodeHandler == nil {
panic("Should not be nil")
}
Expand Down
5 changes: 4 additions & 1 deletion pkg/datapath/linux/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import (
ipamOption "github.com/cilium/cilium/pkg/ipam/option"
"github.com/cilium/cilium/pkg/lock"
"github.com/cilium/cilium/pkg/logging/logfields"
"github.com/cilium/cilium/pkg/maps/nodemap"
"github.com/cilium/cilium/pkg/maps/tunnel"
"github.com/cilium/cilium/pkg/metrics"
"github.com/cilium/cilium/pkg/node"
Expand Down Expand Up @@ -68,6 +69,7 @@ type linuxNodeHandler struct {
neighByNextHop map[string]*netlink.Neigh // key = string(net.IP)
neighLastPingByNextHop map[string]time.Time // key = string(net.IP)

nodeMap nodemap.Map
// Pool of available IDs for nodes.
nodeIDs idpool.IDPool
// Node-scoped unique IDs for the nodes.
Expand All @@ -87,7 +89,7 @@ var (

// NewNodeHandler returns a new node handler to handle node events and
// implement the implications in the Linux datapath
func NewNodeHandler(datapathConfig DatapathConfiguration, nodeAddressing datapath.NodeAddressing) *linuxNodeHandler {
func NewNodeHandler(datapathConfig DatapathConfiguration, nodeAddressing datapath.NodeAddressing, nodeMap nodemap.Map) *linuxNodeHandler {
return &linuxNodeHandler{
nodeAddressing: nodeAddressing,
datapathConfig: datapathConfig,
Expand All @@ -97,6 +99,7 @@ func NewNodeHandler(datapathConfig DatapathConfiguration, nodeAddressing datapat
neighNextHopRefCount: counter.StringCounter{},
neighByNextHop: map[string]*netlink.Neigh{},
neighLastPingByNextHop: map[string]time.Time{},
nodeMap: nodeMap,
nodeIDs: idpool.NewIDPool(minNodeID, maxNodeID),
nodeIDsByIPs: map[string]uint16{},
nodeIPsByIDs: map[uint16]string{},
Expand Down
6 changes: 3 additions & 3 deletions pkg/datapath/linux/node_ids.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ func (n *linuxNodeHandler) mapNodeID(ip string, id uint16) error {
return fmt.Errorf("invalid node IP %s", ip)
}

if err := nodemap.NodeMap().Update(nodeIP, id); err != nil {
if err := n.nodeMap.Update(nodeIP, id); err != nil {
return err
}

Expand All @@ -197,7 +197,7 @@ func (n *linuxNodeHandler) unmapNodeID(ip string) error {
return fmt.Errorf("invalid node IP %s", ip)
}

if err := nodemap.NodeMap().Delete(nodeIP); err != nil {
if err := n.nodeMap.Delete(nodeIP); err != nil {
return err
}
if id, exists := n.nodeIDsByIPs[ip]; exists {
Expand Down Expand Up @@ -246,7 +246,7 @@ func (n *linuxNodeHandler) RestoreNodeIDs() {
}
nodeIDs[address] = val.NodeID
}
if err := nodemap.NodeMap().IterateWithCallback(parse); err != nil {
if err := n.nodeMap.IterateWithCallback(parse); err != nil {
log.WithError(err).Error("Failed to dump content of node map")
return
}
Expand Down
34 changes: 15 additions & 19 deletions pkg/datapath/linux/node_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import (
"github.com/cilium/cilium/pkg/datapath/fake"
"github.com/cilium/cilium/pkg/datapath/linux/route"
datapath "github.com/cilium/cilium/pkg/datapath/types"
"github.com/cilium/cilium/pkg/maps/nodemap"
nodemapfake "github.com/cilium/cilium/pkg/maps/nodemap/fake"
"github.com/cilium/cilium/pkg/maps/tunnel"
"github.com/cilium/cilium/pkg/mtu"
"github.com/cilium/cilium/pkg/netns"
Expand Down Expand Up @@ -112,10 +112,6 @@ func (s *linuxPrivilegedBaseTestSuite) SetUpTest(c *check.C, addressing datapath
tunnel.SetTunnelMap(tunnel.NewTunnelMap("test_cilium_tunnel_map"))
err = tunnel.TunnelMap().OpenOrCreate()
c.Assert(err, check.IsNil)

nodemap.SetNodeMap(nodemap.NewNodeMap("test_cilium_node_map"))
err = nodemap.NodeMap().OpenOrCreate()
c.Assert(err, check.IsNil)
}

func (s *linuxPrivilegedIPv6OnlyTestSuite) SetUpTest(c *check.C) {
Expand Down Expand Up @@ -201,7 +197,7 @@ func (s *linuxPrivilegedBaseTestSuite) TestUpdateNodeRoute(c *check.C) {

dpConfig := DatapathConfiguration{HostDevice: dummyHostDeviceName}

linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing)
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing, nil)
c.Assert(linuxNodeHandler, check.Not(check.IsNil))
nodeConfig := datapath.LocalNodeConfiguration{
EnableIPv4: s.enableIPv4,
Expand Down Expand Up @@ -249,7 +245,7 @@ func (s *linuxPrivilegedBaseTestSuite) TestUpdateNodeRoute(c *check.C) {
func (s *linuxPrivilegedBaseTestSuite) TestSingleClusterPrefix(c *check.C) {
dpConfig := DatapathConfiguration{HostDevice: dummyHostDeviceName}

linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing)
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing, nil)
c.Assert(linuxNodeHandler, check.Not(check.IsNil))

// enable as per test definition
Expand Down Expand Up @@ -315,7 +311,7 @@ func (s *linuxPrivilegedBaseTestSuite) TestAuxiliaryPrefixes(c *check.C) {
net2 := cidr.MustParseCIDR("cafe:f00d::/112")

dpConfig := DatapathConfiguration{HostDevice: dummyHostDeviceName}
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing)
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing, nil)
c.Assert(linuxNodeHandler, check.Not(check.IsNil))
nodeConfig := datapath.LocalNodeConfiguration{
EnableIPv4: s.enableIPv4,
Expand Down Expand Up @@ -389,7 +385,7 @@ func (s *linuxPrivilegedBaseTestSuite) TestNodeUpdateEncapsulation(c *check.C) {
externalNodeIP2 := net.ParseIP("8.8.8.8")

dpConfig := DatapathConfiguration{HostDevice: dummyHostDeviceName}
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing)
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing, nodemapfake.NewFakeNodeMap())
c.Assert(linuxNodeHandler, check.Not(check.IsNil))
nodeConfig := datapath.LocalNodeConfiguration{
EnableIPv4: s.enableIPv4,
Expand Down Expand Up @@ -679,7 +675,7 @@ func (s *linuxPrivilegedBaseTestSuite) TestNodeUpdateDirectRouting(c *check.C) {
defer removeDevice(externalNode2Device)

dpConfig := DatapathConfiguration{HostDevice: dummyHostDeviceName}
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing)
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing, nil)
c.Assert(linuxNodeHandler, check.Not(check.IsNil))
nodeConfig := datapath.LocalNodeConfiguration{
EnableIPv4: s.enableIPv4,
Expand Down Expand Up @@ -894,7 +890,7 @@ func (s *linuxPrivilegedBaseTestSuite) TestAgentRestartOptionChanges(c *check.C)
underlayIP := net.ParseIP("4.4.4.4")

dpConfig := DatapathConfiguration{HostDevice: dummyHostDeviceName}
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing)
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing, nodemapfake.NewFakeNodeMap())
c.Assert(linuxNodeHandler, check.Not(check.IsNil))
nodeConfig := datapath.LocalNodeConfiguration{
EnableIPv4: s.enableIPv4,
Expand Down Expand Up @@ -1001,7 +997,7 @@ func (s *linuxPrivilegedBaseTestSuite) TestNodeValidationDirectRouting(c *check.
ip4Alloc1 := cidr.MustParseCIDR("5.5.5.0/24")
ip6Alloc1 := cidr.MustParseCIDR("2001:aaaa::/96")
dpConfig := DatapathConfiguration{HostDevice: dummyHostDeviceName}
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing)
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing, nil)
c.Assert(linuxNodeHandler, check.Not(check.IsNil))

if s.enableIPv4 {
Expand Down Expand Up @@ -1166,7 +1162,7 @@ func (s *linuxPrivilegedIPv6OnlyTestSuite) TestArpPingHandling(c *check.C) {
defer func() { option.Config.ARPPingRefreshPeriod = prevARPPeriod }()
option.Config.ARPPingRefreshPeriod = time.Duration(1 * time.Nanosecond)

linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing)
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing, nil)
c.Assert(linuxNodeHandler, check.Not(check.IsNil))

err = linuxNodeHandler.NodeConfigurationChanged(datapath.LocalNodeConfiguration{
Expand Down Expand Up @@ -2055,7 +2051,7 @@ func (s *linuxPrivilegedIPv6OnlyTestSuite) TestArpPingHandlingForMultiDevice(c *
defer func() { option.Config.ARPPingRefreshPeriod = prevARPPeriod }()
option.Config.ARPPingRefreshPeriod = 1 * time.Nanosecond

linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing)
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing, nil)
c.Assert(linuxNodeHandler, check.Not(check.IsNil))

err = linuxNodeHandler.NodeConfigurationChanged(datapath.LocalNodeConfiguration{
Expand Down Expand Up @@ -2336,7 +2332,7 @@ func (s *linuxPrivilegedIPv4OnlyTestSuite) TestArpPingHandling(c *check.C) {
defer func() { option.Config.ARPPingRefreshPeriod = prevARPPeriod }()
option.Config.ARPPingRefreshPeriod = time.Duration(1 * time.Nanosecond)

linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing)
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing, nil)
c.Assert(linuxNodeHandler, check.Not(check.IsNil))

err = linuxNodeHandler.NodeConfigurationChanged(datapath.LocalNodeConfiguration{
Expand Down Expand Up @@ -3226,7 +3222,7 @@ func (s *linuxPrivilegedIPv4OnlyTestSuite) TestArpPingHandlingForMultiDevice(c *
defer func() { option.Config.ARPPingRefreshPeriod = prevARPPeriod }()
option.Config.ARPPingRefreshPeriod = 1 * time.Nanosecond

linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing)
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing, nil)
c.Assert(linuxNodeHandler, check.Not(check.IsNil))

err = linuxNodeHandler.NodeConfigurationChanged(datapath.LocalNodeConfiguration{
Expand Down Expand Up @@ -3425,7 +3421,7 @@ func (s *linuxPrivilegedBaseTestSuite) benchmarkNodeUpdate(c *check.C, config da
ip6Alloc2 := cidr.MustParseCIDR("2001:bbbb::/96")

dpConfig := DatapathConfiguration{HostDevice: dummyHostDeviceName}
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing)
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing, nil)
c.Assert(linuxNodeHandler, check.Not(check.IsNil))

err := linuxNodeHandler.NodeConfigurationChanged(config)
Expand Down Expand Up @@ -3531,7 +3527,7 @@ func (s *linuxPrivilegedBaseTestSuite) benchmarkNodeUpdateNOP(c *check.C, config
ip6Alloc1 := cidr.MustParseCIDR("2001:aaaa::/96")

dpConfig := DatapathConfiguration{HostDevice: dummyHostDeviceName}
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing)
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing, nil)
c.Assert(linuxNodeHandler, check.Not(check.IsNil))

err := linuxNodeHandler.NodeConfigurationChanged(config)
Expand Down Expand Up @@ -3600,7 +3596,7 @@ func (s *linuxPrivilegedBaseTestSuite) benchmarkNodeValidateImplementation(c *ch
ip6Alloc1 := cidr.MustParseCIDR("2001:aaaa::/96")

dpConfig := DatapathConfiguration{HostDevice: dummyHostDeviceName}
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing)
linuxNodeHandler := NewNodeHandler(dpConfig, s.nodeAddressing, nil)
c.Assert(linuxNodeHandler, check.Not(check.IsNil))

err := linuxNodeHandler.NodeConfigurationChanged(config)
Expand Down
2 changes: 1 addition & 1 deletion pkg/datapath/linux/node_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ func (s *linuxTestSuite) TestCreateNodeRoute(c *check.C) {

fakeNodeAddressing := fake.NewNodeAddressing()

nodeHandler := NewNodeHandler(dpConfig, fakeNodeAddressing)
nodeHandler := NewNodeHandler(dpConfig, fakeNodeAddressing, nil)

c1 := cidr.MustParseCIDR("10.10.0.0/16")
generatedRoute, err := nodeHandler.createNodeRouteSpec(c1, false)
Expand Down
2 changes: 1 addition & 1 deletion pkg/endpoint/bpf_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func BenchmarkWriteHeaderfile(b *testing.B) {
testutils.IntegrationTest(b)

e := NewEndpointWithState(&suite, &suite, testipcache.NewMockIPCache(), &FakeEndpointProxy{}, testidentity.NewMockIdentityAllocator(nil), 100, StateWaitingForIdentity)
dp := linux.NewDatapath(linux.DatapathConfiguration{}, nil, nil)
dp := linux.NewDatapath(linux.DatapathConfiguration{}, nil, nil, nil)

targetComments := func(w io.Writer) error {
return e.writeInformationalComments(w)
Expand Down
6 changes: 3 additions & 3 deletions pkg/endpoint/restore_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ func (ds *EndpointSuite) TestReadEPsFromDirNames(c *C) {
defer func() {
ds.datapath = oldDatapath
}()
ds.datapath = linuxDatapath.NewDatapath(linuxDatapath.DatapathConfiguration{}, nil, nil)
ds.datapath = linuxDatapath.NewDatapath(linuxDatapath.DatapathConfiguration{}, nil, nil, nil)

epsWanted, _ := ds.createEndpoints()
tmpDir, err := os.MkdirTemp("", "cilium-tests")
Expand Down Expand Up @@ -151,7 +151,7 @@ func (ds *EndpointSuite) TestReadEPsFromDirNamesWithRestoreFailure(c *C) {
defer func() {
ds.datapath = oldDatapath
}()
ds.datapath = linuxDatapath.NewDatapath(linuxDatapath.DatapathConfiguration{}, nil, nil)
ds.datapath = linuxDatapath.NewDatapath(linuxDatapath.DatapathConfiguration{}, nil, nil, nil)

eps, _ := ds.createEndpoints()
ep := eps[0]
Expand Down Expand Up @@ -217,7 +217,7 @@ func (ds *EndpointSuite) BenchmarkReadEPsFromDirNames(c *C) {
defer func() {
ds.datapath = oldDatapath
}()
ds.datapath = linuxDatapath.NewDatapath(linuxDatapath.DatapathConfiguration{}, nil, nil)
ds.datapath = linuxDatapath.NewDatapath(linuxDatapath.DatapathConfiguration{}, nil, nil, nil)

epsWanted, _ := ds.createEndpoints()
tmpDir, err := os.MkdirTemp("", "cilium-tests")
Expand Down
4 changes: 4 additions & 0 deletions pkg/maps/cells.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/cilium/cilium/pkg/maps/configmap"
"github.com/cilium/cilium/pkg/maps/ctmap/gc"
"github.com/cilium/cilium/pkg/maps/egressmap"
"github.com/cilium/cilium/pkg/maps/nodemap"
"github.com/cilium/cilium/pkg/maps/signalmap"
)

Expand All @@ -32,4 +33,7 @@ var Cell = cell.Module(

// Provides signalmap for datapath signals
signalmap.Cell,

// Provides the node map which contains information about node IDs and their IP addresses.
nodemap.Cell,
)