From 135d20218ac8f67153c106d373d3a1c1a00f55d6 Mon Sep 17 00:00:00 2001 From: Avishay Balderman Date: Tue, 11 Jun 2013 01:52:20 -0700 Subject: [PATCH] Protect PoolStats table from negative values. Fixes: bug #1188959 Change-Id: I67038734dae5dc29e5c0666fdc98827dfd50b678 --- quantum/db/loadbalancer/loadbalancer_db.py | 11 +++++++++++ .../unit/db/loadbalancer/test_db_loadbalancer.py | 15 +++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/quantum/db/loadbalancer/loadbalancer_db.py b/quantum/db/loadbalancer/loadbalancer_db.py index df20928c0..332aa96dd 100644 --- a/quantum/db/loadbalancer/loadbalancer_db.py +++ b/quantum/db/loadbalancer/loadbalancer_db.py @@ -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.""" diff --git a/quantum/tests/unit/db/loadbalancer/test_db_loadbalancer.py b/quantum/tests/unit/db/loadbalancer/test_db_loadbalancer.py index 790159072..02a8f3c49 100644 --- a/quantum/tests/unit/db/loadbalancer/test_db_loadbalancer.py +++ b/quantum/tests/unit/db/loadbalancer/test_db_loadbalancer.py @@ -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,