diff options
| author | John Estabrook <jestabro@vyos.io> | 2026-10-06 11:50:21 -0500 |
|---|---|---|
| committer | John Estabrook <jestabro@vyos.io> | 2026-10-08 07:41:04 -0500 |
| commit | 0b43a668ac1fdbc5149616f5065279bbce9a02c8 (patch) | |
| tree | 66b44b21a1dfc938f0f35658d3acd419192e2f74 /python | |
| parent | 82c134c09cfc48c54389d25fbd4fc788ed881f30 (diff) | |
| download | vyos-1x-0b43a668ac1fdbc5149616f5065279bbce9a02c8.tar.gz vyos-1x-0b43a668ac1fdbc5149616f5065279bbce9a02c8.zip | |
T7886: add concatenation of vif entries
Diffstat (limited to 'python')
| -rw-r--r-- | python/vyos/configmanager.py | 18 | ||||
| -rw-r--r-- | python/vyos/dependentverify.py | 53 |
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 |
