docs/cluster/container.go

89 lines
1.9 KiB
Go

package cluster
import (
"strings"
"github.com/docker/docker/pkg/stringid"
"github.com/samalba/dockerclient"
)
// Container is exported
type Container struct {
dockerclient.Container
Config *ContainerConfig
Info dockerclient.ContainerInfo
Engine *Engine
}
// Refresh container
func (c *Container) Refresh() (*Container, error) {
return c.Engine.refreshContainer(c.Id, true)
}
// Containers represents a list a containers
type Containers []*Container
// Get returns a container using it's ID or Name
func (containers Containers) Get(IDOrName string) *Container {
// Abort immediately if the name is empty.
if len(IDOrName) == 0 {
return nil
}
// Match exact or short Container ID.
for _, container := range containers {
if container.Id == IDOrName || stringid.TruncateID(container.Id) == IDOrName {
return container
}
}
// Match exact Swarm ID.
for _, container := range containers {
if swarmID := container.Config.SwarmID(); swarmID == IDOrName || stringid.TruncateID(swarmID) == IDOrName {
return container
}
}
candidates := []*Container{}
// Match name, /name or engine/name.
for _, container := range containers {
found := false
for _, name := range container.Names {
if name == IDOrName || name == "/"+IDOrName || container.Engine.ID+name == IDOrName || container.Engine.Name+name == IDOrName {
found = true
}
}
if found {
candidates = append(candidates, container)
}
}
if size := len(candidates); size == 1 {
return candidates[0]
} else if size > 1 {
return nil
}
// Match Container ID prefix.
for _, container := range containers {
if strings.HasPrefix(container.Id, IDOrName) {
candidates = append(candidates, container)
}
}
// Match Swarm ID prefix.
for _, container := range containers {
if strings.HasPrefix(container.Config.SwarmID(), IDOrName) {
candidates = append(candidates, container)
}
}
if len(candidates) == 1 {
return candidates[0]
}
return nil
}