r4091 l2addressForDatabase(): signal error with exception, not NULL
authorDenis Ovsienko <infrastation@yandex.ru>
Mon, 10 Jan 2011 22:51:53 +0000 (22:51 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Mon, 10 Jan 2011 22:51:53 +0000 (22:51 +0000)
genericAssertion(): add cases for IPv6, L2 and PCRE types
commitAddPort(): dismiss local check, rely on exception
commitUpdatePort(): idem
getPortSearchResults(): employ catch block
addPortForObject(): add respective assertion
editPortForObject(): ditto

inc/database.php
inc/functions.php
inc/ophandlers.php

index e6ccfd3..ed80318 100644 (file)
@@ -899,9 +899,7 @@ function getResidentRacksData ($object_id = 0, $fetch_rackdata = TRUE)
 
 function commitAddPort ($object_id = 0, $port_name, $port_type_id, $port_label, $port_l2address)
 {
-       // FIXME: use InvalidRequestArgException and return nothing
-       if (NULL === ($db_l2address = l2addressForDatabase ($port_l2address)))
-               return "Invalid L2 address ${port_l2address}";
+       $db_l2address = l2addressForDatabase ($port_l2address);
        global $dbxlink;
        $dbxlink->exec ('LOCK TABLES Port WRITE');
        if (alreadyUsedL2Address ($db_l2address, $object_id))
@@ -949,8 +947,7 @@ function commitAddPort ($object_id = 0, $port_name, $port_type_id, $port_label,
 // It would be nice to simplify this semantics later.
 function commitUpdatePort ($object_id, $port_id, $port_name, $port_type_id, $port_label, $port_l2address, $port_reservation_comment)
 {
-       if (NULL === ($db_l2address = l2addressForDatabase ($port_l2address)))
-               return "Invalid L2 address ${port_l2address}";
+       $db_l2address = l2addressForDatabase ($port_l2address);
        global $dbxlink;
        $dbxlink->exec ('LOCK TABLES Port WRITE');
        if (alreadyUsedL2Address ($db_l2address, $object_id))
@@ -1865,8 +1862,14 @@ function getPortSearchResults ($what)
                $ret[$port['object_id']]['id'] = $port['object_id'];
                $ret[$port['object_id']]['by_port'][$port['id']] = $port['label'];
        }
-       if (NULL === ($db_l2address = l2addressForDatabase ($what)))
+       try
+       {
+               $db_l2address = l2addressForDatabase ($what);
+       }
+       catch (InvalidArgException $e)
+       {
                return $ret;
+       }
        $ports = getSearchResultByField
        (
                'Port',
index 867bc52..ac0a955 100644 (file)
@@ -236,11 +236,30 @@ function genericAssertion ($argname, $argtype)
        case 'inet4':
                assertIPv4Arg ($argname);
                break;
+       case 'inet6':
+               assertIPv6Arg ($argname);
+               break;
+       case 'l2address':
+               assertStringArg ($argname);
+       case 'l2address0':
+               assertStringArg ($argname, TRUE);
+               try
+               {
+                       l2addressForDatabase ($sic[$argname]);
+               }
+               catch (InvalidArgException $e)
+               {
+                       throw new InvalidRequestArgException ($argname, $sic[$argname], 'malformed MAC/WWN address');
+               }
+               break;
        case 'tag':
                assertStringArg ($argname);
                if (!validTagName ($sic[$argname]))
                        throw new InvalidRequestArgException ($argname, $sic[$argname], 'Invalid tag name');
                break;
+       case 'pcre':
+               assertPCREArg ($argname);
+               break;
        case 'enum/attr_type':
                assertStringArg ($argname);
                if (!in_array ($sic[$argname], array ('uint', 'float', 'string', 'dict')))
@@ -603,7 +622,7 @@ function markupObjectProblems (&$rackData)
 }
 
 // Return a uniformly (010203040506 or 0102030405060708) formatted address, if it is present
-// in the provided string, an empty string for an empty string or NULL for error.
+// in the provided string, an empty string for an empty string or raise an exception.
 function l2addressForDatabase ($string)
 {
        $string = strtoupper ($string);
@@ -624,7 +643,7 @@ function l2addressForDatabase ($string)
                case (preg_match (RE_L2_IPCFG, $string) or preg_match (RE_L2_WWN_HYPHEN, $string)):
                        return str_replace ('-', '', $string);
                default:
-                       return NULL;
+                       throw new InvalidArgException ('$string', $string, 'malformed MAC/WWN address');
        }
 }
 
index bafec1a..bc5b933 100644 (file)
@@ -133,6 +133,7 @@ $msgcode['addPortForObject']['ERR2'] = 100;
 function addPortForObject ()
 {
        assertStringArg ('port_name', TRUE);
+       genericAssertion ('port_l2address', 'l2address0');
        if (!strlen ($_REQUEST['port_name']))
                return buildRedirectURL (__FUNCTION__, 'ERR1');
        $error = commitAddPort
@@ -157,6 +158,7 @@ function editPortForObject ()
        assertUIntArg ('port_id');
        assertUIntArg ('port_type_id');
        assertStringArg ('reservation_comment', TRUE);
+       genericAssertion ('l2address', 'l2address0');
        // tolerate empty value now to produce custom informative message later
        assertStringArg ('name', TRUE);
        if (!strlen ($_REQUEST['name']))