Changeset 692 for trunk/cgi-bin/main.cgi
- Timestamp:
- 02/11/15 18:43:22 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/cgi-bin/main.cgi
r691 r692 410 410 411 411 my $cidr; 412 my $resv; # Reserved for expansion. 412 413 my $alloc_from; 413 414 my $fbid = $webvar{fbid}; … … 443 444 $alloc_from = new NetAddr::IP $webvar{allocfrom}; 444 445 $webvar{maskbits} = $cidr->masklen; 446 # Some additional checks are needed for reserving free space 447 if ($webvar{reserve}) { 448 if ($cidr == $alloc_from) { 449 # We could still squirm and fiddle to try to find a way to reserve space, but the storage model for 450 # IPDB means that all continguous free space is kept in the smallest number of strict CIDR netblocks 451 # possible. (In theory.) If the request and the freeblock are the same, it is theoretically impossible 452 # to reserve an equivalent-sized block either ahead or behind the requested one, because the pair 453 # together would never be a strict CIDR block. 454 $page->param(warning => "Can't reserve space for expansion; free block and requested allocation are the same."); 455 delete $webvar{reserve}; 456 } else { 457 # Find which new free block will match the reqested block. 458 # Take the requested mask, shift by one 459 my $tmpmask = $webvar{maskbits}; 460 $tmpmask--; 461 # find the subnets with that mask in the selected free block 462 my @pieces = $alloc_from->split($tmpmask); 463 foreach my $slice (@pieces) { 464 if ($slice->contains($cidr)) { 465 # For the subnet that contains the requested block, split that in two, 466 # and flag/cache the one that's not the requested block. 467 my @bits = $slice->split($webvar{maskbits}); 468 if ($bits[0] == $cidr) { 469 $resv = $bits[1]; 470 } else { 471 $resv = $bits[0]; 472 } 473 } 474 } 475 } 476 } # reserve block check 477 445 478 } else { # done with direct freeblocks assignment 446 479 … … 465 498 } 466 499 $failmsg .= "You will have to route another superblock to $webvar{pop}<br>\n". 467 "from one of the master blocks or chose a smaller blocksize."; 500 "from one of the master blocks"; 501 if ($webvar{reserve}) { 502 $failmsg .= ', choose a smaller blocksize, or uncheck "Reserve space for expansion".'; 503 } else { 504 $failmsg .= " or chose a smaller blocksize."; 505 } 468 506 } 469 507 } 470 508 471 ## fixme: add rdepth? 509 # if requesting extra space "reserved for expansion", we need to find a free 510 # block at least double the size of the request. 511 if ($webvar{reserve}) { 512 $webvar{maskbits}--; 513 } 514 472 515 ($fbid,$cidr,$p_id) = findAllocateFrom($ip_dbh, $webvar{maskbits}, $webvar{alloctype}, 473 516 $webvar{city}, $webvar{pop}, (master => $webvar{allocfrom}, allowpriv => $webvar{allowpriv}) ); … … 478 521 $cidr = new NetAddr::IP $cidr; 479 522 480 # this chunk now specific to "guided" allocation; freeblock-select can now slice-n-dice on its own.481 523 $alloc_from = "$cidr"; 524 525 # when autofinding a block to allocate from, use the first piece of the found 526 # block for the allocation, and the next piece for the "reserved for expansion". 527 if ($webvar{reserve}) { 528 # reset the mask to the real requested one, now that we've got a 529 # block large enough for the request plus reserve 530 $webvar{maskbits}++; 531 ($cidr,$resv) = $cidr->split($webvar{maskbits}); 532 } 533 482 534 # If the block to be allocated is smaller than the one we found, 483 535 # figure out the "real" block to be allocated. … … 524 576 ## end node hack 525 577 578 # reserve for expansion 579 $page->param(reserve => $webvar{reserve}); 580 # probably just preventing a little log noise doing this; could just set the param 581 # all the time since it won't be shown if the reserve param above isn't set. 582 # if ($webvar{reserve}) { 583 $page->param(resvblock => $resv); 584 # } 585 526 586 # Stick in the allocation data 527 587 $page->param(alloc_type => $webvar{alloctype}); … … 592 652 cidr => $webvar{fullcidr}, 593 653 fbid => $webvar{fbid}, 654 reserve => $webvar{reserve}, 594 655 parent => $webvar{parent}, 595 656 custid => $webvar{custid},
Note:
See TracChangeset
for help on using the changeset viewer.