@classmethod
def run_iface_op(cls, ifupdownobj, ifaceobj, op, cenv):
""" Runs sub operation on an interface """
- ifacename = ifaceobj.get_name()
+ ifacename = ifaceobj.name
if (cls._STATE_CHECK and
- (ifaceobj.get_state() >= ifaceState.from_str(op)) and
- (ifaceobj.get_status() == ifaceStatus.SUCCESS)):
+ (ifaceobj.state >= ifaceState.from_str(op)) and
+ (ifaceobj.status == ifaceStatus.SUCCESS)):
ifupdownobj.logger.debug('%s: already in state %s' %(ifacename, op))
return
# first run ifupdownobj handlers
handler = ifupdownobj.ops_handlers.get(op)
if handler:
- addr_method = ifaceobj.get_addr_method()
- if not addr_method or (addr_method and addr_method != 'manual'):
+ if not ifaceobj.addr_method or (ifaceobj.addr_method and
+ ifaceobj.addr_method != 'manual'):
handler(ifupdownobj, ifaceobj)
if not ifupdownobj.ADDONS_ENABLE: return
@classmethod
def run_iface_ops(cls, ifupdownobj, ifaceobj, ops):
""" Runs all operations on an interface """
- ifacename = ifaceobj.get_name()
+ ifacename = ifaceobj.name
# minor optimization. If operation is 'down', proceed only
# if interface exists in the system
if 'down' in ops[0] and not ifupdownobj.link_exists(ifacename):
@classmethod
- def _check_upperifaces(cls, ifupdownobj, ifaceobj, ops, parent, followdependents=False):
+ def _check_upperifaces(cls, ifupdownobj, ifaceobj, ops, parent,
+ followdependents=False):
""" Check if conflicting upper ifaces are around and warn if required
- Returns False if this interface needs to be skipped, else return True """
+ Returns False if this interface needs to be skipped,
+ else return True """
+
+ # XXX: simply return for now, the warnings this function prints
+ # are very confusing. Get rid of this function soon
+ return True
if 'up' in ops[0] and followdependents:
return True
- ifacename = ifaceobj.get_name()
# Deal with upperdevs first
- ulist = ifaceobj.get_upperifaces()
+ ulist = ifaceobj.upperifaces
if ulist:
tmpulist = ([u for u in ulist if u != parent] if parent
else ulist)
for u in tmpulist:
if ifupdownobj.link_exists(u):
if not ifupdownobj.FORCE and not ifupdownobj.ALL:
- ifupdownobj.logger.warn('%s: ' %ifacename +
- ' skip interface down,' +
- ' upperiface %s still around' %u)
- return False
+ ifupdownobj.logger.warn('%s: ' %ifaceobj.name +
+ 'upperiface %s still around' %u)
+ return True
elif 'up' in ops[0] and not ifupdownobj.ALL:
# For 'up', just warn that there is an upperdev which is
# probably not up
for u in tmpulist:
if not ifupdownobj.link_exists(u):
- ifupdownobj.logger.warn('%s: upper iface %s '
- %(ifacename, u) + 'does not exist')
+ ifupdownobj.logger.warn('%s: ' %ifaceobj.name +
+ 'upper iface %s does not exist' %u)
return True
@classmethod
raise Exception('%s: not found' %ifacename)
for ifaceobj in ifaceobjs:
- if not cls._check_upperifaces(ifupdownobj, ifaceobj, ops, parent,
- followdependents):
+ if not cls._check_upperifaces(ifupdownobj, ifaceobj,
+ ops, parent, followdependents):
return
if order == ifaceSchedulerFlags.INORDER:
# If inorder, run the iface first and then its dependents
cls.run_iface_ops(ifupdownobj, ifaceobj, ops)
# Run lowerifaces or dependents
- dlist = ifaceobj.get_lowerifaces()
+ dlist = ifaceobj.lowerifaces
if dlist:
- ifupdownobj.logger.debug('%s:' %ifacename +
- ' found dependents: %s' %str(dlist))
+ ifupdownobj.logger.debug('%s: found dependents %s'
+ %(ifacename, str(dlist)))
try:
if not followdependents:
# XXX: this is yet another extra step,
cls.run_iface_ops(ifupdownobj, ifaceobj, ops)
# Run upperifaces
- ulist = ifaceobj.get_upperifaces()
+ ulist = ifaceobj.upperifaces
if ulist:
- ifupdownobj.logger.debug('%s:' %ifacename +
- ' found upperifaces: %s' %str(ulist))
+ ifupdownobj.logger.debug('%s: found upperifaces %s'
+ %(ifacename, str(ulist)))
try:
cls.run_iface_list_upper(ifupdownobj, ulist, ops,
ifacename,
"""
if not ifupdownobj.ALL or not followdependents or len(ifacenames) == 1:
+ # If there is any interface that does exist, maybe it is a
+ # logical interface and we have to followupperifaces
+ followupperifaces = (True if
+ [i for i in ifacenames
+ if not ifupdownobj.link_exists(i)]
+ else False)
cls.run_iface_list(ifupdownobj, ifacenames, ops,
parent=None,order=order,
followdependents=followdependents)
- if not ifupdownobj.ALL and followdependents and 'up' in ops[0]:
+ if (not ifupdownobj.ALL and
+ (followdependents or followupperifaces) and 'up' in ops[0]):
# If user had given a set of interfaces to bring up
# try and execute 'up' on the upperifaces
ifupdownobj.logger.info('running upperifaces if available')
cls.run_iface_list(ifupdownobj, run_queue, ops,
parent=None,order=order,
followdependents=followdependents)
-
- @classmethod
- def run_iface(cls, ifupdownobj, ifacename, ops):
- """ Runs operation on an interface """
-
- ifaceobjs = ifupdownobj.get_ifaceobjs(ifacename)
- for i in ifaceobjs:
- cls.run_iface_ops(ifupdownobj, i, ops)
-
- @classmethod
- def run_iface_list_op(cls, ifupdownobj, ifacenames, op,
- sorted_by_dependency=False):
- """ Runs interface list through sub operation handler. """
-
- ifupdownobj.logger.debug('running operation %s on all given interfaces'
- %op)
- iface_run_queue = deque(ifacenames)
- for i in range(0, len(iface_run_queue)):
- if op.endswith('up'):
- # XXX: simplify this
- if sorted_by_dependency:
- ifacename = iface_run_queue.pop()
- else:
- ifacename = iface_run_queue.popleft()
- else:
- if sorted_by_dependency:
- ifacename = iface_run_queue.popleft()
- else:
- ifacename = iface_run_queue.pop()
-
- try:
- ifaceobjs = ifupdownobj.get_ifaceobjs(ifacename)
- for ifaceobj in ifaceobjs:
- cenv = ifupdownobj.generate_running_env(ifaceobj, op)
- cls.run_iface_op(ifupdownobj, ifaceobj, op, cenv)
- except Exception, e:
- ifupdownobj.log_error(str(e))
-
- @classmethod
- def run_iface_list_ops(cls, ifupdownobj, ifacenames, ops,
- sorted_by_dependency=False):
- """ Runs interface list through sub operations handler
-
- Unlike run_iface_list, this method executes a sub operation on the
- entire interface list before proceeding to the next sub-operation.
- ie operation 'pre-up' is run through the entire interface list before
- 'up'
- """
- # Each sub operation has a module list
- [cls.run_iface_list_op(ifupdownobj, ifacenames, op,
- sorted_by_dependency) for op in ops]
-
- @classmethod
- def run_iface_dependency_graphs_sorted(cls, ifupdownobj,
- dependency_graphs,
- ops, indegrees=None,
- graphsortall=False):
- """ runs interface dependency graph by topologically sorting the interfaces """
-
- if indegrees is None:
- indegrees = OrderedDict()
- for ifacename in dependency_graphs.keys():
- indegrees[ifacename] = ifupdownobj.get_iface_refcnt(ifacename)
-
- ifupdownobj.logger.debug('indegree array :')
- ifupdownobj.logger.debug(ifupdownobj.pp.pformat(indegrees))
-
- try:
- ifupdownobj.logger.debug('calling topological sort on the graph ' +
- '...')
- if graphsortall:
- sorted_ifacenames = graph.topological_sort_graphs_all(
- dependency_graphs, indegrees)
- else:
- sorted_ifacenames = graph.topological_sort_graphs(
- dependency_graphs, indegrees)
- except Exception:
- raise
-
- ifupdownobj.logger.debug('sorted iface list = %s' %sorted_ifacenames)
- cls.run_iface_list_ops(ifupdownobj, sorted_ifacenames, ops,
- sorted_by_dependency=True)
-
-
- """ Methods to execute interfaces in parallel """
- @classmethod
- def init_tokens(cls, count):
- cls.token_pool = BoundedSemaphore(count)
-
- @classmethod
- def accquire_token(cls, logprefix=''):
- cls.token_pool.acquire()
-
- @classmethod
- def release_token(cls, logprefix=''):
- cls.token_pool.release()
-
- @classmethod
- def run_iface_parallel(cls, ifupdownobj, ifacename, op):
- """ Configures interface in parallel.
-
- Executes all its direct dependents in parallel
-
- """
-
- ifupdownobj.logger.debug('%s:' %ifacename + ' %s' %op)
- cls.accquire_token(iface)
-
- # Each iface can have a list of objects
- ifaceobjs = ifupdownobj.get_ifaceobjs(ifacename)
- if ifaceobjs is None:
- ifupdownobj.logger.warning('%s: ' %ifacename + 'not found')
- cls.release_token(ifacename)
- return -1
-
- for ifaceobj in ifaceobjs:
- # Run dependents
- dlist = ifaceobj.get_lowerifaces()
- if dlist:
- ifupdownobj.logger.debug('%s:' %ifacename +
- ' found dependents: %s' %str(dlist))
- try:
- cls.release_token(ifacename)
- cls.run_iface_list_parallel(ifacename, ifupdownobj,
- dlist, op)
- cls.accquire_token(ifacename)
- except Exception, e:
- if ifupdownobj.ignore_error(str(e)):
- pass
- else:
- # Dont bring the iface up if children did not come up
- ifupdownobj.logger.debug('%s:' %ifacename +
- ' there was an error bringing %s' %op +
- ' dependents (%s)', str(e))
- ifupdownobj.set_iface_state(ifaceobj,
- ifaceState.from_str(ops[0]),
- ifaceStatus.ERROR)
- return -1
-
- # Run all sub operations sequentially
- try:
- ifupdownobj.logger.debug('%s:' %ifacename +
- ' running sub-operations')
- cls.run_iface_ops(ifupdownobj, ifaceobj, op)
- except Exception, e:
- ifupdownobj.logger.error('%s:' %ifacename +
- ' error running sub operations (%s)' %str(e))
-
- cls.release_token(ifacename)
-
- @classmethod
- def run_iface_list_parallel(cls, parent, ifupdownobj, ifacenames, op):
- """ Runs interface list in parallel """
-
- running_threads = OrderedDict()
- err = 0
-
- for ifacename in ifacenames:
- try:
- cls.accquire_token(parent)
- running_threads[ifacename] = Thread(None,
- cls.run_iface_parallel, ifacename,
- args=(ifupdownobj, ifacename, op))
- running_threads[ifacename].start()
- cls.release_token(parent)
- except Exception, e:
- cls.release_token(parent)
- if ifupdownobj.ignore_error(str(e)):
- pass
- else:
- raise Exception('error starting thread for iface %s'
- %ifacename)
-
-
- ifupdownobj.logger.debug('%s ' %parent +
- 'waiting for all the threads ...')
- for ifacename, t in running_threads.items():
- t.join()
- if ifupdownobj.get_iface_status(ifacename) != ifaceStatus.SUCCESS:
- err += 1
-
- return err
-
- @classmethod
- def run_iface_graphs_parallel(cls, parent, ifupdownobj, ifacenames, op):
- """ Runs iface graphs in parallel """
-
- running_threads = OrderedDict()
- err = 0
-
- for ifacename in ifacenames:
- try:
- cls.accquire_graph_token(parent)
- running_threads[ifacename] = Thread(None,
- cls.run_iface_parallel, ifacename,
- args=(ifupdownobj, ifacename, op))
- running_threads[ifacename].start()
- cls.release_graph_token(parent)
- except Exception, e:
- cls.release_graph_token(parent)
- if ifupdownobj.ignore_error(str(e)):
- pass
- else:
- raise Exception('error starting thread for iface %s'
- %ifacename)
-
- ifupdownobj.logger.info('%s ' %parent +
- 'waiting for all the threads ...')
- for ifacename, t in running_threads.items():
- t.join()
- # Check status of thread
- # XXX: Check all objs
- if ifupdownobj.get_iface_status(ifacename) != ifaceStatus.SUCCESS:
- err += 1
- return err
-
- @classmethod
- def run_iface_dependency_graph_parallel(cls, ifupdownobj, dependency_graph,
- operation):
- """ Runs iface dependeny graph in parallel.
-
- arguments:
- ifupdownobj -- ifupdown object (used for getting and updating iface
- object state)
- dependency_graph -- dependency graph with
- operation -- 'up' or 'down' or 'query'
-
- """
-
- ifupdownobj.logger.debug('running dependency graph in parallel ..')
- run_queue = []
- # Build a list of ifaces that dont have any dependencies
- for ifacename in dependency_graph.keys():
- if ifupdownobj.get_iface_refcnt(ifacename) == 0:
- run_queue.append(ifacename)
-
- ifupdownobj.logger.debug('graph roots (interfaces that dont'
- ' have dependents):' + ' %s' %str(run_queue))
- cls.init_tokens(ifupdownobj.get_njobs())
- return cls.run_iface_list_parallel('main', ifupdownobj, run_queue,
- operation)
-
- # OR
- # Run one graph at a time
- #for iface in run_queue:
- # self.run_iface_list_parallel('main', ifupdownobj, [iface],
- # operation)
-