From 5264ab966d3db7b1cb698190872cbe6feaf48464 Mon Sep 17 00:00:00 2001 From: Nam Nguyen Hoai Date: Fri, 5 Aug 2016 09:46:43 +0700 Subject: [PATCH] Using revision_number to ensure no overlap in *one* network This patch uses revision_number in database. When creating a subnet in a network, the revision_number of the network will be increased. That will prevent overlapping CIDR (overlapping CIDR means some subnets' cidrs are overlapping) on *one* network. Basically, in case of concurrent requests creating subnets on *one* network, only one request successes, other requests needs retrying request. Change-Id: Id6548535075bed87a4b36e1462db546ab9163f29 Closes-Bug: #1532695 --- neutron/db/models_v2.py | 1 + neutron/tests/tempest/api/test_revisions.py | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/neutron/db/models_v2.py b/neutron/db/models_v2.py index a173c590959..3c98f349308 100644 --- a/neutron/db/models_v2.py +++ b/neutron/db/models_v2.py @@ -196,6 +196,7 @@ class Subnet(model_base.HasStandardAttributes, model_base.BASEV2, ip_version = sa.Column(sa.Integer, nullable=False) cidr = sa.Column(sa.String(64), nullable=False) gateway_ip = sa.Column(sa.String(64)) + revises_on_change = ('networks', ) allocation_pools = orm.relationship(IPAllocationPool, backref='subnet', lazy="joined", diff --git a/neutron/tests/tempest/api/test_revisions.py b/neutron/tests/tempest/api/test_revisions.py index 92f78663a71..4284649fff2 100644 --- a/neutron/tests/tempest/api/test_revisions.py +++ b/neutron/tests/tempest/api/test_revisions.py @@ -55,6 +55,17 @@ def test_update_subnetpool_bumps_revision(self): updated = self.admin_client.update_subnetpool(sp['id'], name='sp2') self.assertGreater(updated['subnetpool']['revision'], sp['revision']) + @test.idempotent_id('e8c5d7db-2b8d-4567-a326-6e123437c4d1') + def test_update_subnet_bumps_network_revision(self): + net = self.create_network() + subnet = self.create_subnet(net) + updated = self.client.show_network(net['id']) + self.assertGreater(updated['network']['revision'], net['revision']) + self.client.delete_subnet(subnet['id']) + updated2 = self.client.show_network(net['id']) + self.assertGreater(updated2['network']['revision'], + updated['network']['revision']) + @test.idempotent_id('6c256f71-c929-4200-b3dc-4e1843506be5') @test.requires_ext(extension="security-group", service="network") def test_update_sg_group_bumps_revision(self):