From e70a304e36fc6456e16fea81ace4a0a5fd8bd1df Mon Sep 17 00:00:00 2001
From: Christian Poessinger <christian@poessinger.com>
Date: Sat, 25 Jul 2020 00:39:14 +0200
Subject: ifconfig: T2653: make ifname an optional argument to
 get_interface_dict()

Further reduce the boiler-plate code to determine interface tag node or not.
It can be passed into get_interface_dict() if explicitly required - else it
is taken from the environment.
---
 python/vyos/configdict.py                   | 11 ++++++++---
 src/conf_mode/interfaces-bonding.py         | 10 ++--------
 src/conf_mode/interfaces-bridge.py          | 11 ++---------
 src/conf_mode/interfaces-dummy.py           |  8 +-------
 src/conf_mode/interfaces-ethernet.py        |  8 +-------
 src/conf_mode/interfaces-geneve.py          |  9 +--------
 src/conf_mode/interfaces-loopback.py        |  8 +-------
 src/conf_mode/interfaces-macsec.py          |  8 +-------
 src/conf_mode/interfaces-pppoe.py           |  8 +-------
 src/conf_mode/interfaces-pseudo-ethernet.py |  8 +-------
 src/conf_mode/interfaces-wireless.py        |  8 +-------
 src/conf_mode/interfaces-wirelessmodem.py   |  9 +--------
 12 files changed, 21 insertions(+), 85 deletions(-)

diff --git a/python/vyos/configdict.py b/python/vyos/configdict.py
index 53b5f9492..126d6195a 100644
--- a/python/vyos/configdict.py
+++ b/python/vyos/configdict.py
@@ -15,8 +15,8 @@
 
 """
 A library for retrieving value dicts from VyOS configs in a declarative fashion.
-
 """
+import os
 import jmespath
 
 from enum import Enum
@@ -24,7 +24,6 @@ from copy import deepcopy
 
 from vyos import ConfigError
 from vyos.validate import is_member
-from vyos.util import ifname_from_config
 
 def retrieve_config(path_hash, base_path, config):
     """
@@ -195,7 +194,7 @@ def get_removed_vlans(conf, dict):
 
     return dict
 
-def get_interface_dict(config, base, ifname):
+def get_interface_dict(config, base, ifname=''):
     """
     Common utility function to retrieve and mandgle the interfaces available
     in CLI configuration. All interfaces have a common base ground where the
@@ -205,6 +204,12 @@ def get_interface_dict(config, base, ifname):
     """
     from vyos.xml import defaults
 
+    if not ifname:
+        # determine tagNode instance
+        if 'VYOS_TAGNODE_VALUE' not in os.environ:
+            raise ConfigError('Interface (VYOS_TAGNODE_VALUE) not specified')
+        ifname = os.environ['VYOS_TAGNODE_VALUE']
+
     # retrieve interface default values
     default_values = defaults(base)
 
diff --git a/src/conf_mode/interfaces-bonding.py b/src/conf_mode/interfaces-bonding.py
index 8e87a0059..3b238f1ea 100755
--- a/src/conf_mode/interfaces-bonding.py
+++ b/src/conf_mode/interfaces-bonding.py
@@ -60,13 +60,7 @@ def get_config():
     """
     conf = Config()
     base = ['interfaces', 'bonding']
-
-    # determine tagNode instance
-    if 'VYOS_TAGNODE_VALUE' not in os.environ:
-        raise ConfigError('Interface (VYOS_TAGNODE_VALUE) not specified')
-
-    ifname = os.environ['VYOS_TAGNODE_VALUE']
-    bond = get_interface_dict(conf, base, ifname)
+    bond = get_interface_dict(conf, base)
 
     # To make our own life easier transfor the list of member interfaces
     # into a dictionary - we will use this to add additional information
@@ -107,7 +101,7 @@ def get_config():
 
             # Check if we are a member of a bond device
             tmp = is_member(conf, interface, 'bonding')
-            if tmp and tmp != ifname:
+            if tmp and tmp != bond['ifname']:
                 interface_config.update({'is_bond_member' : tmp})
 
             # bond members must not have an assigned address
