From c6be441c86bc8fe2e938e2bd3c85f99071cbfb49 Mon Sep 17 00:00:00 2001
From: l0crian1 <ryan.claridge13@gmail.com>
Date: Wed, 15 May 2024 14:54:18 -0400
Subject: T6335: Add/Update EVPN op commands

Added the following commands:
show evpn
show evpn es
show evpn es <es-id>
show evpn es detail
show evpn es-evi
show evpn es-evi detail
show evpn es-evi vni <num>
show evpn vni
show evpn vni detail
show evpn vni <num>

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 +
 op-mode-definitions/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 a4ed2bcf4..911869d09 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 0fedb9371..18f74653b 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 @@
   <properties>
     <help>VXLAN network identifier (VNI) number</help>
     <completionHelp>
-      <list>1-16777215 all</list>
+      <list>&lt;1-16777215&gt; all</list>
+      <script>${vyos_completion_dir}/list_vni.py</script>
     </completionHelp>
   </properties>
-  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+  <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
 </tagNode>
 <!-- included end -->
diff --git a/op-mode-definitions/include/vni-tagnode.xml.i b/op-mode-definitions/include/vni-tagnode.xml.i
index 22f2d33bd..363da8d5e 100644
--- a/op-mode-definitions/include/vni-tagnode.xml.i
+++ b/op-mode-definitions/include/vni-tagnode.xml.i
@@ -3,9 +3,10 @@
   <properties>
     <help>VXLAN network identifier (VNI) number</help>
     <completionHelp>
-      <list>1-16777215</list>
+      <list>&lt;1-16777215&gt;</list>
+      <script>${vyos_completion_dir}/list_vni.py</script>
     </completionHelp>
   </properties>
-  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+  <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
 </tagNode>
 <!-- included end -->
diff --git a/op-mode-definitions/show-evpn.xml.in b/op-mode-definitions/show-evpn.xml.in
index a005cbc30..ba3b104cd 100644
--- a/op-mode-definitions/show-evpn.xml.in
+++ b/op-mode-definitions/show-evpn.xml.in
@@ -14,7 +14,7 @@
             <children>
               #include <include/frr-detail.xml.i>
             </children>
-            <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+            <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
           </node>
           <tagNode name="access-vlan">
             <properties>
@@ -31,7 +31,7 @@
                     <list>&lt;1-4094&gt;</list>
                   </completionHelp>
                 </properties>
-                <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>
+                <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
               </node>
             </children>
           </tagNode>
@@ -43,6 +43,45 @@
               #include <include/vni-tagnode-all.xml.i>
             </children>
           </node>
+          <tagNode name="es">
+            <properties>
+              <help>Show ESI information for specified ESI</help>
+              <completionHelp>
+                <list>&lt;esi&gt;</list>
+                <script>${vyos_completion_dir}/list_esi.py</script>
+              </completionHelp>
+            </properties>
+            <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
+          </tagNode>
+          <node name="es">
+            <properties>
+              <help>Show ESI information</help>
+            </properties>
+            <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
+            <children>
+              <leafNode name="detail">
+                <properties>
+                  <help>Show ESI details</help>
+                </properties>
+                <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
+              </leafNode>
+            </children>
+          </node>
+          <node name="es-evi">
+            <properties>
+              <help>Show ESI information per EVI</help>
+            </properties>
+            <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
+            <children>
+              <leafNode name="detail">
+                <properties>
+                  <help>Show ESI per EVI details</help>
+                </properties>
+                <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
+              </leafNode>
+              #include <include/vni-tagnode.xml.i>
+            </children>
+          </node>
           <node name="mac">
             <properties>
               <help>MAC addresses</help>
@@ -67,7 +106,23 @@
               #include <include/vni-tagnode-all.xml.i>
             </children>
           </node>
+          #include <include/vni-tagnode.xml.i>
+          <node name="vni">
+            <properties>
+              <help>Show VNI information</help>
+            </properties>
+            <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
+            <children>
+              <leafNode name="detail">
+                <properties>
+                  <help>Show VNI details</help>
+                </properties>
+                <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
+              </leafNode>
+            </children>
+          </node>
         </children>
+        <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
       </node>
     </children>
   </node>
diff --git a/src/completion/list_esi.py b/src/completion/list_esi.py
new file mode 100644
index 000000000..fc40f37b6
--- /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 <http://www.gnu.org/licenses/>.
+#
+# 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 000000000..ef78eb16f
--- /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 <http://www.gnu.org/licenses/>.
+#
+# 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 000000000..cae4ab9f5
--- /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 <http://www.gnu.org/licenses/>.
+#
+# 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)
-- 
cgit v1.2.3


