Browse Source

Decouple daemon and container to manage volumes.

Signed-off-by: David Calavera <david.calavera@gmail.com>
David Calavera 9 years ago
parent
commit
2c72015ce3
5 changed files with 49 additions and 43 deletions
  1. 0 40
      daemon/container.go
  2. 1 1
      daemon/create.go
  3. 1 1
      daemon/daemon.go
  4. 1 1
      daemon/delete.go
  5. 46 0
      daemon/mounts.go

+ 0 - 40
daemon/container.go

@@ -7,7 +7,6 @@ import (
 	"io"
 	"io"
 	"os"
 	"os"
 	"path/filepath"
 	"path/filepath"
-	"strings"
 	"sync"
 	"sync"
 	"syscall"
 	"syscall"
 	"time"
 	"time"
@@ -31,7 +30,6 @@ import (
 	"github.com/docker/docker/pkg/system"
 	"github.com/docker/docker/pkg/system"
 	"github.com/docker/docker/runconfig"
 	"github.com/docker/docker/runconfig"
 	"github.com/docker/docker/volume"
 	"github.com/docker/docker/volume"
-	"github.com/docker/docker/volume/store"
 )
 )
 
 
 var (
 var (
@@ -667,44 +665,6 @@ func (container *Container) mountVolumes() error {
 	return nil
 	return nil
 }
 }
 
 
-func (container *Container) prepareMountPoints() error {
-	for _, config := range container.MountPoints {
-		if len(config.Driver) > 0 {
-			v, err := container.daemon.createVolume(config.Name, config.Driver, nil)
-			if err != nil {
-				return err
-			}
-			config.Volume = v
-		}
-	}
-	return nil
-}
-
-func (container *Container) removeMountPoints(rm bool) error {
-	var rmErrors []string
-	for _, m := range container.MountPoints {
-		if m.Volume == nil {
-			continue
-		}
-		container.daemon.volumes.Decrement(m.Volume)
-		if rm {
-			err := container.daemon.volumes.Remove(m.Volume)
-			// ErrVolumeInUse is ignored because having this
-			// volume being referenced by other container is
-			// not an error, but an implementation detail.
-			// This prevents docker from logging "ERROR: Volume in use"
-			// where there is another container using the volume.
-			if err != nil && err != store.ErrVolumeInUse {
-				rmErrors = append(rmErrors, err.Error())
-			}
-		}
-	}
-	if len(rmErrors) > 0 {
-		return derr.ErrorCodeRemovingVolume.WithArgs(strings.Join(rmErrors, "\n"))
-	}
-	return nil
-}
-
 func (container *Container) unmountVolumes(forceSyscall bool) error {
 func (container *Container) unmountVolumes(forceSyscall bool) error {
 	var (
 	var (
 		volumeMounts []volume.MountPoint
 		volumeMounts []volume.MountPoint

+ 1 - 1
daemon/create.go

@@ -109,7 +109,7 @@ func (daemon *Daemon) create(params *ContainerCreateConfig) (retC *Container, re
 	}
 	}
 	defer func() {
 	defer func() {
 		if retErr != nil {
 		if retErr != nil {
-			if err := container.removeMountPoints(true); err != nil {
+			if err := daemon.removeMountPoints(container, true); err != nil {
 				logrus.Error(err)
 				logrus.Error(err)
 			}
 			}
 		}
 		}

+ 1 - 1
daemon/daemon.go

@@ -246,7 +246,7 @@ func (daemon *Daemon) Register(container *Container) error {
 		return err
 		return err
 	}
 	}
 
 
-	if err := container.prepareMountPoints(); err != nil {
+	if err := daemon.prepareMountPoints(container); err != nil {
 		return err
 		return err
 	}
 	}
 
 

+ 1 - 1
daemon/delete.go

@@ -58,7 +58,7 @@ func (daemon *Daemon) ContainerRm(name string, config *ContainerRmConfig) error
 		return err
 		return err
 	}
 	}
 
 
-	if err := container.removeMountPoints(config.RemoveVolume); err != nil {
+	if err := daemon.removeMountPoints(container, config.RemoveVolume); err != nil {
 		logrus.Error(err)
 		logrus.Error(err)
 	}
 	}
 
 

+ 46 - 0
daemon/mounts.go

@@ -0,0 +1,46 @@
+package daemon
+
+import (
+	"strings"
+
+	derr "github.com/docker/docker/errors"
+	"github.com/docker/docker/volume/store"
+)
+
+func (daemon *Daemon) prepareMountPoints(container *Container) error {
+	for _, config := range container.MountPoints {
+		if len(config.Driver) > 0 {
+			v, err := daemon.createVolume(config.Name, config.Driver, nil)
+			if err != nil {
+				return err
+			}
+			config.Volume = v
+		}
+	}
+	return nil
+}
+
+func (daemon *Daemon) removeMountPoints(container *Container, rm bool) error {
+	var rmErrors []string
+	for _, m := range container.MountPoints {
+		if m.Volume == nil {
+			continue
+		}
+		container.daemon.volumes.Decrement(m.Volume)
+		if rm {
+			err := daemon.volumes.Remove(m.Volume)
+			// ErrVolumeInUse is ignored because having this
+			// volume being referenced by other container is
+			// not an error, but an implementation detail.
+			// This prevents docker from logging "ERROR: Volume in use"
+			// where there is another container using the volume.
+			if err != nil && err != store.ErrVolumeInUse {
+				rmErrors = append(rmErrors, err.Error())
+			}
+		}
+	}
+	if len(rmErrors) > 0 {
+		return derr.ErrorCodeRemovingVolume.WithArgs(strings.Join(rmErrors, "\n"))
+	}
+	return nil
+}