From e2cc31ec0040ce4b66da0164d93095bd755644c9 Mon Sep 17 00:00:00 2001 From: bingwang Date: Thu, 23 Sep 2021 03:28:43 -0700 Subject: [PATCH] Update minigraph parser to support MIRROR_DSCP Signed-off-by: bingwang --- src/sonic-config-engine/minigraph.py | 9 +++++++-- .../tests/simple-sample-graph-case.xml | 5 +++++ .../tests/test_minigraph_case.py | 15 ++++++++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 74bfece3659e..eef516e7d43a 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -242,6 +242,7 @@ def parse_dpg(dpg, hname): acl_intfs = [] is_mirror = False is_mirror_v6 = False + is_mirror_dscp = False # TODO: Ensure that acl_intfs will only ever contain front-panel interfaces (e.g., # maybe we should explicity ignore management and loopback interfaces?) because we @@ -261,7 +262,9 @@ def parse_dpg(dpg, hname): if port_alias_map[member] in intfs_inpc: print >> sys.stderr, "Warning: ACL " + aclname + " is attached to a LAG member interface " + port_alias_map[member] + ", instead of LAG interface" elif member.lower().startswith('erspan'): - if member.lower().startswith('erspanv6'): + if 'dscp' in member.lower(): + is_mirror_dscp = True + elif member.lower().startswith('erspanv6'): is_mirror_v6 = True else: is_mirror = True @@ -283,6 +286,8 @@ def parse_dpg(dpg, hname): acls[aclname]['type'] = 'MIRROR' elif is_mirror_v6: acls[aclname]['type'] = 'MIRRORV6' + elif is_mirror_dscp: + acls[aclname]['type'] = 'MIRROR_DSCP' else: acls[aclname]['type'] = 'L3V6' if 'v6' in aclname.lower() else 'L3' else: @@ -481,7 +486,7 @@ def filter_acl_mirror_table_bindings(acls, neighbors, port_channels): for acl_table, group_params in acls.iteritems(): group_type = group_params.get('type', None) - if group_type != 'MIRROR' and group_type != 'MIRRORV6': + if group_type != 'MIRROR' and group_type != 'MIRRORV6' and group_type != 'MIRROR_DSCP': continue active_ports = [ port for port in group_params.get('ports', []) if port in neighbors.keys() or port in port_channels ] diff --git a/src/sonic-config-engine/tests/simple-sample-graph-case.xml b/src/sonic-config-engine/tests/simple-sample-graph-case.xml index 35d8f8343796..92dcf8b15bf5 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph-case.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph-case.xml @@ -175,6 +175,11 @@ SNMP_ACL SNMP + + ERSPAN_DSCP + Everflow_dscp + Everflow_dscp + diff --git a/src/sonic-config-engine/tests/test_minigraph_case.py b/src/sonic-config-engine/tests/test_minigraph_case.py index 665bcb85d0c7..222b35719231 100644 --- a/src/sonic-config-engine/tests/test_minigraph_case.py +++ b/src/sonic-config-engine/tests/test_minigraph_case.py @@ -1,7 +1,7 @@ from unittest import TestCase import subprocess import os - +import minigraph class TestCfgGenCaseInsensitive(TestCase): def setUp(self): @@ -125,3 +125,16 @@ def test_metadata_ntp(self): argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "NTP_SERVER"' output = self.run_script(argument) self.assertEqual(output.strip(), "{'10.0.10.1': {}, '10.0.10.2': {}}") + + def test_minigraph_mirror_dscp(self): + result = minigraph.parse_xml(self.sample_graph, port_config_file=self.port_config) + self.assertTrue('EVERFLOW_DSCP' in result['ACL_TABLE']) + everflow_dscp_entry = result['ACL_TABLE']['EVERFLOW_DSCP'] + + self.assertEqual(everflow_dscp_entry['type'], 'MIRROR_DSCP') + self.assertEqual(everflow_dscp_entry['stage'], 'ingress') + expected_ports = ['PortChannel01', 'Ethernet12', 'Ethernet8', 'Ethernet0'] + self.assertEqual( + everflow_dscp_entry['ports'].sort(), + expected_ports.sort() + )