From 3917e3e9f985063ab7419c903f6019116224f640 Mon Sep 17 00:00:00 2001
From: l0crian1 <ryan.claridge13@gmail.com>
Date: Thu, 16 May 2024 08:07:02 -0400
Subject: 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 <es-id>
show evpn es detail
show evpn es-evi
show evpn es-evi detail
show evpn es-evi vni <num>
show evpn vni
show evpn vni detail
show evpn vni <num>

Updated the following commands:
show evpn access-vlan
show evpn arp-cache
show evpn mac
show evpn next-hops
show evpn rmac
---
 op-mode-definitions/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                        | 31 -----------------------
 src/completion/list_esi.sh                        | 20 +++++++++++++++
 src/completion/list_vni.py                        | 27 --------------------
 src/completion/list_vni.sh                        | 20 +++++++++++++++
 7 files changed, 43 insertions(+), 61 deletions(-)
 delete mode 100644 src/completion/list_esi.py
 create mode 100755 src/completion/list_esi.sh
 delete mode 100644 src/completion/list_vni.py
 create mode 100755 src/completion/list_vni.sh

diff --git a/op-mode-definitions/include/vni-tagnode-all.xml.i b/op-mode-definitions/include/vni-tagnode-all.xml.i
index 18f74653b..fabab19d7 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 @@
     <help>VXLAN network identifier (VNI) number</help>
     <completionHelp>
       <list>&lt;1-16777215&gt; all</list>
-      <script>${vyos_completion_dir}/list_vni.py</script>
+      <script>${vyos_completion_dir}/list_vni.sh</script>
     </completionHelp>
   </properties>
   <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
diff --git a/op-mode-definitions/include/vni-tagnode.xml.i b/op-mode-definitions/include/vni-tagnode.xml.i
index 363da8d5e..f5b99dcc8 100644
--- a/op-mode-definitions/include/vni-tagnode.xml.i
+++ b/op-mode-definitions/include/vni-tagnode.xml.i
@@ -4,7 +4,7 @@
     <help>VXLAN network identifier (VNI) number</help>
     <completionHelp>
       <list>&lt;1-16777215&gt;</list>
-      <script>${vyos_completion_dir}/list_vni.py</script>
+      <script>${vyos_completion_dir}/list_vni.sh</script>
     </completionHelp>
   </properties>
   <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
diff --git a/op-mode-definitions/show-evpn.xml.in b/op-mode-definitions/show-evpn.xml.in
index ba3b104cd..3c1e5c7d6 100644
--- a/op-mode-definitions/show-evpn.xml.in
+++ b/op-mode-definitions/show-evpn.xml.in
@@ -48,7 +48,7 @@
               <help>Show ESI information for specified ESI</help>
               <completionHelp>
                 <list>&lt;esi&gt;</list>
-                <script>${vyos_completion_dir}/list_esi.py</script>
+                <script>${vyos_completion_dir}/list_esi.sh</script>
               </completionHelp>
             </properties>
             <command>${vyos_op_scripts_dir}/evpn.py show_evpn --command "$*"</command>
diff --git a/src/completion/list_esi.py b/src/completion/list_esi.py
deleted file mode 100644
index fc40f37b6..000000000
--- a/src/completion/list_esi.py
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/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 <http://www.gnu.org/licenses/>.
-#
-# 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_esi.sh b/src/completion/list_esi.sh
new file mode 100755
index 000000000..b8373fa57
--- /dev/null
+++ b/src/completion/list_esi.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# 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
+# 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 <http://www.gnu.org/licenses/>.
+#
+# This script is completion helper to list all valid ESEs that are visible to FRR
+
+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.py
deleted file mode 100644
index ef78eb16f..000000000
--- a/src/completion/list_vni.py
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/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 <http://www.gnu.org/licenses/>.
-#
-# 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/completion/list_vni.sh b/src/completion/list_vni.sh
new file mode 100755
index 000000000..f8bd4a993
--- /dev/null
+++ b/src/completion/list_vni.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# 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
+# 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 <http://www.gnu.org/licenses/>.
+#
+# This script is completion helper to list all configured VNIs that are visible to FRR
+
+vniJson=$(vtysh -c 'show evpn vni json')
+echo "$(echo "$vniJson" | jq -r 'keys | .[]')"
-- 
cgit v1.2.3