r1512 + implement LB management for RS pools
authorDenis Ovsienko <infrastation@yandex.ru>
Mon, 14 Jan 2008 13:17:36 +0000 (13:17 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Mon, 14 Jan 2008 13:17:36 +0000 (13:17 +0000)
+ fix broken RS updates
+ adjust SLB pages and tables

inc/database.php
inc/interface.php
inc/navigation.php
inc/ophandlers.php

index b4519c663bbe3be5f693f7a549e121623a0588fc..288c7927377cb8d8362304e4427cb825939e6325 100644 (file)
@@ -2134,7 +2134,28 @@ function addRStoRSPool ($pool_id = 0, $rsip = '', $rsport = 0, $rsconfig = '')
                        'rsip' => "inet_aton('${rsip}')",
                        'rsport' => $rsport,
                        'rspool_id' => $pool_id,
-                       'rsconfig' => (empty ($rsconfig) ? 'NULL' : "'${rsconfig}'"))
+                       'rsconfig' => (empty ($rsconfig) ? 'NULL' : "'${rsconfig}'")
+               )
+       );
+}
+
+function addLBtoRSPool ($pool_id = 0, $object_id = 0, $vsconfig = '', $rsconfig = '')
+{
+       if ($pool_id <= 0 or $object_id <= 0)
+       {
+               showError ('Invalid arguments', __FUNCTION__);
+               die;
+       }
+       return useInsertBlade
+       (
+               'IPLoadBalancer',
+               array
+               (
+                       'object_id' => $object_id,
+                       'rspool_id' => $pool_id,
+                       'vsconfig' => (empty ($vsconfig) ? 'NULL' : "'${vsconfig}'"),
+                       'rsconfig' => (empty ($rsconfig) ? 'NULL' : "'${rsconfig}'")
+               )
        );
 }
 
@@ -2145,6 +2166,21 @@ function commitDeleteRS ($id = 0)
        return useDeleteBlade ('IPRealServer', 'id', $id);
 }
 
+function commitDeleteLB ($object_id = 0, $pool_id = 0)
+{
+       global $dbxlink;
+       if ($object_id <= 0 or $pool_id <= 0)
+               return FALSE;
+       $query = "delete from IPLoadBalancer where object_id = ${object_id} and rspool_id = ${pool_id} limit 1";
+       $result = $dbxlink->exec ($query);
+       if ($result === NULL)
+               return FALSE;
+       elseif ($result != 1)
+               return FALSE;
+       else
+               return TRUE;
+}
+
 function commitUpdateRS ($rsid = 0, $rsip = '', $rsport = 0, $rsconfig = '')
 {
        if ($rsid <= 0 or $rsport <= 0)
@@ -2160,7 +2196,7 @@ function commitUpdateRS ($rsid = 0, $rsip = '', $rsport = 0, $rsconfig = '')
        global $dbxlink;
        $query =
                "update IPRealServer set rsip = inet_aton('${rsip}'), rsport = ${rsport}, rsconfig = " .
-               (empty ($rsconfig) ? 'NULL' : "'#{rsconfig}'") .
+               (empty ($rsconfig) ? 'NULL' : "'${rsconfig}'") .
                " where id = ${rsid} limit 1";
        $result = $dbxlink->query ($query);
        if ($result == NULL)
@@ -2171,6 +2207,29 @@ function commitUpdateRS ($rsid = 0, $rsip = '', $rsport = 0, $rsconfig = '')
        return TRUE;
 }
 
