"shared router" allocation to support VRRP and alike 210/head
authorVladimir Ivanov <vladimir.ivanov@lazada.com>
Thu, 1 Mar 2018 13:12:19 +0000 (21:12 +0800)
committerVladimir Ivanov <vladimir.ivanov@lazada.com>
Mon, 5 Mar 2018 06:13:52 +0000 (14:13 +0800)
ChangeLog
wwwroot/inc/database.php
wwwroot/inc/functions.php
wwwroot/inc/interface.php
wwwroot/inc/upgrade.php

index 4980bbf..000c129 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,7 @@
        update: 802.1Q: foreign VLANs (missing from the vlan domain list) are not propagated to uplinks
        update: ability to extend supported device breed list via plug-in
        update: add a server configuration report (same as before install/upgrade)
+        new feature: "shared router" allocation (GH#210 by Vladimir Ivanov)
 0.21.1 2017-10-22
        update: improve Percona server support (Mantis#1793)
        bugfix: fix an upgrade bug introduced in 0.21.0 (found by Chris James)
index f45d3a8..9175776 100644 (file)
@@ -2144,7 +2144,7 @@ function scanIPv4Space ($pairlist, $filter_flags = IPSCAN_ANY)
        if ($filter_flags & IPSCAN_DO_ALLOCS)
        {
        if ($filter_flags & IPSCAN_RTR_ONLY)
-               $whereexpr2 .= " AND ia.type = 'router'";
+               $whereexpr2 .= " AND ( ia.type = 'router' OR ia.type = 'sharedrouter')";
        $query =
                "select ia.ip, ia.object_id, ia.name, ia.type, Object.name as object_name " .
                "from IPv4Allocation AS ia INNER JOIN Object ON ia.object_id = Object.id where ${whereexpr2} order by ia.type";
@@ -2354,7 +2354,7 @@ function scanIPv6Space ($pairlist, $filter_flags = IPSCAN_ANY)
        if ($filter_flags & IPSCAN_DO_ALLOCS)
        {
        if ($filter_flags & IPSCAN_RTR_ONLY)
-               $whereexpr2 .= " AND ia.type = 'router'";
+               $whereexpr2 .= " AND (ia.type = 'router' OR ia.type = 'sharedrouter')";
        $query =
                "select ia.ip, ia.object_id, ia.name, ia.type, Object.name as object_name " .
                "from IPv6Allocation AS ia INNER JOIN Object ON ia.object_id = Object.id where ${whereexpr2} order by ia.type";
index cb2999e..30a594c 100644 (file)
@@ -436,7 +436,7 @@ function genericAssertion ($argname, $argtype)
                return $sic[$argname];
        case 'enum/alloc_type':
                assertStringArg ($argname);
-               if (!in_array ($sic[$argname], array ('regular', 'shared', 'virtual', 'router', 'point2point')))
+               if (!in_array ($sic[$argname], array ('regular', 'shared', 'virtual', 'router', 'sharedrouter', 'point2point')))
                        throw new InvalidRequestArgException ($argname, $sic[$argname], 'Unknown value');
                return $sic[$argname];
        case 'enum/dqcode':
@@ -2151,6 +2151,7 @@ function markupIPAddrList (&$addrlist)
                        'virtual' => 0, // loopback
                        'regular' => 0, // connected host
                        'router' => 0,   // connected gateway
+                       'sharedrouter' => 0, // VRRP gateway
                        'point2point' => 0,
                );
                $nallocs = 0;
@@ -2160,7 +2161,9 @@ function markupIPAddrList (&$addrlist)
                        $nallocs++;
                }
                $nreserved = ($addrlist[$ip_bin]['reserved'] == 'yes') ? 1 : 0; // only one reservation is possible ever
-               if ($nallocs > 1 && $nallocs != $refc['shared'] || $nallocs && $nreserved)
+               if ($nallocs && $nreserved ||                                                     // reserved cannot be allocated
+                    $nallocs > 1 && $nallocs != $refc['shared'] && $refc['sharedrouter'] == 0 ||  // multiple shared IPs allowed
+                    $nallocs > 1 && $nallocs != $refc['sharedrouter'] && $refc['shared'] ==0)     // multiple shared routers allowed
                {
                        $addrlist[$ip_bin]['class'] = 'trerror';
                        ++$used;
@@ -2196,7 +2199,7 @@ function findRouters ($addrlist)
        $ret = array();
        foreach ($addrlist as $addr)
                foreach ($addr['allocs'] as $alloc)
-                       if ($alloc['type'] == 'router')
+                       if ($alloc['type'] == 'router' || $alloc['type'] == 'sharedrouter')
                                $ret[] = array
                                (
                                        'id' => $alloc['object_id'],
index da20ac1..d11af15 100644 (file)
@@ -24,6 +24,7 @@ $aat = array
        'virtual' => 'Loopback',
        'shared' => 'Shared',
        'router' => 'Router',
+       'sharedrouter' => 'Shared router',
        'point2point' => 'Point-to-point',
 );
 // address allocation code, IPv4 addresses and objects view
@@ -33,6 +34,7 @@ $aac_right = array
        'virtual' => '<span class="aac-right" title="' . $aat['virtual'] . '">L</span>',
        'shared' => '<span class="aac-right" title="' . $aat['shared'] . '">S</span>',
        'router' => '<span class="aac-right" title="' . $aat['router'] . '">R</span>',
+       'sharedrouter' => '<span class="aac-right" title="' . $aat['sharedrouter'] . '">R</span>',
        'point2point' => '<span class="aac-right" title="' . $aat['point2point'] . '">P</span>',
 );
 // address allocation code, IPv4 networks view
@@ -42,6 +44,7 @@ $aac_left = array
        'virtual' => '<span class="aac-left" title="' . $aat['virtual'] . '">L:</span>',
        'shared' => '<span class="aac-left" title="' . $aat['shared'] . '">S:</span>',
        'router' => '<span class="aac-left" title="' . $aat['router'] . '">R:</span>',
+       'sharedrouter' => '<span class="aac-left" title="' . $aat['sharedrouter'] . '">R:</span>',
        'point2point' => '<span class="aac-left" title="' . $aat['point2point'] . '">P:</span>',
 );
 
@@ -3039,7 +3042,7 @@ function renderIPv4NetworkAddresses ($range)
                {
                        echo $delim . $aac_left[$ref['type']];
                        echo makeIPAllocLink ($ip_bin, $ref, TRUE);
-                       $delim = '; ';
+                       $delim = ';<br/>';
                }
                if ($delim != '')
                        $delim = '<br>';
@@ -3164,7 +3167,7 @@ function renderIPv6NetworkAddresses ($netinfo)
                {
                        echo $delim . $aac_left[$ref['type']];
                        echo makeIPAllocLink ($ip_bin, $ref, TRUE);
-                       $delim = '; ';
+                       $delim = ';<br/>';
                }
                if ($delim != '')
                        $delim = '<br>';
index d7b65b7..23e8df2 100644 (file)
@@ -172,6 +172,10 @@ This release introduces a new plugin architecture.  If you experience issues
 after the upgrade, try disabling plugins.
 Refer to <a href="http://wiki.racktables.org/index.php/Plugins">the wiki</a> for more information.
 ENDOFTEXT
+,
+       '0.21.2' => <<<'ENDOFTEXT'
+"Shared router" allocation type introduced, useful for documenting VRRP-protected addresses.
+ENDOFTEXT
 ,
 );
 
@@ -1307,6 +1311,8 @@ INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdef
                        $query[] = "ALTER TABLE MountOperation DROP KEY `MountOperation-FK-old_molecule_id`";
                        $query[] = "ALTER TABLE MountOperation DROP KEY `MountOperation-FK-new_molecule_id`";
                        $query[] = "UPDATE Config SET varvalue = '0.21.2' WHERE varname = 'DB_VERSION'";
+                       $query[] = "ALTER TABLE IPv4Allocation MODIFY TYPE ENUM('regular','shared','virtual','router','point2point', 'sharedrouter') NOT NULL DEFAULT 'regular';";
+                       $query[] = "ALTER TABLE IPv6Allocation MODIFY TYPE ENUM('regular','shared','virtual','router','point2point', 'sharedrouter') NOT NULL DEFAULT 'regular';";
                        break;
                case 'dictionary':
                        $query = reloadDictionary();