Skip to content

Commit

Permalink
ndb.objects.interface: strict check on rename
Browse files Browse the repository at this point in the history
Control `alt_ifname_list` after rename. Ignore the old interface
name in `alt_ifname_list`.

Bug-Url: #1178
  • Loading branch information
svinota committed Feb 21, 2024
1 parent fc899cb commit cd913fa
Showing 1 changed file with 13 additions and 6 deletions.
19 changes: 13 additions & 6 deletions pyroute2/ndb/objects/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,7 @@ class Interface(RTNL_Object):
'alt_ifname_list': lambda x: list(json.loads(x or '[]'))
}
field_filter = LinkFieldFilter
old_ifname = None

@classmethod
def _count(cls, view):
Expand Down Expand Up @@ -860,6 +861,10 @@ def del_altname(self, ifname):
def __setitem__(self, key, value):
if key == 'peer':
dict.__setitem__(self, key, value)
elif key == 'ifname':
if self.old_ifname is None:
self.old_ifname = self[key]
dict.__setitem__(self, key, value)
elif key == 'target' and self.state == 'invalid':
dict.__setitem__(self, key, value)
elif key == 'net_ns_fd' and self.state == 'invalid':
Expand Down Expand Up @@ -979,7 +984,7 @@ def make_req(self, prime):
return req

@check_auth('obj:modify')
def apply_altnames(self, alt_ifname_setup):
def apply_altnames(self, alt_ifname_setup, old_ifname=None):
alt_ifname_remove = set(self['alt_ifname_list']) - alt_ifname_setup
alt_ifname_add = alt_ifname_setup - set(self['alt_ifname_list'])
for ifname in alt_ifname_remove:
Expand All @@ -992,10 +997,9 @@ def apply_altnames(self, alt_ifname_setup):
)
self.load_from_system()
self.load_sql(set_state=False)
if (
'ifname' not in self.changed
and set(self['alt_ifname_list']) != alt_ifname_setup
):
if old_ifname is not None and old_ifname in self['alt_ifname_list']:
alt_ifname_setup.add(old_ifname)
if set(self['alt_ifname_list']) != alt_ifname_setup:
raise Exception('could not setup alt ifnames')

@check_auth('obj:modify')
Expand All @@ -1007,6 +1011,7 @@ def apply(self, rollback=False, req_filter=None, mode='apply'):
setns = self.state.get() == 'setns'
remove = self.state.get() == 'remove'
alt_ifname_setup = set(self['alt_ifname_list'])
old_ifname = self.old_ifname if 'ifname' in self.changed else None
if 'alt_ifname_list' in self.changed:
self.changed.remove('alt_ifname_list')
try:
Expand All @@ -1018,7 +1023,7 @@ def apply(self, rollback=False, req_filter=None, mode='apply'):
if spec:
self.state.set('system')
if not remove:
self.apply_altnames(alt_ifname_setup)
self.apply_altnames(alt_ifname_setup, old_ifname)

except NetlinkError as e:
if (
Expand Down Expand Up @@ -1064,6 +1069,8 @@ def req_filter(req):
self.apply(rollback, req_filter, mode)
else:
raise
finally:
self.old_ifname = None
if ('net_ns_fd' in self.get('peer', {})) and (
self['peer']['net_ns_fd'] in self.view.ndb.sources
):
Expand Down

0 comments on commit cd913fa

Please sign in to comment.