+function commitUpdateLB ($object_id = 0, $pool_id = 0, $vsconfig = '', $rsconfig = '')
+{
+       if ($object_id <= 0 or $pool_id <= 0)
+       {
+               showError ('Invalid args', __FUNCTION__);
+               die;
+       }
+       global $dbxlink;
+       $query =
+               "update IPLoadBalancer set vsconfig = " .
+               (empty ($vsconfig) ? 'NULL' : "'${vsconfig}'") .
+               ', rsconfig = ' .
+               (empty ($rsconfig) ? 'NULL' : "'${rsconfig}'") .
+               " where object_id = ${object_id} and rspool_id = ${pool_id} limit 1";
+       $result = $dbxlink->exec ($query);
+       if ($result === NULL)
+               return FALSE;
+       elseif ($result != 1)
+               return FALSE;
+       else
+               return TRUE;
+}
+
 // Return the list of virtual services, indexed by vs_id.
 function getVSList ()
 {
index d2efef2afae3e3a4a3f740887c97a0786181254f..02431e6bc3b49c4486aacbfa646a6720f0b71d1b 100644 (file)
@@ -3754,7 +3754,7 @@ function renderRSPoolServerForm ($pool_id = 0)
        echo "</form></table>\n";
        finishPortlet();
 
-       echo "<center><h2>Manage Existing</h2></center>\n";
+       startPortlet ('Manage existing');
        echo "<table cellspacing=0 cellpadding=5 align=center class=widetable>\n";
        echo "<tr><th>&nbsp;</th><th>Address</th><th>Port</th><th>configuration</th><th>&nbsp;</th></tr>\n";
        foreach ($poolInfo['rslist'] as $rsid => $rs)
@@ -3775,6 +3775,58 @@ function renderRSPoolServerForm ($pool_id = 0)
                echo "</tr></form>\n";
        }
        echo "</table>\n";
+       finishPortlet();
+}
+
+function renderRSPoolLBForm ($pool_id = 0)
+{
+       global $root, $pageno, $tabno;
+       showMessageOrError();
+       startPortlet ('Add new');
+               echo "<input type=hidden name=id value='${pool_id}'>";
+       echo "<table cellspacing=0 cellpadding=5 align=center class=widetable>\n";
+       echo "<tr><th>Object</th><th>VS config</th><th>RS config</th><th>&nbsp;</th></tr>\n";
+       echo "<form action='${root}process.php'>";
+       echo "<input type=hidden name=page value='${pageno}'>\n";
+       echo "<input type=hidden name=tab value='${tabno}'>\n";
+       echo "<input type=hidden name=op value=addLB>";
+       echo "<input type=hidden name=pool_id value='${pool_id}'>";
+       echo "<tr valign=top><td><select name='object_id' tabindex=1>";
+       foreach (array(4, 7, 8) as $type)
+       {
+               $objects = getObjectList ($type);
+               foreach ($objects as $object)
+                       echo "<option value='${object['id']}'>${object['dname']}</option>";
+       }
+       echo "</select></td>";
+       echo "<td><textarea name=vsconfig></textarea></td>";
+       echo "<td><textarea name=rsconfig></textarea></td>";
+       echo "<td><input type=submit value=OK tabindex=2></td></tr>\n";
+       echo "</form></table>\n";
+       finishPortlet();
+
+       startPortlet ('Manage existing');
+       $poolInfo = getRSPoolInfo ($pool_id);
+       echo "<table cellspacing=0 cellpadding=5 align=center class=widetable>\n";
+       echo "<tr><th>&nbsp;</th><th>Object</th><th>VS config</th><th>RS config</th><th>&nbsp;</th></tr>\n";
+       foreach ($poolInfo['lblist'] as $object_id => $lbinfo)
+       {
+               $oi = getObjectInfo ($object_id);
+               echo "<form action='${root}process.php'>";
+               echo "<input type=hidden name=page value='${pageno}'>\n";
+               echo "<input type=hidden name=tab value='${tabno}'>\n";
+               echo "<input type=hidden name=op value=updLB>";
+               echo "<input type=hidden name=pool_id value='${pool_id}'>";
+               echo "<input type=hidden name=object_id value='${object_id}'>";
+               echo "<tr valign=top><td><a href='${root}process.php?page=${pageno}&tab=${tabno}&op=delLB&pool_id=${pool_id}&object_id=${object_id}'>";
+               printImageHREF ('delete', 'Unconfigure');
+               echo "</a></td>";
+               echo "<td class=tdleft><a href='${root}?page=object&object_id=${object_id}'>${oi['dname']}</a></td>";
+               echo "<td><textarea name=vsconfig>${lbinfo['vsconfig']}</textarea></td>";
+               echo "<td><textarea name=rsconfig>${lbinfo['rsconfig']}</textarea></td>";
+               echo "<td><input type=submit value=OK></td></tr></form>\n";
+       }
+       finishPortlet();
 }
 
 function renderRSPool ($pool_id = 0)
@@ -3804,8 +3856,9 @@ function renderRSPool ($pool_id = 0)
        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>";
-       echo "<a href='${root}?page=vservice&id=${poolInfo['vs_id']}'>" . buildVServiceName (getVServiceInfo ($poolInfo['vs_id']));
-       echo "</a></td></tr>\n";
+       $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>";
@@ -3818,8 +3871,8 @@ function renderRSPool ($pool_id = 0)
        echo "<tr><th>address</th><th>port</th><th>RS configuration</th></tr>";
        foreach ($poolInfo['rslist'] as $rs)
        {
-               echo "<tr><td><a href='${root}?page=ipaddress&ip=${rs['rsip']}'>${rs['rsip']}</a></td>";
-               echo "<td>${rs['rsport']}</td><td><pre>${rs['rsconfig']}</pre></td></tr>\n";
+               echo "<tr valign=top><td class=tdleft><a href='${root}?page=ipaddress&ip=${rs['rsip']}'>${rs['rsip']}</a></td>";
+               echo "<td class=tdleft>${rs['rsport']}</td><td class=tdleft><pre>${rs['rsconfig']}</pre></td></tr>\n";
        }
        echo "</table>\n";
        finishPortlet();
@@ -3832,8 +3885,8 @@ function renderRSPool ($pool_id = 0)
        foreach ($poolInfo['lblist'] as $object_id => $lbinfo)
        {
                $oi = getObjectInfo ($object_id);
-               echo "<tr><td><a href='${root}?page=object&object_id=${object_id}'>${oi['dname']}</a></td>";
-               echo "<td>${lbinfo['vsconfig']}</td><td>${lbinfo['rsconfig']}</td></tr>\n";
+               echo "<tr valign=top><td class=tdleft><a href='${root}?page=object&object_id=${object_id}'>${oi['dname']}</a></td>";
+               echo "<td class=tdleft><pre>${lbinfo['vsconfig']}</pre></td><td class=tdleft><pre>${lbinfo['rsconfig']}</pre></td></tr>\n";
        }
        echo "</table>\n";
        finishPortlet();
@@ -3853,9 +3906,9 @@ function renderVSList ()
        echo "<tr><th>endpoint</th><th>name</th><th>VS configuration</th><th>RS configuration</th></tr>";
        foreach ($vslist as $vsid => $vsinfo)
        {
-               echo "<tr><td><a href='${root}?page=vservice&id=${vsid}'>" . buildVServiceName ($vsinfo);
+               echo "<tr valign=top><td class=tdleft><a href='${root}?page=vservice&id=${vsid}'>" . buildVServiceName ($vsinfo);
                echo "</a></td>";
-               echo "<td>${vsinfo['name']}</td>";
+               echo "<td class=tdleft>${vsinfo['name']}</td>";
                echo "<td><pre>${vsinfo['vsconfig']}</pre></td>";
                echo "<td><pre>${vsinfo['rsconfig']}</pre></td>";
                echo "</tr>\n";
index 4cae1c24ce4b68cf163417ffc42f062b9e2a1565..230b43cdb6fbd3b6445b5bdb0285b07b5e7b7cf4 100644 (file)
@@ -172,12 +172,16 @@ $page['rspool']['bypass'] = 'id';
 $page['rspool']['bypass_type'] = 'uint';
 $tab['rspool']['default'] = 'View';
 $tab['rspool']['editrslist'] = 'Real Servers';
-$tab['rspool']['editlb'] = '[Load Balancers]';
+$tab['rspool']['editlblist'] = 'Load Balancers';
 $tabhandler['rspool']['default'] = 'renderRSPool';
 $tabhandler['rspool']['editrslist'] = 'renderRSPoolServerForm';
+$tabhandler['rspool']['editlblist'] = 'renderRSPoolLBForm';
 $ophandler['rspool']['editrslist']['addRS'] = 'addRealServer';
 $ophandler['rspool']['editrslist']['delRS'] = 'deleteRealServer';
 $ophandler['rspool']['editrslist']['updRS'] = 'updateRealServer';
+$ophandler['rspool']['editlblist']['addLB'] = 'addLoadBalancer';
+$ophandler['rspool']['editlblist']['delLB'] = 'deleteLoadBalancer';
+$ophandler['rspool']['editlblist']['updLB'] = 'updateLoadBalancer';
 
 $page['rservers']['title'] = '[Real servers]';
 $page['rservers']['parent'] = 'ipv4space';
index e210ca1b56b5e49d2ae6848a872f695ee92fc60e..0457bbcd727a0808fe04e5d2b838586feed8943a 100644 (file)
@@ -991,6 +991,20 @@ function deleteRealServer ()
                return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&message=" . urlencode ("Real server was successfully deleted");
 }
 
