Browse code

Renaming a container with an invalid name should fail

Docker-DCO-1.1-Signed-off-by: Jessica Frazelle <jess@docker.com> (github: jfrazelle)

Jessica Frazelle authored on 2015/01/14 10:30:49
Showing 2 changed files
... ...
@@ -8,23 +8,27 @@ func (daemon *Daemon) ContainerRename(job *engine.Job) engine.Status {
8 8
 	if len(job.Args) != 2 {
9 9
 		return job.Errorf("usage: %s OLD_NAME NEW_NAME", job.Name)
10 10
 	}
11
-	old_name := job.Args[0]
12
-	new_name := job.Args[1]
11
+	oldName := job.Args[0]
12
+	newName := job.Args[1]
13 13
 
14
-	container := daemon.Get(old_name)
14
+	container := daemon.Get(oldName)
15 15
 	if container == nil {
16
-		return job.Errorf("No such container: %s", old_name)
16
+		return job.Errorf("No such container: %s", oldName)
17 17
 	}
18 18
 
19
+	oldName = container.Name
20
+
19 21
 	container.Lock()
20 22
 	defer container.Unlock()
21
-	if err := daemon.containerGraph.Delete(container.Name); err != nil {
22
-		return job.Errorf("Failed to delete container %q: %v", old_name, err)
23
-	}
24
-	if _, err := daemon.reserveName(container.ID, new_name); err != nil {
23
+	if _, err := daemon.reserveName(container.ID, newName); err != nil {
25 24
 		return job.Errorf("Error when allocating new name: %s", err)
26 25
 	}
27
-	container.Name = new_name
26
+
27
+	container.Name = newName
28
+
29
+	if err := daemon.containerGraph.Delete(oldName); err != nil {
30
+		return job.Errorf("Failed to delete container %q: %v", oldName, err)
31
+	}
28 32
 
29 33
 	return engine.StatusOK
30 34
 }
... ...
@@ -97,3 +97,23 @@ func TestRenameCheckNames(t *testing.T) {
97 97
 
98 98
 	logDone("rename - running container")
99 99
 }
100
+
101
+func TestRenameInvalidName(t *testing.T) {
102
+	defer deleteAllContainers()
103
+	runCmd := exec.Command(dockerBinary, "run", "--name", "myname", "-d", "busybox", "top")
104
+	if out, _, err := runCommandWithOutput(runCmd); err != nil {
105
+		t.Fatalf(out, err)
106
+	}
107
+
108
+	runCmd = exec.Command(dockerBinary, "rename", "myname", "new:invalid")
109
+	if out, _, err := runCommandWithOutput(runCmd); err == nil || !strings.Contains(out, "Invalid container name") {
110
+		t.Fatalf("Renaming container to invalid name should have failed: %s\n%v", out, err)
111
+	}
112
+
113
+	runCmd = exec.Command(dockerBinary, "ps", "-a")
114
+	if out, _, err := runCommandWithOutput(runCmd); err != nil || !strings.Contains(out, "myname") {
115
+		t.Fatalf("Output of docker ps should have included 'myname': %s\n%v", out, err)
116
+	}
117
+
118
+	logDone("rename - invalid container name")
119
+}