diff options
author | Christian Breunig <christian@breunig.cc> | 2024-03-23 16:47:15 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-23 16:47:15 +0100 |
commit | a72102b89566451bce40beb1ffdb5d2bf0b1dcc2 (patch) | |
tree | 56bc8c3d10036bc92822389ff2349144399cf40b | |
parent | 9cc20ffadc74d4e5e082e9335547f6fe14492b5c (diff) | |
parent | 6c5153fc6adad069b428d7337c0afa88e5f39c55 (diff) | |
download | vyos-1x-a72102b89566451bce40beb1ffdb5d2bf0b1dcc2.tar.gz vyos-1x-a72102b89566451bce40beb1ffdb5d2bf0b1dcc2.zip |
Merge pull request #3174 from vyos/mergify/bp/sagitta/pr-3173
vyos.configverify: T6131: verify_interface_exists() checks CLI interfaces, too (backport #3173)
-rw-r--r-- | python/vyos/configverify.py | 27 |
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): """ |