+function deleteLoadBalancer ()
+{
+       global $root, $pageno, $tabno;
+
+       assertUIntArg ('object_id');
+       assertUIntArg ('pool_id');
+       $object_id = $_REQUEST['object_id'];
+       $pool_id = $_REQUEST['pool_id'];
+       if (!commitDeleteLB ($object_id, $pool_id))
+               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&error=" . urlencode ('commitDeleteLB() failed');
+       else
+               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&message=" . urlencode ("Load balancer was successfully deleted");
+}
+
 function updateRealServer ()
 {
        global $root, $pageno, $tabno;
@@ -1000,15 +1014,45 @@ function updateRealServer ()
        assertStringArg ('rsip');
        assertUIntArg ('rsport');
        assertStringArg ('rsconfig', TRUE);
+       // only necessary for generating next URL
        $pool_id = $_REQUEST['pool_id'];
-       $rsid = $_REQUEST['id'];
-       $rsip = $_REQUEST['rsip'];
-       $rsport = $_REQUEST['rsport'];
-       $rsconfig = $_REQUEST['rsconfig'];
-       if (!commitUpdateRS ($rsid, $rsip, $rsport, $rsconfig))
+       if (!commitUpdateRS ($_REQUEST['id'], $_REQUEST['rsip'], $_REQUEST['rsport'], $_REQUEST['rsconfig']))
                return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&error=" . urlencode ('commitUpdateRS() failed');
        else
                return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&message=" . urlencode ("Real server was successfully updated");
 }
 
+function updateLoadbalancer ()
+{
+       global $root, $pageno, $tabno;
+
+       assertUIntArg ('object_id');
+       assertUIntArg ('pool_id');
+       assertStringArg ('vsconfig', TRUE);
+       assertStringArg ('rsconfig', TRUE);
+       $pool_id = $_REQUEST['pool_id'];
+       if (!commitUpdateLB ($_REQUEST['object_id'], $pool_id, $_REQUEST['vsconfig'], $_REQUEST['rsconfig']))
+               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&error=" . urlencode ('commitUpdateLB() failed');
+       else
+               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&message=" . urlencode ("Real server was successfully updated");
+}
+
+function addLoadBalancer ()
+{
+       global $root, $pageno, $tabno;
+
+       assertUIntArg ('pool_id');
+       assertUIntArg ('object_id');
+       assertStringArg ('vsconfig', TRUE);
+       assertStringArg ('rsconfig', TRUE);
+       $pool_id = $_REQUEST['pool_id'];
+       $object_id = $_REQUEST['object_id'];
+       $vsconfig = $_REQUEST['vsconfig'];
+       $rsconfig = $_REQUEST['rsconfig'];
+       if (!addLBtoRSPool ($pool_id, $object_id, $vsconfig, $rsconfig))
+               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&error=" . urlencode ('addLBtoRSPool() failed');
+       else
+               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&message=" . urlencode ("Load balancer was successfully added");
+}
+
 ?>