]> git.proxmox.com Git - mirror_ifupdown2.git/blobdiff - pkg/scheduler.py
Remove upper device check warnings + implicitly follow upperifaces when
[mirror_ifupdown2.git] / pkg / scheduler.py
index 28a3382dc17552cab546932eb26b84695af71b08..0767435d6989b37298081f53f8ecff482817c0ba 100644 (file)
@@ -114,15 +114,20 @@ class ifaceScheduler():
 
 
     @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.name
         # Deal with upperdevs first
         ulist = ifaceobj.upperifaces
         if ulist:
@@ -137,17 +142,16 @@ class ifaceScheduler():
                 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
@@ -162,8 +166,8 @@ class ifaceScheduler():
             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
@@ -172,8 +176,8 @@ class ifaceScheduler():
             # Run lowerifaces or dependents
             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,
@@ -245,8 +249,8 @@ class ifaceScheduler():
             # Run 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,
@@ -301,10 +305,17 @@ class ifaceScheduler():
         """
 
         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')
@@ -337,251 +348,3 @@ class ifaceScheduler():
         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.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)
-