Skip to content

Commit d64a12d

Browse files
author
Aritra Basu
committed
refactor: make BGP peer and secret management system event-driven
Signed-off-by: Aritra Basu <[email protected]>
1 parent 05e1278 commit d64a12d

File tree

10 files changed

+803
-447
lines changed

10 files changed

+803
-447
lines changed

calico-vpp-agent/cmd/calico_vpp_dataplane.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,11 @@ func main() {
159159
log.Fatalf("cannot get default BGP config %s", err)
160160
}
161161

162-
peerWatcher.SetBGPConf(bgpConf)
163162
routingServer.SetBGPConf(bgpConf)
164163
felixServer.SetBGPConf(bgpConf)
165164

165+
routingServer.SetPeerHandler(felixServer.GetPeerHandler())
166+
166167
watchDog := watchdog.NewWatchDog(log.WithFields(logrus.Fields{"component": "watchDog"}), &t)
167168
Go(felixServer.ServeFelix)
168169
Go(felixWatcher.WatchFelix)

calico-vpp-agent/common/pubsub.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,9 @@ const (
4545
TunnelAdded CalicoVppEventType = "TunnelAdded"
4646
TunnelDeleted CalicoVppEventType = "TunnelDeleted"
4747

48-
BGPPeerAdded CalicoVppEventType = "BGPPeerAdded"
49-
BGPPeerDeleted CalicoVppEventType = "BGPPeerDeleted"
50-
BGPPeerUpdated CalicoVppEventType = "BGPPeerUpdated"
51-
BGPSecretChanged CalicoVppEventType = "BGPSecretChanged"
48+
BGPPeerAdded CalicoVppEventType = "BGPPeerAdded"
49+
BGPPeerDeleted CalicoVppEventType = "BGPPeerDeleted"
50+
BGPPeerUpdated CalicoVppEventType = "BGPPeerUpdated"
5251

5352
BGPFilterAddedOrUpdated CalicoVppEventType = "BGPFilterAddedOrUpdated"
5453
BGPFilterDeleted CalicoVppEventType = "BGPFilterDeleted"
@@ -65,6 +64,15 @@ const (
6564

6665
IpamPoolUpdate CalicoVppEventType = "IpamPoolUpdate"
6766
IpamPoolRemove CalicoVppEventType = "IpamPoolRemove"
67+
68+
PeersChanged CalicoVppEventType = "PeersChanged"
69+
PeerAdded CalicoVppEventType = "PeerAdded"
70+
PeerUpdated CalicoVppEventType = "PeerUpdated"
71+
PeerDeleted CalicoVppEventType = "PeerDeleted"
72+
73+
SecretAdded CalicoVppEventType = "SecretAdded"
74+
SecretChanged CalicoVppEventType = "SecretChanged"
75+
SecretDeleted CalicoVppEventType = "SecretDeleted"
6876
)
6977

7078
var (

calico-vpp-agent/common/types.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package common
1717

1818
import (
19+
calicov3 "github.com/projectcalico/api/pkg/apis/projectcalico/v3"
1920
v1 "k8s.io/api/core/v1"
2021
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2122
)
@@ -70,3 +71,45 @@ type ServiceEndpointsUpdate struct {
7071
type ServiceEndpointsDelete struct {
7172
Meta *metav1.ObjectMeta
7273
}
74+
75+
// PeersChangedEvent is emitted when the list of BGP peers changes
76+
type PeersChangedEvent struct {
77+
Peers []calicov3.BGPPeer
78+
}
79+
80+
// PeerAddedEvent is emitted when a BGP peer is added
81+
type PeerAddedEvent struct {
82+
Peer calicov3.BGPPeer
83+
}
84+
85+
// PeerUpdatedEvent is emitted when a BGP peer is updated
86+
type PeerUpdatedEvent struct {
87+
Old calicov3.BGPPeer
88+
New calicov3.BGPPeer
89+
}
90+
91+
// PeerDeletedEvent is emitted when a BGP peer is deleted
92+
type PeerDeletedEvent struct {
93+
Peer calicov3.BGPPeer
94+
}
95+
96+
// SecretData represents secret information
97+
type SecretData struct {
98+
Name string
99+
Data map[string][]byte
100+
}
101+
102+
// SecretAddedEvent is emitted when a secret is added
103+
type SecretAddedEvent struct {
104+
Secret *SecretData
105+
}
106+
107+
// SecretChangedEvent is emitted when a secret changes
108+
type SecretChangedEvent struct {
109+
SecretName string
110+
}
111+
112+
// SecretDeletedEvent is emitted when a secret is deleted
113+
type SecretDeletedEvent struct {
114+
SecretName string
115+
}

calico-vpp-agent/felix/felix_server.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"github.com/projectcalico/vpp-dataplane/v3/calico-vpp-agent/felix/connectivity"
3535
"github.com/projectcalico/vpp-dataplane/v3/calico-vpp-agent/felix/policies"
3636
"github.com/projectcalico/vpp-dataplane/v3/calico-vpp-agent/felix/services"
37+
"github.com/projectcalico/vpp-dataplane/v3/calico-vpp-agent/routing"
3738
"github.com/projectcalico/vpp-dataplane/v3/config"
3839
"github.com/projectcalico/vpp-dataplane/v3/vpplink"
3940
"github.com/projectcalico/vpp-dataplane/v3/vpplink/types"
@@ -59,6 +60,7 @@ type Server struct {
5960
cniHandler *cni.CNIHandler
6061
connectivityHandler *connectivity.ConnectivityHandler
6162
serviceHandler *services.ServiceHandler
63+
peerHandler *routing.PeerHandler
6264
}
6365

6466
// NewFelixServer creates a felix server
@@ -77,6 +79,7 @@ func NewFelixServer(vpp *vpplink.VppLink, clientv3 calicov3cli.Interface, log *l
7779
cniHandler: cni.NewCNIHandler(vpp, cache, log),
7880
connectivityHandler: connectivity.NewConnectivityHandler(vpp, cache, clientv3, log),
7981
serviceHandler: services.NewServiceHandler(vpp, cache, log),
82+
peerHandler: routing.NewPeerHandler(cache, log),
8083
}
8184

8285
reg := common.RegisterHandler(server.felixServerEventChan, "felix server events")
@@ -91,6 +94,13 @@ func NewFelixServer(vpp *vpplink.VppLink, clientv3 calicov3cli.Interface, log *l
9194
common.ConnectivityDeleted,
9295
common.SRv6PolicyAdded,
9396
common.SRv6PolicyDeleted,
97+
common.PeersChanged,
98+
common.PeerAdded,
99+
common.PeerUpdated,
100+
common.PeerDeleted,
101+
common.SecretAdded,
102+
common.SecretChanged,
103+
common.SecretDeleted,
94104
)
95105

96106
return server
@@ -104,6 +114,10 @@ func (s *Server) GetCache() *cache.Cache {
104114
return s.cache
105115
}
106116

117+
func (s *Server) GetPeerHandler() *routing.PeerHandler {
118+
return s.peerHandler
119+
}
120+
107121
func (s *Server) SetBGPConf(bgpConf *calicov3.BGPConfigurationSpec) {
108122
s.cache.BGPConf = bgpConf
109123
}
@@ -404,6 +418,60 @@ func (s *Server) handleFelixServerEvents(msg interface{}) (err error) {
404418
if err != nil {
405419
s.log.Errorf("Error while deleting SRv6 Policy %s", err)
406420
}
421+
case common.PeersChanged:
422+
peersEvent, ok := evt.New.(*common.PeersChangedEvent)
423+
if !ok {
424+
return fmt.Errorf("evt.New is not a (*common.PeersChangedEvent) %v", evt.New)
425+
}
426+
err := s.peerHandler.ProcessPeers(peersEvent.Peers)
427+
if err != nil {
428+
s.log.Errorf("Error processing peers: %v", err)
429+
}
430+
case common.PeerAdded:
431+
peerEvent, ok := evt.New.(*common.PeerAddedEvent)
432+
if !ok {
433+
return fmt.Errorf("evt.New is not a (*common.PeerAddedEvent) %v", evt.New)
434+
}
435+
err := s.peerHandler.OnPeerAdded(&peerEvent.Peer)
436+
if err != nil {
437+
s.log.Errorf("Error adding peer: %v", err)
438+
}
439+
case common.PeerUpdated:
440+
peerEvent, ok := evt.New.(*common.PeerUpdatedEvent)
441+
if !ok {
442+
return fmt.Errorf("evt.New is not a (*common.PeerUpdatedEvent) %v", evt.New)
443+
}
444+
err := s.peerHandler.OnPeerUpdated(&peerEvent.Old, &peerEvent.New)
445+
if err != nil {
446+
s.log.Errorf("Error updating peer: %v", err)
447+
}
448+
case common.PeerDeleted:
449+
peerEvent, ok := evt.New.(*common.PeerDeletedEvent)
450+
if !ok {
451+
return fmt.Errorf("evt.New is not a (*common.PeerDeletedEvent) %v", evt.New)
452+
}
453+
err := s.peerHandler.OnPeerDeleted(&peerEvent.Peer)
454+
if err != nil {
455+
s.log.Errorf("Error deleting peer: %v", err)
456+
}
457+
case common.SecretAdded:
458+
secretEvent, ok := evt.New.(*common.SecretAddedEvent)
459+
if !ok {
460+
return fmt.Errorf("evt.New is not a (*common.SecretAddedEvent) %v", evt.New)
461+
}
462+
s.peerHandler.OnSecretAdded(secretEvent.Secret)
463+
case common.SecretChanged:
464+
secretEvent, ok := evt.New.(*common.SecretChangedEvent)
465+
if !ok {
466+
return fmt.Errorf("evt.New is not a (*common.SecretChangedEvent) %v", evt.New)
467+
}
468+
s.peerHandler.OnSecretChanged(secretEvent.SecretName)
469+
case common.SecretDeleted:
470+
secretEvent, ok := evt.New.(*common.SecretDeletedEvent)
471+
if !ok {
472+
return fmt.Errorf("evt.New is not a (*common.SecretDeletedEvent) %v", evt.New)
473+
}
474+
s.peerHandler.OnSecretDeleted(secretEvent.SecretName)
407475
default:
408476
s.log.Warnf("Unhandled CalicoVppEvent.Type: %s", evt.Type)
409477
}

calico-vpp-agent/routing/bgp_watcher.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,12 @@ func (s *Server) WatchBGPPath(t *tomb.Tomb) error {
669669
}
670670
s.log.Infof("bgp(del) filter deleted: %s", filter.Name)
671671
delete(s.bgpFilters, filter.Name)
672+
case common.PeerNodeStateChanged:
673+
old, _ := evt.Old.(*common.LocalNodeSpec)
674+
new, _ := evt.New.(*common.LocalNodeSpec)
675+
if s.peerHandler != nil {
676+
s.peerHandler.OnPeerNodeStateChanged(old, new)
677+
}
672678
}
673679
}
674680
}

0 commit comments

Comments
 (0)