r4554 scripts/syncdomain.php:
authorAlexey Andriyanov <alan@al-an.info>
Thu, 9 Jun 2011 15:14:20 +0000 (15:14 +0000)
committerAlexey Andriyanov <alan@al-an.info>
Thu, 9 Jun 2011 15:14:20 +0000 (15:14 +0000)
 ability to sync all the domains at-once (vdid parameters is not mandatory any more)
 filter switchlist to process by SYNC_802Q_LISTSRC constraint

wwwroot/inc/ophandlers.php: new config variable SYNC_802Q_LISTSRC
wwwroot/inc/install.php: idem
wwwroot/inc/upgrade.php: idem

generateEntityAutoTags: new object autotags $8021Q_domain_XX and $8021Q_tpl_XX
detectVLANSwitchQueue: 104 error code is removed, corresponding DB records are treated as 'sync_ready'
get8021QDeployQueues: return structure format changed, queues are separated by enabled state

render8021QStatus: 8021q queues are displayed withoud disabled hosts
renderObject8021QSync: displaying sync disabled hint
renderDeployQueue: ability to display 'disabled' pseudo-queue

ChangeLog
scripts/syncdomain.php
wwwroot/inc/database.php
wwwroot/inc/functions.php
wwwroot/inc/install.php
wwwroot/inc/interface.php
wwwroot/inc/ophandlers.php
wwwroot/inc/upgrade.php

index e0b3fdd..d177608 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,6 +9,7 @@
        update: ability to search a remote port while linking ports together and to resolve port type conflicts in-place
        update: create network and link to a VLAN at once
        update: add new port type for VMs and virtual switches (by Aaron Dummer)
+       update: 8021Q switch autosync status is now managed by SYNC_802Q_LISTSRC config constraint
        new feature: you can obtain who has made tag assignment, object's ports or IPv4 address changes by hovering cursor on these entities
        new feature: ability to open a terminal session to a device by clicking on its FQDN
        new feature: inverting tags on cell filter pages by clicking the checkboxes with Ctrl key
index 62c6b66..af1862f 100755 (executable)
@@ -17,7 +17,7 @@ function usage()
 }
 
 $options = getopt ('', array ('vdid:', 'max::', 'mode:', 'verbose'));
-if (!array_key_exists ('vdid', $options) or !array_key_exists ('mode', $options))
+if (!array_key_exists ('mode', $options))
        usage();
 
 switch ($options['mode'])
@@ -38,16 +38,22 @@ default:
 $max = array_key_exists ('max', $options) ? $options['max'] : 0;
 $verbose = array_key_exists ('verbose', $options);
 
-try
-{
-       $mydomain = getVLANDomain ($options['vdid']);
-}
-catch (RackTablesError $e)
-{
-       echo "Cannot load domain data with ID ${options['vdid']}\n";
-       echo $e->getMessage() . "\n";
-       exit (1);
-}
+$switch_list = array();
+if (! isset ($options['vdid']))
+       $switch_list = getVLANSwitches();
+else
+       try
+       {
+               $mydomain = getVLANDomain ($options['vdid']);
+               foreach ($mydomain['switchlist'] as $switch)
+                       $switch_list[] = $switch['object_id'];
+       }
+       catch (RackTablesError $e)
+       {
+               echo "Cannot load domain data with ID ${options['vdid']}\n";
+               echo $e->getMessage() . "\n";
+               exit (1);
+       }
 
 $todo = array
 (
@@ -56,7 +62,8 @@ $todo = array
        'pullall' => array ('sync_ready', 'resync_ready', 'sync_aging', 'resync_aging', 'done'),
 );
 
-$filename = '/var/tmp/RackTables-syncdomain-' . $options['vdid'] . '.pid';
+$domain_key = isset ($options['vdid']) ? $options['vdid'] : 0;
+$filename = '/var/tmp/RackTables-syncdomain-' . $domain_key . '.pid';
 if (FALSE === $fp = @fopen ($filename, 'x+'))
 {
        if (FALSE === $pidfile_mtime = filemtime ($filename))
@@ -83,9 +90,13 @@ fclose ($fp);
 
 // fetch all the needed data from DB (preparing for DB connection loss)
 $switch_queue = array();
-foreach ($mydomain['switchlist'] as $switch)
-       if (in_array (detectVLANSwitchQueue (getVLANSwitchInfo ($switch['object_id'])), $todo[$options['mode']]))
-               $switch_queue[] = spotEntity ('object', $switch['object_id']);
+foreach ($switch_list as $object_id)
+       if (in_array (detectVLANSwitchQueue (getVLANSwitchInfo ($object_id)), $todo[$options['mode']]))
+       {
+               $cell = spotEntity ('object', $object_id);
+               if (considerConfiguredConstraint ($cell, 'SYNC_802Q_LISTSRC'))
+                       $switch_queue[] = $cell;
+       }
 
 // YOU SHOULD NOT USE DB FUNCTIONS BELOW IN THE PARENT PROCESS
 // THE PARENT'S DB CONNECTION IS LOST DUE TO RECONNECTING IN THE CHILD
index 7e97a4f..c545a24 100644 (file)
@@ -21,7 +21,8 @@ $SQLSchema = array
                        'has_problems' => 'has_problems',
                        'comment' => 'comment',
                        'nports' => '(SELECT COUNT(*) FROM Port WHERE object_id = RackObject.id)',
-                       'runs8021Q' => '(SELECT 1 FROM VLANSwitch WHERE object_id = id LIMIT 1)',
+                       '8021q_domain_id' => '(SELECT domain_id FROM VLANSwitch WHERE object_id = id LIMIT 1)',
+                       '8021q_template_id' => '(SELECT template_id FROM VLANSwitch WHERE object_id = id LIMIT 1)',
                ),
                'keycolumn' => 'id',
                'ordcolumns' => array ('RackObject.name'),
