summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--python/vyos/ifconfig/vpp/bond.py18
-rw-r--r--src/conf_mode/vpp_interfaces_bonding.py13
2 files changed, 26 insertions, 5 deletions
diff --git a/python/vyos/ifconfig/vpp/bond.py b/python/vyos/ifconfig/vpp/bond.py
index b3bcce449..cece5560d 100644
--- a/python/vyos/ifconfig/vpp/bond.py
+++ b/python/vyos/ifconfig/vpp/bond.py
@@ -17,6 +17,7 @@
from vyos.ifconfig import Interface
from vyos.ifconfig.vpp.interface import VPPInterface
+from vyos.utils.dict import dict_search
class VPPBondInterface(Interface, VPPInterface):
@@ -135,13 +136,24 @@ class VPPBondInterface(Interface, VPPInterface):
# Delete bonding interface
self.delete_bond()
+ self.index = None
+
def update(self, config):
# Add bond interface
- self.add_bond()
+ if self.index is None:
+ self.add_bond()
+
+ # Delete removed members
+ members = self.get_members()
+ config_members = dict_search('member.interface', config, default=[])
+ for member in members:
+ if member not in config_members:
+ self.detach_member(interface=member)
# Add members to bond
- for member in config.get('member', {}).get('interface', []):
- self.add_member(interface=member)
+ for member in config_members:
+ if member not in members:
+ self.add_member(interface=member)
# Apply VPP-specific interface settings
VPPInterface.update(self, config)
diff --git a/src/conf_mode/vpp_interfaces_bonding.py b/src/conf_mode/vpp_interfaces_bonding.py
index c7fd43bb4..932287a03 100644
--- a/src/conf_mode/vpp_interfaces_bonding.py
+++ b/src/conf_mode/vpp_interfaces_bonding.py
@@ -18,6 +18,7 @@
from vyos.config import Config
from vyos.configdict import get_interface_dict
+from vyos.configdict import is_node_changed
from vyos.configdep import set_dependents, call_dependents
from vyos.configverify import verify_mtu_ipv6
from vyos import ConfigError
@@ -108,6 +109,12 @@ def get_config(config=None) -> dict:
no_tag_node_value_mangle=True,
)
+ iface_path = ['interfaces', 'vpp', 'bonding', ifname]
+ rebuild_required_nodes = ['mode', 'hash-policy', 'mac']
+ for node in rebuild_required_nodes:
+ if is_node_changed(conf, iface_path + [node]):
+ config.update({'rebuild_required': {}})
+
config['bond_members'] = deps_bond_dict(conf)
# Dependency
@@ -225,10 +232,12 @@ def apply(config):
ifname = config.get('ifname')
bond = VPPBondInterface(ifname, config)
- bond.remove()
+
+ if 'deleted' in config or 'rebuild_required' in config:
+ bond.remove()
if 'deleted' in config:
- return
+ return None
bond.update(config)