|
@@ -0,0 +1,164 @@
|
|
|
+package volumes
|
|
|
+
|
|
|
+import (
|
|
|
+ "io/ioutil"
|
|
|
+ "os"
|
|
|
+ "path/filepath"
|
|
|
+ "testing"
|
|
|
+
|
|
|
+ "github.com/docker/docker/daemon/graphdriver"
|
|
|
+ _ "github.com/docker/docker/daemon/graphdriver/vfs"
|
|
|
+)
|
|
|
+
|
|
|
+func TestRepositoryFindOrCreate(t *testing.T) {
|
|
|
+ root, err := ioutil.TempDir(os.TempDir(), "volumes")
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+ defer os.RemoveAll(root)
|
|
|
+ repo, err := newRepo(root)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // no path
|
|
|
+ v, err := repo.FindOrCreateVolume("", true)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // FIXME: volumes are heavily dependent on the vfs driver, but this should not be so!
|
|
|
+ expected := filepath.Join(root, "repo-graph", "vfs", "dir", v.ID)
|
|
|
+ if v.Path != expected {
|
|
|
+ t.Fatalf("expected new path to be created in %s, got %s", expected, v.Path)
|
|
|
+ }
|
|
|
+
|
|
|
+ // with a non-existant path
|
|
|
+ dir := filepath.Join(root, "doesntexist")
|
|
|
+ v, err = repo.FindOrCreateVolume(dir, true)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if v.Path != dir {
|
|
|
+ t.Fatalf("expected new path to be created in %s, got %s", dir, v.Path)
|
|
|
+ }
|
|
|
+
|
|
|
+ if _, err := os.Stat(v.Path); err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // with a pre-existing path
|
|
|
+ // can just use the same path from above since it now exists
|
|
|
+ v, err = repo.FindOrCreateVolume(dir, true)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+ if v.Path != dir {
|
|
|
+ t.Fatalf("expected new path to be created in %s, got %s", dir, v.Path)
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+func TestRepositoryGet(t *testing.T) {
|
|
|
+ root, err := ioutil.TempDir(os.TempDir(), "volumes")
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+ defer os.RemoveAll(root)
|
|
|
+ repo, err := newRepo(root)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ v, err := repo.FindOrCreateVolume("", true)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ v2 := repo.Get(v.Path)
|
|
|
+ if v2 == nil {
|
|
|
+ t.Fatalf("expected to find volume but didn't")
|
|
|
+ }
|
|
|
+ if v2 != v {
|
|
|
+ t.Fatalf("expected get to return same volume")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestRepositoryDelete(t *testing.T) {
|
|
|
+ root, err := ioutil.TempDir(os.TempDir(), "volumes")
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+ defer os.RemoveAll(root)
|
|
|
+ repo, err := newRepo(root)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // with a normal volume
|
|
|
+ v, err := repo.FindOrCreateVolume("", true)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if err := repo.Delete(v.Path); err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if v := repo.Get(v.Path); v != nil {
|
|
|
+ t.Fatalf("expected volume to not exist")
|
|
|
+ }
|
|
|
+
|
|
|
+ if _, err := os.Stat(v.Path); err == nil {
|
|
|
+ t.Fatalf("expected volume files to be removed")
|
|
|
+ }
|
|
|
+
|
|
|
+ // with a bind mount
|
|
|
+ dir := filepath.Join(root, "test")
|
|
|
+ v, err = repo.FindOrCreateVolume(dir, true)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if err := repo.Delete(v.Path); err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if v := repo.Get(v.Path); v != nil {
|
|
|
+ t.Fatalf("expected volume to not exist")
|
|
|
+ }
|
|
|
+
|
|
|
+ if _, err := os.Stat(v.Path); err != nil && os.IsNotExist(err) {
|
|
|
+ t.Fatalf("expected bind volume data to persist after destroying volume")
|
|
|
+ }
|
|
|
+
|
|
|
+ // with container refs
|
|
|
+ dir = filepath.Join(root, "test")
|
|
|
+ v, err = repo.FindOrCreateVolume(dir, true)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+ v.AddContainer("1234")
|
|
|
+
|
|
|
+ if err := repo.Delete(v.Path); err == nil {
|
|
|
+ t.Fatalf("expected volume delete to fail due to container refs")
|
|
|
+ }
|
|
|
+
|
|
|
+ v.RemoveContainer("1234")
|
|
|
+ if err := repo.Delete(v.Path); err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+func newRepo(root string) (*Repository, error) {
|
|
|
+ configPath := filepath.Join(root, "repo-config")
|
|
|
+ graphDir := filepath.Join(root, "repo-graph")
|
|
|
+
|
|
|
+ driver, err := graphdriver.GetDriver("vfs", graphDir, []string{})
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ return NewRepository(configPath, driver)
|
|
|
+}
|