diff --git a/cluster/engine.go b/cluster/engine.go index e2d2aac943..09ad4869cf 100644 --- a/cluster/engine.go +++ b/cluster/engine.go @@ -455,35 +455,6 @@ func (e *Engine) Containers() []*Container { return containers } -// Container returns the container with IDOrName in the engine. -func (e *Engine) Container(IDOrName string) *Container { - // Abort immediately if the name is empty. - if len(IDOrName) == 0 { - return nil - } - - for _, container := range e.Containers() { - // Match Container ID prefix. - if strings.HasPrefix(container.Id, IDOrName) { - return container - } - - // Match Swarm ID prefix. - if strings.HasPrefix(container.Config.SwarmID(), IDOrName) { - return container - } - - // Match name, /name or engine/name. - for _, name := range container.Names { - if name == IDOrName || name == "/"+IDOrName || container.Engine.ID+name == IDOrName || container.Engine.Name+name == IDOrName { - return container - } - } - } - - return nil -} - // Images returns all the images in the engine func (e *Engine) Images() []*Image { e.RLock() diff --git a/cluster/engine_test.go b/cluster/engine_test.go index 69dac1b152..202179ae1c 100644 --- a/cluster/engine_test.go +++ b/cluster/engine_test.go @@ -135,38 +135,6 @@ func TestEngineState(t *testing.T) { client.Mock.AssertExpectations(t) } -func TestEngineContainerLookup(t *testing.T) { - engine := NewEngine("test-engine", 0) - assert.False(t, engine.isConnected()) - - client := mockclient.NewMockClient() - client.On("Info").Return(mockInfo, nil) - client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return() - - client.On("ListContainers", true, false, "").Return([]dockerclient.Container{{Id: "container-id", Names: []string{"/container-name1", "/container-name2"}}}, nil).Once() - client.On("ListImages").Return([]*dockerclient.Image{}, nil).Once() - client.On("InspectContainer", "container-id").Return(&dockerclient.ContainerInfo{Config: &dockerclient.ContainerConfig{CpuShares: 100}}, nil).Once() - - assert.NoError(t, engine.connectClient(client)) - assert.True(t, engine.isConnected()) - - // Invalid lookup - assert.Nil(t, engine.Container("invalid-id")) - assert.Nil(t, engine.Container("")) - // Container ID lookup. - assert.NotNil(t, engine.Container("container-id")) - // Container ID prefix lookup. - assert.NotNil(t, engine.Container("container-")) - // Container name lookup. - assert.NotNil(t, engine.Container("container-name1")) - assert.NotNil(t, engine.Container("container-name2")) - // Container engine/name matching. - assert.NotNil(t, engine.Container("id/container-name1")) - assert.NotNil(t, engine.Container("id/container-name2")) - - client.Mock.AssertExpectations(t) -} - func TestCreateContainer(t *testing.T) { var ( config = &ContainerConfig{dockerclient.ContainerConfig{ diff --git a/cluster/swarm/cluster.go b/cluster/swarm/cluster.go index adf4611e8b..b08f988288 100644 --- a/cluster/swarm/cluster.go +++ b/cluster/swarm/cluster.go @@ -371,8 +371,42 @@ func (c *Cluster) Container(IDOrName string) *cluster.Container { c.RLock() defer c.RUnlock() - for _, n := range c.engines { - if container := n.Container(IDOrName); container != nil { + + containers := c.Containers() + + // 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 + } + } + + // Match name, /name or engine/name. + for _, container := range containers { + for _, name := range container.Names { + if name == IDOrName || name == "/"+IDOrName || container.Engine.ID+name == IDOrName || container.Engine.Name+name == IDOrName { + return container + } + } + } + + // Match Container ID prefix. + for _, container := range containers { + if strings.HasPrefix(container.Id, IDOrName) { + return container + } + } + + // Match Swarm ID prefix. + for _, container := range containers { + if strings.HasPrefix(container.Config.SwarmID(), IDOrName) { return container } } diff --git a/cluster/swarm/cluster_test.go b/cluster/swarm/cluster_test.go index aca6828e4c..3cfb6dab5f 100644 --- a/cluster/swarm/cluster_test.go +++ b/cluster/swarm/cluster_test.go @@ -25,36 +25,52 @@ func TestContainerLookup(t *testing.T) { c := &Cluster{ engines: make(map[string]*cluster.Engine), } - container := &cluster.Container{ + container1 := &cluster.Container{ Container: dockerclient.Container{ - Id: "container-id", - Names: []string{"/container-name1", "/container-name2"}, + Id: "container-id1", + Names: []string{"/container1-name1", "/container1-name2"}, }, Config: cluster.BuildContainerConfig(dockerclient.ContainerConfig{ Labels: map[string]string{ - "com.docker.swarm.id": "swarm-id", + "com.docker.swarm.id": "swarm-id1", }, }), } - n := createEngine(t, "test-engine", container) + container2 := &cluster.Container{ + Container: dockerclient.Container{ + Id: "container-id2", + Names: []string{"/con"}, + }, + Config: cluster.BuildContainerConfig(dockerclient.ContainerConfig{ + Labels: map[string]string{ + "com.docker.swarm.id": "swarm-id2", + }, + }), + } + + n := createEngine(t, "test-engine", container1, container2) c.engines[n.ID] = n // Invalid lookup assert.Nil(t, c.Container("invalid-id")) assert.Nil(t, c.Container("")) // Container ID lookup. - assert.NotNil(t, c.Container("container-id")) + assert.NotNil(t, c.Container("container-id1")) // Container ID prefix lookup. assert.NotNil(t, c.Container("container-")) // Container name lookup. - assert.NotNil(t, c.Container("container-name1")) - assert.NotNil(t, c.Container("container-name2")) + assert.NotNil(t, c.Container("container1-name1")) + assert.NotNil(t, c.Container("container1-name2")) // Container engine/name matching. - assert.NotNil(t, c.Container("test-engine/container-name1")) - assert.NotNil(t, c.Container("test-engine/container-name2")) + assert.NotNil(t, c.Container("test-engine/container1-name1")) + assert.NotNil(t, c.Container("test-engine/container1-name2")) // Swarm ID lookup. - assert.NotNil(t, c.Container("swarm-id")) + assert.NotNil(t, c.Container("swarm-id1")) // Swarm ID prefix lookup. assert.NotNil(t, c.Container("swarm-")) + // Match name before ID prefix + cc := c.Container("con") + assert.NotNil(t, cc) + assert.Equal(t, cc.Id, "container-id2") }