From dec1e329c2ebba9fd0f9e96d1ae85aa084ccba6f Mon Sep 17 00:00:00 2001 From: Sylvain Afchain Date: Mon, 9 Sep 2013 13:02:19 +0200 Subject: [PATCH] Fix adding identical metering rules on two labels Fixes: Bug #1229075 Change-Id: Id86c83ec9c7af78fc08e662bb0a9202f0f759c0c --- neutron/db/metering/metering_db.py | 10 +++++-- .../unit/db/metering/test_db_metering.py | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/neutron/db/metering/metering_db.py b/neutron/db/metering/metering_db.py index 5d8f1e12c..8bdaa7c0c 100644 --- a/neutron/db/metering/metering_db.py +++ b/neutron/db/metering/metering_db.py @@ -144,9 +144,12 @@ class MeteringDbMixin(metering.MeteringPluginBase, return self._make_metering_label_rule_dict(metering_label_rule, fields) - def _validate_cidr(self, context, remote_ip_prefix, direction, excluded): + def _validate_cidr(self, context, label_id, remote_ip_prefix, + direction, excluded): r_ips = self.get_metering_label_rules(context, - filters={'direction': + filters={'metering_label_id': + label_id, + 'direction': [direction], 'excluded': [excluded]}, @@ -166,7 +169,8 @@ class MeteringDbMixin(metering.MeteringPluginBase, direction = m['direction'] excluded = m['excluded'] - self._validate_cidr(context, ip_prefix, direction, excluded) + self._validate_cidr(context, label_id, ip_prefix, direction, + excluded) metering_db = MeteringLabelRule(id=uuidutils.generate_uuid(), metering_label_id=label_id, direction=direction, diff --git a/neutron/tests/unit/db/metering/test_db_metering.py b/neutron/tests/unit/db/metering/test_db_metering.py index 69f98b265..72319c057 100644 --- a/neutron/tests/unit/db/metering/test_db_metering.py +++ b/neutron/tests/unit/db/metering/test_db_metering.py @@ -263,6 +263,34 @@ class MeteringPluginDbTestCase(test_db_plugin.NeutronDbPluginV2TestCase, self._test_list_resources('metering-label-rule', metering_label_rule) + def test_create_metering_label_rule_two_labels(self): + name1 = 'my label 1' + name2 = 'my label 2' + description = 'my metering label' + + with self.metering_label(name1, description) as metering_label1: + metering_label_id1 = metering_label1['metering_label']['id'] + + with self.metering_label(name2, description) as metering_label2: + metering_label_id2 = metering_label2['metering_label']['id'] + + direction = 'egress' + remote_ip_prefix = '192.168.0.0/24' + excluded = True + + with contextlib.nested( + self.metering_label_rule(metering_label_id1, + direction, + remote_ip_prefix, + excluded), + self.metering_label_rule(metering_label_id2, + direction, + remote_ip_prefix, + excluded)) as metering_label_rule: + + self._test_list_resources('metering-label-rule', + metering_label_rule) + class TestMeteringDbXML(MeteringPluginDbTestCase): fmt = 'xml' -- 2.45.2