summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/vyos/configmanager.py18
-rw-r--r--python/vyos/dependentverify.py53
2 files changed, 68 insertions, 3 deletions
diff --git a/python/vyos/configmanager.py b/python/vyos/configmanager.py
index 895d43ba7..69d40e5ef 100644
--- a/python/vyos/configmanager.py
+++ b/python/vyos/configmanager.py
@@ -29,6 +29,7 @@ from vyos.configtree import DiffTree
from vyos.referencetree import ReferenceTree
from vyos.dependentverify import removed_dependency_value_paths_of_kind
from vyos.dependentverify import dependent_value_paths_of_kind
+from vyos.dependentverify import concatenate_vif
from vyos.utils.system import load_as_module
from vyos.defaults import directories
@@ -163,6 +164,10 @@ class ConfigManager:
'interface', self.reference_tree, self.session_config, self.diff_tree
)
+ removed_dependency_value_paths, orig_value = concatenate_vif(
+ self.reference_tree, removed_dependency_value_paths
+ )
+
LOG.debug(f'removed_dependency_value_paths: {removed_dependency_value_paths}')
if not removed_dependency_value_paths:
@@ -178,7 +183,8 @@ class ConfigManager:
return
for vals, path in removed_dependency_value_paths:
- owner = self.reference_tree.get_owner(path)
+ rpath = self.reference_tree.reference_path_from_config_path(path)
+ owner = self.reference_tree.get_owner(rpath)
if owner is None:
LOG.error(f'Path {path} has no owner')
continue
@@ -190,16 +196,22 @@ class ConfigManager:
rdep_err = component.rdep_error
for dependent_vals, dependent_path in errors:
for v in set(vals) & set(dependent_vals):
+ ov = orig_value.get(v, v)
+ path_str = ' '.join(path + [ov])
+ dpath_str = ' '.join(dependent_path)
rdep_err.append(
- f'\nNode:\n {path + [v]}\nis required by:\n {dependent_path}\n'
+ f'\nNode:\n "{path_str}"\nis required by:\n "{dpath_str}"\n'
)
warnings = dependent_value_paths.get('warning', [])
rdep_warn = component.rdep_warning
for dependent_vals, dependent_path in warnings:
for v in set(vals) & set(dependent_vals):
+ ov = orig_value.get(v, v)
+ path_str = ' '.join(path + [ov])
+ dpath_str = ' '.join(dependent_path)
rdep_warn.append(
- f'removed node:\n {path + [v]}\nis referenced by:\n {dependent_path}\n'
+ f'removed node:\n "{path_str}"\nis referenced by:\n "{dpath_str}"\n'
)
def clear_rdep(self):
diff --git a/python/vyos/dependentverify.py b/python/vyos/dependentverify.py
index 157f99ae3..1e22b65a0 100644
--- a/python/vyos/dependentverify.py
+++ b/python/vyos/dependentverify.py
@@ -18,6 +18,7 @@ from vyos.configtree import ConfigTree # noqa: I001
from vyos.configtree import DiffTree
from vyos.configtree import subtree_values_of_path
from vyos.referencetree import ReferenceTree
+from vyos.base import Warning as Warn
def removed_dependency_value_paths_of_kind(
@@ -60,3 +61,55 @@ def dependent_value_paths_of_kind(
lst.extend(path_vals)
return dependent_value_paths
+
+
+vif_refpath = [
+ ['interfaces', 'ethernet', 'vif'],
+ ['interfaces', 'ethernet', 'vif-s'],
+ ['interfaces', 'ethernet', 'vif-s', 'vif-c'],
+ ['interfaces', 'bonding', 'vif'],
+ ['interfaces', 'bonding', 'vif-s'],
+ ['interfaces', 'bonding', 'vif-s', 'vif-c'],
+ ['interfaces', 'bridge', 'vif'],
+ ['interfaces', 'pseudo-ethernet', 'vif'],
+ ['interfaces', 'pseudo-ethernet', 'vif-s'],
+ ['interfaces', 'pseudo-ethernet', 'vif-s', 'vif-c'],
+ ['interfaces', 'virtual-ethernet', 'vif'],
+ ['interfaces', 'virtual-ethernet', 'vif-s'],
+ ['interfaces', 'virtual-ethernet', 'vif-s', 'vif-c'],
+ ['interfaces', 'wireless', 'vif'],
+ ['interfaces', 'wireless', 'vif-s'],
+ ['interfaces', 'wireless', 'vif-s', 'vif-c'],
+]
+
+
+def check_vif_path(reference_tree: ReferenceTree):
+ for p in vif_refpath:
+ if not reference_tree.exists(p):
+ Warn(f'Out of date reference path: {p}')
+
+
+def concatenate_vif(reference_tree: ReferenceTree, value_paths):
+ check_vif_path(reference_tree)
+ revised = []
+ orig_value = {}
+ for vp in value_paths:
+ refpath = reference_tree.reference_path_from_config_path(vp[1])
+ if refpath not in vif_refpath:
+ revised.append(vp)
+ else:
+ p = vp[1]
+ match p[-1]:
+ case 'vif':
+ rev_vals = [p[2] + '.' + v for v in vp[0]]
+ orig_value |= dict(zip(rev_vals, vp[0]))
+ revised.append((rev_vals, vp[1]))
+ case 'vif-s':
+ rev_vals = [p[2] + '.' + v for v in vp[0]]
+ orig_value |= dict(zip(rev_vals, vp[0]))
+ revised.append((rev_vals, vp[1]))
+ case 'vif-c':
+ rev_vals = [p[2] + '.' + p[4] + '.' + v for v in vp[0]]
+ orig_value |= dict(zip(rev_vals, vp[0]))
+ revised.append((rev_vals, vp[1]))
+ return revised, orig_value