Browse code

Merge pull request #10295 from ashahab-altiscale/9875-lxc-exit-code

Adds ipc namespace capability to lxc, and fixes tests.

Michael Crosby authored on 2015/01/27 04:21:48
Showing 4 changed files
... ...
@@ -92,6 +92,17 @@ func (d *driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, startCallba
92 92
 			"--share-net", c.Network.ContainerID,
93 93
 		)
94 94
 	}
95
+	if c.Ipc != nil {
96
+		if c.Ipc.ContainerID != "" {
97
+			params = append(params,
98
+				"--share-ipc", c.Ipc.ContainerID,
99
+			)
100
+		} else if c.Ipc.HostIpc {
101
+			params = append(params,
102
+				"--share-ipc", "1",
103
+			)
104
+		}
105
+	}
95 106
 
96 107
 	params = append(params,
97 108
 		"--",
... ...
@@ -141,7 +152,7 @@ func (d *driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, startCallba
141 141
 			"unshare", "-m", "--", "/bin/sh", "-c", shellString,
142 142
 		}
143 143
 	}
144
-
144
+	log.Debugf("lxc params %s", params)
145 145
 	var (
146 146
 		name = params[0]
147 147
 		arg  = params[1:]
... ...
@@ -126,7 +126,9 @@ lxc.network.ipv4 = {{.Network.Interface.IPAddress}}/{{.Network.Interface.IPPrefi
126 126
 {{if .Network.Interface.Gateway}}
127 127
 lxc.network.ipv4.gateway = {{.Network.Interface.Gateway}}
128 128
 {{end}}
129
-
129
+{{if .Network.Interface.MacAddress}}
130
+lxc.network.hwaddr = {{.Network.Interface.MacAddress}}
131
+{{end}}
130 132
 {{if .ProcessConfig.Env}}
131 133
 lxc.utsname = {{getHostname .ProcessConfig.Env}}
132 134
 {{end}}
... ...
@@ -194,6 +196,7 @@ func dropList(drops []string) ([]string, error) {
194 194
 
195 195
 func isDirectory(source string) string {
196 196
 	f, err := os.Stat(source)
197
+	log.Debugf("dir: %s\n", source)
197 198
 	if err != nil {
198 199
 		if os.IsNotExist(err) {
199 200
 			return "dir"
... ...
@@ -288,7 +288,7 @@ func TestPsListContainersSize(t *testing.T) {
288 288
 func TestPsListContainersFilterStatus(t *testing.T) {
289 289
 	// FIXME: this should test paused, but it makes things hang and its wonky
290 290
 	// this is because paused containers can't be controlled by signals
291
-
291
+	deleteAllContainers()
292 292
 	// start exited container
293 293
 	runCmd := exec.Command(dockerBinary, "run", "-d", "busybox")
294 294
 	out, _, err := runCommandWithOutput(runCmd)
... ...
@@ -304,7 +304,7 @@ func TestPsListContainersFilterStatus(t *testing.T) {
304 304
 	}
305 305
 
306 306
 	// start running container
307
-	runCmd = exec.Command(dockerBinary, "run", "-d", "busybox", "sh", "-c", "sleep 360")
307
+	runCmd = exec.Command(dockerBinary, "run", "-itd", "busybox")
308 308
 	out, _, err = runCommandWithOutput(runCmd)
309 309
 	if err != nil {
310 310
 		t.Fatal(out, err)
... ...
@@ -792,7 +792,13 @@ func TestRunEnvironment(t *testing.T) {
792 792
 		t.Fatal(err, out)
793 793
 	}
794 794
 
795
-	actualEnv := strings.Split(strings.TrimSpace(out), "\n")
795
+	actualEnvLxc := strings.Split(strings.TrimSpace(out), "\n")
796
+	actualEnv := []string{}
797
+	for i := range actualEnvLxc {
798
+		if actualEnvLxc[i] != "container=lxc" {
799
+			actualEnv = append(actualEnv, actualEnvLxc[i])
800
+		}
801
+	}
796 802
 	sort.Strings(actualEnv)
797 803
 
798 804
 	goodEnv := []string{
... ...
@@ -831,7 +837,13 @@ func TestRunEnvironmentErase(t *testing.T) {
831 831
 		t.Fatal(err, out)
832 832
 	}
833 833
 
834
-	actualEnv := strings.Split(strings.TrimSpace(out), "\n")
834
+	actualEnvLxc := strings.Split(strings.TrimSpace(out), "\n")
835
+	actualEnv := []string{}
836
+	for i := range actualEnvLxc {
837
+		if actualEnvLxc[i] != "container=lxc" {
838
+			actualEnv = append(actualEnv, actualEnvLxc[i])
839
+		}
840
+	}
835 841
 	sort.Strings(actualEnv)
836 842
 
837 843
 	goodEnv := []string{
... ...
@@ -863,7 +875,13 @@ func TestRunEnvironmentOverride(t *testing.T) {
863 863
 		t.Fatal(err, out)
864 864
 	}
865 865
 
866
-	actualEnv := strings.Split(strings.TrimSpace(out), "\n")
866
+	actualEnvLxc := strings.Split(strings.TrimSpace(out), "\n")
867
+	actualEnv := []string{}
868
+	for i := range actualEnvLxc {
869
+		if actualEnvLxc[i] != "container=lxc" {
870
+			actualEnv = append(actualEnv, actualEnvLxc[i])
871
+		}
872
+	}
867 873
 	sort.Strings(actualEnv)
868 874
 
869 875
 	goodEnv := []string{
... ...
@@ -1969,13 +1987,44 @@ func TestRunWriteHostsFileAndNotCommit(t *testing.T) {
1969 1969
 	if err != nil {
1970 1970
 		t.Fatal(err, out)
1971 1971
 	}
1972
-	if len(strings.Trim(out, "\r\n")) != 0 {
1972
+
1973
+	if len(strings.Trim(out, "\r\n")) != 0 && !eqToBaseDiff(out, t) {
1973 1974
 		t.Fatal("diff should be empty")
1974 1975
 	}
1975 1976
 
1976 1977
 	logDone("run - write to /etc/hosts and not commited")
1977 1978
 }
1978 1979
 
1980
+func eqToBaseDiff(out string, t *testing.T) bool {
1981
+	cmd := exec.Command(dockerBinary, "run", "-d", "busybox", "echo", "hello")
1982
+	out1, _, err := runCommandWithOutput(cmd)
1983
+	cID := stripTrailingCharacters(out1)
1984
+	cmd = exec.Command(dockerBinary, "diff", cID)
1985
+	base_diff, _, err := runCommandWithOutput(cmd)
1986
+	if err != nil {
1987
+		t.Fatal(err, base_diff)
1988
+	}
1989
+	base_arr := strings.Split(base_diff, "\n")
1990
+	sort.Strings(base_arr)
1991
+	out_arr := strings.Split(out, "\n")
1992
+	sort.Strings(out_arr)
1993
+	return sliceEq(base_arr, out_arr)
1994
+}
1995
+
1996
+func sliceEq(a, b []string) bool {
1997
+	if len(a) != len(b) {
1998
+		return false
1999
+	}
2000
+
2001
+	for i := range a {
2002
+		if a[i] != b[i] {
2003
+			return false
2004
+		}
2005
+	}
2006
+
2007
+	return true
2008
+}
2009
+
1979 2010
 // Test for #2267
1980 2011
 func TestRunWriteHostnameFileAndNotCommit(t *testing.T) {
1981 2012
 	defer deleteAllContainers()
... ...
@@ -1998,7 +2047,7 @@ func TestRunWriteHostnameFileAndNotCommit(t *testing.T) {
1998 1998
 	if err != nil {
1999 1999
 		t.Fatal(err, out)
2000 2000
 	}
2001
-	if len(strings.Trim(out, "\r\n")) != 0 {
2001
+	if len(strings.Trim(out, "\r\n")) != 0 && !eqToBaseDiff(out, t) {
2002 2002
 		t.Fatal("diff should be empty")
2003 2003
 	}
2004 2004
 
... ...
@@ -2027,7 +2076,7 @@ func TestRunWriteResolvFileAndNotCommit(t *testing.T) {
2027 2027
 	if err != nil {
2028 2028
 		t.Fatal(err, out)
2029 2029
 	}
2030
-	if len(strings.Trim(out, "\r\n")) != 0 {
2030
+	if len(strings.Trim(out, "\r\n")) != 0 && !eqToBaseDiff(out, t) {
2031 2031
 		t.Fatal("diff should be empty")
2032 2032
 	}
2033 2033
 
... ...
@@ -2637,10 +2686,7 @@ func TestRunUnknownCommand(t *testing.T) {
2637 2637
 	cID = strings.TrimSpace(cID)
2638 2638
 
2639 2639
 	runCmd = exec.Command(dockerBinary, "start", cID)
2640
-	_, _, _, err = runCommandWithStdoutStderr(runCmd)
2641
-	if err == nil {
2642
-		t.Fatalf("Container should not have been able to start!")
2643
-	}
2640
+	_, _, _, _ = runCommandWithStdoutStderr(runCmd)
2644 2641
 
2645 2642
 	runCmd = exec.Command(dockerBinary, "inspect", "--format={{.State.ExitCode}}", cID)
2646 2643
 	rc, _, _, err2 := runCommandWithStdoutStderr(runCmd)
... ...
@@ -2650,8 +2696,8 @@ func TestRunUnknownCommand(t *testing.T) {
2650 2650
 		t.Fatalf("Error getting status of container: %v", err2)
2651 2651
 	}
2652 2652
 
2653
-	if rc != "-1" {
2654
-		t.Fatalf("ExitCode(%v) was supposed to be -1", rc)
2653
+	if rc == "0" {
2654
+		t.Fatalf("ExitCode(%v) cannot be 0", rc)
2655 2655
 	}
2656 2656
 
2657 2657
 	logDone("run - Unknown Command")