diff --git a/src/conf_mode/interfaces-bridge.py b/src/conf_mode/interfaces-bridge.py
index 9c43d1983..ee8e85e73 100755
--- a/src/conf_mode/interfaces-bridge.py
+++ b/src/conf_mode/interfaces-bridge.py
@@ -41,13 +41,7 @@ def get_config():
     """
     conf = Config()
     base = ['interfaces', 'bridge']
-
-    # determine tagNode instance
-    if 'VYOS_TAGNODE_VALUE' not in os.environ:
-        raise ConfigError('Interface (VYOS_TAGNODE_VALUE) not specified')
-
-    ifname = os.environ['VYOS_TAGNODE_VALUE']
-    bridge = get_interface_dict(conf, base, ifname)
+    bridge = get_interface_dict(conf, base)
 
     # determine which members have been removed
     tmp = node_changed(conf, ['member', 'interface'])
@@ -69,13 +63,12 @@ def get_config():
         # the default dictionary is not properly paged into the dict (see T2665)
         # thus we will ammend it ourself
         default_member_values = defaults(base + ['member', 'interface'])
-
         for interface, interface_config in bridge['member']['interface'].items():
             interface_config.update(default_member_values)
 
             # Check if we are a member of another bridge device
             tmp = is_member(conf, interface, 'bridge')
-            if tmp and tmp != ifname:
+            if tmp and tmp != bridge['ifname']:
                 interface_config.update({'is_bridge_member' : tmp})
 
             # Check if we are a member of a bond device
diff --git a/src/conf_mode/interfaces-dummy.py b/src/conf_mode/interfaces-dummy.py
index 6d2a78e30..8df86c8ea 100755
--- a/src/conf_mode/interfaces-dummy.py
+++ b/src/conf_mode/interfaces-dummy.py
@@ -35,13 +35,7 @@ def get_config():
     """
     conf = Config()
     base = ['interfaces', 'dummy']
-
-    # determine tagNode instance
-    if 'VYOS_TAGNODE_VALUE' not in os.environ:
-        raise ConfigError('Interface (VYOS_TAGNODE_VALUE) not specified')
-
-    ifname = os.environ['VYOS_TAGNODE_VALUE']
-    dummy = get_interface_dict(conf, base, ifname)
+    dummy = get_interface_dict(conf, base)
     return dummy
 
 def verify(dummy):
diff --git a/src/conf_mode/interfaces-ethernet.py b/src/conf_mode/interfaces-ethernet.py
index 24ea0af7c..10758e35a 100755
--- a/src/conf_mode/interfaces-ethernet.py
+++ b/src/conf_mode/interfaces-ethernet.py
@@ -37,13 +37,7 @@ def get_config():
     """
     conf = Config()
     base = ['interfaces', 'ethernet']
-
-    # determine tagNode instance
-    if 'VYOS_TAGNODE_VALUE' not in os.environ:
-        raise ConfigError('Interface (VYOS_TAGNODE_VALUE) not specified')
-
-    ifname = os.environ['VYOS_TAGNODE_VALUE']
-    ethernet = get_interface_dict(conf, base, ifname)
+    ethernet = get_interface_dict(conf, base)
     return ethernet
 
 def verify(ethernet):
diff --git a/src/conf_mode/interfaces-geneve.py b/src/conf_mode/interfaces-geneve.py
index 868ab5ccf..1104bd3c0 100755
--- a/src/conf_mode/interfaces-geneve.py
+++ b/src/conf_mode/interfaces-geneve.py
@@ -37,14 +37,7 @@ def get_config():
     """
     conf = Config()
     base = ['interfaces', 'geneve']
-
-    # determine tagNode instance
-    if 'VYOS_TAGNODE_VALUE' not in os.environ:
-        raise ConfigError('Interface (VYOS_TAGNODE_VALUE) not specified')
-
-    ifname = os.environ['VYOS_TAGNODE_VALUE']
-    geneve = get_interface_dict(conf, base, ifname)
-
+    geneve = get_interface_dict(conf, base)
     return geneve
 
 def verify(geneve):
diff --git a/src/conf_mode/interfaces-loopback.py b/src/conf_mode/interfaces-loopback.py
index 68a1392ff..0398cd591 100755
--- a/src/conf_mode/interfaces-loopback.py
+++ b/src/conf_mode/interfaces-loopback.py
@@ -32,13 +32,7 @@ def get_config():
     """
     conf = Config()
     base = ['interfaces', 'loopback']
-
-    # determine tagNode instance
-    if 'VYOS_TAGNODE_VALUE' not in os.environ:
-        raise ConfigError('Interface (VYOS_TAGNODE_VALUE) not specified')
-
-    ifname = os.environ['VYOS_TAGNODE_VALUE']
-    loopback = get_interface_dict(conf, base, ifname)
+    loopback = get_interface_dict(conf, base)
     return loopback
 
 def verify(loopback):
diff --git a/src/conf_mode/interfaces-macsec.py b/src/conf_mode/interfaces-macsec.py
index 06aee9ea0..ca15212d4 100755
--- a/src/conf_mode/interfaces-macsec.py
+++ b/src/conf_mode/interfaces-macsec.py
@@ -42,13 +42,7 @@ def get_config():
     """
     conf = Config()
     base = ['interfaces', 'macsec']