@@ -3461,8 +3462,13 @@ function generateEntityAutoTags ($cell)
                                $ret[] = array ('tag' => '$portless');
                        if ($cell['asset_no'] == '')
                                $ret[] = array ('tag' => '$no_asset_tag');
-                       if ($cell['runs8021Q'])
+                       if (isset ($cell['8021q_domain_id']))
+                       {
                                $ret[] = array ('tag' => '$runs_8021Q');
+                               $ret[] = array ('tag' => '$8021Q_domain_' . $cell['8021q_domain_id']);
+                               if (isset ($cell['8021q_template_id']))
+                                       $ret[] = array ('tag' => '$8021Q_tpl_' . $cell['8021q_template_id']);
+                       }
 
                        # dictionary attribute autotags '$attr_X_Y'
                        $attrs = getAttrValues($cell['id']);
index bff1c9e..1c807e2 100644 (file)
@@ -4004,7 +4004,7 @@ function detectVLANSwitchQueue ($vswitch)
        case E_8021Q_PUSH_REMOTE_ERROR:
                return 'failed';
        case E_8021Q_SYNC_DISABLED:
-               return 'disabled';
+               return 'sync_ready';
        }
        return '';
 }
@@ -4014,12 +4014,20 @@ function get8021QDeployQueues()
        global $dqtitle;
        $ret = array();
        foreach (array_keys ($dqtitle) as $qcode)
-               $ret[$qcode] = array();
+               $ret[$qcode] = array
+               (
+                       'enabled' => array(),
+                       'disabled' => array(),
+               );
        foreach (getVLANSwitches() as $object_id)
        {
                $vswitch = getVLANSwitchInfo ($object_id);
                if ('' != $qcode = detectVLANSwitchQueue ($vswitch))
-                       $ret[$qcode][] = $vswitch;
+               {
+                       $cell = spotEntity ('object', $vswitch['object_id']);
+                       $enabled_key = considerConfiguredConstraint ($cell, 'SYNC_802Q_LISTSRC') ? 'enabled' : 'disabled';
+                               $ret[$qcode][$enabled_key][] = $vswitch;
+               }
        }
        return $ret;
 }
index c86de1f..1de4169 100644 (file)
@@ -1428,6 +1428,7 @@ INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdef
 ('FILTER_RACKLIST_BY_TAGS','yes','string','yes','no','yes','Rackspace: show only racks matching the current object\'s tags'),
 ('SSH_OBJS_LISTSRC','none','string','yes','no','yes','Rackcode filter for SSH-managed objects'),
 ('TELNET_OBJS_LISTSRC','none','string','yes','no','yes','Rackcode filter for telnet-managed objects'),
+('SYNC_802Q_LISTSRC','','string','yes','no','no','List of VLAN switches sync is enabled on'),
 ('DB_VERSION','0.19.3','string','no','yes','no','Database version.');
 
 INSERT INTO `Script` VALUES ('RackCode','allow {\$userid_1}');
index 68f11ed..6eeaaf2 100644 (file)
@@ -7549,14 +7549,25 @@ function render8021QStatus ()
        echo '</td><td class=pcright>';
 
        startPortlet ('deploy queues');
+       $enabled_total = 0;
+       $disabled_total = 0;
        echo '<table border=0 cellspacing=0 cellpadding=3 width="100%">';
        foreach (get8021QDeployQueues() as $qcode => $qitems)
        {
                echo '<tr><th width="50%" class=tdright><a href="' . makeHREF (array ('page' => 'dqueue', 'dqcode' => $qcode));
                echo '">' . $dqtitle[$qcode] . '</a>:</th>';
-               echo '<td class=tdleft>' . count ($qitems) . '</td></tr>';
+           echo '<td class=tdleft>' . count ($qitems['enabled']) . '</td></tr>';
+
+               $enabled_total += count ($qitems['enabled']);
+               $disabled_total += count ($qitems['disabled']);
        }
        echo '</table>';
