From 3f158352b2cef171a0aa5e89d075ed4328cef6dd Mon Sep 17 00:00:00 2001 From: Garrick He <32883830+GarrickHe@users.noreply.github.com> Date: Thu, 12 Nov 2020 17:12:11 -0800 Subject: [PATCH] [sflow] Add mVRF support (#1230) Add mVRF support and options to CLICK CLI to allow mVRF configuration for sFlow collectors Signed-off-by: Garrick He --- config/main.py | 15 +++++++++++---- show/main.py | 5 ++++- tests/mock_tables/config_db.json | 6 ++++-- tests/sflow_test.py | 15 ++++++++------- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/config/main.py b/config/main.py index b691edf1519a..5f3fa24c861b 100755 --- a/config/main.py +++ b/config/main.py @@ -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 @@ -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 # @@ -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='', required=True) @click.argument('ipaddr', metavar='', 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'] @@ -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 # diff --git a/show/main.py b/show/main.py index e4722927970b..797655529965 100755 --- a/show/main.py +++ b/show/main.py @@ -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)) # diff --git a/tests/mock_tables/config_db.json b/tests/mock_tables/config_db.json index b50f28a3d072..3ee150ff7cca 100644 --- a/tests/mock_tables/config_db.json +++ b/tests/mock_tables/config_db.json @@ -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]" diff --git a/tests/sflow_test.py b/tests/sflow_test.py index a3c13f9ebc13..a326a7ef7295 100644 --- a/tests/sflow_test.py +++ b/tests/sflow_test.py @@ -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' @@ -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) @@ -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) @@ -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