in pkg/scheduler/api/node_info.go [378:424]
func (ni *NodeInfo) AddTask(task *TaskInfo) error {
if len(task.NodeName) > 0 && len(ni.Name) > 0 && task.NodeName != ni.Name {
return fmt.Errorf("task <%v/%v> already on different node <%v>",
task.Namespace, task.Name, task.NodeName)
}
key := PodKey(task.Pod)
if _, found := ni.Tasks[key]; found {
return fmt.Errorf("task <%v/%v> already on node <%v>",
task.Namespace, task.Name, ni.Name)
}
// Node will hold a copy of task to make sure the status
// change will not impact resource in node.
ti := task.Clone()
if ni.Node != nil {
switch ti.Status {
case Releasing:
if err := ni.allocateIdleResource(ti); err != nil {
return err
}
ni.Releasing.Add(ti.Resreq)
ni.Used.Add(ti.Resreq)
ni.AddGPUResource(ti.Pod)
case Pipelined:
ni.Pipelined.Add(ti.Resreq)
default:
if err := ni.allocateIdleResource(ti); err != nil {
return err
}
ni.Used.Add(ti.Resreq)
ni.AddGPUResource(ti.Pod)
}
}
if ni.NumaInfo != nil {
ni.NumaInfo.AddTask(ti)
}
// Update task node name upon successful task addition.
task.NodeName = ni.Name
ti.NodeName = ni.Name
ni.Tasks[key] = ti
return nil
}