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

Fixes for some corner cases + cleanup

Ticket: CM-1438
Reviewed By:
Testing Done:

Also includes fix for CM-2307 and some other fixes for primary/secondary
address handling.
This commit is contained in:
roopa
2014-02-18 22:25:48 -08:00
parent be0b20f288
commit 69f582783b
3 changed files with 48 additions and 18 deletions

View File

@@ -34,7 +34,7 @@ class ifaceStatus():
elif state == cls.ERROR: elif state == cls.ERROR:
return 'error' return 'error'
elif state == cls.NOTFOUND: elif state == cls.NOTFOUND:
return 'not found' return 'notfound'
@classmethod @classmethod
def from_str(cls, state_str): def from_str(cls, state_str):
@@ -136,6 +136,7 @@ class iface():
self.addr_family = None self.addr_family = None
self.addr_method = None self.addr_method = None
self.config = OrderedDict() self.config = OrderedDict()
self.config_status = {}
self.state = ifaceState.NEW self.state = ifaceState.NEW
self.status = ifaceStatus.UNKNOWN self.status = ifaceStatus.UNKNOWN
self.errstr = '' self.errstr = ''
@@ -231,6 +232,12 @@ class iface():
return False return False
def set_priv_flags(self, priv_flags):
self.priv_flags = priv_flags
def get_priv_flags(self):
return self.priv_flags
def get_state(self): def get_state(self):
return self.state return self.state
@@ -336,19 +343,32 @@ class iface():
self.config.update(attrdict) self.config.update(attrdict)
def update_config_with_status(self, attr_name, attr_value, attr_status=0): def update_config_with_status(self, attr_name, attr_value, attr_status=0):
if attr_value is None: if not attr_value:
attr_value = '' attr_value = ''
if self.config.get(attr_name):
self.config[attr_name].append(attr_value)
self.config_status[attr_name].append(attr_status)
else:
self.config[attr_name] = [attr_value]
self.config_status[attr_name] = [attr_status]
# set global iface state
if attr_status: if attr_status:
self.set_status(ifaceStatus.ERROR) self.set_status(ifaceStatus.ERROR)
new_attr_value = '%s (%s)' %(attr_value, crossmark) elif self.get_status() != ifaceStatus.ERROR:
# Not already error, mark success
self.set_status(ifaceStatus.SUCCESS)
def get_config_attr_status(self, attr_name, idx=0):
self.config_status.get(attr_name, [])[idx]
def get_config_attr_status_str(self, attr_name, idx=0):
ret = self.config_status.get(attr_name, [])[idx]
if ret:
return crossmark
else: else:
new_attr_value = '%s (%s)' %(attr_value, tickmark) return tickmark
if self.get_status() != ifaceStatus.ERROR:
self.set_status(ifaceStatus.SUCCESS)
if self.config.get(attr_name) is not None:
self.config[attr_name].append(new_attr_value)
else:
self.config[attr_name] = [new_attr_value]
def is_different(self, dstiface): def is_different(self, dstiface):
if self.name != dstiface.name: return True if self.name != dstiface.name: return True
@@ -410,7 +430,7 @@ class iface():
logger.info(indent + indent + str(config)) logger.info(indent + indent + str(config))
logger.info('}') logger.info('}')
def dump_pretty(self): def dump_pretty(self, with_status=False):
indent = '\t' indent = '\t'
outbuf = '' outbuf = ''
if self.get_auto(): if self.get_auto():
@@ -427,10 +447,16 @@ class iface():
config = self.get_config() config = self.get_config()
if config is not None: if config is not None:
for cname, cvaluelist in config.items(): for cname, cvaluelist in config.items():
idx = 0
for cv in cvaluelist: for cv in cvaluelist:
outbuf += indent + '%s' %cname + ' %s\n' %cv if with_status:
outbuf += indent + '%s %s %s\n' %(cname, cv,
self.get_config_attr_status_str(cname, idx))
else:
outbuf += indent + '%s %s\n' %(cname, cv)
idx += 1
print outbuf print outbuf
def dump_json(self): def dump_json(self, with_status=False):
print json.dumps(self, cls=ifaceJsonEncoder, indent=4) print json.dumps(self, cls=ifaceJsonEncoder, indent=4)

