From: Ihar Hrachyshka Date: Wed, 29 Jul 2015 18:44:54 +0000 (+0200) Subject: Guarantee there is only one bandwidth limit rule per policy X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=2b280a634ecb6f57c44c1d5a34b07e0bdb4d750e;p=openstack-build%2Fneutron-build.git Guarantee there is only one bandwidth limit rule per policy Added corresponding db model constraint. Change-Id: I5592d49909408df66e4d01cebbc45204c2be66c1 Partially-Implements: blueprint quantum-qos-api --- diff --git a/neutron/db/migration/alembic_migrations/versions/liberty/expand/48153cb5f051_qos_db_changes.py b/neutron/db/migration/alembic_migrations/versions/liberty/expand/48153cb5f051_qos_db_changes.py index d20048b0e..940b4def5 100755 --- a/neutron/db/migration/alembic_migrations/versions/liberty/expand/48153cb5f051_qos_db_changes.py +++ b/neutron/db/migration/alembic_migrations/versions/liberty/expand/48153cb5f051_qos_db_changes.py @@ -64,6 +64,6 @@ def upgrade(): sa.Column('id', sa.String(length=36), primary_key=True), sa.Column('qos_policy_id', sa.String(length=36), sa.ForeignKey('qos_policies.id', ondelete='CASCADE'), - nullable=False), + nullable=False, unique=True), sa.Column('max_kbps', sa.Integer()), sa.Column('max_burst_kbps', sa.Integer())) diff --git a/neutron/db/qos/models.py b/neutron/db/qos/models.py index 89594618f..6185475ed 100755 --- a/neutron/db/qos/models.py +++ b/neutron/db/qos/models.py @@ -70,7 +70,9 @@ class QosPortPolicyBinding(model_base.BASEV2): class QosRuleColumns(models_v2.HasId): - qos_policy_id = sa.Column(sa.String(36), nullable=False) + # NOTE(ihrachyshka): we may need to rework it later when we introduce types + # that should not enforce uniqueness + qos_policy_id = sa.Column(sa.String(36), nullable=False, unique=True) __table_args__ = ( sa.ForeignKeyConstraint(['qos_policy_id'], ['qos_policies.id']), diff --git a/neutron/services/qos/qos_plugin.py b/neutron/services/qos/qos_plugin.py index 23135bf82..082fdae2b 100644 --- a/neutron/services/qos/qos_plugin.py +++ b/neutron/services/qos/qos_plugin.py @@ -85,10 +85,6 @@ class QoSPlugin(qos.QoSPluginBase): # future code duplication when we have more rules. def create_policy_bandwidth_limit_rule(self, context, policy_id, bandwidth_limit_rule): - #TODO(QoS): avoid creation of severan bandwidth limit rules - # in the future we need an inter-rule validation - # mechanism to verify all created rules will - # play well together. # validate that we have access to the policy policy = self._get_policy_obj(context, policy_id) rule = rule_object.QosBandwidthLimitRule( diff --git a/neutron/tests/api/test_qos.py b/neutron/tests/api/test_qos.py index 845ef61cc..43ab12b8c 100644 --- a/neutron/tests/api/test_qos.py +++ b/neutron/tests/api/test_qos.py @@ -256,6 +256,21 @@ class QosBandwidthLimitRuleTestJSON(base.BaseAdminNetworkTest): self.assertEqual(1, len(policy_rules)) self.assertEqual(rule['id'], policy_rules[0]['id']) + @test.attr(type='smoke') + @test.idempotent_id('8a59b00b-ab01-4787-92f8-93a5cdf5e378') + def test_rule_create_fail_for_the_same_type(self): + policy = self.create_qos_policy(name='test-policy', + description='test policy', + shared=False) + self.create_qos_bandwidth_limit_rule(policy_id=policy['id'], + max_kbps=200, + max_burst_kbps=1337) + + self.assertRaises(exceptions.ServerFault, + self.create_qos_bandwidth_limit_rule, + policy_id=policy['id'], + max_kbps=201, max_burst_kbps=1338) + @test.attr(type='smoke') @test.idempotent_id('149a6988-2568-47d2-931e-2dbc858943b3') def test_rule_update(self): @@ -295,6 +310,3 @@ class QosBandwidthLimitRuleTestJSON(base.BaseAdminNetworkTest): self.assertRaises(exceptions.ServerFault, self.admin_client.show_bandwidth_limit_rule, policy['id'], rule['id']) - - #TODO(QoS): create several bandwidth-limit rules (not sure it makes sense, - # but to test more than one rule)