r1818 + implemented initial tag filtering for IPv4 networks
authorDenis Ovsienko <infrastation@yandex.ru>
Sun, 23 Mar 2008 12:36:45 +0000 (12:36 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Sun, 23 Mar 2008 12:36:45 +0000 (12:36 +0000)
inc/database.php
inc/functions.php
inc/interface.php

index 2a551eed45c3a53c47688de2e47a4196a8d5c5f6..7c3e8ea76f5240043493d84dfe690b4e075afc9a 100644 (file)
@@ -891,16 +891,29 @@ function getObjectAddresses ($object_id = 0)
        return $ret;
 }
 
-function getAddressspaceList ()
+function getAddressspaceList ($tagfilter)
 {
+       if (!count ($tagfilter))
+               $whereclause = 'where tag_id is null';
+       else
+       {
+               $whereclause = 'where ';
+               $orclause = '';
+               foreach ($tagfilter as $tag_id)
+               {
+                       $whereclause .= $orclause . 'tag_id = ' . $tag_id;
+                       $orclause = ' or ';
+               }
+       }
        $query =
                "select ".
                "id as IPRanges_id, ".
                "INET_NTOA(ip) as IPRanges_ip, ".
                "mask as IPRanges_mask, ".
                "name as IPRanges_name ".
-               "from IPRanges ".
-               "order by ip";
+               "from IPRanges left join TagStorage on IPRanges.id = TagStorage.target_id and target_realm = 'ipv4net' " .
+               $whereclause .
+               " order by ip";
        $result = useSelectBlade ($query);
        $ret=array();
        $count=0;
index 33e64a69f90a528d41f9e9b2c6c95c29e41ba082..94933f4a4ea6d29ba54cdb3a8f21fa8ac5311e0f 100644 (file)
@@ -1447,6 +1447,33 @@ function getExplicitTagsOnly ($trail, $tree = NULL)
        return $ret;
 }
 
+// Maximize the trail: for each tag add all tags, for which it is direct or indirect parent.
+// Unlike other functions, this one accepts and returns a list of integer tag IDs, not
+// a list of tag structures.
+function complementByKids ($idlist, $tree = NULL, $getall = FALSE)
+{
+       if ($tree === NULL)
+               $tree = getTagTree();
+       $getallkids = $getall;
+       $ret = array();
+       foreach ($tree as $taginfo)
+       {
+               foreach ($idlist as $test_id)
+                       if ($getall or $taginfo['id'] == $test_id)
+                       {
+                               $ret[] = $taginfo['id'];
+                               // Once matched node makes all sub-nodes match, but don't make
+                               // a mistake of matching every other node at the current level.
+                               $getallkids = TRUE;
+                               break;
+                       }
+               if (isset ($taginfo['kids']))
+                       $ret = array_merge ($ret, complementByKids ($idlist, $taginfo['kids'], $getallkids));
+               $getallkids = FALSE;
+       }
+       return $ret;
+}
+
 function loadRackObjectAutoTags()
 {
        assertUIntArg ('object_id');
index 761ce49c7c3f4717714c8850a2ff452017be5d9a..0a6502dd0e880f20ca1e573dab356bb8ca41b0f0 100644 (file)
@@ -1718,9 +1718,14 @@ function renderAddressspace ()
 {
        global $root, $page;
 
+       echo "<table border=0 class=objectview>\n";
+       echo "<tr><td class=pcleft>";
+
        startPortlet ('Subnets');
        echo "<table class='widetable' border=0 cellpadding=10 cellspacing=0 align='center'>\n";
-       $addrspaceList = getAddressspaceList();
+       $tagfilter = isset ($_REQUEST['tagfilter']) ? $_REQUEST['tagfilter'] : array();
+       $tagfilter = complementByKids ($tagfilter);
+       $addrspaceList = getAddressspaceList ($tagfilter);
        echo "<tr><th>Subnet</th><th>Name</th><th>Utilization</th></tr>";
        foreach ($addrspaceList as $iprange)
        {
@@ -1734,6 +1739,9 @@ function renderAddressspace ()
        }
        echo "</table>\n";
        finishPortlet();
+       echo '</td><td class=pcright>';
+       renderTagFilterPortlet ($tagfilter);
+       echo "</td></tr></table>\n";
 }
 
 function renderIPv4SLB ()
@@ -4681,6 +4689,8 @@ function renderTagTreeEditor ()
        echo '</table>';
 }
 
+// Output a sequence of OPTION elements, selecting those, which are present on the
+// explicit tags list.
 function renderTagOption ($taginfo, $level = 0)
 {
        global $expl_tags;
@@ -4699,6 +4709,25 @@ function renderTagOption ($taginfo, $level = 0)
                renderTagOption ($kid, $level + 1);
 }
 
+// Idem, but select those, which are shown on the $_REQUEST['tagfiler'] array.
+function renderTagOptionForFilter ($taginfo, $tagfilter, $level = 0)
+{
+       echo $level;
+       $selected = '';
+       foreach ($tagfilter as $filter_id)
+               if ($taginfo['id'] == $filter_id)
+               {
+                       $selected = ' selected';
+                       break;
+               }
+       echo '<option value=' . $taginfo['id'] . "${selected}>";
+       for ($i = 0; $i < $level; $i++)
+               echo '-- ';
+       echo $taginfo['tag'] . "</option>\n";
+       foreach ($taginfo['kids'] as $kid)
+               renderTagOptionForFilter ($kid, $tagfilter, $level + 1);
+}
+
 function renderObjectTags ($id)
 {
        renderEntityTags ('object', 'object_id', $id);
@@ -4768,4 +4797,24 @@ function printTagTRs()
        }
 }
 
+function renderTagFilterPortlet ($tagfilter)
+{
+       global $pageno, $tabno;
+       startPortlet ('Tag filter');
+       if (!count (($tagTree = getTagTree())))
+       {
+               echo "No tags defined";
+               return;
+       }
+       echo "<form method=get'>\n";
+       echo "<input type=hidden name=page value=${pageno}>\n";
+       echo "<input type=hidden name=tab value=${tabno}>\n";
+       echo '<select name=tagfilter[] multiple>';
+       foreach ($tagTree as $taginfo)
+               renderTagOptionForFilter ($taginfo, $tagfilter);
+       echo '</select><br>';
+       echo "<input type=submit value='Apply'></form>\n";
+       finishPortlet();
+}
+
 ?>