View File

@@ -206,12 +206,13 @@ class ifupdownMain(ifupdownBase):
def create_n_save_ifaceobjcurr(self, ifaceobj): def create_n_save_ifaceobjcurr(self, ifaceobj):
ifacename = ifaceobj.get_name() ifacename = ifaceobj.get_name()
ifaceobjcurr = self.get_ifaceobjcurr(ifacename) ifaceobjcurr = self.get_ifaceobjcurr(ifacename)
if ifaceobjcurr is not None: if ifaceobjcurr:
return ifaceobjcurr return ifaceobjcurr
ifaceobjcurr = iface() ifaceobjcurr = iface()
ifaceobjcurr.set_name(ifacename) ifaceobjcurr.set_name(ifacename)
ifaceobjcurr.set_lowerifaces(ifaceobj.get_lowerifaces()) ifaceobjcurr.set_lowerifaces(ifaceobj.get_lowerifaces())
ifaceobjcurr.set_priv_flags(ifaceobj.get_priv_flags())
self.ifaceobjcurrdict[ifacename] = ifaceobjcurr self.ifaceobjcurrdict[ifacename] = ifaceobjcurr
return ifaceobjcurr return ifaceobjcurr
@@ -1033,7 +1034,8 @@ class ifupdownMain(ifupdownBase):
ifaceobj = self.get_ifaceobjcurr(i) ifaceobj = self.get_ifaceobjcurr(i)
if not ifaceobj: continue if not ifaceobj: continue
if ifaceobj.get_status() == ifaceStatus.NOTFOUND: if ifaceobj.get_status() == ifaceStatus.NOTFOUND:
print 'iface %s' %ifaceobj.get_name() + ' (not found)\n' print 'iface %s %s\n' %(ifaceobj.get_name(),
ifaceStatus.to_str(ifaceStatus.NOTFOUND))
ret = 1 ret = 1
continue continue
elif ifaceobj.get_status() == ifaceStatus.ERROR: elif ifaceobj.get_status() == ifaceStatus.ERROR:
@@ -1043,15 +1045,14 @@ class ifupdownMain(ifupdownBase):
continue continue
if format == 'json': if format == 'json':
ifaceobj.dump_json() ifaceobj.dump_json(with_status=True)
else: else:
ifaceobj.dump_pretty() ifaceobj.dump_pretty(with_status=True)
if self.WITH_DEPENDS: if self.WITH_DEPENDS:
dlist = ifaceobj.get_lowerifaces() dlist = ifaceobj.get_lowerifaces()
if not dlist or not len(dlist): continue if not dlist or not len(dlist): continue
self.print_ifaceobjscurr_pretty(dlist, format) self.print_ifaceobjscurr_pretty(dlist, format)
return ret return ret
def print_ifaceobjsrunning_pretty(self, ifacenames, format='native'): def print_ifaceobjsrunning_pretty(self, ifacenames, format='native'):

View File

@@ -14,6 +14,7 @@ from collections import deque
from collections import OrderedDict from collections import OrderedDict
import logging import logging
import traceback import traceback
import sys
from graph import * from graph import *
from collections import deque from collections import deque
from threading import * from threading import *
@@ -198,6 +199,8 @@ class ifaceScheduler():
order, followdependents) order, followdependents)
except Exception, e: except Exception, e:
if continueonfailure: if continueonfailure:
if ifupdownobj.logger.isEnabledFor(logging.DEBUG):
traceback.print_tb(sys.exc_info()[2])
ifupdownobj.logger.error('%s : %s' %(ifacename, str(e))) ifupdownobj.logger.error('%s : %s' %(ifacename, str(e)))
pass pass
else: else: