Propagate unmount events to the external volume drivers.
Signed-off-by: David Calavera <david.calavera@gmail.com> Upstream-commit: d592778f4a75d36745aaffaf73c0775ecd420545 Component: engine
This commit is contained in:
@ -16,7 +16,10 @@ func (a *volumeDriverAdapter) Create(name string) (volume.Volume, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &volumeAdapter{a.proxy, name, a.name}, nil
|
||||
return &volumeAdapter{
|
||||
proxy: a.proxy,
|
||||
name: name,
|
||||
driverName: a.name}, nil
|
||||
}
|
||||
|
||||
func (a *volumeDriverAdapter) Remove(v volume.Volume) error {
|
||||
@ -27,6 +30,7 @@ type volumeAdapter struct {
|
||||
proxy *volumeDriverProxy
|
||||
name string
|
||||
driverName string
|
||||
eMount string // ephemeral host volume path
|
||||
}
|
||||
|
||||
func (a *volumeAdapter) Name() string {
|
||||
@ -38,12 +42,17 @@ func (a *volumeAdapter) DriverName() string {
|
||||
}
|
||||
|
||||
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) {
|
||||
return a.proxy.Mount(a.name)
|
||||
var err error
|
||||
a.eMount, err = a.proxy.Mount(a.name)
|
||||
return a.eMount, err
|
||||
}
|
||||
|
||||
func (a *volumeAdapter) Unmount() error {
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
package volumedrivers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"github.com/Sirupsen/logrus"
|
||||
"github.com/docker/docker/pkg/plugins"
|
||||
"github.com/docker/docker/volume"
|
||||
)
|
||||
@ -52,9 +52,9 @@ func Lookup(name string) (volume.Driver, error) {
|
||||
}
|
||||
pl, err := plugins.Get(name, "VolumeDriver")
|
||||
if err != nil {
|
||||
logrus.Errorf("Error: %v", err)
|
||||
return nil, err
|
||||
return nil, fmt.Errorf("Error looking up volume plugin %s: %v", name, err)
|
||||
}
|
||||
|
||||
d := NewVolumeDriver(name, pl.Client)
|
||||
drivers.extensions[name] = d
|
||||
return d, nil
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
package volumedrivers
|
||||
|
||||
import "fmt"
|
||||
|
||||
// currently created by hand. generation tool would generate this like:
|
||||
// $ rpc-gen volume/drivers/api.go VolumeDriver > volume/drivers/proxy.go
|
||||
|
||||
@ -21,9 +23,9 @@ func (pp *volumeDriverProxy) Create(name string) error {
|
||||
var ret volumeDriverResponse
|
||||
err := pp.c.Call("VolumeDriver.Create", args, &ret)
|
||||
if err != nil {
|
||||
return err
|
||||
return pp.fmtError(name, err)
|
||||
}
|
||||
return ret.Err
|
||||
return pp.fmtError(name, ret.Err)
|
||||
}
|
||||
|
||||
func (pp *volumeDriverProxy) Remove(name string) error {
|
||||
@ -31,27 +33,27 @@ func (pp *volumeDriverProxy) Remove(name string) error {
|
||||
var ret volumeDriverResponse
|
||||
err := pp.c.Call("VolumeDriver.Remove", args, &ret)
|
||||
if err != nil {
|
||||
return err
|
||||
return pp.fmtError(name, err)
|
||||
}
|
||||
return ret.Err
|
||||
return pp.fmtError(name, ret.Err)
|
||||
}
|
||||
|
||||
func (pp *volumeDriverProxy) Path(name string) (string, error) {
|
||||
args := volumeDriverRequest{name}
|
||||
var ret volumeDriverResponse
|
||||
if err := pp.c.Call("VolumeDriver.Path", args, &ret); err != nil {
|
||||
return "", err
|
||||
return "", pp.fmtError(name, err)
|
||||
}
|
||||
return ret.Mountpoint, ret.Err
|
||||
return ret.Mountpoint, pp.fmtError(name, ret.Err)
|
||||
}
|
||||
|
||||
func (pp *volumeDriverProxy) Mount(name string) (string, error) {
|
||||
args := volumeDriverRequest{name}
|
||||
var ret volumeDriverResponse
|
||||
if err := pp.c.Call("VolumeDriver.Mount", args, &ret); err != nil {
|
||||
return "", err
|
||||
return "", pp.fmtError(name, err)
|
||||
}
|
||||
return ret.Mountpoint, ret.Err
|
||||
return ret.Mountpoint, pp.fmtError(name, ret.Err)
|
||||
}
|
||||
|
||||
func (pp *volumeDriverProxy) Unmount(name string) error {
|
||||
@ -59,7 +61,14 @@ func (pp *volumeDriverProxy) Unmount(name string) error {
|
||||
var ret volumeDriverResponse
|
||||
err := pp.c.Call("VolumeDriver.Unmount", args, &ret)
|
||||
if err != nil {
|
||||
return err
|
||||
return pp.fmtError(name, err)
|
||||
}
|
||||
return ret.Err
|
||||
return pp.fmtError(name, ret.Err)
|
||||
}
|
||||
|
||||
func (pp *volumeDriverProxy) fmtError(name string, err error) error {
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("External volume driver request failed for %s: %v", name, err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user