docs: def _get_all_descendants(self):
          """
          traverses all descendants nodes
          :raises: CircularDependency if self is contained in descendants
          :return: a set containing all descendant nodes
          """
          descendants = set()
          descendants = descendants.union(self.child_nodes)
          for child in self.child_nodes:
              descendants = descendants.union(child._get_all_descendants())
  
          if self in descendants:
              log.error('circular dependancy found in %s. Descendants: %s ', self, descendants)
              raise CircularDependency('Node %s contains itself in it\'s list of dependencies.' % (self.job.name,))
          return descendants