r1538 + redesign SLB relational model
authorDenis Ovsienko <infrastation@yandex.ru>
Tue, 15 Jan 2008 16:39:57 +0000 (16:39 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Tue, 15 Jan 2008 16:39:57 +0000 (16:39 +0000)
+ update install/upgrade files appropriately
+ update SLB functions appropriately

inc/database.php
inc/interface.php
inc/ophandlers.php
install/init-structure.sql
upgrade.php

index 8dc019f..0e8dfe6 100644 (file)
@@ -2003,9 +2003,9 @@ function getSLBSummary ()
        global $dbxlink;
        $query = 'select vs.id as vsid, inet_ntoa(vip) as vip, vport, proto, ' .
                'vs.name, rsp.id as pool_id, rsp.name as pool_name, object_id, count(rs.id) as rscount from ' .
-               'IPVirtualService as vs inner join IPRSPool as rsp on vs.id = rsp.vs_id ' .
-               'inner join IPRealServer as rs on rs.rspool_id = rsp.id ' .
-               'inner join IPLoadBalancer as lb on rsp.id = lb.rspool_id ' .
+               'IPVirtualService as vs inner join IPLoadBalancer as lb on vs.id = lb.vs_id ' .
+               'inner join IPRSPool as rsp on lb.rspool_id = rsp.id ' .
+               'inner join IPRealServer as rs on lb.rspool_id = rs.rspool_id ' .
                'group by rsp.id, object_id order by vip, object_id';
        $result = $dbxlink->query ($query);
        if ($result == NULL)
@@ -2094,7 +2094,7 @@ function getVServiceInfo ($vsid = 0)
 function getRSPoolInfo ($id = 0)
 {
        global $dbxlink;
-       $query1 = "select ${id} as id, vs_id, name, vsconfig, rsconfig from " .
+       $query1 = "select ${id} as id, name, vsconfig, rsconfig from " .
                "IPRSPool where id = ${id}";
        $result1 = $dbxlink->query ($query1);
        if ($result1 == NULL)
@@ -2106,7 +2106,7 @@ function getRSPoolInfo ($id = 0)
        $row = $result1->fetch (PDO::FETCH_ASSOC);
        if (!$row)
                return NULL;
-       foreach (array ('id', 'name', 'vsconfig', 'rsconfig', 'vs_id') as $c)
+       foreach (array ('id', 'name', 'vsconfig', 'rsconfig') as $c)
                $ret[$c] = $row[$c];
        $result1->closeCursor();
        $ret['lblist'] = array();
@@ -2303,11 +2303,12 @@ function commitUpdateVS ($vsid = 0, $vip = '', $vport = 0, $proto = '', $name =
 }
 
 // Return the list of virtual services, indexed by vs_id.
+// Each record will be shown with its basic info plus RS pools counter.
 function getVSList ()
 {
        global $dbxlink;
-       $query = "select vs.id, inet_ntoa(vip) as vip, vport, proto, vs.name, vs.vsconfig, vs.rsconfig, count(pool.id) as poolcount " .
-               "from IPVirtualService as vs left join IPRSPool as pool on pool.vs_id = vs.id " .
+       $query = "select vs.id, inet_ntoa(vip) as vip, vport, proto, vs.name, vs.vsconfig, vs.rsconfig, count(rspool_id) as poolcount " .
+               "from IPVirtualService as vs left join IPLoadBalancer as lb on vs.id = lb.vs_id " .
                "group by vs.id order by vs.vip, proto, vport";
        $result = $dbxlink->query ($query);
        if ($result == NULL)
@@ -2327,9 +2328,9 @@ function getVSList ()
 function getRSPoolList ()
 {
        global $dbxlink;
-       $query = "select pool.id, vs_id, pool.name, count(rs.id) as rscount, pool.vsconfig, pool.rsconfig " .
-               "from IPRSPool as pool left join IPRealServer as rs on pool.id = rs.rspool_id " .
-               "group by pool.id order by vs_id, name";
+       $query = "select pool.id, pool.name, count(rspool_id) as refcnt, pool.vsconfig, pool.rsconfig " .
+               "from IPRSPool as pool left join IPLoadBalancer as lb on pool.id = lb.rspool_id " .
+               "group by pool.id order by pool.id, name";
        $result = $dbxlink->query ($query);
        if ($result == NULL)
        {
@@ -2338,7 +2339,7 @@ function getRSPoolList ()
        }
        $ret = array ();
        while ($row = $result->fetch (PDO::FETCH_ASSOC))
-               foreach (array ('vs_id', 'name', 'rscount', 'vsconfig', 'rsconfig') as $cname)
+               foreach (array ('name', 'refcnt', 'vsconfig', 'rsconfig') as $cname)
                        $ret[$row['id']][$cname] = $row[$cname];
        $result->closeCursor();
        return $ret;
@@ -2398,13 +2399,11 @@ function getRSPoolsForObject ($object_id = 0)
                return NULL;
        }
        global $dbxlink;
-       $query = "select pool.id, pool.name, vs_id, vs.name as vs_name, count(rsip) as rscount, " .
-               "inet_ntoa(vs.vip) as vip, vs.vport, vs.proto from " .
+       $query = "select pool.id, pool.name, count(rsip) as rscount from " .
                "IPLoadBalancer as lb inner join IPRSPool as pool on lb.rspool_id = pool.id " .
-               "inner join IPVirtualService as vs on pool.vs_id = vs.id " .
-               "left join IPRealServer as rs on pool.id = rs.rspool_id " .
-               "where lb.object_id = ${object_id} group by pool.id " .
-               "order by vip, vport, proto, name";
+               "left join IPRealServer as rs on lb.rspool_id = rs.rspool_id " .
+               "where lb.object_id = ${object_id} group by lb.rspool_id " .
+               "order by pool.name";
        $result = $dbxlink->query ($query);
        if ($result == NULL)
        {
@@ -2413,25 +2412,19 @@ function getRSPoolsForObject ($object_id = 0)
        }
        $pool_list = array ();
        while ($row = $result->fetch (PDO::FETCH_ASSOC))
-               foreach (array ('name', 'vs_id', 'vs_name', 'rscount', 'vip', 'vport', 'proto') as $cname)
+               foreach (array ('name', 'rscount') as $cname)
                        $pool_list[$row['id']][$cname] = $row[$cname];
        $result->closeCursor();
        return $pool_list;
 }
 
-function commitCreateRSPool ($vs_id = 0, $name = '', $vsconfig, $rsconfig)
+function commitCreateRSPool ($name = '', $vsconfig = '', $rsconfig = '')
 {
-       if ($vs_id <= 0)
-       {
-               showError ('Invalid argument', __FUNCTION__);
-               die;
-       }
        return useInsertBlade
        (
                'IPRSPool',
                array
                (
-                       'vs_id' => $vs_id,
                        'name' => (empty ($name) ? 'NULL' : "'${name}'"),
                        'vsconfig' => (empty ($vsconfig) ? 'NULL' : "'${vsconfig}'"),
                        'rsconfig' => (empty ($rsconfig) ? 'NULL' : "'${rsconfig}'")
index 0cbbaa7..0924e9d 100644 (file)
@@ -862,15 +862,12 @@ function renderRackObject ($object_id = 0)
        {
                startPortlet ('Real server pools');
                echo "<table cellspacing=0 cellpadding=5 align=center class=widetable>\n";
-               echo "<tr><th>virtual service</th><th>RS pool</th><th>real servers</th></tr>\n";
+               echo "<tr><th>RS pool</th><th>real servers</th></tr>\n";
                foreach ($pools as $pool_id => $poolinfo)
                {
-                       echo "<tr><td class=tdleft><a href='${root}?page=vservice&id=${poolinfo['vs_id']}'>";
-                       echo buildVServiceName ($poolinfo) . '</a>';
-                       if (!empty ($poolinfo['vs_name']))
-                               echo " (${poolinfo['vs_name']})";
-                       echo "</td><td class=tdleft><a href='${root}?page=rspool&id=${pool_id}'>";
-                       echo $poolinfo['name'] . '</a></td><td class=tdleft>' . $poolinfo['rscount'] . '</td>';
+                       echo "<tr><td class=tdleft><a href='${root}?page=rspool&id=${pool_id}'>";
+                       echo (empty ($poolinfo['name']) ? 'ANONYMOUS' : $poolinfo['name']);
+                       echo '</a></td><td class=tdleft>' . $poolinfo['rscount'] . '</td>';
                        echo "</tr>\n";
                }
                echo "</table>\n";
@@ -3845,9 +3842,9 @@ function renderRSPoolLBForm ($pool_id = 0)
                foreach ($objects as $object)
                        echo "<option value='${object['id']}'>${object['dname']}</option>";
        }
-       echo "</select></td><td rowspan=3 valign=middle><input type=submit value=OK tabindex=2></td></tr>\n";
-       echo "<tr><th>VS config</th><td><textarea name=vsconfig rows=10 cols=80></textarea></td></tr>";
-       echo "<tr><th>RS config</th><td><textarea name=rsconfig rows=10 cols=80></textarea></td></tr>";
+       echo "</select></td><td><input type=submit value=OK tabindex=2></td></tr>\n";
+       echo "<tr><th>VS config</th><td colspan=2><textarea name=vsconfig rows=10 cols=80></textarea></td></tr>";
+       echo "<tr><th>RS config</th><td colspan=2><textarea name=rsconfig rows=10 cols=80></textarea></td></tr>";
        echo "</form></table>\n";
        finishPortlet();
 }
@@ -3878,12 +3875,6 @@ function renderRSPool ($pool_id = 0)
                echo "<tr><th width='50%' class=tdright>Pool name:</th><td class=tdleft>${poolInfo['name']}</td></tr>\n";
        echo "<tr><th width='50%' class=tdright>Real servers:</th><td class=tdleft>" . count ($poolInfo['rslist']) . "</td></tr>\n";
        echo "<tr><th width='50%' class=tdright>Load balancers:</th><td class=tdleft>" . count ($poolInfo['lblist']) . "</td></tr>\n";
-       echo "<tr><th width='50%' class=tdright>Virtual service:</th><td class=tdleft>";
-       $vsinfo = getVServiceInfo ($poolInfo['vs_id']);
-       echo "<a href='${root}?page=vservice&id=${poolInfo['vs_id']}'>" . buildVServiceName ($vsinfo);
-       echo "</a>" . (empty ($vsinfo['name']) ? '' : " (${vsinfo['name']})") . "</td></tr>\n";
-       if (!empty ($poolInfo['vs_name']))
-               echo "<tr><th width='50%' class=tdright>VS name:</th><td class=tdleft>${poolInfo['vs_name']}</td></tr>\n";
        echo "</table>";
        finishPortlet();
 
@@ -4005,15 +3996,11 @@ function renderRSPoolList ()
                showError ('getRSPoolList() failed', __FUNCTION__);
                return;
        }
-       $vsinfocache = array();
        echo "<table class=widetable border=0 cellpadding=10 cellspacing=0 align=center>\n";
-       echo "<tr><th>parent VS</th><th>name</th><th>VS configuration</th><th>RS configuration</th></tr>";
+       echo "<tr><th>refcnt</th><th>name</th><th>VS configuration</th><th>RS configuration</th></tr>";
        foreach ($pool_list as $pool_id => $pool_info)
        {
-               if (!isset ($vsinfocache[$pool_info['vs_id']]))
-                       $vsinfocache[$pool_info['vs_id']] = getVServiceInfo ($pool_info['vs_id']);
-               echo "<tr><td><a href='${root}?page=vservice&id=${pool_info['vs_id']}'>";
-               echo buildVServiceName ($vsinfocache[$pool_info['vs_id']]) . '</a></td>';
+               echo '<tr><td>' . ($pool_info['refcnt'] ? $pool_info['refcnt'] : '&nbsp;') . '</td>';
                echo "<td><a href='${root}?page=rspool&id=${pool_id}'>";
                echo (empty ($pool_info['name']) ? 'ANONYMOUS' : $pool_info['name']) . '</a></td>';
                echo "<td><pre>${pool_info['vsconfig']}</pre></td>";
@@ -4028,14 +4015,10 @@ function editRSPools ()
        global $root, $pageno, $tabno;
        showMessageOrError();
        $pool_list = getRSPoolList();
-       // Something we are going to render as a SELECT element later.
-       $vs_list = array ();
-       foreach (getVSList() as $vsid => $vsinfo)
-               $vs_list[$vsid] = buildVServiceName ($vsinfo) . (empty ($vsinfo['name']) ? '' : " (${vsinfo['name']})");
 
        startPortlet ('Manage existing');
        echo "<table class=widetable border=0 cellpadding=10 cellspacing=0 align=center>\n";
-       echo "<tr><th>&nbsp;</th><th>parent VS</th><th>name</th><th>VS configuration</th><th>RS configuration</th><th>&nbsp;</th></tr>";
+       echo "<tr><th>&nbsp;</th><th>name</th><th>VS configuration</th><th>RS configuration</th><th>&nbsp;</th></tr>";
        foreach ($pool_list as $pool_id => $pool_info)
        {
                echo "<form method=post action='${root}process.php'>\n";
@@ -4044,7 +4027,7 @@ function editRSPools ()
                echo "<input type=hidden name=op value=upd>\n";
                echo "<input type=hidden name=id value=${pool_id}>\n";
                echo "<tr valign=top><td>";
-               if ($pool_info['rscount'])
+               if ($pool_info['refcnt'])
                        echo '&nbsp;';
                else
                {
@@ -4052,8 +4035,6 @@ function editRSPools ()
                        printImageHREF ('delete', 'delete real server pool');
                        echo '</a>';
                }
-               echo "</td><td class=tdleft>";
-               printSelect ($vs_list, 'vs_id', $pool_info['vs_id']);
                echo "</td>";
                echo "<td class=tdleft><input type=text name=name value='${pool_info['name']}'></td>";
                echo "<td><textarea name=vsconfig>${pool_info['vsconfig']}</textarea></td>";
@@ -4070,15 +4051,9 @@ function editRSPools ()
        echo "<input type=hidden name=tab value=${tabno}>\n";
        echo "<input type=hidden name=op value=add>\n";
        echo "<table class=widetable border=0 cellpadding=10 cellspacing=0 align=center>\n";
-       echo "<tr><th>&nbsp;</th><th>parent VS</th><th>name</th><th>&nbsp;</th></tr>";
-       echo "<tr valign=top><td>&nbsp;</td><td>";
-       // FIXME: change printSelect to accept tabindex and markup this form appropriately (others probably as well).
-       // Note: array_merge() will renumber array keys and mess things up. Use '+' instead.
-       $vs_list = array (0 => 'select virtual service') + $vs_list;
-       printSelect ($vs_list, 'vs_id', 0);
-       echo "</td>";
-       echo "<td class=tdleft><input type=text name=name></td>";
-       echo "<td rowspan=3 valign=middle><input type=submit value=OK></td></tr>";
+       echo "<tr><th>name</th>";
+       echo "<td><input type=text name=name></td>";
+       echo "<td><input type=submit value=OK></td></tr>";
        echo "<tr><th>VS configuration</th><td colspan=2><textarea name=vsconfig rows=10 cols=80></textarea></td></tr>";
        echo "<tr><th>RS configuration</th><td colspan=2><textarea name=rsconfig rows=10 cols=80></textarea></td></tr>";
        echo "</table></form>";
index b78f90b..5bad22d 100644 (file)
@@ -1099,11 +1099,10 @@ function addRSPool ()
 {
        global $root, $pageno, $tabno;
 
-       assertUIntArg ('vs_id');
        assertStringArg ('name', TRUE);
        assertStringArg ('vsconfig', TRUE);
        assertStringArg ('rsconfig', TRUE);
-       if (!commitCreateRSPool ($_REQUEST['vs_id'], $_REQUEST['name'], $_REQUEST['vsconfig'], $_REQUEST['rsconfig']))
+       if (!commitCreateRSPool ($_REQUEST['name'], $_REQUEST['vsconfig'], $_REQUEST['rsconfig']))
                return "${root}?page=${pageno}&tab=${tabno}&error=" . urlencode ('commitCreateRSPool() failed');
        else
                return "${root}?page=${pageno}&tab=${tabno}&message=" . urlencode ("Real server pool was successfully created");
index 3d53efe..28dca20 100644 (file)
@@ -120,9 +120,10 @@ DROP TABLE IF EXISTS `IPLoadBalancer`;
 CREATE TABLE `IPLoadBalancer` (
   `object_id` int(10) unsigned default NULL,
   `rspool_id` int(10) unsigned default NULL,
+  `vs_id` int(10) unsigned default NULL,
   `vsconfig` text,
   `rsconfig` text,
-  UNIQUE KEY `object_id` (`object_id`,`rspool_id`)
+  UNIQUE KEY `LB-VS` (`object_id`,`vs_id`)
 ) ENGINE=MyISAM;
 
 --
@@ -132,7 +133,6 @@ CREATE TABLE `IPLoadBalancer` (
 DROP TABLE IF EXISTS `IPRSPool`;
 CREATE TABLE `IPRSPool` (
   `id` int(10) unsigned NOT NULL auto_increment,
-  `vs_id` int(10) unsigned default NULL,
   `name` char(255) default NULL,
   `vsconfig` text,
   `rsconfig` text,
@@ -164,7 +164,7 @@ CREATE TABLE `IPRealServer` (
   `rspool_id` int(10) unsigned default NULL,
   `rsconfig` text,
   PRIMARY KEY  (`id`),
-  UNIQUE KEY `endpoint` (`rsip`,`rsport`)
+  UNIQUE KEY `pool-endpoint` (`rspool_id`,`rsip`,`rsport`)
 ) ENGINE=MyISAM;
 
 --
@@ -180,8 +180,7 @@ CREATE TABLE `IPVirtualService` (
   `name` char(255) default NULL,
   `vsconfig` text,
   `rsconfig` text,
-  PRIMARY KEY  (`id`),
-  UNIQUE KEY `endpoint` (`vip`,`vport`,`proto`)
+  PRIMARY KEY  (`id`)
 ) ENGINE=MyISAM;
 
 --
index 5d84371..d3e76e4 100644 (file)
@@ -577,14 +577,14 @@ echo '</pre>';
 CREATE TABLE `IPLoadBalancer` (
   `object_id` int(10) unsigned default NULL,
   `rspool_id` int(10) unsigned default NULL,
+  `vs_id` int(10) unsigned default NULL,
   `vsconfig` text,
   `rsconfig` text,
-  UNIQUE KEY `object_id` (`object_id`,`rspool_id`)
+  UNIQUE KEY `LB-VS` (`object_id`,`vs_id`)
 ) ENGINE=MyISAM";
                        $query[] = "
 CREATE TABLE `IPRSPool` (
   `id` int(10) unsigned NOT NULL auto_increment,
-  `vs_id` int(10) unsigned default NULL,
   `name` char(255) default NULL,
   `vsconfig` text,
   `rsconfig` text,
@@ -597,7 +597,8 @@ CREATE TABLE `IPRealServer` (
   `rsport` smallint(5) unsigned default NULL,
   `rspool_id` int(10) unsigned default NULL,
   `rsconfig` text,
-  PRIMARY KEY  (`id`)
+  PRIMARY KEY  (`id`),
+  UNIQUE KEY `pool-endpoint` (`rspool_id`,`rsip`,`rsport`)
 ) ENGINE=MyISAM";
                        $query[] = "
 CREATE TABLE `IPVirtualService` (
@@ -609,7 +610,6 @@ CREATE TABLE `IPVirtualService` (
   `vsconfig` text,
   `rsconfig` text,
   PRIMARY KEY  (`id`),
-  UNIQUE KEY `endpoint` (`vip`,`vport`,`proto`)
 ) ENGINE=MyISAM";
                        break; // --------------------------------------------
 #              case '0.14.10':