]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Protect PoolStats table from negative values.
authorAvishay Balderman <avishayb@radware.com>
Tue, 11 Jun 2013 08:52:20 +0000 (01:52 -0700)
committerAvishay Balderman <avishayb@radware.com>
Tue, 11 Jun 2013 11:35:02 +0000 (04:35 -0700)
Fixes: bug #1188959
Change-Id: I67038734dae5dc29e5c0666fdc98827dfd50b678

quantum/db/loadbalancer/loadbalancer_db.py
quantum/tests/unit/db/loadbalancer/test_db_loadbalancer.py

index df20928c035d5603876c4f0675aec8f890118c33..332aa96dd4cef319c050ea05c34ac323372bdf85 100644 (file)
@@ -19,6 +19,7 @@ import sqlalchemy as sa
 from sqlalchemy import exc as sa_exc
 from sqlalchemy import orm
 from sqlalchemy.orm import exc
+from sqlalchemy.orm import validates
 
 from quantum.api.v2 import attributes
 from quantum.common import exceptions as q_exc
@@ -59,6 +60,16 @@ class PoolStatistics(model_base.BASEV2):
     active_connections = sa.Column(sa.Integer, nullable=False)
     total_connections = sa.Column(sa.Integer, nullable=False)
 
+    @validates('bytes_in', 'bytes_out',
+               'active_connections', 'total_connections')
+    def validate_non_negative_int(self, key, value):
+        if value < 0:
+            data = {'key': key, 'value': value}
+            raise ValueError(_('The %(key)s field can not have '
+                               'negative value. '
+                               'Current value is %(value)d.') % data)
+        return value
+
 
 class Vip(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):
     """Represents a v2 quantum loadbalancer vip."""
index 790159072d4aedd21b5a41db98b8b327b9d0941a..02a8f3c4916c0da63450d1e0a05fb1b9b5f8bca5 100644 (file)
@@ -936,6 +936,21 @@ class TestLoadBalancer(LoadBalancerPluginDbTestCase):
             for key in keys:
                 self.assertEqual(pool_obj.stats.__dict__[key], 0)
 
+    def test_update_pool_stats_with_negative_values(self):
+        stats_data = {"bytes_in": -1,
+                      "bytes_out": -2,
+                      "active_connections": -3,
+                      "total_connections": -4}
+        for k, v in stats_data.items():
+            self._test_update_pool_stats_with_negative_value(k, v)
+
+    def _test_update_pool_stats_with_negative_value(self, k, v):
+        with self.pool() as pool:
+            pool_id = pool['pool']['id']
+            ctx = context.get_admin_context()
+            self.assertRaises(ValueError, self.plugin._update_pool_stats,
+                              ctx, pool_id, {k: v})
+
     def test_update_pool_stats(self):
         stats_data = {"bytes_in": 1,
                       "bytes_out": 2,