Added option to enable/disable Static Route Advertisement (#9298)

What I did:

Added option 'advertise':'true'/'false' to STATIC_TALE to control whether given route need to be advertise into BGP.

How I did:

Add a route in FRR with tag (1 for advertise and 2 for not advertise)
Create Route Map to match on tag as 1 and permit
Attach route-map to redistribute static.
Minigraph option to parse advertise option of Static Route.
This commit is contained in:
abdosi 2021-11-24 09:43:37 -08:00 committed by GitHub
parent b3ccef9c08
commit 950ec3e68b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 261 additions and 127 deletions

View File

@ -27,6 +27,8 @@ class StaticRouteMgr(Manager):
OP_DELETE = 'DELETE'
OP_ADD = 'ADD'
ROUTE_ADVERTISE_ENABLE_TAG = '1'
ROUTE_ADVERTISE_DISABLE_TAG = '2'
def set_handler(self, key, data):
vrf, ip_prefix = self.split_key(key)
@ -38,11 +40,12 @@ class StaticRouteMgr(Manager):
intf_list = arg_list(data['ifname']) if 'ifname' in data else None
dist_list = arg_list(data['distance']) if 'distance' in data else None
nh_vrf_list = arg_list(data['nexthop-vrf']) if 'nexthop-vrf' in data else None
route_tag = self.ROUTE_ADVERTISE_DISABLE_TAG if 'advertise' in data and data['advertise'] == "false" else self.ROUTE_ADVERTISE_ENABLE_TAG
try:
ip_nh_set = IpNextHopSet(is_ipv6, bkh_list, nh_list, intf_list, dist_list, nh_vrf_list)
cur_nh_set = self.static_routes.get(vrf, {}).get(ip_prefix, IpNextHopSet(is_ipv6))
cmd_list = self.static_route_commands(ip_nh_set, cur_nh_set, ip_prefix, vrf)
cur_nh_set, cur_route_tag = self.static_routes.get(vrf, {}).get(ip_prefix, (IpNextHopSet(is_ipv6), route_tag))
cmd_list = self.static_route_commands(ip_nh_set, cur_nh_set, ip_prefix, vrf, route_tag, cur_route_tag)
except Exception as exc:
log_crit("Got an exception %s: Traceback: %s" % (str(exc), traceback.format_exc()))
return False
@ -60,7 +63,7 @@ class StaticRouteMgr(Manager):
else:
log_debug("Nothing to update for static route {}".format(key))
self.static_routes.setdefault(vrf, {})[ip_prefix] = ip_nh_set
self.static_routes.setdefault(vrf, {})[ip_prefix] = (ip_nh_set, route_tag)
return True
@ -70,8 +73,8 @@ class StaticRouteMgr(Manager):
is_ipv6 = TemplateFabric.is_ipv6(ip_prefix)
ip_nh_set = IpNextHopSet(is_ipv6)
cur_nh_set = self.static_routes.get(vrf, {}).get(ip_prefix, IpNextHopSet(is_ipv6))
cmd_list = self.static_route_commands(ip_nh_set, cur_nh_set, ip_prefix, vrf)
cur_nh_set, route_tag = self.static_routes.get(vrf, {}).get(ip_prefix, (IpNextHopSet(is_ipv6), self.ROUTE_ADVERTISE_DISABLE_TAG))
cmd_list = self.static_route_commands(ip_nh_set, cur_nh_set, ip_prefix, vrf, route_tag, route_tag)
# Disable redistribution of static routes when it is the last one to delete
if self.static_routes.get(vrf, {}).keys() == {ip_prefix}:
@ -99,10 +102,18 @@ class StaticRouteMgr(Manager):
else:
return tuple(key.split('|', 1))
def static_route_commands(self, ip_nh_set, cur_nh_set, ip_prefix, vrf):
def static_route_commands(self, ip_nh_set, cur_nh_set, ip_prefix, vrf, route_tag, cur_route_tag):
op_cmd_list = {}
if route_tag != cur_route_tag:
for ip_nh in cur_nh_set:
op_cmds = op_cmd_list.setdefault(self.OP_DELETE, [])
op_cmds.append(self.generate_command(self.OP_DELETE, ip_nh, ip_prefix, vrf, cur_route_tag))
for ip_nh in ip_nh_set:
op_cmds = op_cmd_list.setdefault(self.OP_ADD, [])
op_cmds.append(self.generate_command(self.OP_ADD, ip_nh, ip_prefix, vrf, route_tag))
else:
diff_set = ip_nh_set.symmetric_difference(cur_nh_set)
op_cmd_list = {}
for ip_nh in diff_set:
if ip_nh in cur_nh_set:
op = self.OP_DELETE
@ -110,25 +121,28 @@ class StaticRouteMgr(Manager):
op = self.OP_ADD
op_cmds = op_cmd_list.setdefault(op, [])
op_cmds.append(self.generate_command(op, ip_nh, ip_prefix, vrf))
op_cmds.append(self.generate_command(op, ip_nh, ip_prefix, vrf, route_tag))
cmd_list = op_cmd_list.get(self.OP_DELETE, [])
cmd_list += op_cmd_list.get(self.OP_ADD, [])
return cmd_list
def generate_command(self, op, ip_nh, ip_prefix, vrf):
return '{}{} route {}{}{}'.format(
def generate_command(self, op, ip_nh, ip_prefix, vrf, route_tag):
return '{}{} route {}{}{}{}'.format(
'no ' if op == self.OP_DELETE else '',
'ipv6' if ip_nh.af == socket.AF_INET6 else 'ip',
ip_prefix,
ip_nh,
' vrf {}'.format(vrf) if vrf != 'default' else ''
' vrf {}'.format(vrf) if vrf != 'default' else '',
' tag {}'.format(route_tag)
)
def enable_redistribution_command(self, vrf):
log_debug("Enabling static route redistribution")
cmd_list = []
cmd_list.append("route-map STATIC_ROUTE_FILTER permit 10")
cmd_list.append(" match tag %s" % self.ROUTE_ADVERTISE_ENABLE_TAG)
bgp_asn = self.directory.get_slot("CONFIG_DB", swsscommon.CFG_DEVICE_METADATA_TABLE_NAME)["localhost"]["bgp_asn"]
if vrf == 'default':
cmd_list.append("router bgp %s" % bgp_asn)
@ -136,7 +150,7 @@ class StaticRouteMgr(Manager):
cmd_list.append("router bgp %s vrf %s" % (bgp_asn, vrf))
for af in ["ipv4", "ipv6"]:
cmd_list.append(" address-family %s" % af)
cmd_list.append(" redistribute static")
cmd_list.append(" redistribute static route-map STATIC_ROUTE_FILTER")
return cmd_list
def disable_redistribution_command(self, vrf):
@ -149,7 +163,8 @@ class StaticRouteMgr(Manager):
cmd_list.append("router bgp %s vrf %s" % (bgp_asn, vrf))
for af in ["ipv4", "ipv6"]:
cmd_list.append(" address-family %s" % af)
cmd_list.append(" no redistribute static")
cmd_list.append(" no redistribute static route-map STATIC_ROUTE_FILTER")
cmd_list.append("no route-map STATIC_ROUTE_FILTER")
return cmd_list
def on_bgp_asn_change(self):

View File

@ -62,12 +62,14 @@ def test_set():
}),
True,
[
"ip route 10.1.0.0/24 10.0.0.57",
"ip route 10.1.0.0/24 10.0.0.57 tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
@ -81,12 +83,14 @@ def test_set_nhportchannel():
}),
True,
[
"ip route 10.1.0.0/24 PortChannel0001",
"ip route 10.1.0.0/24 PortChannel0001 tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
@ -96,12 +100,13 @@ def test_set_nhportchannel():
("10.1.0.0/24",),
True,
[
"no ip route 10.1.0.0/24 PortChannel0001",
"no ip route 10.1.0.0/24 PortChannel0001 tag 1",
"router bgp 65100",
" address-family ipv4",
" no redistribute static",
" no redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" no redistribute static"
" no redistribute static route-map STATIC_ROUTE_FILTER",
"no route-map STATIC_ROUTE_FILTER"
]
)
@ -115,13 +120,15 @@ def test_set_several_nhportchannels():
}),
True,
[
"ip route 10.1.0.0/24 PortChannel0003",
"ip route 10.1.0.0/24 PortChannel0004",
"ip route 10.1.0.0/24 PortChannel0003 tag 1",
"ip route 10.1.0.0/24 PortChannel0004 tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
@ -139,12 +146,14 @@ def test_set_nhvrf():
}),
True,
[
"ip route 10.1.1.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf",
"ip route 10.1.1.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
@ -162,12 +171,14 @@ def test_set_blackhole():
}),
True,
[
"ip route 10.1.2.0/24 blackhole 10",
"ip route 10.1.2.0/24 blackhole 10 tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
@ -185,12 +196,14 @@ def test_set_vrf():
}),
True,
[
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100 vrf vrfRED",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
@ -208,12 +221,14 @@ def test_set_ipv6():
}),
True,
[
"ipv6 route fc00:10::/64 fc00::72 PortChannel0001 10",
"ipv6 route fc00:10::/64 fc00::72 PortChannel0001 10 tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
@ -230,14 +245,16 @@ def test_set_nh_only():
}),
True,
[
"ip route 10.1.3.0/24 10.0.0.57 10 nexthop-vrf nh_vrf vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.59 20 vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.61 30 nexthop-vrf default vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.57 10 nexthop-vrf nh_vrf vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.59 20 vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.61 30 nexthop-vrf default vrf vrfRED tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100 vrf vrfRED",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
@ -254,14 +271,16 @@ def test_set_ifname_only():
}),
True,
[
"ip route 10.1.3.0/24 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED",
"ip route 10.1.3.0/24 PortChannel0002 20 vrf vrfRED",
"ip route 10.1.3.0/24 PortChannel0003 30 nexthop-vrf default vrf vrfRED",
"ip route 10.1.3.0/24 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED tag 1",
"ip route 10.1.3.0/24 PortChannel0002 20 vrf vrfRED tag 1",
"ip route 10.1.3.0/24 PortChannel0003 30 nexthop-vrf default vrf vrfRED tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100 vrf vrfRED",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
@ -279,14 +298,16 @@ def test_set_with_empty_ifname():
}),
True,
[
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.59 20 vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.59 20 vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100 vrf vrfRED",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
@ -304,14 +325,16 @@ def test_set_with_empty_nh():
}),
True,
[
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED",
"ip route 10.1.3.0/24 PortChannel0002 20 vrf vrfRED",
"ip route 10.1.3.0/24 PortChannel0003 30 nexthop-vrf default vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED tag 1",
"ip route 10.1.3.0/24 PortChannel0002 20 vrf vrfRED tag 1",
"ip route 10.1.3.0/24 PortChannel0003 30 nexthop-vrf default vrf vrfRED tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100 vrf vrfRED",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
@ -329,14 +352,16 @@ def test_set_del():
}),
True,
[
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100 vrf vrfRED",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
set_del_test(
@ -345,14 +370,15 @@ def test_set_del():
("vrfRED|10.1.3.0/24",),
True,
[
"no ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED",
"no ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED",
"no ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED",
"no ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED tag 1",
"no ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED tag 1",
"no ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED tag 1",
"router bgp 65100 vrf vrfRED",
" address-family ipv4",
" no redistribute static",
" no redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" no redistribute static"
" no redistribute static route-map STATIC_ROUTE_FILTER",
"no route-map STATIC_ROUTE_FILTER"
]
)
set_del_test(
@ -367,14 +393,16 @@ def test_set_del():
}),
True,
[
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100 vrf vrfRED",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
@ -392,14 +420,16 @@ def test_set_same_route():
}),
True,
[
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100 vrf vrfRED",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
set_del_test(
@ -414,12 +444,12 @@ def test_set_same_route():
}),
True,
[
"no ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED",
"no ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED",
"no ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 40 nexthop-vrf nh_vrf vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 50 vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 60 nexthop-vrf default vrf vrfRED"
"no ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED tag 1",
"no ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED tag 1",
"no ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 40 nexthop-vrf nh_vrf vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 50 vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 60 nexthop-vrf default vrf vrfRED tag 1"
]
)
@ -437,14 +467,16 @@ def test_set_add_del_nh():
}),
True,
[
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100 vrf vrfRED",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
set_del_test(
@ -459,7 +491,7 @@ def test_set_add_del_nh():
}),
True,
[
"ip route 10.1.3.0/24 10.0.0.63 PortChannel0004 30 vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.63 PortChannel0004 30 vrf vrfRED tag 1",
]
)
set_del_test(
@ -474,8 +506,8 @@ def test_set_add_del_nh():
}),
True,
[
"no ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED",
"no ip route 10.1.3.0/24 10.0.0.63 PortChannel0004 30 vrf vrfRED",
"no ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED tag 1",
"no ip route 10.1.3.0/24 10.0.0.63 PortChannel0004 30 vrf vrfRED tag 1",
]
)
@ -493,14 +525,16 @@ def test_set_add_del_nh_ethernet():
}),
True,
[
"ip route 20.1.3.0/24 20.0.0.57 Ethernet4 10 nexthop-vrf default",
"ip route 20.1.3.0/24 20.0.0.59 Ethernet8 20",
"ip route 20.1.3.0/24 20.0.0.61 Ethernet12 30 nexthop-vrf default",
"ip route 20.1.3.0/24 20.0.0.57 Ethernet4 10 nexthop-vrf default tag 1",
"ip route 20.1.3.0/24 20.0.0.59 Ethernet8 20 tag 1",
"ip route 20.1.3.0/24 20.0.0.61 Ethernet12 30 nexthop-vrf default tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
set_del_test(
@ -515,7 +549,7 @@ def test_set_add_del_nh_ethernet():
}),
True,
[
"ip route 20.1.3.0/24 20.0.0.63 Ethernet16 30",
"ip route 20.1.3.0/24 20.0.0.63 Ethernet16 30 tag 1",
]
)
set_del_test(
@ -530,8 +564,8 @@ def test_set_add_del_nh_ethernet():
}),
True,
[
"no ip route 20.1.3.0/24 20.0.0.61 Ethernet12 30 nexthop-vrf default",
"no ip route 20.1.3.0/24 20.0.0.63 Ethernet16 30",
"no ip route 20.1.3.0/24 20.0.0.61 Ethernet12 30 nexthop-vrf default tag 1",
"no ip route 20.1.3.0/24 20.0.0.63 Ethernet16 30 tag 1",
]
)
@ -548,12 +582,14 @@ def test_set_no_action(mocked_log_debug):
}),
True,
[
"ip route 10.1.1.0/24 blackhole",
"ip route 10.1.1.0/24 blackhole tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
@ -608,11 +644,13 @@ def test_set_invalid_blackhole(mocked_log_err):
}),
True,
[
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
mocked_log_err.assert_called_with("Mandatory attribute not found for nexthop")
@ -643,9 +681,9 @@ def test_set_del_no_bgp_asn():
}),
True,
[
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED tag 1",
]
)
set_del_test(
@ -654,9 +692,9 @@ def test_set_del_no_bgp_asn():
("vrfRED|10.1.3.0/24",),
True,
[
"no ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED",
"no ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED",
"no ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED",
"no ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED tag 1",
"no ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED tag 1",
"no ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED tag 1",
]
)
@ -674,20 +712,22 @@ def test_set_del_bgp_asn_change():
}),
True,
[
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED",
"ip route 10.1.3.0/24 10.0.0.57 PortChannel0001 10 nexthop-vrf nh_vrf vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.59 PortChannel0002 20 vrf vrfRED tag 1",
"ip route 10.1.3.0/24 10.0.0.61 PortChannel0003 30 nexthop-vrf default vrf vrfRED tag 1",
]
)
assert mgr.vrf_pending_redistribution == {"vrfRED"}
expected_cmds = [
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100 vrf vrfRED",
" address-family ipv4",
" redistribute static",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static"
" redistribute static route-map STATIC_ROUTE_FILTER"
]
def push_list(cmds):
set_del_test.push_list_called = True
@ -705,3 +745,79 @@ def test_set_del_bgp_asn_change():
mgr.directory.put("CONFIG_DB", swsscommon.CFG_DEVICE_METADATA_TABLE_NAME, "localhost", {"bgp_asn": "65100"})
assert not mgr.vrf_pending_redistribution
def test_set_tag_enable():
mgr = constructor()
set_del_test(
mgr,
"SET",
("10.1.0.0/24", {
"nexthop": "10.0.0.57","advertise":"true"
}),
True,
[
"ip route 10.1.0.0/24 10.0.0.57 tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100",
" address-family ipv4",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
def test_set_tag_disable():
mgr = constructor()
set_del_test(
mgr,
"SET",
("10.1.0.0/24", {
"nexthop": "10.0.0.57","advertise":"false"
}),
True,
[
"ip route 10.1.0.0/24 10.0.0.57 tag 2",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100",
" address-family ipv4",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
def test_set_tag_change():
mgr = constructor()
set_del_test(
mgr,
"SET",
("10.1.0.0/24", {
"nexthop": "10.0.0.57","advertise":"true"
}),
True,
[
"ip route 10.1.0.0/24 10.0.0.57 tag 1",
"route-map STATIC_ROUTE_FILTER permit 10",
" match tag 1",
"router bgp 65100",
" address-family ipv4",
" redistribute static route-map STATIC_ROUTE_FILTER",
" address-family ipv6",
" redistribute static route-map STATIC_ROUTE_FILTER"
]
)
set_del_test(
mgr,
"SET",
("10.1.0.0/24", {
"nexthop": "10.0.0.57","advertise":"false"
}),
True,
[
"no ip route 10.1.0.0/24 10.0.0.57 tag 1",
"ip route 10.1.0.0/24 10.0.0.57 tag 2",
]
)

View File

@ -512,7 +512,8 @@ def parse_dpg(dpg, hname):
elif ipnh.find(str(QName(ns, "Type"))).text == 'StaticRoute':
prefix = ipnh.find(str(QName(ns, "AttachTo"))).text
nexthop = ipnh.find(str(QName(ns, "Address"))).text
static_routes[prefix] = {'nexthop': nexthop }
advertise = ipnh.find(str(QName(ns, "Advertise"))).text
static_routes[prefix] = {'nexthop': nexthop, 'advertise': advertise}
if port_nhipv4_map and port_nhipv6_map:
subnet_check_ip = list(port_nhipv4_map.values())[0]

View File

@ -124,6 +124,7 @@
<AttachTo>8.0.0.1/32</AttachTo>
<Address>192.168.1.2,192.168.2.2</Address>
<Type>StaticRoute</Type>
<Advertise>false</Advertise>
</IPNextHop>
</IPNextHops>
<DataAcls/>
@ -214,6 +215,7 @@
<AttachTo>8.0.0.1/32</AttachTo>
<Address>192.168.1.2,192.168.2.2</Address>
<Type>StaticRoute</Type>
<Advertise>false</Advertise>
</IPNextHop>
</IPNextHops>
</DeviceDataPlaneInfo>

View File

@ -904,14 +904,14 @@ class TestCfgGen(TestCase):
output = self.run_script(argument)
self.assertEqual(
utils.to_dict(output.strip()),
utils.to_dict("{'8.0.0.1/32': {'nexthop': '192.168.1.2,192.168.2.2'}}")
utils.to_dict("{'8.0.0.1/32': {'nexthop': '192.168.1.2,192.168.2.2', 'advertise':'false'}}")
)
argument = '-m "' + self.packet_chassis_graph + '" -p "' + self.packet_chassis_port_ini + '" -n "' + "asic1" + '" -v "STATIC_ROUTE"'
output = self.run_script(argument)
self.assertEqual(
utils.to_dict(output.strip()),
utils.to_dict("{'8.0.0.1/32': {'nexthop': '192.168.1.2,192.168.2.2'}}")
utils.to_dict("{'8.0.0.1/32': {'nexthop': '192.168.1.2,192.168.2.2', 'advertise':'false'}}")
)
def test_minigraph_bgp_packet_chassis_vlan_subintf(self):