+       $total = $enabled_total + $disabled_total;
+       echo "<p align=left>$total switches total";
+       if ($disabled_total)
+               echo ', <a href="' . makeHREF (array ('page' => 'dqueue', 'dqcode' => 'disabled')) . '">' .
+               $disabled_total . "</a> disabled";
+       echo '</p>';
        finishPortlet();
        echo '</td></tr></table>';
 }
@@ -8319,6 +8330,7 @@ function renderVLANIPLinks ($some_id)
 function renderObject8021QSync ($object_id)
 {
        $vswitch = getVLANSwitchInfo ($object_id);
+       $object = spotEntity ('object', $object_id);
        try
        {
                $R = getRunning8021QConfig ($object_id);
@@ -8349,7 +8361,6 @@ function renderObject8021QSync ($object_id)
                $hl_port_name = NULL;
                addAutoScrollScript ("port-$hl_port_id");
 
-               $object = spotEntity ('object', $object_id);
                amplifyCell ($object);
                foreach ($object['ports'] as $port)
                        if (mb_strlen ($port['name']) && $port['id'] == $hl_port_id)
@@ -8366,6 +8377,8 @@ function renderObject8021QSync ($object_id)
        echo '<table border=0 cellspacing=0 cellpadding=3 align=center>';
        // FIXME: sort rows newest event last
        $rows = array();
+       if (! considerConfiguredConstraint ($object, 'SYNC_802Q_LISTSRC'))
+               $rows['auto sync'] = '<span class="trerror">disabled by operator</span>';
        $rows['last local change'] = $vswitch['last_change'] . ' (' . $vswitch['last_change_age'] . ' ago)';
        $rows['device out of sync'] = $vswitch['out_of_sync'];
        if ($vswitch['out_of_sync'] == 'no')
@@ -8758,20 +8771,29 @@ function renderVSTRulesEditor ($vst_id)
 
 function renderDeployQueue()
 {
-       global $nextorder;
+       global $nextorder, $dqtitle;
        $order = 'odd';
        $dqcode = getBypassValue();
        $allq = get8021QDeployQueues();
-       echo '<table cellspacing=0 cellpadding=5 align=center class=widetable>';
-       echo '<tr><th>switch</th><th>age</th><th>';
-       foreach ($allq[$dqcode] as $item)
-       {
-               echo "<tr class=row_${order}><td>";
-               renderCell (spotEntity ('object', $item['object_id']));
-               echo "</td><td>${item['last_change_age']}</td></tr>";
-               $order = $nextorder[$order];
-       }
-       echo '</table>';
+       $en_key = $dqcode == 'disabled' ? 'disabled' : 'enabled';
+       foreach ($allq as $qcode => $data)
+               if ($dqcode == 'disabled' || $dqcode == $qcode)
+               {
+                       if (! count ($data[$en_key]))
+                               continue;
+                       if ($dqcode == 'disabled')
+                               echo "<h2 align=center>Queue " . $dqtitle[$qcode] . " (" . count ($data[$en_key]) . ")</h2>";
+                       echo '<table cellspacing=0 cellpadding=5 align=center class=widetable>';
+                       echo '<tr><th>switch</th><th>age</th><th>';
+                       foreach ($data[$en_key] as $item)
+                       {
+                               echo "<tr class=row_${order}><td>";
+                               renderCell (spotEntity ('object', $item['object_id']));
+                               echo "</td><td>${item['last_change_age']}</td></tr>";
+                               $order = $nextorder[$order];
+                       }
+                       echo '</table>';
+               }
 }
 
 function renderDiscoveredNeighbors ($object_id)
index 5f7f334..2bad00a 100644 (file)
@@ -1403,6 +1403,7 @@ function resetUIConfig()
        setConfigVar ('FILTER_RACKLIST_BY_TAGS', 'yes');
        setConfigVar ('SSH_OBJS_LISTSRC', 'none');
        setConfigVar ('TELNET_OBJS_LISTSRC', 'none');
+       setConfigVar ('SYNC_802Q_LISTSRC', '');
        return showFuncMessage (__FUNCTION__, 'OK');
 }
 
index 3d0a5c9..a8367fc 100644 (file)
@@ -1205,6 +1205,8 @@ CREATE VIEW `RackObject` AS SELECT * FROM `Object`
                        $query[] = 'ALTER TABLE `EntityLink` ADD KEY `EntityLink-compound` (`parent_entity_type`,`child_entity_type`,`child_entity_id`)';
                        $query[] = "UPDATE `Chapter` SET `name` = 'ObjectType' WHERE `id` = 1";
                        $query[] = "DELETE FROM RackSpace WHERE object_id IS NULL AND state = 'T'";
+                       
+                       $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('SYNC_802Q_LISTSRC','','string','yes','no','no','List of VLAN switches sync is enabled on')";
                        $query[] = "UPDATE Config SET varvalue = '0.20.0' WHERE varname = 'DB_VERSION'";
                        break;
                default: