From df7c3fc0017fb27d2945ac2818ac2d5fc343ca37 Mon Sep 17 00:00:00 2001 From: John Estabrook Date: Tue, 15 Sep 2026 13:51:30 -0500 Subject: T7886: add basic cases of reverse interface dependency verification Add cases for which a config mode script calls verify_interface_exists, excluding those of dynamic_interface_pattern, to be handled separately. The dependency verification raises error, resp., gives a warning, when verify_interface_exists is called with warning_only=False, resp., True. These are the critical cases that motivated the original design, for if a removal of an interface is allowed, a subsequent reboot will raise ConfigError on config load and invalidate the config subtree for that component. --- interface-definitions/firewall.xml.in | 2 +- .../constraint/dependent-error-interface-name.xml.i | 7 +++++++ .../constraint/dependent-warning-interface-name.xml.i | 7 +++++++ .../dependent-error-generic-interface-multi.xml.i | 19 +++++++++++++++++++ .../include/dependent-error-generic-interface.xml.i | 18 ++++++++++++++++++ .../include/dependent-error-source-interface.xml.i | 18 ++++++++++++++++++ ...nt-warning-generic-interface-multi-broadcast.xml.i | 19 +++++++++++++++++++ .../dependent-warning-generic-interface-multi.xml.i | 19 +++++++++++++++++++ .../include/dependent-warning-source-interface.xml.i | 18 ++++++++++++++++++ .../interface/dependent-error-inbound-interface.xml.i | 11 +++++++++++ .../include/isis/protocol-common-config.xml.i | 1 + .../include/ospf/protocol-common-config.xml.i | 4 +--- .../include/ospfv3/protocol-common-config.xml.i | 4 +--- interface-definitions/interfaces_bonding.xml.in | 1 + interface-definitions/interfaces_bridge.xml.in | 1 + interface-definitions/interfaces_dummy.xml.in | 1 + interface-definitions/interfaces_ethernet.xml.in | 1 + interface-definitions/interfaces_geneve.xml.in | 1 + interface-definitions/interfaces_input.xml.in | 1 + interface-definitions/interfaces_l2tpv3.xml.in | 1 + interface-definitions/interfaces_macsec.xml.in | 1 + interface-definitions/interfaces_openvpn.xml.in | 1 + interface-definitions/interfaces_pppoe.xml.in | 1 + .../interfaces_pseudo-ethernet.xml.in | 1 + interface-definitions/interfaces_sstpc.xml.in | 1 + interface-definitions/interfaces_tunnel.xml.in | 1 + .../interfaces_virtual-ethernet.xml.in | 1 + interface-definitions/interfaces_vti.xml.in | 1 + interface-definitions/interfaces_vxlan.xml.in | 1 + interface-definitions/interfaces_wireguard.xml.in | 1 + interface-definitions/interfaces_wireless.xml.in | 1 + interface-definitions/interfaces_wwan.xml.in | 1 + interface-definitions/policy_local-route.xml.in | 4 ++-- interface-definitions/protocols_igmp-proxy.xml.in | 1 + interface-definitions/protocols_mpls.xml.in | 2 +- interface-definitions/protocols_pim.xml.in | 4 +--- interface-definitions/protocols_pim6.xml.in | 4 +--- interface-definitions/qos.xml.in | 4 +--- interface-definitions/service_conntrack-sync.xml.in | 1 + interface-definitions/service_dhcp-relay.xml.in | 10 +++------- interface-definitions/service_ipoe-server.xml.in | 1 + interface-definitions/service_mdns_repeater.xml.in | 2 +- interface-definitions/service_ndp-proxy.xml.in | 4 +--- interface-definitions/service_ntp.xml.in | 5 +++-- interface-definitions/service_pppoe-server.xml.in | 1 + interface-definitions/system_flow-accounting.xml.in | 4 ++-- interface-definitions/system_option.xml.in | 2 +- 47 files changed, 180 insertions(+), 35 deletions(-) create mode 100644 interface-definitions/include/constraint/dependent-error-interface-name.xml.i create mode 100644 interface-definitions/include/constraint/dependent-warning-interface-name.xml.i create mode 100644 interface-definitions/include/dependent-error-generic-interface-multi.xml.i create mode 100644 interface-definitions/include/dependent-error-generic-interface.xml.i create mode 100644 interface-definitions/include/dependent-error-source-interface.xml.i create mode 100644 interface-definitions/include/dependent-warning-generic-interface-multi-broadcast.xml.i create mode 100644 interface-definitions/include/dependent-warning-generic-interface-multi.xml.i create mode 100644 interface-definitions/include/dependent-warning-source-interface.xml.i create mode 100644 interface-definitions/include/interface/dependent-error-inbound-interface.xml.i (limited to 'interface-definitions') diff --git a/interface-definitions/firewall.xml.in b/interface-definitions/firewall.xml.in index 53be2edfa..0ebe6cf69 100644 --- a/interface-definitions/firewall.xml.in +++ b/interface-definitions/firewall.xml.in @@ -16,7 +16,7 @@ #include - #include + #include Offloading method diff --git a/interface-definitions/include/constraint/dependent-error-interface-name.xml.i b/interface-definitions/include/constraint/dependent-error-interface-name.xml.i new file mode 100644 index 000000000..ec4d524f4 --- /dev/null +++ b/interface-definitions/include/constraint/dependent-error-interface-name.xml.i @@ -0,0 +1,7 @@ + + + (bond|br|dum|en|ersp|eth|gnv|ifb|ipoe|lan|l2tp|l2tpeth|macsec|peth|ppp|pppoe|pptp|sstp|sstpc|tun|veth|vpptap|vpptun|vti|vtun|vxlan|wg|wlan|wwan)[0-9]+(.\d+)?|pod-[-_a-zA-Z0-9]{1,11}|lo + + + + diff --git a/interface-definitions/include/constraint/dependent-warning-interface-name.xml.i b/interface-definitions/include/constraint/dependent-warning-interface-name.xml.i new file mode 100644 index 000000000..bc646c3c9 --- /dev/null +++ b/interface-definitions/include/constraint/dependent-warning-interface-name.xml.i @@ -0,0 +1,7 @@ + + + (bond|br|dum|en|ersp|eth|gnv|ifb|ipoe|lan|l2tp|l2tpeth|macsec|peth|ppp|pppoe|pptp|sstp|sstpc|tun|veth|vpptap|vpptun|vti|vtun|vxlan|wg|wlan|wwan)[0-9]+(.\d+)?|pod-[-_a-zA-Z0-9]{1,11}|lo + + + + diff --git a/interface-definitions/include/dependent-error-generic-interface-multi.xml.i b/interface-definitions/include/dependent-error-generic-interface-multi.xml.i new file mode 100644 index 000000000..c5dd26267 --- /dev/null +++ b/interface-definitions/include/dependent-error-generic-interface-multi.xml.i @@ -0,0 +1,19 @@ + + + + Interface + + + + + txt + Interface name + + + #include + + + + + + diff --git a/interface-definitions/include/dependent-error-generic-interface.xml.i b/interface-definitions/include/dependent-error-generic-interface.xml.i new file mode 100644 index 000000000..c48e728c8 --- /dev/null +++ b/interface-definitions/include/dependent-error-generic-interface.xml.i @@ -0,0 +1,18 @@ + + + + Interface + + + + + txt + Interface name + + + #include + + + + + diff --git a/interface-definitions/include/dependent-error-source-interface.xml.i b/interface-definitions/include/dependent-error-source-interface.xml.i new file mode 100644 index 000000000..b3c23f64e --- /dev/null +++ b/interface-definitions/include/dependent-error-source-interface.xml.i @@ -0,0 +1,18 @@ + + + + Interface used to establish connection + + interface + Interface name + + + + + + #include + + + + + diff --git a/interface-definitions/include/dependent-warning-generic-interface-multi-broadcast.xml.i b/interface-definitions/include/dependent-warning-generic-interface-multi-broadcast.xml.i new file mode 100644 index 000000000..22f6b6552 --- /dev/null +++ b/interface-definitions/include/dependent-warning-generic-interface-multi-broadcast.xml.i @@ -0,0 +1,19 @@ + + + + Interface + + + + + txt + Interface name + + + #include + + + + + + diff --git a/interface-definitions/include/dependent-warning-generic-interface-multi.xml.i b/interface-definitions/include/dependent-warning-generic-interface-multi.xml.i new file mode 100644 index 000000000..bd4b9ea93 --- /dev/null +++ b/interface-definitions/include/dependent-warning-generic-interface-multi.xml.i @@ -0,0 +1,19 @@ + + + + Interface + + + + + txt + Interface name + + + #include + + + + + + diff --git a/interface-definitions/include/dependent-warning-source-interface.xml.i b/interface-definitions/include/dependent-warning-source-interface.xml.i new file mode 100644 index 000000000..164135f2f --- /dev/null +++ b/interface-definitions/include/dependent-warning-source-interface.xml.i @@ -0,0 +1,18 @@ + + + + Interface used to establish connection + + interface + Interface name + + + + + + #include + + + + + diff --git a/interface-definitions/include/interface/dependent-error-inbound-interface.xml.i b/interface-definitions/include/interface/dependent-error-inbound-interface.xml.i new file mode 100644 index 000000000..e1c79feb0 --- /dev/null +++ b/interface-definitions/include/interface/dependent-error-inbound-interface.xml.i @@ -0,0 +1,11 @@ + + + + Inbound Interface + + + + + + + diff --git a/interface-definitions/include/isis/protocol-common-config.xml.i b/interface-definitions/include/isis/protocol-common-config.xml.i index 6a7388c99..d0424ea4f 100644 --- a/interface-definitions/include/isis/protocol-common-config.xml.i +++ b/interface-definitions/include/isis/protocol-common-config.xml.i @@ -719,6 +719,7 @@ + #include diff --git a/interface-definitions/include/ospf/protocol-common-config.xml.i b/interface-definitions/include/ospf/protocol-common-config.xml.i index 93d718ed4..caef8abb4 100644 --- a/interface-definitions/include/ospf/protocol-common-config.xml.i +++ b/interface-definitions/include/ospf/protocol-common-config.xml.i @@ -406,9 +406,7 @@ txt Interface name - - #include - + #include diff --git a/interface-definitions/include/ospfv3/protocol-common-config.xml.i b/interface-definitions/include/ospfv3/protocol-common-config.xml.i index 72fb86d3d..e6d3b23b8 100644 --- a/interface-definitions/include/ospfv3/protocol-common-config.xml.i +++ b/interface-definitions/include/ospfv3/protocol-common-config.xml.i @@ -132,9 +132,7 @@ txt Interface used for routing information exchange - - #include - + #include diff --git a/interface-definitions/interfaces_bonding.xml.in b/interface-definitions/interfaces_bonding.xml.in index 9945fc15d..6eca96fb1 100644 --- a/interface-definitions/interfaces_bonding.xml.in +++ b/interface-definitions/interfaces_bonding.xml.in @@ -14,6 +14,7 @@ bondN Bonding interface name + interface #include diff --git a/interface-definitions/interfaces_bridge.xml.in b/interface-definitions/interfaces_bridge.xml.in index d4ee2a652..b2b08659a 100644 --- a/interface-definitions/interfaces_bridge.xml.in +++ b/interface-definitions/interfaces_bridge.xml.in @@ -14,6 +14,7 @@ brN Bridge interface name + interface #include diff --git a/interface-definitions/interfaces_dummy.xml.in b/interface-definitions/interfaces_dummy.xml.in index 993380ab8..9f4856845 100644 --- a/interface-definitions/interfaces_dummy.xml.in +++ b/interface-definitions/interfaces_dummy.xml.in @@ -14,6 +14,7 @@ dumN Dummy interface name + interface #include diff --git a/interface-definitions/interfaces_ethernet.xml.in b/interface-definitions/interfaces_ethernet.xml.in index e110bd48f..466c0c8e4 100644 --- a/interface-definitions/interfaces_ethernet.xml.in +++ b/interface-definitions/interfaces_ethernet.xml.in @@ -17,6 +17,7 @@ ((eth|lan)[0-9]+|(eno|ens|enp|enx).+) Invalid Ethernet interface name + interface #include diff --git a/interface-definitions/interfaces_geneve.xml.in b/interface-definitions/interfaces_geneve.xml.in index b85bd3b9e..385d15250 100644 --- a/interface-definitions/interfaces_geneve.xml.in +++ b/interface-definitions/interfaces_geneve.xml.in @@ -14,6 +14,7 @@ gnvN GENEVE interface name + interface #include diff --git a/interface-definitions/interfaces_input.xml.in b/interface-definitions/interfaces_input.xml.in index 771c47e42..8ca45053a 100644 --- a/interface-definitions/interfaces_input.xml.in +++ b/interface-definitions/interfaces_input.xml.in @@ -15,6 +15,7 @@ ifbN Input interface name + interface #include diff --git a/interface-definitions/interfaces_l2tpv3.xml.in b/interface-definitions/interfaces_l2tpv3.xml.in index 381e86bd0..3f6d77ad8 100644 --- a/interface-definitions/interfaces_l2tpv3.xml.in +++ b/interface-definitions/interfaces_l2tpv3.xml.in @@ -14,6 +14,7 @@ l2tpethN L2TPv3 interface name + interface #include diff --git a/interface-definitions/interfaces_macsec.xml.in b/interface-definitions/interfaces_macsec.xml.in index 5279a9495..3ece4d777 100644 --- a/interface-definitions/interfaces_macsec.xml.in +++ b/interface-definitions/interfaces_macsec.xml.in @@ -14,6 +14,7 @@ macsecN MACsec interface name + interface #include diff --git a/interface-definitions/interfaces_openvpn.xml.in b/interface-definitions/interfaces_openvpn.xml.in index ff16a5610..f0bf1db9c 100644 --- a/interface-definitions/interfaces_openvpn.xml.in +++ b/interface-definitions/interfaces_openvpn.xml.in @@ -14,6 +14,7 @@ vtunN OpenVPN interface name + interface #include diff --git a/interface-definitions/interfaces_pppoe.xml.in b/interface-definitions/interfaces_pppoe.xml.in index d38074b41..37067aefc 100644 --- a/interface-definitions/interfaces_pppoe.xml.in +++ b/interface-definitions/interfaces_pppoe.xml.in @@ -14,6 +14,7 @@ pppoeN PPPoE dialer interface name + interface diff --git a/interface-definitions/interfaces_pseudo-ethernet.xml.in b/interface-definitions/interfaces_pseudo-ethernet.xml.in index 5687e3556..72e0fcf80 100644 --- a/interface-definitions/interfaces_pseudo-ethernet.xml.in +++ b/interface-definitions/interfaces_pseudo-ethernet.xml.in @@ -14,6 +14,7 @@ pethN Pseudo Ethernet interface name + interface #include diff --git a/interface-definitions/interfaces_sstpc.xml.in b/interface-definitions/interfaces_sstpc.xml.in index b7c49446f..418901a66 100644 --- a/interface-definitions/interfaces_sstpc.xml.in +++ b/interface-definitions/interfaces_sstpc.xml.in @@ -14,6 +14,7 @@ sstpcN Secure Socket Tunneling Protocol interface name + interface #include diff --git a/interface-definitions/interfaces_tunnel.xml.in b/interface-definitions/interfaces_tunnel.xml.in index 74849be5d..eb97e2b4c 100644 --- a/interface-definitions/interfaces_tunnel.xml.in +++ b/interface-definitions/interfaces_tunnel.xml.in @@ -14,6 +14,7 @@ tunN Tunnel interface name + interface #include diff --git a/interface-definitions/interfaces_virtual-ethernet.xml.in b/interface-definitions/interfaces_virtual-ethernet.xml.in index 1559a6038..37631e312 100644 --- a/interface-definitions/interfaces_virtual-ethernet.xml.in +++ b/interface-definitions/interfaces_virtual-ethernet.xml.in @@ -14,6 +14,7 @@ vethN Virtual Ethernet interface name + interface #include diff --git a/interface-definitions/interfaces_vti.xml.in b/interface-definitions/interfaces_vti.xml.in index 39fb3131e..b472ac9b1 100644 --- a/interface-definitions/interfaces_vti.xml.in +++ b/interface-definitions/interfaces_vti.xml.in @@ -14,6 +14,7 @@ vtiN VTI interface name + interface #include diff --git a/interface-definitions/interfaces_vxlan.xml.in b/interface-definitions/interfaces_vxlan.xml.in index 7f71dca34..55924edc0 100644 --- a/interface-definitions/interfaces_vxlan.xml.in +++ b/interface-definitions/interfaces_vxlan.xml.in @@ -14,6 +14,7 @@ vxlanN VXLAN interface name + interface #include diff --git a/interface-definitions/interfaces_wireguard.xml.in b/interface-definitions/interfaces_wireguard.xml.in index 33cb5864a..d22230de4 100644 --- a/interface-definitions/interfaces_wireguard.xml.in +++ b/interface-definitions/interfaces_wireguard.xml.in @@ -14,6 +14,7 @@ wgN WireGuard interface name + interface #include diff --git a/interface-definitions/interfaces_wireless.xml.in b/interface-definitions/interfaces_wireless.xml.in index 1b5356caa..ec1817585 100644 --- a/interface-definitions/interfaces_wireless.xml.in +++ b/interface-definitions/interfaces_wireless.xml.in @@ -17,6 +17,7 @@ wlanN Wireless (WiFi/WLAN) interface name + interface #include diff --git a/interface-definitions/interfaces_wwan.xml.in b/interface-definitions/interfaces_wwan.xml.in index 552806d4e..7763cc704 100644 --- a/interface-definitions/interfaces_wwan.xml.in +++ b/interface-definitions/interfaces_wwan.xml.in @@ -17,6 +17,7 @@ wwanN Wireless Wide Area Network interface name + interface #include diff --git a/interface-definitions/policy_local-route.xml.in b/interface-definitions/policy_local-route.xml.in index 9f6588db8..fed3a8edc 100644 --- a/interface-definitions/policy_local-route.xml.in +++ b/interface-definitions/policy_local-route.xml.in @@ -73,7 +73,7 @@ #include - #include + #include @@ -148,7 +148,7 @@ #include - #include + #include diff --git a/interface-definitions/protocols_igmp-proxy.xml.in b/interface-definitions/protocols_igmp-proxy.xml.in index a1deeb3fc..65a5cf3c7 100644 --- a/interface-definitions/protocols_igmp-proxy.xml.in +++ b/interface-definitions/protocols_igmp-proxy.xml.in @@ -22,6 +22,7 @@ + diff --git a/interface-definitions/protocols_mpls.xml.in b/interface-definitions/protocols_mpls.xml.in index fc1864f38..b904a0740 100644 --- a/interface-definitions/protocols_mpls.xml.in +++ b/interface-definitions/protocols_mpls.xml.in @@ -574,7 +574,7 @@ - #include + #include diff --git a/interface-definitions/protocols_pim.xml.in b/interface-definitions/protocols_pim.xml.in index 4a20c0d9b..3de986545 100644 --- a/interface-definitions/protocols_pim.xml.in +++ b/interface-definitions/protocols_pim.xml.in @@ -15,9 +15,7 @@ - - #include - + #include #include diff --git a/interface-definitions/protocols_pim6.xml.in b/interface-definitions/protocols_pim6.xml.in index 8bd3f3fee..0d6d4d1b6 100644 --- a/interface-definitions/protocols_pim6.xml.in +++ b/interface-definitions/protocols_pim6.xml.in @@ -15,9 +15,7 @@ - - #include - + #include #include diff --git a/interface-definitions/qos.xml.in b/interface-definitions/qos.xml.in index aad1de629..5f3e76c2c 100644 --- a/interface-definitions/qos.xml.in +++ b/interface-definitions/qos.xml.in @@ -16,9 +16,7 @@ txt Interface name - - #include - + #include diff --git a/interface-definitions/service_conntrack-sync.xml.in b/interface-definitions/service_conntrack-sync.xml.in index 9483c809b..56faa4a59 100644 --- a/interface-definitions/service_conntrack-sync.xml.in +++ b/interface-definitions/service_conntrack-sync.xml.in @@ -141,6 +141,7 @@ + diff --git a/interface-definitions/service_dhcp-relay.xml.in b/interface-definitions/service_dhcp-relay.xml.in index 9fdd9581d..0fbb75598 100644 --- a/interface-definitions/service_dhcp-relay.xml.in +++ b/interface-definitions/service_dhcp-relay.xml.in @@ -10,7 +10,7 @@ #include - #include + #include Interface for DHCP Relay Agent to listen for requests @@ -21,9 +21,7 @@ txt Interface name - - #include - + #include @@ -37,9 +35,7 @@ txt Interface name - - #include - + #include diff --git a/interface-definitions/service_ipoe-server.xml.in b/interface-definitions/service_ipoe-server.xml.in index 27b163001..f3a7e1e3c 100644 --- a/interface-definitions/service_ipoe-server.xml.in +++ b/interface-definitions/service_ipoe-server.xml.in @@ -90,6 +90,7 @@ + diff --git a/interface-definitions/service_mdns_repeater.xml.in b/interface-definitions/service_mdns_repeater.xml.in index 9d626bf6a..0cdb45db3 100644 --- a/interface-definitions/service_mdns_repeater.xml.in +++ b/interface-definitions/service_mdns_repeater.xml.in @@ -14,7 +14,7 @@ #include - #include + #include IP address version to use diff --git a/interface-definitions/service_ndp-proxy.xml.in b/interface-definitions/service_ndp-proxy.xml.in index 327ce89d5..a35457991 100644 --- a/interface-definitions/service_ndp-proxy.xml.in +++ b/interface-definitions/service_ndp-proxy.xml.in @@ -28,9 +28,7 @@ - - #include - + #include #include diff --git a/interface-definitions/service_ntp.xml.in b/interface-definitions/service_ntp.xml.in index 216722715..f85b5715b 100644 --- a/interface-definitions/service_ntp.xml.in +++ b/interface-definitions/service_ntp.xml.in @@ -10,10 +10,10 @@ #include - #include + #include #include #include - #include + #include #include @@ -39,6 +39,7 @@ #include all + diff --git a/interface-definitions/service_pppoe-server.xml.in b/interface-definitions/service_pppoe-server.xml.in index 81a4a95e3..06f4225a6 100644 --- a/interface-definitions/service_pppoe-server.xml.in +++ b/interface-definitions/service_pppoe-server.xml.in @@ -61,6 +61,7 @@ + diff --git a/interface-definitions/system_flow-accounting.xml.in b/interface-definitions/system_flow-accounting.xml.in index 53436036e..c340fccd6 100644 --- a/interface-definitions/system_flow-accounting.xml.in +++ b/interface-definitions/system_flow-accounting.xml.in @@ -20,7 +20,7 @@ NetFlow settings - #include + #include NetFlow engine-id @@ -112,7 +112,7 @@ 2055 #include - #include + #include diff --git a/interface-definitions/system_option.xml.in b/interface-definitions/system_option.xml.in index c295b2ebe..3bc58155c 100644 --- a/interface-definitions/system_option.xml.in +++ b/interface-definitions/system_option.xml.in @@ -381,7 +381,7 @@ Global options used for HTTP client - #include + #include #include -- cgit v1.2.3 From 0b43a668ac1fdbc5149616f5065279bbce9a02c8 Mon Sep 17 00:00:00 2001 From: John Estabrook Date: Tue, 6 Oct 2026 11:50:21 -0500 Subject: T7886: add concatenation of vif entries --- .../include/interface/vif-s.xml.i | 2 + interface-definitions/include/interface/vif.xml.i | 1 + python/vyos/configmanager.py | 18 ++++++-- python/vyos/dependentverify.py | 53 ++++++++++++++++++++++ 4 files changed, 71 insertions(+), 3 deletions(-) (limited to 'interface-definitions') diff --git a/interface-definitions/include/interface/vif-s.xml.i b/interface-definitions/include/interface/vif-s.xml.i index 65ca10207..e07a9bf8a 100644 --- a/interface-definitions/include/interface/vif-s.xml.i +++ b/interface-definitions/include/interface/vif-s.xml.i @@ -10,6 +10,7 @@ VLAN ID must be between 0 and 4094 + interface #include @@ -32,6 +33,7 @@ VLAN ID must be between 0 and 4094 + interface #include diff --git a/interface-definitions/include/interface/vif.xml.i b/interface-definitions/include/interface/vif.xml.i index 87f91c5ce..e9b9385f1 100644 --- a/interface-definitions/include/interface/vif.xml.i +++ b/interface-definitions/include/interface/vif.xml.i @@ -10,6 +10,7 @@ VLAN ID must be between 0 and 4094 + interface #include 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 -- cgit v1.2.3