1
0
mirror of https://github.com/CumulusNetworks/ifupdown2.git synced 2024-05-06 15:54:50 +00:00

Rework bridge upperiface handling (to fix some problems with the new

bridge driver and svi config)

Ticket: CM-3346
Reviewed By:
Testing Done: Tested upper interface handling during ifup of
bonds/bridges/svis
This commit is contained in:
Roopa Prabhu
2014-12-24 12:14:30 -08:00
parent 97f4cff80c
commit a9ab1b4f10
4 changed files with 79 additions and 2 deletions

View File

@ -220,6 +220,7 @@ class bridge(moduleBase):
return None
if ifaceobj.link_type != ifaceLinkType.LINK_NA:
ifaceobj.link_type = ifaceLinkType.LINK_MASTER
ifaceobj.link_kind = ifaceLinkKind.BRIDGE
return self.parse_port_list(ifaceobj.get_attr_value_first(
'bridge-ports'), ifacenames_all)

View File

@ -22,6 +22,11 @@ class ifaceType():
IFACE = 0x1
BRIDGE_VLAN = 0x2
class ifaceLinkKind():
UNKNOWN = 0x0
BRIDGE = 0x1
BOND = 0x2
class ifaceLinkType():
LINK_UNKNOWN = 0x0
LINK_SLAVE = 0x1
@ -223,6 +228,7 @@ class iface():
self.priv_data = None
self.realname = None
self.link_type = ifaceLinkType.LINK_UNKNOWN
self.link_kind = ifaceLinkKind.BRIDGE
def _set_attrs_from_dict(self, attrdict):
self.auto = attrdict.get('auto', False)
@ -407,6 +413,7 @@ class iface():
del odict['linkstate']
del odict['env']
del odict['link_type']
del odict['link_kind']
return odict
def __setstate__(self, dict):
@ -424,6 +431,7 @@ class iface():
self.raw_config = []
self.flags |= self._PICKLED
self.link_type = ifaceLinkType.LINK_UNKNOWN
self.link_kind = ifaceLinkKind.UNKNOWN
def dump_raw(self, logger):
indent = ' '

View File

@ -241,6 +241,13 @@ class ifupdownMain(ifupdownBase):
def get_ifaceobjs(self, ifacename):
return self.ifaceobjdict.get(ifacename)
def get_ifaceobjs_saved(self, ifacename):
""" Return ifaceobjects from statemanager """
if self.STATEMANAGER_ENABLE:
return self.statemanager.get_ifaceobjs(ifacename)
else:
None
def get_ifaceobj_first(self, ifacename):
ifaceobjs = self.get_ifaceobjs(ifacename)
if ifaceobjs:
@ -253,6 +260,7 @@ class ifupdownMain(ifupdownBase):
def get_iface_obj_last(self, ifacename):
return self.ifaceobjdict.get(ifacename)[-1]
def must_follow_upperifaces(self, ifacename):
#
# XXX: This bleeds the knowledge of iface

View File

@ -19,6 +19,7 @@ from graph import *
from collections import deque
from threading import *
from ifupdownbase import *
from sets import Set
class ifaceSchedulerFlags():
""" Enumerates scheduler flags """
@ -330,6 +331,66 @@ class ifaceScheduler():
ifupdownobj.logger.warn('%s : %s' %(ifacename, str(e)))
pass
@classmethod
def _get_valid_upperifaces(cls, ifupdownobj, ifacenames,
allupperifacenames):
""" Recursively find valid upperifaces
valid upperifaces are:
- An upperiface which had no user config (example builtin
interfaces. usually vlan interfaces.)
- or had config and previously up
- and interface currently does not exist
- or is a bridge (because if your upperiface was a bridge
- u will have to execute up on the bridge
to enslave the port and apply bridge attributes to the port) """
upperifacenames = []
for ifacename in ifacenames:
# get upperifaces
ifaceobj = ifupdownobj.get_ifaceobj_first(ifacename)
if not ifaceobj:
continue
ulist = Set(ifaceobj.upperifaces).difference(upperifacenames)
nulist = []
for u in ulist:
uifaceobj = ifupdownobj.get_ifaceobj_first(u)
if not uifaceobj:
continue
has_config = not bool(uifaceobj.priv_flags
& ifupdownobj.NOCONFIG)
if (((has_config and ifupdownobj.get_ifaceobjs_saved(u)) or
not has_config) and (not ifupdownobj.link_exists(u)
or uifaceobj.link_kind == ifaceLinkKind.BRIDGE)):
nulist.append(u)
upperifacenames.extend(nulist)
allupperifacenames.extend(upperifacenames)
if upperifacenames:
cls._get_valid_upperifaces(ifupdownobj, upperifacenames,
allupperifacenames)
return
@classmethod
def run_upperifaces(cls, ifupdownobj, ifacenames, ops,
continueonfailure=True):
""" Run through valid upperifaces """
upperifaces = []
cls._get_valid_upperifaces(ifupdownobj, ifacenames, upperifaces)
if not upperifaces:
return
# dump valid upperifaces
ifupdownobj.logger.debug(upperifaces)
for u in upperifaces:
try:
ifaceobjs = ifupdownobj.get_ifaceobjs(u)
if not ifaceobjs:
continue
cls.run_iface_list_ops(ifupdownobj, ifaceobjs, ops)
except Exception, e:
if continueonfailure:
self.logger.warn('%s' %str(e))
@classmethod
def get_sorted_iface_list(cls, ifupdownobj, ifacenames, ops,
dependency_graph, indegrees=None):
@ -457,6 +518,5 @@ class ifaceScheduler():
ifupdownobj.logger.info('running upperifaces (parent interfaces) ' +
'if available ..')
cls._STATE_CHECK = False
cls.run_iface_list_upper(ifupdownobj, ifacenames, ops,
skip_root=True)
cls.run_upperifaces(ifupdownobj, ifacenames, ops)
cls._STATE_CHECK = True