mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Add some tests to the volume store
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
This commit is contained in:
parent
9e1c4f9906
commit
834d0e262a
6 changed files with 231 additions and 6 deletions
|
@ -34,7 +34,6 @@ func TestVolumesCreateAndList(t *testing.T) {
|
||||||
Driver: "local",
|
Driver: "local",
|
||||||
Scope: "local",
|
Scope: "local",
|
||||||
Name: name,
|
Name: name,
|
||||||
Options: map[string]string{},
|
|
||||||
Mountpoint: fmt.Sprintf("%s/volumes/%s/_data", testEnv.DaemonInfo.DockerRootDir, name),
|
Mountpoint: fmt.Sprintf("%s/volumes/%s/_data", testEnv.DaemonInfo.DockerRootDir, name),
|
||||||
}
|
}
|
||||||
assert.Equal(t, vol, expected)
|
assert.Equal(t, vol, expected)
|
||||||
|
@ -95,7 +94,6 @@ func TestVolumesInspect(t *testing.T) {
|
||||||
Driver: "local",
|
Driver: "local",
|
||||||
Scope: "local",
|
Scope: "local",
|
||||||
Name: name,
|
Name: name,
|
||||||
Options: map[string]string{},
|
|
||||||
Mountpoint: fmt.Sprintf("%s/volumes/%s/_data", testEnv.DaemonInfo.DockerRootDir, name),
|
Mountpoint: fmt.Sprintf("%s/volumes/%s/_data", testEnv.DaemonInfo.DockerRootDir, name),
|
||||||
}
|
}
|
||||||
assert.Equal(t, vol, expected)
|
assert.Equal(t, vol, expected)
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
||||||
"github.com/boltdb/bolt"
|
"github.com/boltdb/bolt"
|
||||||
|
"github.com/docker/docker/errdefs"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
@ -28,7 +29,10 @@ func setMeta(tx *bolt.Tx, name string, meta volumeMetadata) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
b := tx.Bucket(volumeBucketName)
|
b, err := tx.CreateBucketIfNotExists(volumeBucketName)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "error creating volume bucket")
|
||||||
|
}
|
||||||
return errors.Wrap(b.Put([]byte(name), metaJSON), "error setting volume metadata")
|
return errors.Wrap(b.Put([]byte(name), metaJSON), "error setting volume metadata")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,8 +46,11 @@ func (s *VolumeStore) getMeta(name string) (volumeMetadata, error) {
|
||||||
|
|
||||||
func getMeta(tx *bolt.Tx, name string, meta *volumeMetadata) error {
|
func getMeta(tx *bolt.Tx, name string, meta *volumeMetadata) error {
|
||||||
b := tx.Bucket(volumeBucketName)
|
b := tx.Bucket(volumeBucketName)
|
||||||
|
if b == nil {
|
||||||
|
return errdefs.NotFound(errors.New("volume bucket does not exist"))
|
||||||
|
}
|
||||||
val := b.Get([]byte(name))
|
val := b.Get([]byte(name))
|
||||||
if string(val) == "" {
|
if len(val) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if err := json.Unmarshal(val, meta); err != nil {
|
if err := json.Unmarshal(val, meta); err != nil {
|
||||||
|
|
51
volume/store/db_test.go
Normal file
51
volume/store/db_test.go
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
package store
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/boltdb/bolt"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSetGetMeta(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
dir, err := ioutil.TempDir("", "test-set-get")
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer os.RemoveAll(dir)
|
||||||
|
|
||||||
|
db, err := bolt.Open(filepath.Join(dir, "db"), 0600, &bolt.Options{Timeout: 1 * time.Second})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
store := &VolumeStore{db: db}
|
||||||
|
|
||||||
|
_, err = store.getMeta("test")
|
||||||
|
require.Error(t, err)
|
||||||
|
|
||||||
|
err = db.Update(func(tx *bolt.Tx) error {
|
||||||
|
_, err := tx.CreateBucket(volumeBucketName)
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
meta, err := store.getMeta("test")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, volumeMetadata{}, meta)
|
||||||
|
|
||||||
|
testMeta := volumeMetadata{
|
||||||
|
Name: "test",
|
||||||
|
Driver: "fake",
|
||||||
|
Labels: map[string]string{"a": "1", "b": "2"},
|
||||||
|
Options: map[string]string{"foo": "bar"},
|
||||||
|
}
|
||||||
|
err = store.setMeta("test", testMeta)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
meta, err = store.getMeta("test")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, testMeta, meta)
|
||||||
|
}
|
55
volume/store/restore_test.go
Normal file
55
volume/store/restore_test.go
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
package store
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/docker/docker/volume"
|
||||||
|
volumedrivers "github.com/docker/docker/volume/drivers"
|
||||||
|
volumetestutils "github.com/docker/docker/volume/testutils"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRestore(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
dir, err := ioutil.TempDir("", "test-restore")
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer os.RemoveAll(dir)
|
||||||
|
|
||||||
|
driverName := "test-restore"
|
||||||
|
volumedrivers.Register(volumetestutils.NewFakeDriver(driverName), driverName)
|
||||||
|
defer volumedrivers.Unregister("test-restore")
|
||||||
|
|
||||||
|
s, err := New(dir)
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer s.Shutdown()
|
||||||
|
|
||||||
|
_, err = s.Create("test1", driverName, nil, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
testLabels := map[string]string{"a": "1"}
|
||||||
|
testOpts := map[string]string{"foo": "bar"}
|
||||||
|
_, err = s.Create("test2", driverName, testOpts, testLabels)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
s.Shutdown()
|
||||||
|
|
||||||
|
s, err = New(dir)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
v, err := s.Get("test1")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
dv := v.(volume.DetailedVolume)
|
||||||
|
var nilMap map[string]string
|
||||||
|
require.Equal(t, nilMap, dv.Options())
|
||||||
|
require.Equal(t, nilMap, dv.Labels())
|
||||||
|
|
||||||
|
v, err = s.Get("test2")
|
||||||
|
require.NoError(t, err)
|
||||||
|
dv = v.(volume.DetailedVolume)
|
||||||
|
require.Equal(t, testOpts, dv.Options())
|
||||||
|
require.Equal(t, testLabels, dv.Labels())
|
||||||
|
}
|
|
@ -29,7 +29,10 @@ type volumeWrapper struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v volumeWrapper) Options() map[string]string {
|
func (v volumeWrapper) Options() map[string]string {
|
||||||
options := map[string]string{}
|
if v.options == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
options := make(map[string]string, len(v.options))
|
||||||
for key, value := range v.options {
|
for key, value := range v.options {
|
||||||
options[key] = value
|
options[key] = value
|
||||||
}
|
}
|
||||||
|
@ -37,7 +40,15 @@ func (v volumeWrapper) Options() map[string]string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v volumeWrapper) Labels() map[string]string {
|
func (v volumeWrapper) Labels() map[string]string {
|
||||||
return v.labels
|
if v.labels == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
labels := make(map[string]string, len(v.labels))
|
||||||
|
for key, value := range v.labels {
|
||||||
|
labels[key] = value
|
||||||
|
}
|
||||||
|
return labels
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v volumeWrapper) Scope() string {
|
func (v volumeWrapper) Scope() string {
|
||||||
|
|
|
@ -12,6 +12,8 @@ import (
|
||||||
"github.com/docker/docker/volume"
|
"github.com/docker/docker/volume"
|
||||||
"github.com/docker/docker/volume/drivers"
|
"github.com/docker/docker/volume/drivers"
|
||||||
volumetestutils "github.com/docker/docker/volume/testutils"
|
volumetestutils "github.com/docker/docker/volume/testutils"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCreate(t *testing.T) {
|
func TestCreate(t *testing.T) {
|
||||||
|
@ -291,6 +293,7 @@ func TestDefererencePluginOnCreateError(t *testing.T) {
|
||||||
|
|
||||||
pg := volumetestutils.NewFakePluginGetter(p)
|
pg := volumetestutils.NewFakePluginGetter(p)
|
||||||
volumedrivers.RegisterPluginGetter(pg)
|
volumedrivers.RegisterPluginGetter(pg)
|
||||||
|
defer volumedrivers.RegisterPluginGetter(nil)
|
||||||
|
|
||||||
dir, err := ioutil.TempDir("", "test-plugin-deref-err")
|
dir, err := ioutil.TempDir("", "test-plugin-deref-err")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -320,3 +323,103 @@ func TestDefererencePluginOnCreateError(t *testing.T) {
|
||||||
t.Fatalf("expected 1 plugin reference, got: %d", refs)
|
t.Fatalf("expected 1 plugin reference, got: %d", refs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRefDerefRemove(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
driverName := "test-ref-deref-remove"
|
||||||
|
s, cleanup := setupTest(t, driverName)
|
||||||
|
defer cleanup(t)
|
||||||
|
|
||||||
|
v, err := s.CreateWithRef("test", driverName, "test-ref", nil, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = s.Remove(v)
|
||||||
|
require.Error(t, err)
|
||||||
|
require.Equal(t, errVolumeInUse, err.(*OpErr).Err)
|
||||||
|
|
||||||
|
s.Dereference(v, "test-ref")
|
||||||
|
err = s.Remove(v)
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGet(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
driverName := "test-get"
|
||||||
|
s, cleanup := setupTest(t, driverName)
|
||||||
|
defer cleanup(t)
|
||||||
|
|
||||||
|
_, err := s.Get("not-exist")
|
||||||
|
require.Error(t, err)
|
||||||
|
require.Equal(t, errNoSuchVolume, err.(*OpErr).Err)
|
||||||
|
|
||||||
|
v1, err := s.Create("test", driverName, nil, map[string]string{"a": "1"})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
v2, err := s.Get("test")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, v1, v2)
|
||||||
|
|
||||||
|
dv := v2.(volume.DetailedVolume)
|
||||||
|
require.Equal(t, "1", dv.Labels()["a"])
|
||||||
|
|
||||||
|
err = s.Remove(v1)
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetWithRef(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
driverName := "test-get-with-ref"
|
||||||
|
s, cleanup := setupTest(t, driverName)
|
||||||
|
defer cleanup(t)
|
||||||
|
|
||||||
|
_, err := s.GetWithRef("not-exist", driverName, "test-ref")
|
||||||
|
require.Error(t, err)
|
||||||
|
|
||||||
|
v1, err := s.Create("test", driverName, nil, map[string]string{"a": "1"})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
v2, err := s.GetWithRef("test", driverName, "test-ref")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, v1, v2)
|
||||||
|
|
||||||
|
err = s.Remove(v2)
|
||||||
|
require.Error(t, err)
|
||||||
|
require.Equal(t, errVolumeInUse, err.(*OpErr).Err)
|
||||||
|
|
||||||
|
s.Dereference(v2, "test-ref")
|
||||||
|
err = s.Remove(v2)
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupTest(t *testing.T, name string) (*VolumeStore, func(*testing.T)) {
|
||||||
|
t.Helper()
|
||||||
|
s, cleanup := newTestStore(t)
|
||||||
|
|
||||||
|
volumedrivers.Register(volumetestutils.NewFakeDriver(name), name)
|
||||||
|
return s, func(t *testing.T) {
|
||||||
|
cleanup(t)
|
||||||
|
volumedrivers.Unregister(name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTestStore(t *testing.T) (*VolumeStore, func(*testing.T)) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
dir, err := ioutil.TempDir("", "store-root")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
cleanup := func(t *testing.T) {
|
||||||
|
err := os.RemoveAll(dir)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
s, err := New(dir)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
return s, func(t *testing.T) {
|
||||||
|
s.Shutdown()
|
||||||
|
cleanup(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue