summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/vyos/configverify.py27
-rw-r--r--python/vyos/frr.py16
2 files changed, 34 insertions, 9 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):
"""
diff --git a/python/vyos/frr.py b/python/vyos/frr.py
index a01d967e4..c3703cbb4 100644
--- a/python/vyos/frr.py
+++ b/python/vyos/frr.py
@@ -68,6 +68,7 @@ Apply the new configuration:
import tempfile
import re
+from vyos import ConfigError
from vyos.utils.permission import chown
from vyos.utils.process import cmd
from vyos.utils.process import popen
@@ -95,6 +96,7 @@ path_config = '/run/frr'
default_add_before = r'(ip prefix-list .*|route-map .*|line vty|end)'
+
class FrrError(Exception):
pass
@@ -210,13 +212,12 @@ def reload_configuration(config, daemon=None):
LOG.debug(f'reload_configuration: Executing command against frr-reload: "{cmd}"')
output, code = popen(cmd, stderr=STDOUT)
f.close()
+
for i, e in enumerate(output.split('\n')):
LOG.debug(f'frr-reload output: {i:3} {e}')
+
if code == 1:
- raise CommitError('FRR configuration failed while running commit. Please ' \
- 'enable debugging to examine logs.\n\n\n' \
- 'To enable debugging run: "touch /tmp/vyos.frr.debug" ' \
- 'and "sudo systemctl stop vyos-configd"')
+ raise ConfigError(output)
elif code:
raise OSError(code, output)
@@ -469,17 +470,22 @@ class FRRConfig:
# https://github.com/FRRouting/frr/issues/10133
count = 0
count_max = 5
+ emsg = ''
while count < count_max:
count += 1
try:
reload_configuration('\n'.join(self.config), daemon=daemon)
break
+ except ConfigError as e:
+ emsg = str(e)
except:
# we just need to re-try the commit of the configuration
# for the listed FRR issues above
pass
if count >= count_max:
- raise ConfigurationNotValid(f'Config commit retry counter ({count_max}) exceeded for {daemon} dameon!')
+ if emsg:
+ raise ConfigError(emsg)
+ raise ConfigurationNotValid(f'Config commit retry counter ({count_max}) exceeded for {daemon} daemon!')
# Save configuration to /run/frr/config/frr.conf
save_configuration()