Browse code

integration-cli: Add Tests for IPv6 and Fixed CIDR

This patch adds tests for the `--ipv6` and `--fixed-cidr` daemon flags

Signed-off-by: Dave Tucker <dt@docker.com>

Dave Tucker authored on 2015/04/28 20:50:20
Showing 2 changed files
... ...
@@ -203,6 +203,123 @@ func (s *DockerDaemonSuite) TestDaemonIptablesCreate(c *check.C) {
203 203
 	}
204 204
 }
205 205
 
206
+// TestDaemonIPv6Enabled checks that when the daemon is started with --ipv6=true that the docker0 bridge
207
+// has the fe80::1 address and that a container is assigned a link-local address
208
+func (s *DockerSuite) TestDaemonIPv6Enabled(c *check.C) {
209
+	testRequires(c, IPv6)
210
+
211
+	if err := setupV6(); err != nil {
212
+		c.Fatal("Could not set up host for IPv6 tests")
213
+	}
214
+
215
+	d := NewDaemon(c)
216
+
217
+	if err := d.StartWithBusybox("--ipv6"); err != nil {
218
+		c.Fatal(err)
219
+	}
220
+	defer d.Stop()
221
+
222
+	iface, err := net.InterfaceByName("docker0")
223
+	if err != nil {
224
+		c.Fatalf("Error getting docker0 interface: %v", err)
225
+	}
226
+
227
+	addrs, err := iface.Addrs()
228
+	if err != nil {
229
+		c.Fatalf("Error getting addresses for docker0 interface: %v", err)
230
+	}
231
+
232
+	var found bool
233
+	expected := "fe80::1/64"
234
+
235
+	for i := range addrs {
236
+		if addrs[i].String() == expected {
237
+			found = true
238
+		}
239
+	}
240
+
241
+	if !found {
242
+		c.Fatalf("Bridge does not have an IPv6 Address")
243
+	}
244
+
245
+	if out, err := d.Cmd("run", "-itd", "--name=ipv6test", "busybox:latest"); err != nil {
246
+		c.Fatalf("Could not run container: %s, %v", out, err)
247
+	}
248
+
249
+	out, err := d.Cmd("inspect", "--format", "'{{.NetworkSettings.LinkLocalIPv6Address}}'", "ipv6test")
250
+	out = strings.Trim(out, " \r\n'")
251
+
252
+	if err != nil {
253
+		c.Fatalf("Error inspecting container: %s, %v", out, err)
254
+	}
255
+
256
+	if ip := net.ParseIP(out); ip == nil {
257
+		c.Fatalf("Container should have a link-local IPv6 address")
258
+	}
259
+
260
+	out, err = d.Cmd("inspect", "--format", "'{{.NetworkSettings.GlobalIPv6Address}}'", "ipv6test")
261
+	out = strings.Trim(out, " \r\n'")
262
+
263
+	if err != nil {
264
+		c.Fatalf("Error inspecting container: %s, %v", out, err)
265
+	}
266
+
267
+	if ip := net.ParseIP(out); ip != nil {
268
+		c.Fatalf("Container should not have a global IPv6 address: %v", out)
269
+	}
270
+
271
+	if err := teardownV6(); err != nil {
272
+		c.Fatal("Could not perform teardown for IPv6 tests")
273
+	}
274
+
275
+}
276
+
277
+// TestDaemonIPv6FixedCIDR checks that when the daemon is started with --ipv6=true and a fixed CIDR
278
+// that running containers are given a link-local and global IPv6 address
279
+func (s *DockerSuite) TestDaemonIPv6FixedCIDR(c *check.C) {
280
+	testRequires(c, IPv6)
281
+
282
+	if err := setupV6(); err != nil {
283
+		c.Fatal("Could not set up host for IPv6 tests")
284
+	}
285
+
286
+	d := NewDaemon(c)
287
+
288
+	if err := d.StartWithBusybox("--ipv6", "--fixed-cidr-v6='2001:db8:1::/64'"); err != nil {
289
+		c.Fatalf("Could not start daemon with busybox: %v", err)
290
+	}
291
+	defer d.Stop()
292
+
293
+	if out, err := d.Cmd("run", "-itd", "--name=ipv6test", "busybox:latest"); err != nil {
294
+		c.Fatalf("Could not run container: %s, %v", out, err)
295
+	}
296
+
297
+	out, err := d.Cmd("inspect", "--format", "'{{.NetworkSettings.LinkLocalIPv6Address}}'", "ipv6test")
298
+	out = strings.Trim(out, " \r\n'")
299
+
300
+	if err != nil {
301
+		c.Fatalf("Error inspecting container: %s, %v", out, err)
302
+	}
303
+
304
+	if ip := net.ParseIP(out); ip == nil {
305
+		c.Fatalf("Container should have a link-local IPv6 address")
306
+	}
307
+
308
+	out, err = d.Cmd("inspect", "--format", "'{{.NetworkSettings.GlobalIPv6Address}}'", "ipv6test")
309
+	out = strings.Trim(out, " \r\n'")
310
+
311
+	if err != nil {
312
+		c.Fatalf("Error inspecting container: %s, %v", out, err)
313
+	}
314
+
315
+	if ip := net.ParseIP(out); ip == nil {
316
+		c.Fatalf("Container should have a global IPv6 address")
317
+	}
318
+	if err := teardownV6(); err != nil {
319
+		c.Fatal("Could not perform teardown for IPv6 tests")
320
+	}
321
+}
322
+
206 323
 func (s *DockerDaemonSuite) TestDaemonLogLevelWrong(c *check.C) {
207 324
 	c.Assert(s.d.Start("--log-level=bogus"), check.NotNil, check.Commentf("Daemon shouldn't start with wrong log level"))
208 325
 }
... ...
@@ -1274,4 +1391,22 @@ func (s *DockerDaemonSuite) TestDaemonNoTlsCliTlsVerifyWithEnv(c *check.C) {
1274 1274
 	out, _, err := runCommandWithOutput(cmd)
1275 1275
 	c.Assert(err, check.Not(check.IsNil), check.Commentf("%s", out))
1276 1276
 	c.Assert(strings.Contains(out, "error occurred trying to connect"), check.Equals, true)
1277
+
1278
+}
1279
+
1280
+func setupV6() error {
1281
+	// Hack to get the right IPv6 address on docker0, which has already been created
1282
+	err := exec.Command("ip", "addr", "add", "fe80::1/64", "dev", "docker0").Run()
1283
+	if err != nil {
1284
+		return err
1285
+	}
1286
+	return nil
1287
+}
1288
+
1289
+func teardownV6() error {
1290
+	err := exec.Command("ip", "addr", "del", "fe80::1/64", "dev", "docker0").Run()
1291
+	if err != nil {
1292
+		return err
1293
+	}
1294
+	return nil
1277 1295
 }
... ...
@@ -96,6 +96,17 @@ var (
96 96
 		},
97 97
 		"Test requires underlying root filesystem not be backed by overlay.",
98 98
 	}
99
+	IPv6 = TestRequirement{
100
+		func() bool {
101
+			cmd := exec.Command("test", "-f", "/proc/net/if_inet6")
102
+
103
+			if err := cmd.Run(); err != nil {
104
+				return true
105
+			}
106
+			return false
107
+		},
108
+		"Test requires support for IPv6",
109
+	}
99 110
 )
100 111
 
101 112
 // testRequires checks if the environment satisfies the requirements