Browse code

Add libnetwork call on daemon rename

Signed-off-by: Santhosh Manohar <santhosh@docker.com>

Santhosh Manohar authored on 2015/10/24 00:01:07
Showing 1 changed files
... ...
@@ -1,18 +1,28 @@
1 1
 package daemon
2 2
 
3 3
 import (
4
+	"github.com/Sirupsen/logrus"
4 5
 	derr "github.com/docker/docker/errors"
6
+	"github.com/docker/libnetwork"
7
+	"strings"
5 8
 )
6 9
 
7 10
 // ContainerRename changes the name of a container, using the oldName
8 11
 // to find the container. An error is returned if newName is already
9 12
 // reserved.
10 13
 func (daemon *Daemon) ContainerRename(oldName, newName string) error {
14
+	var (
15
+		err       error
16
+		sid       string
17
+		sb        libnetwork.Sandbox
18
+		container *Container
19
+	)
20
+
11 21
 	if oldName == "" || newName == "" {
12 22
 		return derr.ErrorCodeEmptyRename
13 23
 	}
14 24
 
15
-	container, err := daemon.Get(oldName)
25
+	container, err = daemon.Get(oldName)
16 26
 	if err != nil {
17 27
 		return err
18 28
 	}
... ...
@@ -27,19 +37,44 @@ func (daemon *Daemon) ContainerRename(oldName, newName string) error {
27 27
 
28 28
 	container.Name = newName
29 29
 
30
-	undo := func() {
31
-		container.Name = oldName
32
-		daemon.reserveName(container.ID, oldName)
33
-		daemon.containerGraphDB.Delete(newName)
34
-	}
30
+	defer func() {
31
+		if err != nil {
32
+			container.Name = oldName
33
+			daemon.reserveName(container.ID, oldName)
34
+			daemon.containerGraphDB.Delete(newName)
35
+		}
36
+	}()
35 37
 
36
-	if err := daemon.containerGraphDB.Delete(oldName); err != nil {
37
-		undo()
38
+	if err = daemon.containerGraphDB.Delete(oldName); err != nil {
38 39
 		return derr.ErrorCodeRenameDelete.WithArgs(oldName, err)
39 40
 	}
40 41
 
41
-	if err := container.toDisk(); err != nil {
42
-		undo()
42
+	if err = container.toDisk(); err != nil {
43
+		return err
44
+	}
45
+
46
+	if !container.Running {
47
+		container.logEvent("rename")
48
+		return nil
49
+	}
50
+
51
+	defer func() {
52
+		if err != nil {
53
+			container.Name = oldName
54
+			if e := container.toDisk(); e != nil {
55
+				logrus.Errorf("%s: Failed in writing to Disk on rename failure: %v", container.ID, e)
56
+			}
57
+		}
58
+	}()
59
+
60
+	sid = container.NetworkSettings.SandboxID
61
+	sb, err = daemon.netController.SandboxByID(sid)
62
+	if err != nil {
63
+		return err
64
+	}
65
+
66
+	err = sb.Rename(strings.TrimPrefix(container.Name, "/"))
67
+	if err != nil {
43 68
 		return err
44 69
 	}
45 70