mirror of https://github.com/docker/docs.git
69 lines
1.6 KiB
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
|
|
}
|