From 0d0ca69e5cc4019c2102fb12d5cedfdd3f03a8e1 Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Thu, 7 May 2015 14:32:30 -0700 Subject: [PATCH 1/2] Volume plugins usage Signed-off-by: Alexander Morozov --- daemon/create.go | 2 +- daemon/daemon.go | 35 ++++++++++++++++++++++++++++++----- daemon/delete.go | 6 ++++-- runconfig/config.go | 1 + 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/daemon/create.go b/daemon/create.go index 533d2f0178915..895b5b4673c62 100644 --- a/daemon/create.go +++ b/daemon/create.go @@ -137,7 +137,7 @@ func (daemon *Daemon) Create(config *runconfig.Config, hostConfig *runconfig.Hos if stat, err := os.Stat(path); err == nil && !stat.IsDir() { return nil, nil, fmt.Errorf("cannot mount volume over existing file, file exists %s", path) } - v, err := daemon.volumeDriver.Create(name) + v, err := daemon.createVolume(name, config.VolumeDriver) if err != nil { return nil, nil, err } diff --git a/daemon/daemon.go b/daemon/daemon.go index d45d78d8a2c8e..d8323395b06f4 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -109,7 +109,6 @@ type Daemon struct { defaultLogConfig runconfig.LogConfig RegistryService *registry.Service EventsService *events.Events - volumeDriver volume.Driver } // Get looks for a container using the provided information, which could be @@ -207,8 +206,8 @@ func (daemon *Daemon) register(container *Container, updateSuffixarray bool) err // we'll waste time if we update it for every container daemon.idIndex.Add(container.ID) - for name := range container.VolumeConfig { - v, err := daemon.volumeDriver.Create(name) + for name, config := range container.VolumeConfig { + v, err := daemon.createVolume(name, config.Driver) if err != nil { return err } @@ -933,7 +932,6 @@ func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemo d.defaultLogConfig = config.LogConfig d.RegistryService = registryService d.EventsService = eventsService - d.volumeDriver = volumesDriver if err := d.restore(); err != nil { return nil, err @@ -947,6 +945,33 @@ func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemo return d, nil } +func (d *Daemon) createVolume(name, driverName string) (volume.Volume, error) { + vd, err := d.getVolumeDriver(driverName) + if err != nil { + return nil, err + } + return vd.Create(name) +} + +func (d *Daemon) removeVolume(v volume.Volume) error { + vd, err := d.getVolumeDriver(v.DriverName()) + if err != nil { + return nil + } + return vd.Remove(v) +} + +func (d *Daemon) getVolumeDriver(name string) (volume.Driver, error) { + if name == "" { + name = "local" + } + vd := volume.Drivers.Lookup(name) + if vd == nil { + return nil, fmt.Errorf("Volumes Driver %s isn't registered", name) + } + return vd, nil +} + func (daemon *Daemon) Shutdown() error { if daemon.containerGraph != nil { if err := daemon.containerGraph.Close(); err != nil { @@ -1303,7 +1328,7 @@ func (container *Container) containsBind(dest string) bool { func (container *Container) addVolumesFrom(c *Container, mode string) ([]*vv, error) { var volumes []*vv for name, config := range c.VolumeConfig { - lv, err := container.daemon.volumeDriver.Create(name) + lv, err := container.daemon.createVolume(name, config.Driver) if err != nil { return nil, err } diff --git a/daemon/delete.go b/daemon/delete.go index bd19d2d05524b..022db9f15d56d 100644 --- a/daemon/delete.go +++ b/daemon/delete.go @@ -71,7 +71,7 @@ func (daemon *Daemon) ContainerRm(name string, config *ContainerRmConfig) error container.LogEvent("destroy") if config.RemoveVolume { for _, v := range container.volumes { - daemon.volumeDriver.Remove(v) + daemon.removeVolume(v) } } } @@ -156,7 +156,9 @@ func (daemon *Daemon) commonRm(container *Container, forceRemove bool) (err erro func (daemon *Daemon) DeleteVolumes(c *Container) error { for _, v := range c.volumes { - daemon.volumeDriver.Remove(v) + if err := daemon.removeVolume(v); err != nil { + return err + } } return nil } diff --git a/runconfig/config.go b/runconfig/config.go index 844958be2c3ca..011c557aad95b 100644 --- a/runconfig/config.go +++ b/runconfig/config.go @@ -117,6 +117,7 @@ type Config struct { Cmd *Command Image string // Name of the image as it was passed by the operator (eg. could be symbolic) Volumes map[string]struct{} + VolumeDriver string WorkingDir string Entrypoint *Entrypoint NetworkDisabled bool From dbdf3a1b17a66a1d5a665da0f83f0bfb0607426e Mon Sep 17 00:00:00 2001 From: Jeff Lindsay Date: Thu, 7 May 2015 15:51:54 -0700 Subject: [PATCH 2/2] Adding --volume-driver flag mapped to runconfig.Config Signed-off-by: Jeff Lindsay --- runconfig/parse.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/runconfig/parse.go b/runconfig/parse.go index 63eeecc5f6ef7..7e1ac912fd5be 100644 --- a/runconfig/parse.go +++ b/runconfig/parse.go @@ -72,6 +72,7 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe flReadonlyRootfs = cmd.Bool([]string{"-read-only"}, false, "Mount the container's root filesystem as read only") flLoggingDriver = cmd.String([]string{"-log-driver"}, "", "Logging driver for container") flCgroupParent = cmd.String([]string{"-cgroup-parent"}, "", "Optional parent cgroup for the container") + flVolumeDriver = cmd.String([]string{"-volume-driver"}, "", "Optional volume driver for the container") ) cmd.Var(&flAttach, []string{"a", "-attach"}, "Attach to STDIN, STDOUT or STDERR") @@ -296,6 +297,7 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe Entrypoint: entrypoint, WorkingDir: *flWorkingDir, Labels: convertKVStringsToMap(labels), + VolumeDriver: *flVolumeDriver, } hostConfig := &HostConfig{