summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Breunig <christian@breunig.cc>2024-03-23 09:45:25 +0100
committerMergify <37929162+mergify[bot]@users.noreply.github.com>2024-03-23 14:38:28 +0000
commit6c5153fc6adad069b428d7337c0afa88e5f39c55 (patch)
tree56bc8c3d10036bc92822389ff2349144399cf40b
parent9cc20ffadc74d4e5e082e9335547f6fe14492b5c (diff)
downloadvyos-1x-6c5153fc6adad069b428d7337c0afa88e5f39c55.tar.gz
vyos-1x-6c5153fc6adad069b428d7337c0afa88e5f39c55.zip
vyos.configverify: T6131: verify_interface_exists() checks CLI interfaces, too
Extend the way how we determine if interfaces exist in VyOS. In the past we only validated if the interface in question really exists at the OS level. This has some drawbacks as services (like OSPF or OSPFv3) can also handle interfaces dynamically which appear or leaf the OS. This commit not only checks for OS interfaces but also if the interface in question was configured at the CLI level, this is proof enough to pass the check. If it does not exist at the CLI level, we continue searching it it's maybe a Kernel interface - useful for container networks. In addition we can now not only raise() an error but simply show a warning if an interface does not exist. (cherry picked from commit f7250ecf1d119f14d72f99ee379deaaae0790f0e)
-rw-r--r--python/vyos/configverify.py27
1 files changed, 23 insertions, 4 deletions
diff --git a/python/vyos/configverify.py b/python/vyos/configverify.py
index 5d3723876..6508ccdd9 100644
--- a/python/vyos/configverify.py
+++ b/python/vyos/configverify.py
@@ -269,14 +269,33 @@ def verify_bridge_delete(config):
raise ConfigError(f'Interface "{interface}" cannot be deleted as it '
f'is a member of bridge "{bridge_name}"!')
-def verify_interface_exists(ifname):
+def verify_interface_exists(ifname, warning_only=False):
"""
Common helper function used by interface implementations to perform
- recurring validation if an interface actually exists.
+ recurring validation if an interface actually exists. We first probe
+ if the interface is defined on the CLI, if it's not found we try if
+ it exists at the OS level.
"""
import os
- if not os.path.exists(f'/sys/class/net/{ifname}'):
- raise ConfigError(f'Interface "{ifname}" does not exist!')
+ from vyos.base import Warning
+ from vyos.configquery import ConfigTreeQuery
+ from vyos.utils.dict import dict_search_recursive
+
+ # Check if interface is present in CLI config
+ config = ConfigTreeQuery()
+ tmp = config.get_config_dict(['interfaces'], get_first_key=True)
+ if bool(list(dict_search_recursive(tmp, ifname))):
+ return True
+
+ # Interface not found on CLI, try Linux Kernel
+ if os.path.exists(f'/sys/class/net/{ifname}'):
+ return True
+
+ message = f'Interface "{ifname}" does not exist!'
+ if warning_only:
+ Warning(message)
+ return False
+ raise ConfigError(message)
def verify_source_interface(config):
"""