From c7ea3470ed3262b3f4f1e7531ab777e1c1b82063 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Sat, 22 Apr 2017 00:28:30 +0300 Subject: [PATCH] [swss]: Generate config files for Everflow and IPinIP from minigraph (#507) [swss]: Generate config files for Everflow and IPinIP from minigraph - Add Everflow DST IP to minigraph file - Extend minigraph.py to support Everflow - Add templates file for Everflow and IPinIP configuration - Add config.sh for swss docker to generate config files --- .../x86_64-accton_as7512_32x-r0/minigraph.xml | 5 +++++ .../x86_64-arista_7050_qx32/minigraph.xml | 5 +++++ .../x86_64-arista_7060_cx32s/minigraph.xml | 5 +++++ .../x86_64-dell_s6000_s1220-r0/minigraph.xml | 5 +++++ .../x86_64-dell_s6100_c2538-r0/minigraph.xml | 5 +++++ .../x86_64-dell_z9100_c2538-r0/minigraph.xml | 5 +++++ .../x86_64-ingrasys_s9100-r0/minigraph.xml | 5 +++++ .../x86_64-mlnx_msn2410-r0/minigraph.xml | 5 +++++ .../x86_64-mlnx_msn2700-r0/minigraph.xml | 5 +++++ dockers/docker-orchagent/Dockerfile.j2 | 3 +++ dockers/docker-orchagent/config.sh | 6 ++++++ dockers/docker-orchagent/ipinip.json.j2 | 19 +++++++++++++++++ dockers/docker-orchagent/mirror.json.j2 | 21 +++++++++++++++++++ dockers/docker-orchagent/start.sh | 4 +++- src/sonic-config-engine/minigraph.py | 9 ++++++-- .../tests/sample_output/ipinip.json | 14 +++++++++++++ .../tests/sample_output/mirror.json | 14 +++++++++++++ .../tests/t0-sample-graph.xml | 15 +++++++++++++ src/sonic-config-engine/tests/test_j2files.py | 19 +++++++++++++++++ 19 files changed, 166 insertions(+), 3 deletions(-) create mode 100755 dockers/docker-orchagent/config.sh create mode 100644 dockers/docker-orchagent/ipinip.json.j2 create mode 100644 dockers/docker-orchagent/mirror.json.j2 create mode 100644 src/sonic-config-engine/tests/sample_output/ipinip.json create mode 100644 src/sonic-config-engine/tests/sample_output/mirror.json diff --git a/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml b/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml index f2326c44aa..758aca3551 100644 --- a/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml +++ b/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml @@ -1064,6 +1064,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/arista/x86_64-arista_7050_qx32/minigraph.xml b/device/arista/x86_64-arista_7050_qx32/minigraph.xml index f2ef7b0b8b..bbf2508ce4 100644 --- a/device/arista/x86_64-arista_7050_qx32/minigraph.xml +++ b/device/arista/x86_64-arista_7050_qx32/minigraph.xml @@ -1064,6 +1064,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/arista/x86_64-arista_7060_cx32s/minigraph.xml b/device/arista/x86_64-arista_7060_cx32s/minigraph.xml index 5d7dcea980..513a602548 100644 --- a/device/arista/x86_64-arista_7060_cx32s/minigraph.xml +++ b/device/arista/x86_64-arista_7060_cx32s/minigraph.xml @@ -1064,6 +1064,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/minigraph.xml b/device/dell/x86_64-dell_s6000_s1220-r0/minigraph.xml index 0fd1f49ab8..871a91c7fd 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/minigraph.xml +++ b/device/dell/x86_64-dell_s6000_s1220-r0/minigraph.xml @@ -1064,6 +1064,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml b/device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml index 3ae8e77f80..37fba6c291 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml +++ b/device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml @@ -759,6 +759,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/minigraph.xml b/device/dell/x86_64-dell_z9100_c2538-r0/minigraph.xml index ab1ce20a69..b45892801e 100644 --- a/device/dell/x86_64-dell_z9100_c2538-r0/minigraph.xml +++ b/device/dell/x86_64-dell_z9100_c2538-r0/minigraph.xml @@ -1064,6 +1064,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml b/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml index d56428187a..0c4dec5094 100644 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml @@ -136,6 +136,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml b/device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml index 01cfdd03c6..ed21b8d6ee 100644 --- a/device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml @@ -510,6 +510,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml b/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml index 4942e64be5..ecbabba18d 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml @@ -1064,6 +1064,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index 507b0bf033..55f3b504f8 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -23,6 +23,9 @@ debs/{{ deb }}{{' '}} {%- endfor %} COPY start.sh /usr/bin/start.sh +COPY config.sh /usr/bin/config.sh +COPY ipinip.json.j2 /usr/share/sonic/templates/ipinip.json.j2 +COPY mirror.json.j2 /usr/share/sonic/templates/mirror.json.j2 ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y diff --git a/dockers/docker-orchagent/config.sh b/dockers/docker-orchagent/config.sh new file mode 100755 index 0000000000..813dad9533 --- /dev/null +++ b/dockers/docker-orchagent/config.sh @@ -0,0 +1,6 @@ +#!/bin/bash -e + +mkdir -p /etc/swss/config.d/ + +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/ipinip.json.j2 > /etc/swss/config.d/ipinip.json +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/mirror.json.j2 > /etc/swss/config.d/mirror.json diff --git a/dockers/docker-orchagent/ipinip.json.j2 b/dockers/docker-orchagent/ipinip.json.j2 new file mode 100644 index 0000000000..19e98a4129 --- /dev/null +++ b/dockers/docker-orchagent/ipinip.json.j2 @@ -0,0 +1,19 @@ +[ + { + "TUNNEL_DECAP_TABLE:IPINIP_TUNNEL" : { + "tunnel_type":"IPINIP", + "src_ip":"{{ minigraph_lo_interfaces[0]['addr'] }}", + "dst_ip":"{{ minigraph_lo_interfaces[0]['addr'] }}", +{% if minigraph_hwsku in [ 'ACS-MSN2700', 'ACS-MSN2410', 'ACS-MSN2100' ] %} + "dscp_mode":"uniform", + "ecn_mode":"standard", +{% else %} + "dscp_mode":"pipe", + "ecn_mode":"copy_from_outer", +{% endif %} + "ttl_mode":"pipe" + }, + "OP": "SET" + } +] + diff --git a/dockers/docker-orchagent/mirror.json.j2 b/dockers/docker-orchagent/mirror.json.j2 new file mode 100644 index 0000000000..7a3a9250d7 --- /dev/null +++ b/dockers/docker-orchagent/mirror.json.j2 @@ -0,0 +1,21 @@ +[ +{% if erspan_dst %} + { + "MIRROR_SESSION_TABLE:everflow": { + "src_ip": "{{ minigraph_lo_interfaces[0]['addr'] }}", + "dst_ip": "{{ erspan_dst[0] }}", +{% if minigraph_hwsku in [ 'ACS-MSN2700', 'ACS-MSN2410', 'ACS-MSN2100' ] %} + "gre_type": "0x6558", + "queue": "1", +{% else %} + "gre_type": "0x88be", + "queue": "0", +{% endif %} + "dscp": "8", + "ttl": "255" + }, + "OP": "SET" + } +{% endif %} +] + diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 47fa198e0b..7a653c442e 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -1,5 +1,7 @@ #!/bin/bash +. config.sh + export platform=`sonic-cfggen -m /etc/sonic/minigraph.xml -v platform` function start_app { @@ -45,7 +47,7 @@ ORCHAGENT_ARGS="" PORTSYNCD_ARGS="-p /usr/share/sonic/hwsku/port_config.ini" -SWSSCONFIG_ARGS="00-copp.config.json " +SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json " if [ "$HWSKU" == "Force10-S6000" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 42086625bb..49e8b104a4 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -282,6 +282,7 @@ def parse_meta(meta, hname): dhcp_servers = [] ntp_servers = [] mgmt_routes = [] + erspan_dst = [] device_metas = meta.find(str(QName(ns, "Devices"))) for device in device_metas.findall(str(QName(ns1, "DeviceMetadata"))): if device.find(str(QName(ns1, "Name"))).text == hname: @@ -298,7 +299,9 @@ def parse_meta(meta, hname): syslog_servers = value_group elif name == "ForcedMgmtRoutes": mgmt_routes = value_group - return syslog_servers, dhcp_servers, ntp_servers, mgmt_routes + elif name == "ErspanDestinationIpv4": + erspan_dst = value_group + return syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst def get_console_info(devices, dev, port): @@ -391,6 +394,7 @@ def parse_xml(filename, platform=None, port_config_file=None): dhcp_servers = [] ntp_servers = [] mgmt_routes = [] + erspan_dst = [] hwsku_qn = QName(ns, "HwSku") hostname_qn = QName(ns, "Hostname") @@ -412,7 +416,7 @@ def parse_xml(filename, platform=None, port_config_file=None): elif child.tag == str(QName(ns, "UngDec")): (u_neighbors, u_devices, _, _, _, _) = parse_png(child, hostname) elif child.tag == str(QName(ns, "MetadataDeclaration")): - (syslog_servers, dhcp_servers, ntp_servers, mgmt_routes) = parse_meta(child, hostname) + (syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst) = parse_meta(child, hostname) Tree = lambda: defaultdict(Tree) @@ -460,6 +464,7 @@ def parse_xml(filename, platform=None, port_config_file=None): results['dhcp_servers'] = dhcp_servers results['ntp_servers'] = ntp_servers results['forced_mgmt_routes'] = mgmt_routes + results['erspan_dst'] = erspan_dst return results diff --git a/src/sonic-config-engine/tests/sample_output/ipinip.json b/src/sonic-config-engine/tests/sample_output/ipinip.json new file mode 100644 index 0000000000..00862a3792 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/ipinip.json @@ -0,0 +1,14 @@ +[ + { + "TUNNEL_DECAP_TABLE:IPINIP_TUNNEL" : { + "tunnel_type":"IPINIP", + "src_ip":"10.1.0.32", + "dst_ip":"10.1.0.32", + "dscp_mode":"pipe", + "ecn_mode":"copy_from_outer", + "ttl_mode":"pipe" + }, + "OP": "SET" + } +] + diff --git a/src/sonic-config-engine/tests/sample_output/mirror.json b/src/sonic-config-engine/tests/sample_output/mirror.json new file mode 100644 index 0000000000..54065700a2 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/mirror.json @@ -0,0 +1,14 @@ +[ + { + "MIRROR_SESSION_TABLE:everflow": { + "src_ip": "10.1.0.32", + "dst_ip": "2.2.2.2", + "gre_type": "0x88be", + "queue": "0", + "dscp": "8", + "ttl": "255" + }, + "OP": "SET" + } +] + diff --git a/src/sonic-config-engine/tests/t0-sample-graph.xml b/src/sonic-config-engine/tests/t0-sample-graph.xml index 41e62dca29..e359b4fa62 100644 --- a/src/sonic-config-engine/tests/t0-sample-graph.xml +++ b/src/sonic-config-engine/tests/t0-sample-graph.xml @@ -317,6 +317,21 @@ + + + + switch-t0 + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + switch-t0 Force10-S6000 diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index cf1e32aea5..6ea49efc75 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -46,6 +46,25 @@ class TestJ2Files(TestCase): assert pc_name in pc_list test_render_teamd(self, pc_name) + def test_ipinip(self): + ipinip_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'ipinip.json.j2') + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + ipinip_file + ' > ' + self.output_file + self.run_script(argument) + + sample_output_file = os.path.join(self.test_dir, 'sample_output', 'ipinip.json') + + assert filecmp.cmp(sample_output_file, self.output_file) + + def test_everflow(self): + everflow_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'mirror.json.j2') + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + everflow_file + ' > ' + self.output_file + self.run_script(argument) + + sample_output_file = os.path.join(self.test_dir, 'sample_output', 'mirror.json') + + assert filecmp.cmp(sample_output_file, self.output_file) + + def tearDown(self): try: os.remove(self.output_file)