From 05d9995985009b5bfc2a67c95a60ca974362af02 Mon Sep 17 00:00:00 2001 From: Eugene Chupriyanov Date: Wed, 24 Feb 2016 18:07:15 +0300 Subject: [PATCH] Proposed fix for https://github.com/docker/swarm/issues/1847 * Fix cluster.Volumes.Get() call for volumes with non-local drivers * Added tests for clusterVolumes.Get() Signed-off-by: Eugene Chupriyanov --- cluster/volume.go | 6 +++ cluster/volume_test.go | 90 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 cluster/volume_test.go diff --git a/cluster/volume.go b/cluster/volume.go index ecf832b59e..09ef1f4f99 100644 --- a/cluster/volume.go +++ b/cluster/volume.go @@ -32,6 +32,12 @@ func (volumes Volumes) Get(name string) *Volume { if size := len(candidates); size == 1 { return candidates[0] } else if size > 1 { + // Match first volume with non-local driver + for _, volume := range candidates { + if volume.Name == name && volume.Driver != "local" { + return volume + } + } return nil } diff --git a/cluster/volume_test.go b/cluster/volume_test.go new file mode 100644 index 0000000000..3eb68bbcd4 --- /dev/null +++ b/cluster/volume_test.go @@ -0,0 +1,90 @@ +package cluster + +import ( + "testing" + + "github.com/samalba/dockerclient" + "github.com/stretchr/testify/assert" +) + +func TestGet(t *testing.T) { + engines := []*Engine{ + {ID: "59C8F4EC-3A71-44C7-BA50-0496B4D8E548", + Name: "swarm-node-0"}, + {ID: "607B1F15-CECA-41B2-9D26-D2626EB14D8D", + Name: "swarm-node-1"}, + } + volumes := Volumes{ + &Volume{ + Volume: dockerclient.Volume{ + Name: "t1", + Driver: "local", + }, + Engine: engines[0], + }, + &Volume{ + Volume: dockerclient.Volume{ + Name: "t2", + Driver: "local", + }, + Engine: engines[0], + }, + &Volume{ + Volume: dockerclient.Volume{ + Name: "t3", + Driver: "rexray", + }, + Engine: engines[0], + }, + &Volume{ + Volume: dockerclient.Volume{ + Name: "t4", + Driver: "flocker", + }, + Engine: engines[0], + }, + &Volume{ + Volume: dockerclient.Volume{ + Name: "t1", + Driver: "local", + }, + Engine: engines[1], + }, + &Volume{ + Volume: dockerclient.Volume{ + Name: "t2", + Driver: "local", + }, + Engine: engines[1], + }, + &Volume{ + Volume: dockerclient.Volume{ + Name: "t3", + Driver: "rexray", + }, + Engine: engines[1], + }, + &Volume{ + Volume: dockerclient.Volume{ + Name: "t4", + Driver: "flocker", + }, + Engine: engines[1], + }, + } + emptyVolumes := Volumes{} + assert.Nil(t, emptyVolumes.Get("test")) + assert.Nil(t, volumes.Get("t1")) + if assert.NotNil(t, volumes.Get(engines[0].ID+"/"+"t1")) { + assert.Equal(t, volumes.Get(engines[0].ID+"/"+"t1"), volumes[0]) + } + if assert.NotNil(t, volumes.Get(engines[0].Name+"/"+"t1")) { + assert.Equal(t, volumes.Get(engines[0].Name+"/"+"t1"), volumes[0]) + } + if assert.NotNil(t, volumes.Get("t3")) { + assert.Equal(t, volumes.Get("t3"), volumes[2]) + } + if assert.NotNil(t, volumes.Get("t4")) { + assert.Equal(t, volumes.Get("t4"), volumes[3]) + } +}