mirror of
https://github.com/CumulusNetworks/ifupdown2.git
synced 2024-05-06 15:54:50 +00:00
Move LINK_MASTER/LINK_SLAVE to a new field link_type (purna hit some
issues with having it in flags) + add check for bond slave being already up Ticket: CM-4408 Reviewed By: Testing Done: some bond sanity test (cherry picked from commit 346b62a41fbf4521008cd8a9b0fa227e75a5d994)
This commit is contained in:
@ -105,7 +105,7 @@ class ifenslave(moduleBase):
|
||||
|
||||
# Also save a copy for future use
|
||||
ifaceobj.priv_data = list(slave_list)
|
||||
ifaceobj.flags |= iface.LINK_MASTER
|
||||
ifaceobj.link_type = ifaceLinkType.LINK_MASTER
|
||||
return slave_list
|
||||
|
||||
def get_dependent_ifacenames_running(self, ifaceobj):
|
||||
@ -145,6 +145,7 @@ class ifenslave(moduleBase):
|
||||
|
||||
def _apply_master_settings(self, ifaceobj):
|
||||
have_attrs_to_set = 0
|
||||
linkup = False
|
||||
ifenslavecmd_attrmap = OrderedDict([('bond-mode' , 'mode'),
|
||||
('bond-miimon' , 'miimon'),
|
||||
('bond-use-carrier', 'use_carrier'),
|
||||
@ -157,10 +158,7 @@ class ifenslave(moduleBase):
|
||||
('bond-ad-sys-priority' , 'ad_sys_priority'),
|
||||
('bond-lacp-fallback-allow', 'lacp_fallback_allow'),
|
||||
('bond-lacp-fallback-period', 'lacp_fallback_period')])
|
||||
linkstatus = self.ipcmd.link_get_status(ifaceobj.name)
|
||||
if not linkstatus:
|
||||
# assume link status is 'UP'
|
||||
linkstatus = 'UP'
|
||||
linkup = self.ipcmd.is_link_up(ifaceobj.name)
|
||||
try:
|
||||
# order of attributes set matters for bond, so
|
||||
# construct the list sequentially
|
||||
@ -173,11 +171,11 @@ class ifenslave(moduleBase):
|
||||
return
|
||||
have_attrs_to_set = 1
|
||||
self.ifenslavecmd.set_attrs(ifaceobj.name, attrstoset,
|
||||
self.ipcmd.link_down if linkstatus == 'UP' else None)
|
||||
self.ipcmd.link_down if linkup else None)
|
||||
except:
|
||||
raise
|
||||
finally:
|
||||
if have_attrs_to_set and linkstatus == 'UP':
|
||||
if have_attrs_to_set and linkup:
|
||||
self.ipcmd.link_up(ifaceobj.name)
|
||||
|
||||
def _add_slaves(self, ifaceobj):
|
||||
@ -201,6 +199,8 @@ class ifenslave(moduleBase):
|
||||
self.log_warn('%s: skipping slave %s, does not exist'
|
||||
%(ifaceobj.name, slave))
|
||||
continue
|
||||
if self.ipcmd.is_link_up(slave):
|
||||
rtnetlink_api.rtnl_api.link_set(slave, "down")
|
||||
self.ipcmd.link_set(slave, 'master', ifaceobj.name)
|
||||
rtnetlink_api.rtnl_api.link_set(slave, "up")
|
||||
|
||||
|
8
debian/python-ifupdown2.postinst
vendored
8
debian/python-ifupdown2.postinst
vendored
@ -50,10 +50,10 @@ case "$1" in
|
||||
fi
|
||||
fi
|
||||
|
||||
[ -e /sbin/ifup ] || ln -s /sbin/ifupdown /sbin/ifup
|
||||
[ -e /sbin/ifdown ] || ln -s /sbin/ifupdown /sbin/ifdown
|
||||
[ -e /sbin/ifquery ] || ln -s /sbin/ifupdown /sbin/ifquery
|
||||
[ -e /sbin/ifreload ] || ln -s /sbin/ifupdown /sbin/ifreload
|
||||
[ -e /sbin/ifup ] || ln -sf /sbin/ifupdown /sbin/ifup
|
||||
[ -e /sbin/ifdown ] || ln -sf /sbin/ifupdown /sbin/ifdown
|
||||
[ -e /sbin/ifquery ] || ln -sf /sbin/ifupdown /sbin/ifquery
|
||||
[ -e /sbin/ifreload ] || ln -sf /sbin/ifupdown /sbin/ifreload
|
||||
|
||||
(cd /usr/share/man/man8/ && ln -sf /usr/share/man/man8/ifup.8.gz ifdown.8.gz)
|
||||
|
||||
|
@ -22,6 +22,11 @@ class ifaceType():
|
||||
IFACE = 0x1
|
||||
BRIDGE_VLAN = 0x2
|
||||
|
||||
class ifaceLinkType():
|
||||
UNKNOWN = 0x0
|
||||
LINK_SLAVE = 0x1
|
||||
LINK_MASTER = 0x2
|
||||
|
||||
class ifaceStatus():
|
||||
"""Enumerates iface status """
|
||||
|
||||
@ -181,8 +186,6 @@ class iface():
|
||||
HAS_SIBLINGS = 0x2
|
||||
IFACERANGE_ENTRY = 0x3
|
||||
IFACERANGE_START = 0x4
|
||||
LINK_MASTER = 0x5
|
||||
LINK_SLAVE = 0x6
|
||||
|
||||
version = '0.1'
|
||||
|
||||
@ -218,6 +221,7 @@ class iface():
|
||||
"""interface type"""
|
||||
self.priv_data = None
|
||||
self.realname = None
|
||||
self.link_type = ifaceLinkType.UNKNOWN
|
||||
|
||||
def _set_attrs_from_dict(self, attrdict):
|
||||
self.auto = attrdict.get('auto', False)
|
||||
@ -401,6 +405,7 @@ class iface():
|
||||
del odict['raw_config']
|
||||
del odict['linkstate']
|
||||
del odict['env']
|
||||
del odict['link_type']
|
||||
return odict
|
||||
|
||||
def __setstate__(self, dict):
|
||||
@ -417,6 +422,7 @@ class iface():
|
||||
self.priv_flags = 0
|
||||
self.raw_config = []
|
||||
self.flags |= self._PICKLED
|
||||
self.link_type = ifaceLinkType.UNKNOWN
|
||||
|
||||
def dump_raw(self, logger):
|
||||
indent = ' '
|
||||
|
@ -112,7 +112,7 @@ class ifupdownMain(ifupdownBase):
|
||||
# by its link master interface, then dont set the link state.
|
||||
# But do allow user to change state of the link if the interface
|
||||
# is already with its link master (hence the master check).
|
||||
if ((ifaceobj.flags & iface.LINK_SLAVE) and
|
||||
if ((ifaceobj.link_type == ifaceLinkType.LINK_SLAVE) and
|
||||
not os.path.exists('/sys/class/net/%s/master' %ifaceobj.name)):
|
||||
return
|
||||
if self.link_exists(ifaceobj.name):
|
||||
@ -123,7 +123,7 @@ class ifupdownMain(ifupdownBase):
|
||||
# by its link master interface, then dont set the link state.
|
||||
# But do allow user to change state of the link if the interface
|
||||
# is already with its link master (hence the master check).
|
||||
if ((ifaceobj.flags & iface.LINK_SLAVE) and
|
||||
if ((ifaceobj.link_type == ifaceLinkType.LINK_SLAVE) and
|
||||
not os.path.exists('/sys/class/net/%s/master' %ifaceobj.name)):
|
||||
return
|
||||
if self.link_exists(ifaceobj.name):
|
||||
@ -357,14 +357,14 @@ class ifupdownMain(ifupdownBase):
|
||||
del_list.append(d)
|
||||
if ni:
|
||||
ni.add_to_upperifaces(upperifaceobj.name)
|
||||
if (upperifaceobj.flags & iface.LINK_MASTER):
|
||||
ni.flags |= iface.LINK_SLAVE
|
||||
if upperifaceobj.link_type == ifaceLinkType.LINK_MASTER:
|
||||
ni.link_type = ifaceLinkType.LINK_SLAVE
|
||||
else:
|
||||
for di in dilist:
|
||||
di.inc_refcnt()
|
||||
di.add_to_upperifaces(upperifaceobj.name)
|
||||
if (upperifaceobj.flags & iface.LINK_MASTER):
|
||||
di.flags |= iface.LINK_SLAVE
|
||||
if upperifaceobj.flags == ifaceLinkType.LINK_MASTER:
|
||||
di.link_type = ifaceLinkType.LINK_SLAVE
|
||||
|
||||
for d in del_list:
|
||||
dlist.remove(d)
|
||||
|
@ -673,3 +673,15 @@ class iproute2(utilsBase):
|
||||
|
||||
def is_bridge(self, bridge):
|
||||
return os.path.exists('/sys/class/net/%s/bridge' %bridge)
|
||||
|
||||
def is_link_up(self, ifacename):
|
||||
ret = False
|
||||
try:
|
||||
flags = self.read_file_oneline('/sys/class/net/%s/flags' %ifacename)
|
||||
iflags = int(flags, 16)
|
||||
if (iflags & 0x0001):
|
||||
ret = True
|
||||
except:
|
||||
ret = False
|
||||
pass
|
||||
return ret
|
||||
|
Reference in New Issue
Block a user