From 55b78f599607b4d92b46d2edfb1eacef129472c3 Mon Sep 17 00:00:00 2001 From: Tardis Xu Date: Mon, 13 Aug 2018 17:13:15 +0800 Subject: [PATCH] bugfix: fix that ListVolumes did not implement filter by labels. --- storage/volume/core.go | 13 ++++++++++++ storage/volume/core_test.go | 42 +++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/storage/volume/core.go b/storage/volume/core.go index c47096c58..fb5b70920 100644 --- a/storage/volume/core.go +++ b/storage/volume/core.go @@ -286,7 +286,20 @@ func (c *Core) ListVolumes(labels map[string]string) ([]*types.Volume, error) { c.store.Put(v) retVolumes = append(retVolumes, v) + } + + // filter volumes if specify labels + if len(labels) != 0 { + filteredVolumes := make([]*types.Volume, 0) + for k, v := range labels { + for _, vol := range retVolumes { + if val, ok := vol.Labels[k]; ok && val == v { + filteredVolumes = append(filteredVolumes, vol) + } + } + } + return filteredVolumes, nil } return retVolumes, nil diff --git a/storage/volume/core_test.go b/storage/volume/core_test.go index cc3f26647..b8ffd44f9 100644 --- a/storage/volume/core_test.go +++ b/storage/volume/core_test.go @@ -1,6 +1,7 @@ package volume import ( + "fmt" "io/ioutil" "os" "path" @@ -175,6 +176,47 @@ func TestListVolumes(t *testing.T) { } } +func TestListVolumesWithLabels(t *testing.T) { + driverName := "fake_driver5" + dir, err := ioutil.TempDir("", "TestListVolumesWithLabels") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dir) + + core, err := createVolumeCore(dir) + if err != nil { + t.Fatal(err) + } + + driver.Register(driver.NewFakeDriver(driverName)) + defer driver.Unregister(driverName) + + var i int64 + for i = 0; i < 6; i++ { + volName := strconv.FormatInt(i, 10) + volid := types.VolumeID{Name: volName, Driver: driverName, Labels: map[string]string{fmt.Sprintf("label-%v", i): fmt.Sprintf("value-%v", i)}} + _, err := core.CreateVolume(volid) + if err != nil { + t.Fatalf("create volume error: %v", err) + } + } + + testLabels := map[string]string{"test-label": "test-value"} + + testVolume, err := core.CreateVolume(types.VolumeID{Name: "test-volume", Driver: driverName, Labels: testLabels}) + if err != nil { + t.Fatalf("create volume error: %v", err) + } + realVolume, err := core.ListVolumes(testLabels) + if err != nil { + t.Fatalf("list volumes error: %v", err) + } + if len(realVolume) != 1 || testVolume.UID != realVolume[0].UID { + t.Fatalf("fail to list volumes with labels %v, expect value is %v, real value is %v.", testLabels, testVolume, realVolume[0]) + } +} + func TestListVolumeName(t *testing.T) { driverName := "my_fake" dir, err := ioutil.TempDir("", "TestGetVolume")