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 }