Skip to content

Commit fa6d9e6

Browse files
authored
Merge pull request sonic-net#545 from mssonicbld/cherry/msft-202412/21468
[action] [PR:21468] [Bgpcfgd] Update bgpcfgd to handle SRV6_MY_SIDS table's key as an ipv6 prefix
2 parents 0701d8a + dcc901d commit fa6d9e6

File tree

2 files changed

+34
-28
lines changed

2 files changed

+34
-28
lines changed

src/sonic-bgpcfgd/bgpcfgd/managers_srv6.py

+16-12
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,18 @@ def locators_set_handler(self, key, data):
5454

5555
def sids_set_handler(self, key, data):
5656
locator_name = key.split("|")[0]
57-
ip_addr = key.split("|")[1].lower()
58-
key = "{}|{}".format(locator_name, ip_addr)
57+
ip_prefix = key.split("|")[1].lower()
58+
key = "{}|{}".format(locator_name, ip_prefix)
59+
prefix_len = int(ip_prefix.split("/")[1])
5960

6061
if not self.directory.path_exist(self.db_name, "SRV6_MY_LOCATORS", locator_name):
6162
log_err("Found a SRv6 SID config entry with a locator that does not exist: {} | {}".format(key, data))
6263
return False
6364

6465
locator = self.directory.get(self.db_name, "SRV6_MY_LOCATORS", locator_name)
66+
if locator.block_len + locator.node_len > prefix_len:
67+
log_err("Found a SRv6 SID config entry with an invalid prefix length {} | {}".format(key, data))
68+
return False
6569

6670
if 'action' not in data:
6771
log_err("Found a SRv6 SID config entry that does not specify action: {} | {}".format(key, data))
@@ -71,18 +75,18 @@ def sids_set_handler(self, key, data):
7175
log_err("Found a SRv6 SID config entry associated with unsupported action: {} | {}".format(key, data))
7276
return False
7377

74-
sid = SID(locator_name, ip_addr, data) # the information in data will be parsed into SID's attributes
78+
sid = SID(locator_name, ip_prefix, data) # the information in data will be parsed into SID's attributes
7579

7680
cmd_list = ['segment-routing', 'srv6', 'static-sids']
77-
sid_cmd = 'sid {}/{} locator {} behavior {}'.format(ip_addr, locator.block_len + locator.node_len + locator.func_len, locator_name, sid.action)
81+
sid_cmd = 'sid {} locator {} behavior {}'.format(ip_prefix, locator_name, sid.action)
7882
if sid.decap_vrf != DEFAULT_VRF:
7983
sid_cmd += ' vrf {}'.format(sid.decap_vrf)
8084
cmd_list.append(sid_cmd)
8185

8286
self.cfg_mgr.push_list(cmd_list)
8387
log_debug("{} SRv6 static configuration {}|{} is scheduled for updates. {}".format(self.db_name, self.table_name, key, str(cmd_list)))
8488

85-
self.directory.put(self.db_name, self.table_name, key, (sid, sid_cmd))
89+
self.directory.put(self.db_name, self.table_name, key.replace("/", "\\"), (sid, sid_cmd))
8690
return True
8791

8892
def del_handler(self, key):
@@ -101,21 +105,21 @@ def locators_del_handler(self, key):
101105

102106
def sids_del_handler(self, key):
103107
locator_name = key.split("|")[0]
104-
ip_addr = key.split("|")[1].lower()
105-
key = "{}|{}".format(locator_name, ip_addr)
108+
ip_prefix = key.split("|")[1].lower()
109+
key = "{}|{}".format(locator_name, ip_prefix)
106110

107-
if not self.directory.path_exist(self.db_name, self.table_name, key):
111+
if not self.directory.path_exist(self.db_name, self.table_name, key.replace("/", "\\")):
108112
log_warn("Encountered a config deletion with a SRv6 SID that does not exist: {}".format(key))
109113
return
110114

111-
_, sid_cmd = self.directory.get(self.db_name, self.table_name, key)
115+
_, sid_cmd = self.directory.get(self.db_name, self.table_name, key.replace("/", "\\"))
112116
cmd_list = ['segment-routing', 'srv6', "static-sids"]
113117
no_sid_cmd = 'no ' + sid_cmd
114118
cmd_list.append(no_sid_cmd)
115119

116120
self.cfg_mgr.push_list(cmd_list)
117121
log_debug("{} SRv6 static configuration {}|{} is scheduled for updates. {}".format(self.db_name, self.table_name, key, str(cmd_list)))
118-
self.directory.remove(self.db_name, self.table_name, key)
122+
self.directory.remove(self.db_name, self.table_name, key.replace("/", "\\"))
119123

120124
class Locator:
121125
def __init__(self, name, data):
@@ -127,9 +131,9 @@ def __init__(self, name, data):
127131
self.prefix = data['prefix'].lower() + "/{}".format(self.block_len + self.node_len)
128132

129133
class SID:
130-
def __init__(self, locator, ip_addr, data):
134+
def __init__(self, locator, ip_prefix, data):
131135
self.locator_name = locator
132-
self.ip_addr = ip_addr
136+
self.ip_prefix = ip_prefix
133137

134138
self.action = data['action']
135139
self.decap_vrf = data['decap_vrf'] if 'decap_vrf' in data else DEFAULT_VRF

