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 }