func (s *DiegoScheduler) createTaskTaskInfo(slaveId *mesos.SlaveID, taskAuction *auctiontypes.TaskAuction) *mesos.TaskInfo { work, _ := json.Marshal(rep.Work{LRPs: []rep.LRP{}, Tasks: []rep.Task{taskAuction.Task}}) taskId := mesos.TaskID{Value: proto.String(taskAuction.Identifier())} taskInfo := mesos.TaskInfo{ Name: proto.String(taskAuction.Identifier()), TaskId: &taskId, SlaveId: slaveId, Executor: s.executor, Resources: []*mesos.Resource{ util.NewScalarResource("cpus", taskCpuAllocation), util.NewScalarResource("mem", float64(taskAuction.MemoryMB)), util.NewScalarResource("disk", float64(taskAuction.DiskMB)), }, Data: work, } return &taskInfo }
func (s *Scheduler) scheduleTaskAuction(taskAuction *auctiontypes.TaskAuction, startingContainerWeight float64) (*auctiontypes.TaskAuction, error) { var winnerCell *Cell winnerScore := 1e20 filteredZones := []Zone{} for _, zone := range s.zones { cells := zone.FilterCells(taskAuction.RootFs) if len(cells) > 0 { filteredZones = append(filteredZones, Zone(cells)) } } if len(filteredZones) == 0 { return nil, auctiontypes.ErrorCellMismatch } for _, zone := range filteredZones { for _, cell := range zone { score, err := cell.ScoreForTask(&taskAuction.Task, startingContainerWeight) if err != nil { continue } if score < winnerScore { winnerScore = score winnerCell = cell } } } if winnerCell == nil { return nil, rep.ErrorInsufficientResources } err := winnerCell.ReserveTask(&taskAuction.Task) if err != nil { s.logger.Error("task-failed-to-reserve-cell", err, lager.Data{"cell-guid": winnerCell.Guid, "task-guid": taskAuction.Identifier()}) return nil, err } winningAuction := taskAuction.Copy() winningAuction.Winner = winnerCell.Guid return &winningAuction, nil }