summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorChristian Breunig <christian@breunig.cc>2024-03-23 15:37:51 +0100
committerGitHub <noreply@github.com>2024-03-23 15:37:51 +0100
commit43b206c0fdf03fe236bf7715e2e45992284885f1 (patch)
tree7d34bc04873662722e0d9d43451477b627e1f690 /python
parentdb08b6bd2300b125541e7eaa35e98ae5a2225111 (diff)
parentf7250ecf1d119f14d72f99ee379deaaae0790f0e (diff)
downloadvyos-1x-43b206c0fdf03fe236bf7715e2e45992284885f1.tar.gz
vyos-1x-43b206c0fdf03fe236bf7715e2e45992284885f1.zip
Merge pull request #3173 from c-po/configverify-T6131
vyos.configverify: T6131: verify_interface_exists() checks CLI interfaces, too
Diffstat (limited to 'python')
-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):
"""