src/sonic-bgpcfgd/tests/test_srv6.py

+18-16
Original file line numberDiff line numberDiff line change
@@ -78,22 +78,23 @@ def test_uN_add():
7878
loc_mgr, sid_mgr = constructor()
7979
assert loc_mgr.set_handler("loc1", {'prefix': 'fcbb:bbbb:1::'})
8080

81-
op_test(sid_mgr, 'SET', ("loc1|FCBB:BBBB:1:F1::", {
81+
op_test(sid_mgr, 'SET', ("loc1|FCBB:BBBB:1::/48", {
8282
'action': 'uN'
8383
}), expected_ret=True, expected_cmds=[
8484
'segment-routing',
8585
'srv6',
8686
'static-sids',
87-
'sid fcbb:bbbb:1:f1::/64 locator loc1 behavior uN'
87+
'sid fcbb:bbbb:1::/48 locator loc1 behavior uN'
8888
])
8989

90-
assert sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1:f1::")
90+
print(loc_mgr.directory.data)
91+
assert sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1::\\48")
9192

9293
def test_uDT46_add_vrf1():
9394
loc_mgr, sid_mgr = constructor()
9495
assert loc_mgr.set_handler("loc1", {'prefix': 'fcbb:bbbb:1::'})
9596

96-
op_test(sid_mgr, 'SET', ("loc1|FCBB:BBBB:1:F2::", {
97+
op_test(sid_mgr, 'SET', ("loc1|FCBB:BBBB:1:F2::/64", {
9798
'action': 'uDT46',
9899
'decap_vrf': 'Vrf1'
99100
}), expected_ret=True, expected_cmds=[
@@ -103,61 +104,62 @@ def test_uDT46_add_vrf1():
103104
'sid fcbb:bbbb:1:f2::/64 locator loc1 behavior uDT46 vrf Vrf1'
104105
])
105106

106-
assert sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1:f2::")
107+
print(loc_mgr.directory.data)
108+
assert sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1:f2::\\64")
107109

108110
def test_uN_del():
109111
loc_mgr, sid_mgr = constructor()
110112
assert loc_mgr.set_handler("loc1", {'prefix': 'fcbb:bbbb:1::'})
111113

112114
# add uN function first
113-
assert sid_mgr.set_handler("loc1|FCBB:BBBB:1:F1::", {
115+
assert sid_mgr.set_handler("loc1|FCBB:BBBB:1::/48", {
114116
'action': 'uN'
115117
})
116118

117119
# test the deletion
118-
op_test(sid_mgr, 'DEL', ("loc1|FCBB:BBBB:1:F1::",),
120+
op_test(sid_mgr, 'DEL', ("loc1|FCBB:BBBB:1::/48",),
119121
expected_ret=True, expected_cmds=[
120122
'segment-routing',
121123
'srv6',
122124
'static-sids',
123-
'no sid fcbb:bbbb:1:f1::/64 locator loc1 behavior uN'
125+
'no sid fcbb:bbbb:1::/48 locator loc1 behavior uN'
124126
])
125127

126-
assert not sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1:f1::")
128+
assert not sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1::\\48")
127129

128130
def test_uDT46_del_vrf1():
129131
loc_mgr, sid_mgr = constructor()
130132
assert loc_mgr.set_handler("loc1", {'prefix': 'fcbb:bbbb:1::'})
131133

132134
# add a uN action first to make the uDT46 action not the last function
133-
assert sid_mgr.set_handler("loc1|FCBB:BBBB:1:F1::", {
135+
assert sid_mgr.set_handler("loc1|FCBB:BBBB:1::/48", {
134136
'action': 'uN'
135137
})
136138

137139
# add the uDT46 action
138-
assert sid_mgr.set_handler("loc1|FCBB:BBBB:1:F2::", {
140+
assert sid_mgr.set_handler("loc1|FCBB:BBBB:1:F2::/64", {
139141
'action': 'uDT46',
140142
"decap_vrf": "Vrf1"
141143
})
142144

143145
# test the deletion of uDT46
144-
op_test(sid_mgr, 'DEL', ("loc1|FCBB:BBBB:1:F2::",),
146+
op_test(sid_mgr, 'DEL', ("loc1|FCBB:BBBB:1:F2::/64",),
145147
expected_ret=True, expected_cmds=[
146148
'segment-routing',
147149
'srv6',
148150
'static-sids',
149151
'no sid fcbb:bbbb:1:f2::/64 locator loc1 behavior uDT46 vrf Vrf1'
150152
])
151153

152-
assert sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1:f1::")
153-
assert not sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1:f2::")
154+
assert sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1::\\48")
155+
assert not sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1:f2::\\64")
154156

155157
def test_invalid_add():
156158
_, sid_mgr = constructor()
157159

158160
# test the addition of a SID with a non-existent locator
159-
op_test(sid_mgr, 'SET', ("loc2|FCBB:BBBB:21:F1::", {
161+
op_test(sid_mgr, 'SET', ("loc2|FCBB:BBBB:21:F1::/64", {
160162
'action': 'uN'
161163
}), expected_ret=False, expected_cmds=[])
162164

163-
assert not sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc2|fcbb:bbbb:21:f1::")
165+
assert not sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc2|fcbb:bbbb:21:f1::\\64")

0 commit comments

Comments
 (0)