From c6be441c86bc8fe2e938e2bd3c85f99071cbfb49 Mon Sep 17 00:00:00 2001 From: l0crian1 Date: Wed, 15 May 2024 14:54:18 -0400 Subject: [PATCH 1/2] T6335: Add/Update EVPN op commands Added the following commands: show evpn show evpn es show evpn es show evpn es detail show evpn es-evi show evpn es-evi detail show evpn es-evi vni show evpn vni show evpn vni detail show evpn vni Updated the following commands: show evpn access-vlan show evpn arp-cache show evpn mac show evpn next-hops show evpn rmac --- data/op-mode-standardized.json | 1 + .../include/vni-tagnode-all.xml.i | 5 +- op-mode-definitions/include/vni-tagnode.xml.i | 5 +- op-mode-definitions/show-evpn.xml.in | 59 ++++++++++++++++++- src/completion/list_esi.py | 31 ++++++++++ src/completion/list_vni.py | 27 +++++++++ src/op_mode/evpn.py | 46 +++++++++++++++ 7 files changed, 168 insertions(+), 6 deletions(-) create mode 100644 src/completion/list_esi.py create mode 100644 src/completion/list_vni.py create mode 100644 src/op_mode/evpn.py diff --git a/data/op-mode-standardized.json b/data/op-mode-standardized.json index a4ed2bcf46..911869d093 100644 --- a/data/op-mode-standardized.json +++ b/data/op-mode-standardized.json @@ -9,6 +9,7 @@ "cpu.py", "dhcp.py", "dns.py", +"evpn.py", "interfaces.py", "ipsec.py", "lldp.py", diff --git a/op-mode-definitions/include/vni-tagnode-all.xml.i b/op-mode-definitions/include/vni-tagnode-all.xml.i index 0fedb93716..18f74653ba 100644 --- a/op-mode-definitions/include/vni-tagnode-all.xml.i +++ b/op-mode-definitions/include/vni-tagnode-all.xml.i @@ -3,9 +3,10 @@ VXLAN network identifier (VNI) number - 1-16777215 all + <1-16777215> all + - ${vyos_op_scripts_dir}/vtysh_wrapper.sh $@ + ${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*" diff --git a/op-mode-definitions/include/vni-tagnode.xml.i b/op-mode-definitions/include/vni-tagnode.xml.i index 22f2d33bd9..363da8d5e8 100644 --- a/op-mode-definitions/include/vni-tagnode.xml.i +++ b/op-mode-definitions/include/vni-tagnode.xml.i @@ -3,9 +3,10 @@ VXLAN network identifier (VNI) number - 1-16777215 + <1-16777215> + - ${vyos_op_scripts_dir}/vtysh_wrapper.sh $@ + ${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*" diff --git a/op-mode-definitions/show-evpn.xml.in b/op-mode-definitions/show-evpn.xml.in index a005cbc304..ba3b104cdd 100644 --- a/op-mode-definitions/show-evpn.xml.in +++ b/op-mode-definitions/show-evpn.xml.in @@ -14,7 +14,7 @@ #include - ${vyos_op_scripts_dir}/vtysh_wrapper.sh $@ + ${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*" @@ -31,7 +31,7 @@ <1-4094> - ${vyos_op_scripts_dir}/vtysh_wrapper.sh $@ + ${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*" @@ -43,6 +43,45 @@ #include + + + Show ESI information for specified ESI + + <esi> + + + + ${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*" + + + + Show ESI information + + ${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*" + + + + Show ESI details + + ${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*" + + + + + + Show ESI information per EVI + + ${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*" + + + + Show ESI per EVI details + + ${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*" + + #include + + MAC addresses @@ -67,7 +106,23 @@ #include + #include + + + Show VNI information + + ${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*" + + + + Show VNI details + + ${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*" + + + + ${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*" diff --git a/src/completion/list_esi.py b/src/completion/list_esi.py new file mode 100644 index 0000000000..fc40f37b69 --- /dev/null +++ b/src/completion/list_esi.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2016-2024 VyOS maintainers and contributors +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 or later as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# This script is completion helper to list all configured VNIs that are visible to FRR + +import json +from vyos.utils.process import cmd + +def get_esi(): + esiDict = json.loads(cmd(f"vtysh -c 'show evpn es json'")) + esiList = [] + for i in esiDict: + esiList.append(i['esi']) + + print(' '.join(esiList)) + +if __name__ == '__main__': + get_esi() diff --git a/src/completion/list_vni.py b/src/completion/list_vni.py new file mode 100644 index 0000000000..ef78eb16fa --- /dev/null +++ b/src/completion/list_vni.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2016-2024 VyOS maintainers and contributors +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 or later as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# This script is completion helper to list all configured VNIs that are visible to FRR + +import json +from vyos.utils.process import cmd + +def get_vni(): + vniDict = json.loads(cmd(f"vtysh -c 'show evpn vni json'")) + print(' '.join(vniDict.keys())) + +if __name__ == '__main__': + get_vni() diff --git a/src/op_mode/evpn.py b/src/op_mode/evpn.py new file mode 100644 index 0000000000..cae4ab9f5b --- /dev/null +++ b/src/op_mode/evpn.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2016-2024 VyOS maintainers and contributors +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 or later as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# This script is a helper to run VTYSH commands for "show evpn", allowing for the --raw flag to output JSON + +import sys +import typing +import json + +import vyos.opmode +from vyos.utils.process import cmd + +def show_evpn(raw: bool, command: typing.Optional[str]): + if raw: + command = f"{command} json" + evpnDict = {} + try: + evpnDict['evpn'] = json.loads(cmd(f"vtysh -c '{command}'")) + except: + raise vyos.opmode.DataUnavailable(f"\"{command.replace(' json', '')}\" is invalid or has no JSON option") + + return evpnDict + else: + return cmd(f"vtysh -c '{command}'") + +if __name__ == '__main__': + try: + res = vyos.opmode.run(sys.modules[__name__]) + if res: + print(res) + except (ValueError, vyos.opmode.Error) as e: + print(e) + sys.exit(1) From 3917e3e9f985063ab7419c903f6019116224f640 Mon Sep 17 00:00:00 2001 From: l0crian1 Date: Thu, 16 May 2024 08:07:02 -0400 Subject: [PATCH 2/2] T6335: Add/Update EVPN op commands Converted completion helpers from python to bash for performance Previous commit: Added the following commands: show evpn show evpn es show evpn es show evpn es detail show evpn es-evi show evpn es-evi detail show evpn es-evi vni show evpn vni show evpn vni detail show evpn vni Updated the following commands: show evpn access-vlan show evpn arp-cache show evpn mac show evpn next-hops show evpn rmac --- .../include/vni-tagnode-all.xml.i | 2 +- op-mode-definitions/include/vni-tagnode.xml.i | 2 +- op-mode-definitions/show-evpn.xml.in | 2 +- src/completion/{list_esi.py => list_esi.sh} | 23 +++++-------------- src/completion/{list_vni.py => list_vni.sh} | 17 ++++---------- 5 files changed, 14 insertions(+), 32 deletions(-) rename src/completion/{list_esi.py => list_esi.sh} (50%) mode change 100644 => 100755 rename src/completion/{list_vni.py => list_vni.sh} (63%) mode change 100644 => 100755 diff --git a/op-mode-definitions/include/vni-tagnode-all.xml.i b/op-mode-definitions/include/vni-tagnode-all.xml.i index 18f74653ba..fabab19d7f 100644 --- a/op-mode-definitions/include/vni-tagnode-all.xml.i +++ b/op-mode-definitions/include/vni-tagnode-all.xml.i @@ -4,7 +4,7 @@ VXLAN network identifier (VNI) number <1-16777215> all - + ${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*" diff --git a/op-mode-definitions/include/vni-tagnode.xml.i b/op-mode-definitions/include/vni-tagnode.xml.i index 363da8d5e8..f5b99dcc86 100644 --- a/op-mode-definitions/include/vni-tagnode.xml.i +++ b/op-mode-definitions/include/vni-tagnode.xml.i @@ -4,7 +4,7 @@ VXLAN network identifier (VNI) number <1-16777215> - + ${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*" diff --git a/op-mode-definitions/show-evpn.xml.in b/op-mode-definitions/show-evpn.xml.in index ba3b104cdd..3c1e5c7d66 100644 --- a/op-mode-definitions/show-evpn.xml.in +++ b/op-mode-definitions/show-evpn.xml.in @@ -48,7 +48,7 @@ Show ESI information for specified ESI <esi> - + ${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*" diff --git a/src/completion/list_esi.py b/src/completion/list_esi.sh old mode 100644 new mode 100755 similarity index 50% rename from src/completion/list_esi.py rename to src/completion/list_esi.sh index fc40f37b69..b8373fa570 --- a/src/completion/list_esi.py +++ b/src/completion/list_esi.sh @@ -1,6 +1,6 @@ -#!/usr/bin/env python3 +#!/bin/bash # -# Copyright (C) 2016-2024 VyOS maintainers and contributors +# Copyright (C) 2024 VyOS maintainers and contributors # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 or later as @@ -8,24 +8,13 @@ # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # -# This script is completion helper to list all configured VNIs that are visible to FRR +# This script is completion helper to list all valid ESEs that are visible to FRR -import json -from vyos.utils.process import cmd - -def get_esi(): - esiDict = json.loads(cmd(f"vtysh -c 'show evpn es json'")) - esiList = [] - for i in esiDict: - esiList.append(i['esi']) - - print(' '.join(esiList)) - -if __name__ == '__main__': - get_esi() +esiJson=$(vtysh -c 'show evpn es json') +echo "$(echo "$esiJson" | jq -r '.[] | .esi')" diff --git a/src/completion/list_vni.py b/src/completion/list_vni.sh old mode 100644 new mode 100755 similarity index 63% rename from src/completion/list_vni.py rename to src/completion/list_vni.sh index ef78eb16fa..f8bd4a993b --- a/src/completion/list_vni.py +++ b/src/completion/list_vni.sh @@ -1,6 +1,6 @@ -#!/usr/bin/env python3 +#!/bin/bash # -# Copyright (C) 2016-2024 VyOS maintainers and contributors +# Copyright (C) 2024 VyOS maintainers and contributors # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 or later as @@ -8,7 +8,7 @@ # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License @@ -16,12 +16,5 @@ # # This script is completion helper to list all configured VNIs that are visible to FRR -import json -from vyos.utils.process import cmd - -def get_vni(): - vniDict = json.loads(cmd(f"vtysh -c 'show evpn vni json'")) - print(' '.join(vniDict.keys())) - -if __name__ == '__main__': - get_vni() +vniJson=$(vtysh -c 'show evpn vni json') +echo "$(echo "$vniJson" | jq -r 'keys | .[]')"