github.com/jaegerpicker/docker@v0.7.7-0.20150325003727-22dba32b4dab/daemon/networkdriver/ipallocator/allocator_test.go (about) 1 package ipallocator 2 3 import ( 4 "fmt" 5 "math/big" 6 "net" 7 "testing" 8 ) 9 10 func TestConversion(t *testing.T) { 11 ip := net.ParseIP("127.0.0.1") 12 i := ipToBigInt(ip) 13 if i.Cmp(big.NewInt(0x7f000001)) != 0 { 14 t.Fatal("incorrect conversion") 15 } 16 conv := bigIntToIP(i) 17 if !ip.Equal(conv) { 18 t.Error(conv.String()) 19 } 20 } 21 22 func TestConversionIPv6(t *testing.T) { 23 ip := net.ParseIP("2a00:1450::1") 24 ip2 := net.ParseIP("2a00:1450::2") 25 ip3 := net.ParseIP("2a00:1450::1:1") 26 i := ipToBigInt(ip) 27 val, success := big.NewInt(0).SetString("2a001450000000000000000000000001", 16) 28 if !success { 29 t.Fatal("Hex-String to BigInt conversion failed.") 30 } 31 if i.Cmp(val) != 0 { 32 t.Fatal("incorrent conversion") 33 } 34 35 conv := bigIntToIP(i) 36 conv2 := bigIntToIP(big.NewInt(0).Add(i, big.NewInt(1))) 37 conv3 := bigIntToIP(big.NewInt(0).Add(i, big.NewInt(0x10000))) 38 39 if !ip.Equal(conv) { 40 t.Error("2a00:1450::1 should be equal to " + conv.String()) 41 } 42 if !ip2.Equal(conv2) { 43 t.Error("2a00:1450::2 should be equal to " + conv2.String()) 44 } 45 if !ip3.Equal(conv3) { 46 t.Error("2a00:1450::1:1 should be equal to " + conv3.String()) 47 } 48 } 49 50 func TestRequestNewIps(t *testing.T) { 51 a := New() 52 53 network := &net.IPNet{ 54 IP: []byte{192, 168, 0, 1}, 55 Mask: []byte{255, 255, 255, 0}, 56 } 57 58 var ip net.IP 59 var err error 60 61 for i := 1; i < 10; i++ { 62 ip, err = a.RequestIP(network, nil) 63 if err != nil { 64 t.Fatal(err) 65 } 66 67 if expected := fmt.Sprintf("192.168.0.%d", i); ip.String() != expected { 68 t.Fatalf("Expected ip %s got %s", expected, ip.String()) 69 } 70 } 71 value := bigIntToIP(big.NewInt(0).Add(ipToBigInt(ip), big.NewInt(1))).String() 72 if err := a.ReleaseIP(network, ip); err != nil { 73 t.Fatal(err) 74 } 75 ip, err = a.RequestIP(network, nil) 76 if err != nil { 77 t.Fatal(err) 78 } 79 if ip.String() != value { 80 t.Fatalf("Expected to receive the next ip %s got %s", value, ip.String()) 81 } 82 } 83 84 func TestRequestNewIpV6(t *testing.T) { 85 a := New() 86 87 network := &net.IPNet{ 88 IP: []byte{0x2a, 0x00, 0x14, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 89 Mask: []byte{255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0}, // /64 netmask 90 } 91 92 var ip net.IP 93 var err error 94 for i := 1; i < 10; i++ { 95 ip, err = a.RequestIP(network, nil) 96 if err != nil { 97 t.Fatal(err) 98 } 99 100 if expected := fmt.Sprintf("2a00:1450::%d", i); ip.String() != expected { 101 t.Fatalf("Expected ip %s got %s", expected, ip.String()) 102 } 103 } 104 value := bigIntToIP(big.NewInt(0).Add(ipToBigInt(ip), big.NewInt(1))).String() 105 if err := a.ReleaseIP(network, ip); err != nil { 106 t.Fatal(err) 107 } 108 ip, err = a.RequestIP(network, nil) 109 if err != nil { 110 t.Fatal(err) 111 } 112 if ip.String() != value { 113 t.Fatalf("Expected to receive the next ip %s got %s", value, ip.String()) 114 } 115 } 116 117 func TestReleaseIp(t *testing.T) { 118 a := New() 119 120 network := &net.IPNet{ 121 IP: []byte{192, 168, 0, 1}, 122 Mask: []byte{255, 255, 255, 0}, 123 } 124 125 ip, err := a.RequestIP(network, nil) 126 if err != nil { 127 t.Fatal(err) 128 } 129 130 if err := a.ReleaseIP(network, ip); err != nil { 131 t.Fatal(err) 132 } 133 } 134 135 func TestReleaseIpV6(t *testing.T) { 136 a := New() 137 138 network := &net.IPNet{ 139 IP: []byte{0x2a, 0x00, 0x14, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 140 Mask: []byte{255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0}, // /64 netmask 141 } 142 143 ip, err := a.RequestIP(network, nil) 144 if err != nil { 145 t.Fatal(err) 146 } 147 148 if err := a.ReleaseIP(network, ip); err != nil { 149 t.Fatal(err) 150 } 151 } 152 153 func TestGetReleasedIp(t *testing.T) { 154 a := New() 155 network := &net.IPNet{ 156 IP: []byte{192, 168, 0, 1}, 157 Mask: []byte{255, 255, 255, 0}, 158 } 159 160 ip, err := a.RequestIP(network, nil) 161 if err != nil { 162 t.Fatal(err) 163 } 164 165 value := ip.String() 166 if err := a.ReleaseIP(network, ip); err != nil { 167 t.Fatal(err) 168 } 169 170 for i := 0; i < 253; i++ { 171 _, err = a.RequestIP(network, nil) 172 if err != nil { 173 t.Fatal(err) 174 } 175 err = a.ReleaseIP(network, ip) 176 if err != nil { 177 t.Fatal(err) 178 } 179 } 180 181 ip, err = a.RequestIP(network, nil) 182 if err != nil { 183 t.Fatal(err) 184 } 185 186 if ip.String() != value { 187 t.Fatalf("Expected to receive same ip %s got %s", value, ip.String()) 188 } 189 } 190 191 func TestGetReleasedIpV6(t *testing.T) { 192 a := New() 193 194 network := &net.IPNet{ 195 IP: []byte{0x2a, 0x00, 0x14, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 196 Mask: []byte{255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0}, 197 } 198 199 ip, err := a.RequestIP(network, nil) 200 if err != nil { 201 t.Fatal(err) 202 } 203 204 value := ip.String() 205 if err := a.ReleaseIP(network, ip); err != nil { 206 t.Fatal(err) 207 } 208 209 for i := 0; i < 253; i++ { 210 _, err = a.RequestIP(network, nil) 211 if err != nil { 212 t.Fatal(err) 213 } 214 err = a.ReleaseIP(network, ip) 215 if err != nil { 216 t.Fatal(err) 217 } 218 } 219 220 ip, err = a.RequestIP(network, nil) 221 if err != nil { 222 t.Fatal(err) 223 } 224 225 if ip.String() != value { 226 t.Fatalf("Expected to receive same ip %s got %s", value, ip.String()) 227 } 228 } 229 230 func TestRequestSpecificIp(t *testing.T) { 231 a := New() 232 233 network := &net.IPNet{ 234 IP: []byte{192, 168, 0, 1}, 235 Mask: []byte{255, 255, 255, 224}, 236 } 237 238 ip := net.ParseIP("192.168.0.5") 239 240 // Request a "good" IP. 241 if _, err := a.RequestIP(network, ip); err != nil { 242 t.Fatal(err) 243 } 244 245 // Request the same IP again. 246 if _, err := a.RequestIP(network, ip); err != ErrIPAlreadyAllocated { 247 t.Fatalf("Got the same IP twice: %#v", err) 248 } 249 250 // Request an out of range IP. 251 if _, err := a.RequestIP(network, net.ParseIP("192.168.0.42")); err != ErrIPOutOfRange { 252 t.Fatalf("Got an out of range IP: %#v", err) 253 } 254 } 255 256 func TestRequestSpecificIpV6(t *testing.T) { 257 a := New() 258 259 network := &net.IPNet{ 260 IP: []byte{0x2a, 0x00, 0x14, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 261 Mask: []byte{255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0}, // /64 netmask 262 } 263 264 ip := net.ParseIP("2a00:1450::5") 265 266 // Request a "good" IP. 267 if _, err := a.RequestIP(network, ip); err != nil { 268 t.Fatal(err) 269 } 270 271 // Request the same IP again. 272 if _, err := a.RequestIP(network, ip); err != ErrIPAlreadyAllocated { 273 t.Fatalf("Got the same IP twice: %#v", err) 274 } 275 276 // Request an out of range IP. 277 if _, err := a.RequestIP(network, net.ParseIP("2a00:1500::1")); err != ErrIPOutOfRange { 278 t.Fatalf("Got an out of range IP: %#v", err) 279 } 280 } 281 282 func TestIPAllocator(t *testing.T) { 283 a := New() 284 285 expectedIPs := []net.IP{ 286 0: net.IPv4(127, 0, 0, 1), 287 1: net.IPv4(127, 0, 0, 2), 288 2: net.IPv4(127, 0, 0, 3), 289 3: net.IPv4(127, 0, 0, 4), 290 4: net.IPv4(127, 0, 0, 5), 291 5: net.IPv4(127, 0, 0, 6), 292 } 293 294 gwIP, n, _ := net.ParseCIDR("127.0.0.1/29") 295 296 network := &net.IPNet{IP: gwIP, Mask: n.Mask} 297 // Pool after initialisation (f = free, u = used) 298 // 1(f) - 2(f) - 3(f) - 4(f) - 5(f) - 6(f) 299 // ↑ 300 301 // Check that we get 6 IPs, from 127.0.0.1–127.0.0.6, in that 302 // order. 303 for i := 0; i < 6; i++ { 304 ip, err := a.RequestIP(network, nil) 305 if err != nil { 306 t.Fatal(err) 307 } 308 309 assertIPEquals(t, expectedIPs[i], ip) 310 } 311 // Before loop begin 312 // 1(f) - 2(f) - 3(f) - 4(f) - 5(f) - 6(f) 313 // ↑ 314 315 // After i = 0 316 // 1(u) - 2(f) - 3(f) - 4(f) - 5(f) - 6(f) 317 // ↑ 318 319 // After i = 1 320 // 1(u) - 2(u) - 3(f) - 4(f) - 5(f) - 6(f) 321 // ↑ 322 323 // After i = 2 324 // 1(u) - 2(u) - 3(u) - 4(f) - 5(f) - 6(f) 325 // ↑ 326 327 // After i = 3 328 // 1(u) - 2(u) - 3(u) - 4(u) - 5(f) - 6(f) 329 // ↑ 330 331 // After i = 4 332 // 1(u) - 2(u) - 3(u) - 4(u) - 5(u) - 6(f) 333 // ↑ 334 335 // After i = 5 336 // 1(u) - 2(u) - 3(u) - 4(u) - 5(u) - 6(u) 337 // ↑ 338 339 // Check that there are no more IPs 340 ip, err := a.RequestIP(network, nil) 341 if err == nil { 342 t.Fatalf("There shouldn't be any IP addresses at this point, got %s\n", ip) 343 } 344 345 // Release some IPs in non-sequential order 346 if err := a.ReleaseIP(network, expectedIPs[3]); err != nil { 347 t.Fatal(err) 348 } 349 // 1(u) - 2(u) - 3(u) - 4(f) - 5(u) - 6(u) 350 // ↑ 351 352 if err := a.ReleaseIP(network, expectedIPs[2]); err != nil { 353 t.Fatal(err) 354 } 355 // 1(u) - 2(u) - 3(f) - 4(f) - 5(u) - 6(u) 356 // ↑ 357 358 if err := a.ReleaseIP(network, expectedIPs[4]); err != nil { 359 t.Fatal(err) 360 } 361 // 1(u) - 2(u) - 3(f) - 4(f) - 5(f) - 6(u) 362 // ↑ 363 364 // Make sure that IPs are reused in sequential order, starting 365 // with the first released IP 366 newIPs := make([]net.IP, 3) 367 for i := 0; i < 3; i++ { 368 ip, err := a.RequestIP(network, nil) 369 if err != nil { 370 t.Fatal(err) 371 } 372 373 newIPs[i] = ip 374 } 375 assertIPEquals(t, expectedIPs[2], newIPs[0]) 376 assertIPEquals(t, expectedIPs[3], newIPs[1]) 377 assertIPEquals(t, expectedIPs[4], newIPs[2]) 378 379 _, err = a.RequestIP(network, nil) 380 if err == nil { 381 t.Fatal("There shouldn't be any IP addresses at this point") 382 } 383 } 384 385 func TestAllocateFirstIP(t *testing.T) { 386 a := New() 387 388 network := &net.IPNet{ 389 IP: []byte{192, 168, 0, 0}, 390 Mask: []byte{255, 255, 255, 0}, 391 } 392 393 firstIP := network.IP.To4().Mask(network.Mask) 394 first := big.NewInt(0).Add(ipToBigInt(firstIP), big.NewInt(1)) 395 396 ip, err := a.RequestIP(network, nil) 397 if err != nil { 398 t.Fatal(err) 399 } 400 allocated := ipToBigInt(ip) 401 402 if allocated == first { 403 t.Fatalf("allocated ip should not equal first ip: %d == %d", first, allocated) 404 } 405 } 406 407 func TestAllocateAllIps(t *testing.T) { 408 a := New() 409 410 network := &net.IPNet{ 411 IP: []byte{192, 168, 0, 1}, 412 Mask: []byte{255, 255, 255, 0}, 413 } 414 415 var ( 416 current, first net.IP 417 err error 418 isFirst = true 419 ) 420 421 for err == nil { 422 current, err = a.RequestIP(network, nil) 423 if isFirst { 424 first = current 425 isFirst = false 426 } 427 } 428 429 if err != ErrNoAvailableIPs { 430 t.Fatal(err) 431 } 432 433 if _, err := a.RequestIP(network, nil); err != ErrNoAvailableIPs { 434 t.Fatal(err) 435 } 436 437 if err := a.ReleaseIP(network, first); err != nil { 438 t.Fatal(err) 439 } 440 441 again, err := a.RequestIP(network, nil) 442 if err != nil { 443 t.Fatal(err) 444 } 445 446 assertIPEquals(t, first, again) 447 448 // ensure that alloc.last == alloc.begin won't result in dead loop 449 if _, err := a.RequestIP(network, nil); err != ErrNoAvailableIPs { 450 t.Fatal(err) 451 } 452 453 // Test by making alloc.last the only free ip and ensure we get it back 454 // #1. first of the range, (alloc.last == ipToInt(first) already) 455 if err := a.ReleaseIP(network, first); err != nil { 456 t.Fatal(err) 457 } 458 459 ret, err := a.RequestIP(network, nil) 460 if err != nil { 461 t.Fatal(err) 462 } 463 464 assertIPEquals(t, first, ret) 465 466 // #2. last of the range, note that current is the last one 467 last := net.IPv4(192, 168, 0, 254) 468 setLastTo(t, a, network, last) 469 470 ret, err = a.RequestIP(network, nil) 471 if err != nil { 472 t.Fatal(err) 473 } 474 475 assertIPEquals(t, last, ret) 476 477 // #3. middle of the range 478 mid := net.IPv4(192, 168, 0, 7) 479 setLastTo(t, a, network, mid) 480 481 ret, err = a.RequestIP(network, nil) 482 if err != nil { 483 t.Fatal(err) 484 } 485 486 assertIPEquals(t, mid, ret) 487 } 488 489 // make sure the pool is full when calling setLastTo. 490 // we don't cheat here 491 func setLastTo(t *testing.T, a *IPAllocator, network *net.IPNet, ip net.IP) { 492 if err := a.ReleaseIP(network, ip); err != nil { 493 t.Fatal(err) 494 } 495 496 ret, err := a.RequestIP(network, nil) 497 if err != nil { 498 t.Fatal(err) 499 } 500 501 assertIPEquals(t, ip, ret) 502 503 if err := a.ReleaseIP(network, ip); err != nil { 504 t.Fatal(err) 505 } 506 } 507 508 func TestAllocateDifferentSubnets(t *testing.T) { 509 a := New() 510 network1 := &net.IPNet{ 511 IP: []byte{192, 168, 0, 1}, 512 Mask: []byte{255, 255, 255, 0}, 513 } 514 network2 := &net.IPNet{ 515 IP: []byte{127, 0, 0, 1}, 516 Mask: []byte{255, 255, 255, 0}, 517 } 518 network3 := &net.IPNet{ 519 IP: []byte{0x2a, 0x00, 0x14, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 520 Mask: []byte{255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0}, // /64 netmask 521 } 522 network4 := &net.IPNet{ 523 IP: []byte{0x2a, 0x00, 0x16, 0x32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 524 Mask: []byte{255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0}, // /64 netmask 525 } 526 expectedIPs := []net.IP{ 527 0: net.IPv4(192, 168, 0, 1), 528 1: net.IPv4(192, 168, 0, 2), 529 2: net.IPv4(127, 0, 0, 1), 530 3: net.IPv4(127, 0, 0, 2), 531 4: net.ParseIP("2a00:1450::1"), 532 5: net.ParseIP("2a00:1450::2"), 533 6: net.ParseIP("2a00:1450::3"), 534 7: net.ParseIP("2a00:1632::1"), 535 8: net.ParseIP("2a00:1632::2"), 536 } 537 538 ip11, err := a.RequestIP(network1, nil) 539 if err != nil { 540 t.Fatal(err) 541 } 542 ip12, err := a.RequestIP(network1, nil) 543 if err != nil { 544 t.Fatal(err) 545 } 546 ip21, err := a.RequestIP(network2, nil) 547 if err != nil { 548 t.Fatal(err) 549 } 550 ip22, err := a.RequestIP(network2, nil) 551 if err != nil { 552 t.Fatal(err) 553 } 554 ip31, err := a.RequestIP(network3, nil) 555 if err != nil { 556 t.Fatal(err) 557 } 558 ip32, err := a.RequestIP(network3, nil) 559 if err != nil { 560 t.Fatal(err) 561 } 562 ip33, err := a.RequestIP(network3, nil) 563 if err != nil { 564 t.Fatal(err) 565 } 566 ip41, err := a.RequestIP(network4, nil) 567 if err != nil { 568 t.Fatal(err) 569 } 570 ip42, err := a.RequestIP(network4, nil) 571 if err != nil { 572 t.Fatal(err) 573 } 574 assertIPEquals(t, expectedIPs[0], ip11) 575 assertIPEquals(t, expectedIPs[1], ip12) 576 assertIPEquals(t, expectedIPs[2], ip21) 577 assertIPEquals(t, expectedIPs[3], ip22) 578 assertIPEquals(t, expectedIPs[4], ip31) 579 assertIPEquals(t, expectedIPs[5], ip32) 580 assertIPEquals(t, expectedIPs[6], ip33) 581 assertIPEquals(t, expectedIPs[7], ip41) 582 assertIPEquals(t, expectedIPs[8], ip42) 583 } 584 585 func TestRegisterBadTwice(t *testing.T) { 586 a := New() 587 network := &net.IPNet{ 588 IP: []byte{192, 168, 1, 1}, 589 Mask: []byte{255, 255, 255, 0}, 590 } 591 subnet := &net.IPNet{ 592 IP: []byte{192, 168, 1, 8}, 593 Mask: []byte{255, 255, 255, 248}, 594 } 595 596 if err := a.RegisterSubnet(network, subnet); err != nil { 597 t.Fatal(err) 598 } 599 subnet = &net.IPNet{ 600 IP: []byte{192, 168, 1, 16}, 601 Mask: []byte{255, 255, 255, 248}, 602 } 603 if err := a.RegisterSubnet(network, subnet); err != ErrNetworkAlreadyRegistered { 604 t.Fatalf("Expecteded ErrNetworkAlreadyRegistered error, got %v", err) 605 } 606 } 607 608 func TestRegisterBadRange(t *testing.T) { 609 a := New() 610 network := &net.IPNet{ 611 IP: []byte{192, 168, 1, 1}, 612 Mask: []byte{255, 255, 255, 0}, 613 } 614 subnet := &net.IPNet{ 615 IP: []byte{192, 168, 1, 1}, 616 Mask: []byte{255, 255, 0, 0}, 617 } 618 if err := a.RegisterSubnet(network, subnet); err != ErrBadSubnet { 619 t.Fatalf("Expected ErrBadSubnet error, got %v", err) 620 } 621 } 622 623 func TestAllocateFromRange(t *testing.T) { 624 a := New() 625 network := &net.IPNet{ 626 IP: []byte{192, 168, 0, 1}, 627 Mask: []byte{255, 255, 255, 0}, 628 } 629 // 192.168.1.9 - 192.168.1.14 630 subnet := &net.IPNet{ 631 IP: []byte{192, 168, 0, 8}, 632 Mask: []byte{255, 255, 255, 248}, 633 } 634 635 if err := a.RegisterSubnet(network, subnet); err != nil { 636 t.Fatal(err) 637 } 638 expectedIPs := []net.IP{ 639 0: net.IPv4(192, 168, 0, 9), 640 1: net.IPv4(192, 168, 0, 10), 641 2: net.IPv4(192, 168, 0, 11), 642 3: net.IPv4(192, 168, 0, 12), 643 4: net.IPv4(192, 168, 0, 13), 644 5: net.IPv4(192, 168, 0, 14), 645 } 646 for _, ip := range expectedIPs { 647 rip, err := a.RequestIP(network, nil) 648 if err != nil { 649 t.Fatal(err) 650 } 651 assertIPEquals(t, ip, rip) 652 } 653 654 if _, err := a.RequestIP(network, nil); err != ErrNoAvailableIPs { 655 t.Fatalf("Expected ErrNoAvailableIPs error, got %v", err) 656 } 657 for _, ip := range expectedIPs { 658 a.ReleaseIP(network, ip) 659 rip, err := a.RequestIP(network, nil) 660 if err != nil { 661 t.Fatal(err) 662 } 663 assertIPEquals(t, ip, rip) 664 } 665 } 666 667 func assertIPEquals(t *testing.T, ip1, ip2 net.IP) { 668 if !ip1.Equal(ip2) { 669 t.Fatalf("Expected IP %s, got %s", ip1, ip2) 670 } 671 } 672 673 func BenchmarkRequestIP(b *testing.B) { 674 network := &net.IPNet{ 675 IP: []byte{192, 168, 0, 1}, 676 Mask: []byte{255, 255, 255, 0}, 677 } 678 b.ResetTimer() 679 680 for i := 0; i < b.N; i++ { 681 a := New() 682 683 for j := 0; j < 253; j++ { 684 _, err := a.RequestIP(network, nil) 685 if err != nil { 686 b.Fatal(err) 687 } 688 } 689 } 690 }