зеркало из https://github.com/microsoft/docker.git
165 строки
3.4 KiB
Go
165 строки
3.4 KiB
Go
|
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)
|
||
|
}
|