2016-06-07 14:28:28 -07:00
|
|
|
package scheduler
|
|
|
|
|
|
|
|
import "github.com/docker/swarmkit/api"
|
|
|
|
|
|
|
|
// NodeInfo contains a node and some additional metadata.
|
|
|
|
type NodeInfo struct {
|
|
|
|
*api.Node
|
|
|
|
Tasks map[string]*api.Task
|
2016-06-15 22:41:30 -07:00
|
|
|
AvailableResources api.Resources
|
2016-06-07 14:28:28 -07:00
|
|
|
}
|
|
|
|
|
2016-06-15 22:41:30 -07:00
|
|
|
func newNodeInfo(n *api.Node, tasks map[string]*api.Task, availableResources api.Resources) NodeInfo {
|
2016-06-07 14:28:28 -07:00
|
|
|
nodeInfo := NodeInfo{
|
|
|
|
Node: n,
|
|
|
|
Tasks: make(map[string]*api.Task),
|
|
|
|
AvailableResources: availableResources,
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, t := range tasks {
|
|
|
|
nodeInfo.addTask(t)
|
|
|
|
}
|
|
|
|
return nodeInfo
|
|
|
|
}
|
|
|
|
|
|
|
|
func (nodeInfo *NodeInfo) removeTask(t *api.Task) bool {
|
2016-07-05 11:37:26 -04:00
|
|
|
if nodeInfo.Tasks == nil {
|
2016-06-07 14:28:28 -07:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
if _, ok := nodeInfo.Tasks[t.ID]; !ok {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
delete(nodeInfo.Tasks, t.ID)
|
2016-06-15 22:41:30 -07:00
|
|
|
reservations := taskReservations(t.Spec)
|
|
|
|
nodeInfo.AvailableResources.MemoryBytes += reservations.MemoryBytes
|
|
|
|
nodeInfo.AvailableResources.NanoCPUs += reservations.NanoCPUs
|
2016-06-07 14:28:28 -07:00
|
|
|
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func (nodeInfo *NodeInfo) addTask(t *api.Task) bool {
|
|
|
|
if nodeInfo.Tasks == nil {
|
|
|
|
nodeInfo.Tasks = make(map[string]*api.Task)
|
|
|
|
}
|
|
|
|
if _, ok := nodeInfo.Tasks[t.ID]; !ok {
|
|
|
|
nodeInfo.Tasks[t.ID] = t
|
2016-06-15 22:41:30 -07:00
|
|
|
reservations := taskReservations(t.Spec)
|
|
|
|
nodeInfo.AvailableResources.MemoryBytes -= reservations.MemoryBytes
|
|
|
|
nodeInfo.AvailableResources.NanoCPUs -= reservations.NanoCPUs
|
2016-06-07 14:28:28 -07:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func taskReservations(spec api.TaskSpec) (reservations api.Resources) {
|
|
|
|
if spec.Resources != nil && spec.Resources.Reservations != nil {
|
|
|
|
reservations = *spec.Resources.Reservations
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|