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  }