Ver código fonte

Introduce a CheckContainer to remove duplication

Some methods need to get a container *and* validate some conditon on
these (is the container running, …). The CheckContainer allows
to do that and helps remove some duplication.

Signed-off-by: Vincent Demeester <vincent@sbr.pm>
Vincent Demeester 8 anos atrás
pai
commit
12485d62ee
2 arquivos alterados com 26 adições e 14 exclusões
  1. 10 0
      daemon/container.go
  2. 16 14
      daemon/container_operations_unix.go

+ 10 - 0
daemon/container.go

@@ -55,6 +55,16 @@ func (daemon *Daemon) GetContainer(prefixOrName string) (*container.Container, e
 	return daemon.containers.Get(containerID), nil
 }
 
+// checkContainer make sure the specified container validates the specified conditions
+func (daemon *Daemon) checkContainer(container *container.Container, conditions ...func(*container.Container) error) error {
+	for _, condition := range conditions {
+		if err := condition(container); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
 // Exists returns a true if a container of the specified ID or name exists,
 // false otherwise.
 func (daemon *Daemon) Exists(id string) bool {

+ 16 - 14
daemon/container_operations_unix.go

@@ -58,32 +58,34 @@ func (daemon *Daemon) setupLinkedContainers(container *container.Container) ([]s
 
 func (daemon *Daemon) getIpcContainer(container *container.Container) (*container.Container, error) {
 	containerID := container.HostConfig.IpcMode.Container()
-	c, err := daemon.GetContainer(containerID)
+	container, err := daemon.GetContainer(containerID)
 	if err != nil {
-		return nil, err
+		return nil, errors.Wrapf(err, "cannot join IPC of a non running container: %s", container.ID)
 	}
-	if !c.IsRunning() {
-		return nil, fmt.Errorf("cannot join IPC of a non running container: %s", containerID)
-	}
-	if c.IsRestarting() {
-		return nil, errContainerIsRestarting(container.ID)
-	}
-	return c, nil
+	return container, daemon.checkContainer(container, containerIsRunning, containerIsNotRestarting)
 }
 
 func (daemon *Daemon) getPidContainer(container *container.Container) (*container.Container, error) {
 	containerID := container.HostConfig.PidMode.Container()
-	c, err := daemon.GetContainer(containerID)
+	container, err := daemon.GetContainer(containerID)
 	if err != nil {
-		return nil, err
+		return nil, errors.Wrapf(err, "cannot join PID of a non running container: %s", container.ID)
 	}
+	return container, daemon.checkContainer(container, containerIsRunning, containerIsNotRestarting)
+}
+
+func containerIsRunning(c *container.Container) error {
 	if !c.IsRunning() {
-		return nil, fmt.Errorf("cannot join PID of a non running container: %s", containerID)
+		return errors.Errorf("container %s is not running", c.ID)
 	}
+	return nil
+}
+
+func containerIsNotRestarting(c *container.Container) error {
 	if c.IsRestarting() {
-		return nil, errContainerIsRestarting(container.ID)
+		return errContainerIsRestarting(c.ID)
 	}
-	return c, nil
+	return nil
 }
 
 func (daemon *Daemon) setupIpcDirs(c *container.Container) error {