github.com/justinjmoses/evergreen@v0.0.0-20170530173719-1d50e381ff0d/scheduler/task_duration_estimator.go (about)

     1  package scheduler
     2  
     3  import (
     4  	"github.com/evergreen-ci/evergreen/model"
     5  	"github.com/evergreen-ci/evergreen/model/task"
     6  	"github.com/pkg/errors"
     7  )
     8  
     9  // TaskDurationEstimator is responsible for fetching the expected duration for a
    10  // given set of runnable tasks.
    11  type TaskDurationEstimator interface {
    12  	GetExpectedDurations(runnableTasks []task.Task) (
    13  		model.ProjectTaskDurations, error)
    14  }
    15  
    16  // DBTaskDurationEstimator retrives the estimated duration of runnable tasks.
    17  // Implements TaskDurationEstimator.
    18  type DBTaskDurationEstimator struct{}
    19  
    20  // GetExpectedDurations returns the expected duration of tasks
    21  // (by display name) on a project, buildvariant basis.
    22  func (self *DBTaskDurationEstimator) GetExpectedDurations(
    23  	runnableTasks []task.Task) (model.ProjectTaskDurations, error) {
    24  	durations := model.ProjectTaskDurations{}
    25  
    26  	// get the average task duration for all the runnable tasks
    27  	for _, t := range runnableTasks {
    28  		if durations.TaskDurationByProject == nil {
    29  			durations.TaskDurationByProject =
    30  				make(map[string]*model.BuildVariantTaskDurations)
    31  		}
    32  
    33  		_, ok := durations.TaskDurationByProject[t.Project]
    34  		if !ok {
    35  			durations.TaskDurationByProject[t.Project] =
    36  				&model.BuildVariantTaskDurations{}
    37  		}
    38  
    39  		projectDurations := durations.TaskDurationByProject[t.Project]
    40  		if projectDurations.TaskDurationByBuildVariant == nil {
    41  			durations.TaskDurationByProject[t.Project].
    42  				TaskDurationByBuildVariant = make(map[string]*model.TaskDurations)
    43  		}
    44  
    45  		_, ok = projectDurations.TaskDurationByBuildVariant[t.BuildVariant]
    46  		if !ok {
    47  			expTaskDurationByDisplayName, err := task.ExpectedTaskDuration(
    48  				t.Project, t.BuildVariant,
    49  				model.TaskCompletionEstimateWindow)
    50  			if err != nil {
    51  				return durations, errors.Wrapf(err, "Error fetching "+
    52  					"expected task duration for %v on %v",
    53  					t.BuildVariant, t.Project)
    54  			}
    55  			durations.TaskDurationByProject[t.Project].
    56  				TaskDurationByBuildVariant[t.BuildVariant] =
    57  				&model.TaskDurations{expTaskDurationByDisplayName}
    58  		}
    59  	}
    60  	return durations, nil
    61  }