Estimate from the descendent (child) tasks.

        :returns: deferred that when fired returns a datetime object for the
                  estimated, or actual datetime, or None if there is no support
                  for this task method. Currently the only supported methods
                  here are "build" and "image".
        :raises NoDescendentsError: If we expected to find descendents for this
                  task, but there are none open. Possible explanations:
                  * Koji has not assigned this task to a worker, because it's
                    over capacity, or because it takes a few seconds to assign.
                    You may see descendant tasks in FREE state here, instead of
                    OPEN state.
                  * The makeSRPMFromSCM descendent task for this build task is
                    not yet complete.
                  * The tagBuild descendent task for this build task is not yet
                    complete.
                  If you hit this NoDescendentsError, you may want to try again
                  in a few minutes.

def estimate_descendents(self):
        """
        Estimate from the descendent (child) tasks.

        :returns: deferred that when fired returns a datetime object for the
                  estimated, or actual datetime, or None if there is no support
                  for this task method. Currently the only supported methods
                  here are "build" and "image".
        :raises NoDescendentsError: If we expected to find descendents for this
                  task, but there are none open. Possible explanations:
                  * Koji has not assigned this task to a worker, because it's
                    over capacity, or because it takes a few seconds to assign.
                    You may see descendant tasks in FREE state here, instead of
                    OPEN state.
                  * The makeSRPMFromSCM descendent task for this build task is
                    not yet complete.
                  * The tagBuild descendent task for this build task is not yet
                    complete.
                  If you hit this NoDescendentsError, you may want to try again
                  in a few minutes.
        """
        child_method = None
        if self.method == 'build':
            child_method = 'buildArch'
        if self.method == 'image':
            child_method = 'createImage'
        if child_method is None:
            defer.returnValue(None)
        # Find the open child task and estimate that.
        subtasks = yield self.descendents(method=child_method,
                                          state=task_states.OPEN)
        if not subtasks:
            raise NoDescendentsError('no running %s for task %d' %
                                     (child_method, self.id))
        # Find subtask with the most recent start time:
        build_task = subtasks[0]
        for subtask in subtasks:
            if subtask.start_ts > build_task.start_ts:
                build_task = subtask
        subtask_completion = yield build_task.estimate_completion()
        defer.returnValue(subtask_completion)