docs/scheduler/node/node.go

69 lines
1.6 KiB
Go

package node
import (
"errors"
"github.com/docker/swarm/cluster"
)
// Node is an abstract type used by the scheduler.
type Node struct {
ID string
IP string
Addr string
Name string
Labels map[string]string
Containers cluster.Containers
Images []*cluster.Image
UsedMemory int64
UsedCpus int64
TotalMemory int64
TotalCpus int64
HealthIndicator int64
}
// NewNode creates a node from an engine.
func NewNode(e *cluster.Engine) *Node {
return &Node{
ID: e.ID,
IP: e.IP,
Addr: e.Addr,
Name: e.Name,
Labels: e.Labels,
Containers: e.Containers(),
Images: e.Images(),
UsedMemory: e.UsedMemory(),
UsedCpus: e.UsedCpus(),
TotalMemory: e.TotalMemory(),
TotalCpus: e.TotalCpus(),
HealthIndicator: e.HealthIndicator(),
}
}
// IsHealthy responses if node is in healthy state
func (n *Node) IsHealthy() bool {
return n.HealthIndicator > 0
}
// Container returns the container with IDOrName in the engine.
func (n *Node) Container(IDOrName string) *cluster.Container {
return n.Containers.Get(IDOrName)
}
// AddContainer injects a container into the internal state.
func (n *Node) AddContainer(container *cluster.Container) error {
if container.Config != nil {
memory := container.Config.HostConfig.Memory
cpus := container.Config.HostConfig.CPUShares
if n.TotalMemory-memory < 0 || n.TotalCpus-cpus < 0 {
return errors.New("not enough resources")
}
n.UsedMemory = n.UsedMemory + memory
n.UsedCpus = n.UsedCpus + cpus
}
n.Containers = append(n.Containers, container)
return nil
}