1from ryu.services.protocols.bgp.signals import SignalBus
2
3
4class BgpSignalBus(SignalBus):
5    BGP_ERROR = ('error', 'bgp')
6    BGP_DEST_CHANGED = ('core', 'dest', 'changed')
7    BGP_VRF_REMOVED = ('core', 'vrf', 'removed')
8    BGP_VRF_ADDED = ('core', 'vrf', 'added')
9    BGP_NOTIFICATION_RECEIVED = ('bgp', 'notification_received')
10    BGP_NOTIFICATION_SENT = ('bgp', 'notification_sent')
11    BGP_VRF_STATS_CONFIG_CHANGED = (
12        'core', 'vrf', 'config', 'stats', 'changed'
13    )
14    BGP_BEST_PATH_CHANGED = ('core', 'best', 'changed')
15    BGP_ADJ_RIB_IN_CHANGED = ('core', 'adj', 'rib', 'in', 'changed')
16    BGP_ADJ_RIB_OUT_CHANGED = ('core', 'adj', 'rib', 'out', 'changed')
17    BGP_ADJ_UP = ('core', 'adj', 'up')
18    BGP_ADJ_DOWN = ('core', 'adj', 'down')
19
20    def bgp_error(self, peer, code, subcode, reason):
21        return self.emit_signal(
22            self.BGP_ERROR + (peer, ),
23            {'code': code, 'subcode': subcode, 'reason': reason, 'peer': peer}
24        )
25
26    def bgp_notification_received(self, peer, notification):
27        return self.emit_signal(
28            self.BGP_NOTIFICATION_RECEIVED + (peer,),
29            notification
30        )
31
32    def bgp_notification_sent(self, peer, notification):
33        return self.emit_signal(
34            self.BGP_NOTIFICATION_SENT + (peer,),
35            notification
36        )
37
38    def dest_changed(self, dest):
39        return self.emit_signal(
40            self.BGP_DEST_CHANGED,
41            dest
42        )
43
44    def vrf_removed(self, route_dist):
45        return self.emit_signal(
46            self.BGP_VRF_REMOVED,
47            route_dist
48        )
49
50    def vrf_added(self, vrf_conf):
51        return self.emit_signal(
52            self.BGP_VRF_ADDED,
53            vrf_conf
54        )
55
56    def stats_config_changed(self, vrf_conf):
57        return self.emit_signal(
58            self.BGP_VRF_STATS_CONFIG_CHANGED,
59            vrf_conf
60        )
61
62    def best_path_changed(self, path, is_withdraw):
63        return self.emit_signal(
64            self.BGP_BEST_PATH_CHANGED,
65            {'path': path, 'is_withdraw': is_withdraw})
66
67    def adj_rib_in_changed(self, peer, received_route):
68        return self.emit_signal(
69            self.BGP_ADJ_RIB_IN_CHANGED,
70            {'peer': peer, 'received_route': received_route})
71
72    def adj_rib_out_changed(self, peer, sent_route):
73        return self.emit_signal(
74            self.BGP_ADJ_RIB_OUT_CHANGED,
75            {'peer': peer, 'sent_route': sent_route})
76
77    def adj_up(self, peer):
78        return self.emit_signal(self.BGP_ADJ_UP, {'peer': peer})
79
80    def adj_down(self, peer):
81        return self.emit_signal(self.BGP_ADJ_DOWN, {'peer': peer})
82