1
1
from .manager import Manager
2
2
from .template import TemplateFabric
3
3
from swsscommon import swsscommon
4
- from .managers_rm import ROUTE_MAPS
5
- import ipaddress
6
- from .log import log_info , log_err , log_debug
7
4
8
5
9
6
class AdvertiseRouteMgr (Manager ):
10
7
""" This class Advertises routes when ADVERTISE_NETWORK_TABLE in STATE_DB is updated """
11
-
12
8
def __init__ (self , common_objs , db , table ):
13
9
"""
14
10
Initialize the object
@@ -22,105 +18,82 @@ def __init__(self, common_objs, db, table):
22
18
db ,
23
19
table ,
24
20
)
25
-
21
+
26
22
self .directory .subscribe ([("CONFIG_DB" , swsscommon .CFG_DEVICE_METADATA_TABLE_NAME , "localhost/bgp_asn" ),], self .on_bgp_asn_change )
27
23
self .advertised_routes = dict ()
28
24
29
25
30
- OP_DELETE = "DELETE"
31
- OP_ADD = "ADD"
26
+ OP_DELETE = 'DELETE'
27
+ OP_ADD = 'ADD'
28
+
32
29
33
30
def set_handler (self , key , data ):
34
- log_debug ("AdvertiseRouteMgr:: set handler" )
35
- if not self .__set_handler_validate (key , data ):
36
- return True
37
31
vrf , ip_prefix = self .split_key (key )
38
- self .add_route_advertisement (vrf , ip_prefix , data )
32
+ self .add_route_advertisement (vrf , ip_prefix )
39
33
40
34
return True
41
35
36
+
42
37
def del_handler (self , key ):
43
- log_debug ("AdvertiseRouteMgr:: del handler" )
44
38
vrf , ip_prefix = self .split_key (key )
45
39
self .remove_route_advertisement (vrf , ip_prefix )
46
40
47
- def __set_handler_validate (self , key , data ):
48
- if data :
49
- if ("profile" in data and data ["profile" ] in ROUTE_MAPS ) or data == {"" :"" }:
50
- """
51
- APP which config the data should be responsible to pass a valid IP prefix
52
- """
53
- return True
54
-
55
- log_err ("BGPAdvertiseRouteMgr:: Invalid data %s for advertised route %s" % (data , key ))
56
- return False
57
-
58
- def add_route_advertisement (self , vrf , ip_prefix , data ):
41
+
42
+ def add_route_advertisement (self , vrf , ip_prefix ):
59
43
if self .directory .path_exist ("CONFIG_DB" , swsscommon .CFG_DEVICE_METADATA_TABLE_NAME , "localhost/bgp_asn" ):
60
- if not self .advertised_routes .get (vrf , dict ()):
44
+ if not self .advertised_routes .get (vrf , set ()):
61
45
self .bgp_network_import_check_commands (vrf , self .OP_ADD )
62
- self .advertise_route_commands (ip_prefix , vrf , self .OP_ADD , data )
46
+ self .advertise_route_commands (ip_prefix , vrf , self .OP_ADD )
47
+
48
+ self .advertised_routes .setdefault (vrf , set ()).add (ip_prefix )
63
49
64
- self .advertised_routes .setdefault (vrf , dict ()).update ({ip_prefix : data })
65
50
66
51
def remove_route_advertisement (self , vrf , ip_prefix ):
67
- if ip_prefix not in self .advertised_routes .get (vrf , dict ()):
68
- log_info ("BGPAdvertiseRouteMgr:: %s|%s does not exist" % (vrf , ip_prefix ))
69
- return
70
- self .advertised_routes .get (vrf , dict ()).pop (ip_prefix )
71
- if not self .advertised_routes .get (vrf , dict ()):
52
+ self .advertised_routes .setdefault (vrf , set ()).discard (ip_prefix )
53
+ if not self .advertised_routes .get (vrf , set ()):
72
54
self .advertised_routes .pop (vrf , None )
73
55
74
56
if self .directory .path_exist ("CONFIG_DB" , swsscommon .CFG_DEVICE_METADATA_TABLE_NAME , "localhost/bgp_asn" ):
75
- if not self .advertised_routes .get (vrf , dict ()):
57
+ if not self .advertised_routes .get (vrf , set ()):
76
58
self .bgp_network_import_check_commands (vrf , self .OP_DELETE )
77
59
self .advertise_route_commands (ip_prefix , vrf , self .OP_DELETE )
78
60
79
- def advertise_route_commands (self , ip_prefix , vrf , op , data = None ):
61
+
62
+ def advertise_route_commands (self , ip_prefix , vrf , op ):
80
63
is_ipv6 = TemplateFabric .is_ipv6 (ip_prefix )
81
64
bgp_asn = self .directory .get_slot ("CONFIG_DB" , swsscommon .CFG_DEVICE_METADATA_TABLE_NAME )["localhost" ]["bgp_asn" ]
82
65
83
66
cmd_list = []
84
- if vrf == " default" :
67
+ if vrf == ' default' :
85
68
cmd_list .append ("router bgp %s" % bgp_asn )
86
69
else :
87
70
cmd_list .append ("router bgp %s vrf %s" % (bgp_asn , vrf ))
88
71
89
72
cmd_list .append (" address-family %s unicast" % ("ipv6" if is_ipv6 else "ipv4" ))
90
-
91
- if data and "profile" in data :
92
- cmd_list .append (" network %s route-map %s" % (ip_prefix , "%s_RM" % data ["profile" ]))
93
- log_debug (
94
- "BGPAdvertiseRouteMgr:: Update bgp %s network %s with route-map %s"
95
- % (bgp_asn , vrf + "|" + ip_prefix , "%s_RM" % data ["profile" ])
96
- )
97
- else :
98
- cmd_list .append (" %snetwork %s" % ("no " if op == self .OP_DELETE else "" , ip_prefix ))
99
- log_debug (
100
- "BGPAdvertiseRouteMgr:: %sbgp %s network %s"
101
- % ("Remove " if op == self .OP_DELETE else "Update " , bgp_asn , vrf + "|" + ip_prefix )
102
- )
73
+ cmd_list .append (" %snetwork %s" % ('no ' if op == self .OP_DELETE else '' , ip_prefix ))
103
74
104
75
self .cfg_mgr .push_list (cmd_list )
105
- log_debug ( "BGPAdvertiseRouteMgr::Done" )
76
+
106
77
107
78
def bgp_network_import_check_commands (self , vrf , op ):
108
79
bgp_asn = self .directory .get_slot ("CONFIG_DB" , swsscommon .CFG_DEVICE_METADATA_TABLE_NAME )["localhost" ]["bgp_asn" ]
109
80
cmd_list = []
110
- if vrf == " default" :
81
+ if vrf == ' default' :
111
82
cmd_list .append ("router bgp %s" % bgp_asn )
112
83
else :
113
84
cmd_list .append ("router bgp %s vrf %s" % (bgp_asn , vrf ))
114
- cmd_list .append (" %sbgp network import-check" % ("" if op == self .OP_DELETE else " no " ))
85
+ cmd_list .append (" %sbgp network import-check" % ('' if op == self .OP_DELETE else ' no ' ))
115
86
116
87
self .cfg_mgr .push_list (cmd_list )
117
88
89
+
118
90
def on_bgp_asn_change (self ):
119
91
if self .directory .path_exist ("CONFIG_DB" , swsscommon .CFG_DEVICE_METADATA_TABLE_NAME , "localhost/bgp_asn" ):
120
92
for vrf , ip_prefixes in self .advertised_routes .items ():
121
93
self .bgp_network_import_check_commands (vrf , self .OP_ADD )
122
94
for ip_prefix in ip_prefixes :
123
- self .add_route_advertisement (vrf , ip_prefix , ip_prefixes [ip_prefix ])
95
+ self .add_route_advertisement (vrf , ip_prefix )
96
+
124
97
125
98
@staticmethod
126
99
def split_key (key ):
@@ -129,7 +102,7 @@ def split_key(key):
129
102
:param key: key to split
130
103
:return: vrf name extracted from the key, ip prefix extracted from the key
131
104
"""
132
- if "|" not in key :
133
- return " default" , key
105
+ if '|' not in key :
106
+ return ' default' , key
134
107
else :
135
- return tuple (key .split ("|" , 1 ))
108
+ return tuple (key .split ('|' , 1 ))
0 commit comments