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:
David Calavera
2015-05-22 10:37:00 -07:00
parent 801e8947c6
commit fd9e9a6b5b
8 changed files with 217 additions and 57 deletions

View File

@ -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 {

View File

@ -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

View File

@ -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)
}