Skip to content

Commit

Permalink
[sflow] Add mVRF support (sonic-net#1230)
Browse files Browse the repository at this point in the history
Add mVRF support and options to CLICK CLI to allow mVRF configuration for sFlow collectors

Signed-off-by: Garrick He <garrick_he@dell.com>
  • Loading branch information
GarrickHe authored Nov 13, 2020
1 parent dadfc18 commit 3f15835
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 14 deletions.
15 changes: 11 additions & 4 deletions config/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -3569,7 +3569,7 @@ def collector(ctx):
"""Add/Delete a sFlow collector"""
pass

def is_valid_collector_info(name, ip, port):
def is_valid_collector_info(name, ip, port, vrf_name):
if len(name) > 16:
click.echo("Collector name must not exceed 16 characters")
return False
Expand All @@ -3582,6 +3582,10 @@ def is_valid_collector_info(name, ip, port):
click.echo("Invalid IP address")
return False

if vrf_name != 'default' and vrf_name != 'mgmt':
click.echo("Only 'default' and 'mgmt' VRF are supported")
return False

return True

#
Expand All @@ -3590,14 +3594,16 @@ def is_valid_collector_info(name, ip, port):
@collector.command()
@click.option('--port', required=False, type=int, default=6343,
help='Collector port number')
@click.option('--vrf', required=False, type=str, default='default',
help='Collector VRF')
@click.argument('name', metavar='<collector_name>', required=True)
@click.argument('ipaddr', metavar='<IPv4/v6_address>', required=True)
@click.pass_context
def add(ctx, name, ipaddr, port):
def add(ctx, name, ipaddr, port, vrf):
"""Add a sFlow collector"""
ipaddr = ipaddr.lower()

if not is_valid_collector_info(name, ipaddr, port):
if not is_valid_collector_info(name, ipaddr, port, vrf):
return

config_db = ctx.obj['db']
Expand All @@ -3608,7 +3614,8 @@ def add(ctx, name, ipaddr, port):
return

config_db.mod_entry('SFLOW_COLLECTOR', name,
{"collector_ip": ipaddr, "collector_port": port})
{"collector_ip": ipaddr, "collector_port": port,
"collector_vrf": vrf})
return

#
Expand Down
5 changes: 4 additions & 1 deletion show/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -1684,9 +1684,12 @@ def show_sflow_global(config_db):
sflow_info = config_db.get_table('SFLOW_COLLECTOR')
click.echo("\n {} Collectors configured:".format(len(sflow_info)))
for collector_name in sorted(sflow_info.keys()):
vrf_name = (sflow_info[collector_name]['collector_vrf']
if 'collector_vrf' in sflow_info[collector_name] else 'default')
click.echo(" Name: {}".format(collector_name).ljust(30) +
"IP addr: {} ".format(sflow_info[collector_name]['collector_ip']).ljust(25) +
"UDP port: {}".format(sflow_info[collector_name]['collector_port']))
"UDP port: {}".format(sflow_info[collector_name]['collector_port']).ljust(17) +
"VRF: {}".format(vrf_name))


#
Expand Down
6 changes: 4 additions & 2 deletions tests/mock_tables/config_db.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
},
"SFLOW_COLLECTOR|prod": {
"collector_ip": "fe80::6e82:6aff:fe1e:cd8e",
"collector_port": "6343"
"collector_port": "6343",
"collector_vrf": "mgmt"
},
"SFLOW_COLLECTOR|ser5": {
"collector_ip": "172.21.35.15",
"collector_port": "6343"
"collector_port": "6343",
"collector_vrf": "default"
},
"BREAKOUT_CFG|Ethernet0": {
"brkout_mode": "4x25G[10G]"
Expand Down
15 changes: 8 additions & 7 deletions tests/sflow_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
sFlow AgentID: default
2 Collectors configured:
Name: prod IP addr: fe80::6e82:6aff:fe1e:cd8e UDP port: 6343
Name: ser5 IP addr: 172.21.35.15 UDP port: 6343
Name: prod IP addr: fe80::6e82:6aff:fe1e:cd8e UDP port: 6343 VRF: mgmt
Name: ser5 IP addr: 172.21.35.15 UDP port: 6343 VRF: default
"""

# Expected output for 'show sflow interface'
Expand Down Expand Up @@ -117,7 +117,8 @@ def test_config_sflow_agent_id(self):
# change the output
global show_sflow_output
show_sflow_output_local = \
show_sflow_output.replace('default', 'Ethernet0')
show_sflow_output.replace('sFlow AgentID: default',
'sFlow AgentID: Ethernet0')

# run show and check
result = runner.invoke(show.cli.commands["sflow"], [], obj=db)
Expand Down Expand Up @@ -154,10 +155,10 @@ def test_config_sflow_collector(self):
global show_sflow_output
show_sflow_output_local = show_sflow_output.replace(\
"2 Collectors configured:\n\
Name: prod IP addr: fe80::6e82:6aff:fe1e:cd8e UDP port: 6343\n\
Name: ser5 IP addr: 172.21.35.15 UDP port: 6343", \
Name: prod IP addr: fe80::6e82:6aff:fe1e:cd8e UDP port: 6343 VRF: mgmt\n\
Name: ser5 IP addr: 172.21.35.15 UDP port: 6343 VRF: default", \
"1 Collectors configured:\n\
Name: ser5 IP addr: 172.21.35.15 UDP port: 6343")
Name: ser5 IP addr: 172.21.35.15 UDP port: 6343 VRF: default")

# run show and check
result = runner.invoke(show.cli.commands["sflow"], [], obj=db)
Expand All @@ -168,7 +169,7 @@ def test_config_sflow_collector(self):
# add collector
result = runner.invoke(config.config.commands["sflow"].\
commands["collector"].commands["add"], \
["prod", "fe80::6e82:6aff:fe1e:cd8e"], obj=obj)
["prod", "fe80::6e82:6aff:fe1e:cd8e", "--vrf", "mgmt"], obj=obj)
assert result.exit_code == 0

# run show and check
Expand Down

0 comments on commit 3f15835

Please sign in to comment.