package volumedrivers import ( "fmt" "github.com/docker/docker/volume" ) type volumeDriverAdapter struct { name string proxy *volumeDriverProxy } func (a *volumeDriverAdapter) Name() string { return a.name } func (a *volumeDriverAdapter) Create(name string, opts map[string]string) (volume.Volume, error) { if err := a.proxy.Create(name, opts); err != nil { return nil, err } return &volumeAdapter{ proxy: a.proxy, name: name, driverName: a.name}, nil } func (a *volumeDriverAdapter) Remove(v volume.Volume) error { return a.proxy.Remove(v.Name()) } func (a *volumeDriverAdapter) List() ([]volume.Volume, error) { ls, err := a.proxy.List() if err != nil { return nil, err } var out []volume.Volume for _, vp := range ls { out = append(out, &volumeAdapter{ proxy: a.proxy, name: vp.Name, driverName: a.name, eMount: vp.Mountpoint, }) } return out, nil } func (a *volumeDriverAdapter) Get(name string) (volume.Volume, error) { v, err := a.proxy.Get(name) if err != nil { return nil, err } // plugin may have returned no volume and no error if v == nil { return nil, fmt.Errorf("no such volume") } return &volumeAdapter{ proxy: a.proxy, name: v.Name, driverName: a.Name(), eMount: v.Mountpoint, }, nil } type volumeAdapter struct { proxy *volumeDriverProxy name string driverName string eMount string // ephemeral host volume path } type proxyVolume struct { Name string Mountpoint string } func (a *volumeAdapter) Name() string { return a.name } func (a *volumeAdapter) DriverName() string { return a.driverName } func (a *volumeAdapter) Path() string { if len(a.eMount) > 0 { return a.eMount } m, _ := a.proxy.Path(a.name) return m } func (a *volumeAdapter) Mount() (string, error) { var err error a.eMount, err = a.proxy.Mount(a.name) return a.eMount, err } func (a *volumeAdapter) Unmount() error { return a.proxy.Unmount(a.name) }