github.com/pritambaral/docker@v1.4.2-0.20150120174542-b2fe1b3dd952/daemon/graphdriver/vfs/driver.go (about) 1 package vfs 2 3 import ( 4 "fmt" 5 "os" 6 "path" 7 8 "github.com/docker/docker/daemon/graphdriver" 9 "github.com/docker/docker/pkg/chrootarchive" 10 "github.com/docker/libcontainer/label" 11 ) 12 13 func init() { 14 graphdriver.Register("vfs", Init) 15 } 16 17 func Init(home string, options []string) (graphdriver.Driver, error) { 18 d := &Driver{ 19 home: home, 20 } 21 return graphdriver.NaiveDiffDriver(d), nil 22 } 23 24 type Driver struct { 25 home string 26 } 27 28 func (d *Driver) String() string { 29 return "vfs" 30 } 31 32 func (d *Driver) Status() [][2]string { 33 return nil 34 } 35 36 func (d *Driver) Cleanup() error { 37 return nil 38 } 39 40 func (d *Driver) Create(id, parent string) error { 41 dir := d.dir(id) 42 if err := os.MkdirAll(path.Dir(dir), 0700); err != nil { 43 return err 44 } 45 if err := os.Mkdir(dir, 0755); err != nil { 46 return err 47 } 48 opts := []string{"level:s0"} 49 if _, mountLabel, err := label.InitLabels(opts); err == nil { 50 label.Relabel(dir, mountLabel, "") 51 } 52 if parent == "" { 53 return nil 54 } 55 parentDir, err := d.Get(parent, "") 56 if err != nil { 57 return fmt.Errorf("%s: %s", parent, err) 58 } 59 if err := chrootarchive.CopyWithTar(parentDir, dir); err != nil { 60 return err 61 } 62 return nil 63 } 64 65 func (d *Driver) dir(id string) string { 66 return path.Join(d.home, "dir", path.Base(id)) 67 } 68 69 func (d *Driver) Remove(id string) error { 70 if _, err := os.Stat(d.dir(id)); err != nil { 71 return err 72 } 73 return os.RemoveAll(d.dir(id)) 74 } 75 76 func (d *Driver) Get(id, mountLabel string) (string, error) { 77 dir := d.dir(id) 78 if st, err := os.Stat(dir); err != nil { 79 return "", err 80 } else if !st.IsDir() { 81 return "", fmt.Errorf("%s: not a directory", dir) 82 } 83 return dir, nil 84 } 85 86 func (d *Driver) Put(id string) error { 87 // The vfs driver has no runtime resources (e.g. mounts) 88 // to clean up, so we don't need anything here 89 return nil 90 } 91 92 func (d *Driver) Exists(id string) bool { 93 _, err := os.Stat(d.dir(id)) 94 return err == nil 95 }