From f6a0fa151b367a5d509ffb9b64493e6888db3031 Mon Sep 17 00:00:00 2001 From: Roopa Prabhu Date: Sat, 27 Dec 2014 20:29:44 -0800 Subject: [PATCH] Added a few more try-except clauses during bridge config to continue on failures Ticket: CM-4382 Reviewed By: Testing Done: Tested with bridge port addition failure example in the bug report --- addons/bridge.py | 102 ++++++++++++++++++++++++++++++-------------- addons/ifenslave.py | 2 + addons/mstpctl.py | 6 +-- 3 files changed, 75 insertions(+), 35 deletions(-) diff --git a/addons/bridge.py b/addons/bridge.py index 59c5f70..930f3b9 100644 --- a/addons/bridge.py +++ b/addons/bridge.py @@ -276,9 +276,19 @@ class bridge(moduleBase): self.log_warn('%s: unable to process waitport: %s' %(ifaceobj.name, str(e))) + def _ports_enable_disable_ipv6(self, ports, enable='1'): + for p in ports: + try: + self.write_file('/proc/sys/net/ipv6/conf/%s' %p + + '/disable_ipv6', enable) + except Exception, e: + self.logger.warn(str(e)) + pass + def _add_ports(self, ifaceobj): bridgeports = self._get_bridge_port_list(ifaceobj) runningbridgeports = [] + removedbridgeports = [] self.ipcmd.batch_start() self._process_bridge_waitport(ifaceobj, bridgeports) @@ -289,8 +299,8 @@ class bridge(moduleBase): if runningbridgeports: for bport in runningbridgeports: if not bridgeports or bport not in bridgeports: - self.ipcmd.link_set(bport, 'nomaster') - self.ipcmd.link_set(bport, 'down') + self.ipcmd.link_set(bport, 'nomaster') + removedbridgeports.append(bport) else: runningbridgeports = [] if not bridgeports: @@ -305,16 +315,22 @@ class bridge(moduleBase): err += 1 continue self.ipcmd.link_set(bridgeport, 'master', ifaceobj.name) - self.write_file('/proc/sys/net/ipv6/conf/%s' %bridgeport + - '/disable_ipv6', '1') self.ipcmd.addr_flush(bridgeport) except Exception, e: self.logger.error(str(e)) pass - self.ipcmd.batch_commit() + try: + self.ipcmd.batch_commit() + except Exception, e: + self.logger.error(str(e)) + pass + + # enable ipv6 for ports that were removed + self._ports_enable_disable_ipv6(removedbridgeports, '1') if err: self.log_error('bridge configuration failed (missing ports)') + def _process_bridge_maxwait(self, ifaceobj, portlist): maxwait = ifaceobj.get_attr_value_first('bridge-maxwait') if not maxwait: return @@ -587,12 +603,14 @@ class bridge(moduleBase): self.log_warn('%s: could not parse %s (%s)' %(ifaceobj.name, attrname, str(e))) for port, attrdict in portattrs.iteritems(): - self.brctlcmd.set_bridgeport_attrs(ifaceobj.name, port, - attrdict) + try: + self.brctlcmd.set_bridgeport_attrs(ifaceobj.name, port, + attrdict) + except Exception, e: + self.log_warn('%s: %s', str(e)) + pass self._set_bridge_vidinfo_compat(ifaceobj) - self._set_bridge_mcqv4src_compat(ifaceobj) - self._process_bridge_maxwait(ifaceobj, self._get_bridge_port_list(ifaceobj)) except Exception, e: @@ -717,6 +735,7 @@ class bridge(moduleBase): def _apply_bridge_port_settings_all(self, ifaceobj, ifaceobj_getfunc=None): + err = False bridge_vlan_aware = ifaceobj.get_attr_value_first( 'bridge-vlan-aware') if bridge_vlan_aware and bridge_vlan_aware == 'yes': @@ -764,13 +783,19 @@ class bridge(moduleBase): # Dont process bridge port if it already has been processed if bportifaceobj.priv_flags & self._BRIDGE_PORT_PROCESSED: continue - - # Add attributes specific to the vlan aware bridge - if bridge_vlan_aware: - self._apply_bridge_vlan_aware_port_settings_all( + try: + # Add attributes specific to the vlan aware bridge + if bridge_vlan_aware: + self._apply_bridge_vlan_aware_port_settings_all( bportifaceobj, bridge_vids, bridge_pvid) - self._apply_bridge_port_settings(bportifaceobj, + self._apply_bridge_port_settings(bportifaceobj, bridgeifaceobj=ifaceobj) + except Exception, e: + err = True + self.logger.warn('%s: %s' %(ifaceobj.name, str(e))) + pass + if err: + raise Exception('%s: errors applying port settings' %ifaceobj.name) def _up(self, ifaceobj, ifaceobj_getfunc=None): # Check if bridge port @@ -789,37 +814,52 @@ class bridge(moduleBase): return if not self._is_bridge(ifaceobj): return + err = False + errstr = '' + running_ports = '' try: - link_exists = False - porterr = False - porterrstr = '' if not self.PERFMODE: if not self.ipcmd.link_exists(ifaceobj.name): - self.ipcmd.link_create(ifaceobj.name, 'bridge') + self.ipcmd.link_create(ifaceobj.name, 'bridge') else: self.ipcmd.link_create(ifaceobj.name, 'bridge') - link_exists = True - try: - self._add_ports(ifaceobj) - except Exception, e: - porterr = True - porterrstr = str(e) - pass + except Exception, e: + raise Exception(str(e)) + try: + self._add_ports(ifaceobj) + except Exception, e: + err = True + errstr = str(e) + pass + + try: self._apply_bridge_settings(ifaceobj) + except Exception, e: + err = True + errstr = str(e) + pass + + try: + running_ports = self.brctlcmd.get_bridge_ports(ifaceobj.name) + if not running_ports: + return + # disable ipv6 for ports that were added to bridge + self._ports_enable_disable_ipv6(running_ports, '0') self._apply_bridge_port_settings_all(ifaceobj, ifaceobj_getfunc=ifaceobj_getfunc) - #self._flush_running_vidinfo() except Exception, e: - self.log_error(str(e)) + err = True + errstr = str(e) + pass + #self._flush_running_vidinfo() finally: if ifaceobj.link_type != ifaceLinkType.LINK_NA: - running_ports = self.brctlcmd.get_bridge_ports(ifaceobj.name) [rtnetlink_api.rtnl_api.link_set(p, "up") for p in running_ports] - if link_exists and ifaceobj.addr_method == 'manual': + if ifaceobj.addr_method == 'manual': rtnetlink_api.rtnl_api.link_set(ifaceobj.name, "up") - if porterr: - raise Exception(porterrstr) + if err: + raise Exception(errstr) def _down(self, ifaceobj, ifaceobj_getfunc=None): try: diff --git a/addons/ifenslave.py b/addons/ifenslave.py index 8cb51ba..495b1ac 100644 --- a/addons/ifenslave.py +++ b/addons/ifenslave.py @@ -228,6 +228,8 @@ class ifenslave(moduleBase): def _apply_slaves_lacp_bypass_prio(self, ifaceobj): slaves = self.ifenslavecmd.get_slaves(ifaceobj.name) + if not slaves: + return attrval = ifaceobj.get_attrs_value_first(['bond-lacp-bypass-priority', 'bond-lacp-fallback-priority']) if attrval: diff --git a/addons/mstpctl.py b/addons/mstpctl.py index 4ace15a..2c7b3a5 100644 --- a/addons/mstpctl.py +++ b/addons/mstpctl.py @@ -319,8 +319,8 @@ class mstpctl(moduleBase): ifaceobj_getfunc=None): self.logger.info('%s: applying mstp configuration ' %ifaceobj.name + 'specific to ports') - - bridgeports = self._get_bridge_port_list(ifaceobj) + # Query running bridge ports. and only apply attributes on them + bridgeports = self.brctlcmd.get_bridge_ports(ifaceobj.name) if not bridgeports: self.logger.debug('%s: cannot find bridgeports' %ifaceobj.name) return @@ -328,8 +328,6 @@ class mstpctl(moduleBase): self.logger.info('%s: processing mstp config for port %s' %(ifaceobj.name, bport)) if not self.ipcmd.link_exists(bport): - self.logger.warn('%s: port %s does not exist' %(ifaceobj.name, - bport)) continue bportifaceobjlist = ifaceobj_getfunc(bport) if not bportifaceobjlist: