traverses all descendants nodes
        :raises: CircularDependency if self is contained in descendants
        :return: a set containing all descendant nodes

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