github.com/guilhermebr/docker@v1.4.2-0.20150428121140-67da055cebca/volumes/volume.go (about) 1 package volumes 2 3 import ( 4 "encoding/json" 5 "os" 6 "path/filepath" 7 "sync" 8 9 "github.com/docker/docker/pkg/symlink" 10 ) 11 12 type Volume struct { 13 ID string 14 Path string 15 IsBindMount bool 16 Writable bool 17 containers map[string]struct{} 18 configPath string 19 repository *Repository 20 lock sync.Mutex 21 } 22 23 func (v *Volume) IsDir() (bool, error) { 24 stat, err := os.Stat(v.Path) 25 if err != nil { 26 return false, err 27 } 28 29 return stat.IsDir(), nil 30 } 31 32 func (v *Volume) Containers() []string { 33 v.lock.Lock() 34 35 var containers []string 36 for c := range v.containers { 37 containers = append(containers, c) 38 } 39 40 v.lock.Unlock() 41 return containers 42 } 43 44 func (v *Volume) RemoveContainer(containerId string) { 45 v.lock.Lock() 46 delete(v.containers, containerId) 47 v.lock.Unlock() 48 } 49 50 func (v *Volume) AddContainer(containerId string) { 51 v.lock.Lock() 52 v.containers[containerId] = struct{}{} 53 v.lock.Unlock() 54 } 55 56 func (v *Volume) initialize() error { 57 v.lock.Lock() 58 defer v.lock.Unlock() 59 60 if _, err := os.Stat(v.Path); err != nil { 61 if !os.IsNotExist(err) { 62 return err 63 } 64 if err := os.MkdirAll(v.Path, 0755); err != nil { 65 return err 66 } 67 } 68 69 if err := os.MkdirAll(v.configPath, 0755); err != nil { 70 return err 71 } 72 73 return v.toDisk() 74 } 75 76 func (v *Volume) ToDisk() error { 77 v.lock.Lock() 78 defer v.lock.Unlock() 79 return v.toDisk() 80 } 81 82 func (v *Volume) toDisk() error { 83 jsonPath, err := v.jsonPath() 84 if err != nil { 85 return err 86 } 87 f, err := os.OpenFile(jsonPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) 88 if err != nil { 89 return err 90 } 91 if err := json.NewEncoder(f).Encode(v); err != nil { 92 f.Close() 93 return err 94 } 95 return f.Close() 96 } 97 98 func (v *Volume) FromDisk() error { 99 v.lock.Lock() 100 defer v.lock.Unlock() 101 pth, err := v.jsonPath() 102 if err != nil { 103 return err 104 } 105 106 jsonSource, err := os.Open(pth) 107 if err != nil { 108 return err 109 } 110 defer jsonSource.Close() 111 112 dec := json.NewDecoder(jsonSource) 113 114 return dec.Decode(v) 115 } 116 117 func (v *Volume) jsonPath() (string, error) { 118 return v.getRootResourcePath("config.json") 119 } 120 func (v *Volume) getRootResourcePath(path string) (string, error) { 121 cleanPath := filepath.Join("/", path) 122 return symlink.FollowSymlinkInScope(filepath.Join(v.configPath, cleanPath), v.configPath) 123 } 124 125 func (v *Volume) getResourcePath(path string) (string, error) { 126 cleanPath := filepath.Join("/", path) 127 return symlink.FollowSymlinkInScope(filepath.Join(v.Path, cleanPath), v.Path) 128 }