This patch adds tests for the `--ipv6` and `--fixed-cidr` daemon flags
Signed-off-by: Dave Tucker <dt@docker.com>
| ... | ... |
@@ -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 |