-
-    # determine tagNode instance
-    if 'VYOS_TAGNODE_VALUE' not in os.environ:
-        raise ConfigError('Interface (VYOS_TAGNODE_VALUE) not specified')
-
-    ifname = os.environ['VYOS_TAGNODE_VALUE']
-    macsec = get_interface_dict(conf, base, ifname)
+    macsec = get_interface_dict(conf, base)
 
     # Check if interface has been removed
     if 'deleted' in macsec:
diff --git a/src/conf_mode/interfaces-pppoe.py b/src/conf_mode/interfaces-pppoe.py
index 6947cc1e2..b9a88a949 100755
--- a/src/conf_mode/interfaces-pppoe.py
+++ b/src/conf_mode/interfaces-pppoe.py
@@ -38,13 +38,7 @@ def get_config():
     """
     conf = Config()
     base = ['interfaces', 'pppoe']
-
-    # determine tagNode instance
-    if 'VYOS_TAGNODE_VALUE' not in os.environ:
-        raise ConfigError('Interface (VYOS_TAGNODE_VALUE) not specified')
-
-    ifname = os.environ['VYOS_TAGNODE_VALUE']
-    pppoe = get_interface_dict(conf, base, ifname)
+    pppoe = get_interface_dict(conf, base)
 
     # PPPoE is "special" the default MTU is 1492 - update accordingly
     # as the config_level is already st in get_interface_dict() - we can use []
diff --git a/src/conf_mode/interfaces-pseudo-ethernet.py b/src/conf_mode/interfaces-pseudo-ethernet.py
index 55f11e65e..4afea2b3a 100755
--- a/src/conf_mode/interfaces-pseudo-ethernet.py
+++ b/src/conf_mode/interfaces-pseudo-ethernet.py
@@ -40,13 +40,7 @@ def get_config():
     """
     conf = Config()
     base = ['interfaces', 'pseudo-ethernet']
-
-    # determine tagNode instance
-    if 'VYOS_TAGNODE_VALUE' not in os.environ:
-        raise ConfigError('Interface (VYOS_TAGNODE_VALUE) not specified')
-
-    ifname = os.environ['VYOS_TAGNODE_VALUE']
-    peth = get_interface_dict(conf, base, ifname)
+    peth = get_interface_dict(conf, base)
 
     mode = leaf_node_changed(conf, ['mode'])
     if mode:
diff --git a/src/conf_mode/interfaces-wireless.py b/src/conf_mode/interfaces-wireless.py
index 42b55ee6a..b6f247952 100755
--- a/src/conf_mode/interfaces-wireless.py
+++ b/src/conf_mode/interfaces-wireless.py
@@ -71,13 +71,7 @@ def get_config():
     """
     conf = Config()
     base = ['interfaces', 'wireless']
-
-    # determine tagNode instance
-    if 'VYOS_TAGNODE_VALUE' not in os.environ:
-        raise ConfigError('Interface (VYOS_TAGNODE_VALUE) not specified')
-
-    ifname = os.environ['VYOS_TAGNODE_VALUE']
-    wifi = get_interface_dict(conf, base, ifname)
+    wifi = get_interface_dict(conf, base)
 
     if 'security' in wifi and 'wpa' in wifi['security']:
         wpa_cipher = wifi['security']['wpa'].get('cipher')
diff --git a/src/conf_mode/interfaces-wirelessmodem.py b/src/conf_mode/interfaces-wirelessmodem.py
index 9a5dae9e0..4081be3c9 100755
--- a/src/conf_mode/interfaces-wirelessmodem.py
+++ b/src/conf_mode/interfaces-wirelessmodem.py
@@ -48,14 +48,7 @@ def get_config():
     """
     conf = Config()
     base = ['interfaces', 'wirelessmodem']
-
-    # determine tagNode instance
-    if 'VYOS_TAGNODE_VALUE' not in os.environ:
-        raise ConfigError('Interface (VYOS_TAGNODE_VALUE) not specified')
-
-    ifname = os.environ['VYOS_TAGNODE_VALUE']
-    wwan = get_interface_dict(conf, base, ifname)
-
+    wwan = get_interface_dict(conf, base)
     return wwan
 
 def verify(wwan):
-- 
cgit v1.2.3