From 26af96bbf1fbb29ef0cfed2c0a6c550e9d8a0160 Mon Sep 17 00:00:00 2001 From: Hong Hui Xiao Date: Thu, 22 Sep 2016 19:02:46 +0800 Subject: [PATCH] Use revision_number(network subnet) Change-Id: I5617bc29c41777a175065197e17122b81ef7f03d Partial-Bug: #1618738 --- dragonflow/neutron/ml2/mech_driver.py | 38 ++-- .../tests/fullstack/test_object_version.py | 10 +- dragonflow/tests/unit/test_mech_driver.py | 167 +++++++----------- 3 files changed, 76 insertions(+), 139 deletions(-) diff --git a/dragonflow/neutron/ml2/mech_driver.py b/dragonflow/neutron/ml2/mech_driver.py index 78deff908..6edc6ebb0 100644 --- a/dragonflow/neutron/ml2/mech_driver.py +++ b/dragonflow/neutron/ml2/mech_driver.py @@ -197,11 +197,6 @@ class DFMechDriver(driver_api.MechanismDriver): sg_version=sg_version) LOG.info(_LI("DFMechDriver: delete security group rule %s"), sgr_id) - def create_network_precommit(self, context): - nw_version = version_db._create_db_version_row( - context._plugin_context.session, context.current['id']) - context.current['db_version'] = nw_version - @lock_db.wrap_db_lock(lock_db.RESOURCE_ML2_CORE) def create_network_postcommit(self, context): network = context.current @@ -214,16 +209,12 @@ class DFMechDriver(driver_api.MechanismDriver): segmentation_id=network.get('provider:segmentation_id'), router_external=network['router:external'], mtu=network.get('mtu'), - version=network['db_version'], + version=network['revision_number'], subnets=[]) LOG.info(_LI("DFMechDriver: create network %s"), network['id']) return network - def delete_network_precommit(self, context): - version_db._delete_db_version_row(context._plugin_context.session, - context.current['id']) - @lock_db.wrap_db_lock(lock_db.RESOURCE_ML2_CORE) def delete_network_postcommit(self, context): network = context.current @@ -332,14 +323,10 @@ class DFMechDriver(driver_api.MechanismDriver): return None - def create_subnet_precommit(self, context): - network_version = version_db._update_db_version_row( - context._plugin_context.session, context.current['network_id']) - context.current['db_version'] = network_version - @lock_db.wrap_db_lock(lock_db.RESOURCE_ML2_CORE) def create_subnet_postcommit(self, context): subnet = context.current + network = context.network.current net_id = subnet['network_id'] plugin_context = context._plugin_context dhcp_ip = None @@ -358,7 +345,7 @@ class DFMechDriver(driver_api.MechanismDriver): net_id, subnet['tenant_id'], name=subnet.get('name', df_const.DF_SUBNET_DEFAULT_NAME), - nw_version=subnet['db_version'], + nw_version=network['revision_number'], enable_dhcp=subnet['enable_dhcp'], cidr=subnet['cidr'], dhcp_ip=dhcp_ip, @@ -412,15 +399,11 @@ class DFMechDriver(driver_api.MechanismDriver): dhcp_ip = self._get_ip_from_port(port) return dhcp_ip, None - def update_subnet_precommit(self, context): - network_version = version_db._update_db_version_row( - context._plugin_context.session, context.current['network_id']) - context.current['db_version'] = network_version - @lock_db.wrap_db_lock(lock_db.RESOURCE_ML2_CORE) def update_subnet_postcommit(self, context): new_subnet = context.current old_subnet = context.original + network = context.network.current plugin_context = context._plugin_context dhcp_ip = None dhcp_port = None @@ -439,7 +422,7 @@ class DFMechDriver(driver_api.MechanismDriver): new_subnet['network_id'], new_subnet['tenant_id'], name=new_subnet.get('name', df_const.DF_SUBNET_DEFAULT_NAME), - nw_version=new_subnet['db_version'], + nw_version=network['revision_number'], enable_dhcp=new_subnet['enable_dhcp'], cidr=new_subnet['cidr'], dhcp_ip=dhcp_ip, @@ -450,11 +433,6 @@ class DFMechDriver(driver_api.MechanismDriver): LOG.info(_LI("DFMechDriver: update subnet %s"), new_subnet['id']) return new_subnet - def delete_subnet_precommit(self, context): - network_version = version_db._update_db_version_row( - context._plugin_context.session, context.current['network_id']) - context.current['db_version'] = network_version - @lock_db.wrap_db_lock(lock_db.RESOURCE_ML2_CORE) def delete_subnet_postcommit(self, context): """If the subnet enabled dhcp, the dhcp server port should be deleted. @@ -466,10 +444,14 @@ class DFMechDriver(driver_api.MechanismDriver): net_id = subnet['network_id'] subnet_id = subnet['id'] + # The network in context is still the network before deleting subnet + core_plugin = manager.NeutronManager.get_plugin() + network = core_plugin.get_network(context._plugin_context, net_id) + # update df controller with subnet delete try: self.nb_api.delete_subnet(subnet_id, net_id, subnet['tenant_id'], - nw_version=subnet['db_version']) + nw_version=network['revision_number']) except df_exceptions.DBKeyNotFound: LOG.debug("network %s is not found in DB, might have " "been deleted concurrently" % net_id) diff --git a/dragonflow/tests/fullstack/test_object_version.py b/dragonflow/tests/fullstack/test_object_version.py index b5aec10c8..36755d932 100644 --- a/dragonflow/tests/fullstack/test_object_version.py +++ b/dragonflow/tests/fullstack/test_object_version.py @@ -28,19 +28,19 @@ class TestObjectVersion(test_base.DFTestBase): network_id = network.create() self.assertTrue(network.exists()) version = self.nb_api.get_lswitch(network_id).get_version() - self.assertEqual(version, 0) subnet = self.store(objects.SubnetTestObj( self.neutron, self.nb_api, network_id)) subnet.create() self.assertTrue(subnet.exists()) - version = self.nb_api.get_lswitch(network_id).get_version() - self.assertEqual(version, 1) + new_version = self.nb_api.get_lswitch(network_id).get_version() + self.assertGreater(new_version, version) subnet.close() self.assertFalse(subnet.exists()) - version = self.nb_api.get_lswitch(network_id).get_version() - self.assertEqual(version, 2) + version = new_version + new_version = self.nb_api.get_lswitch(network_id).get_version() + self.assertGreater(new_version, version) network.close() self.assertFalse(network.exists()) diff --git a/dragonflow/tests/unit/test_mech_driver.py b/dragonflow/tests/unit/test_mech_driver.py index 24168d351..173328266 100644 --- a/dragonflow/tests/unit/test_mech_driver.py +++ b/dragonflow/tests/unit/test_mech_driver.py @@ -52,29 +52,6 @@ class TestDFMechDriver(base.BaseTestCase): return_value=self.dbversion) version_db._delete_db_version_row = mock.Mock() - def test_create_network_postcommit(self): - tenant_id = 'test' - network_id = '123' - network_type = 'vxlan' - segmentation_id = 456 - - network_context = self._get_network_context(tenant_id, - network_id, - network_type, - segmentation_id) - - self.driver.create_network_postcommit(network_context) - self.driver.nb_api.create_lswitch.assert_called_with( - id=network_id, - name='FakeNetwork', - topic=tenant_id, - network_type=network_type, - router_external=False, - segmentation_id=segmentation_id, - subnets=[], - mtu=1450, - version=self.dbversion) - def test_delete_network_postcommit(self): tenant_id = 'test' network_id = '123' @@ -91,73 +68,6 @@ class TestDFMechDriver(base.BaseTestCase): self.driver.nb_api.delete_lswitch.assert_called_with( id=network_id, topic=tenant_id) - def test_create_subnet_postcommit(self): - tenant_id = 'test' - network_id = '123' - subnet_id = '122' - cidr = '192.0.0.0/8' - gateway_ip = '192.0.0.1' - dhcp_ip = '1.1.1.1' - enable_dhcp = True - dns_nameservers = '2.2.2.2' - port = {'fixed_ips': [{'subnet_id': subnet_id, 'ip_address': dhcp_ip}]} - - self.driver._handle_create_subnet_dhcp = mock.Mock( - return_value=[dhcp_ip, port]) - subnet_context = self._get_subnet_context(tenant_id, network_id, - subnet_id, cidr, gateway_ip, - enable_dhcp, dns_nameservers) - - self.driver.create_subnet_postcommit(subnet_context) - self.driver.nb_api.add_subnet.assert_called_with( - subnet_id, network_id, tenant_id, enable_dhcp=enable_dhcp, - cidr=cidr, dhcp_ip=dhcp_ip, gateway_ip=gateway_ip, - dns_nameservers=dns_nameservers, name='FakeSubnet', - host_routes=[], - nw_version=self.dbversion) - - def test_update_subnet_postcommit(self): - tenant_id = 'test' - network_id = '123' - subnet_id = '122' - cidr = '192.0.0.0/8' - gateway_ip = '192.0.0.100' - dhcp_ip = '1.1.1.1' - enable_dhcp = True - dns_nameservers = '2.2.2.2' - port = {'fixed_ips': [{'subnet_id': subnet_id, 'ip_address': dhcp_ip}]} - - self.driver._handle_update_subnet_dhcp = mock.Mock( - return_value=[dhcp_ip, port]) - subnet_context = self._get_subnet_context(tenant_id, network_id, - subnet_id, cidr, gateway_ip, - enable_dhcp, dns_nameservers) - - self.driver.update_subnet_postcommit(subnet_context) - self.driver.nb_api.update_subnet.assert_called_with( - subnet_id, network_id, tenant_id, enable_dhcp=enable_dhcp, - cidr=cidr, dhcp_ip=dhcp_ip, gateway_ip=gateway_ip, - dns_nameservers=dns_nameservers, name='FakeSubnet', - host_routes=[], - nw_version=self.dbversion) - - def test_delete_subnet_postcommit(self): - tenant_id = 'test' - network_id = '123' - subnet_id = '122' - cidr = '192.0.0.0/8' - gateway_ip = '192.0.0.1' - enable_dhcp = True - dns_nameservers = '2.2.2.2' - - subnet_context = self._get_subnet_context(tenant_id, network_id, - subnet_id, cidr, gateway_ip, - enable_dhcp, dns_nameservers) - - self.driver.delete_subnet_postcommit(subnet_context) - self.driver.nb_api.delete_subnet.assert_called_with( - subnet_id, network_id, tenant_id, nw_version=self.dbversion) - def test_create_port_postcommit(self): tenant_id = 'test' network_id = '123' @@ -252,21 +162,6 @@ class TestDFMechDriver(base.BaseTestCase): self.driver.nb_api.delete_security_group.assert_called_with( sg_id, topic=tenant_id) - def _get_subnet_context(self, tenant_id, net_id, subnet_id, cidr, - gateway_ip, enable_dhcp, dns_nameservers): - # sample data for testing purpose only. - subnet = {'tenant_id': tenant_id, - 'network_id': net_id, - 'id': subnet_id, - 'cidr': cidr, - 'name': 'FakeSubnet', - 'ip_version': 4, - 'gateway_ip': gateway_ip, - 'enable_dhcp': enable_dhcp, - 'dns_nameservers': dns_nameservers, - 'db_version': self.dbversion} - return FakeContext(subnet) - def _get_port_context(self, tenant_id, net_id, port_id, fixed_ips, binding_profile): # sample data for testing purpose only. @@ -297,7 +192,7 @@ class TestDFMechDriver(base.BaseTestCase): 'provider:segmentation_id': seg_id, 'router:external': False, 'mtu': 1450, - 'db_version': self.dbversion} + 'revision_number': self.dbversion} segments = [{'segmentation_id': seg_id}] return FakeNetworkContext(network, segments) @@ -386,6 +281,66 @@ class TestDFMechDriverRevision(test_plugin.Ml2PluginV2TestCase): sg['id'], rule['id'], sg['tenant_id'], sg_version=newer_sg['revision_number']) + def _test_create_network_revision(self): + with self.network() as n: + network = n['network'] + self.assertGreater(network['revision_number'], 0) + self.nb_api.create_lswitch.assert_called_with( + id=network['id'], topic=network['tenant_id'], + name=network['name'], + network_type=network['provider:network_type'], + segmentation_id=network['provider:segmentation_id'], + router_external=network['router:external'], + mtu=network['mtu'], version=network['revision_number'], + subnets=[]) + return network + + def test_create_network_revision(self): + self._test_create_network_revision() + + def test_create_update_delete_subnet_network_revision(self): + network = self._test_create_network_revision() + with self.subnet(network={'network': network}) as s: + subnet = s['subnet'] + subnet_id = s['subnet']['id'] + + new_network = self.driver.get_network(self.context, network['id']) + self.assertGreater(new_network['revision_number'], + network['revision_number']) + self.nb_api.add_subnet.assert_called_with( + subnet_id, network['id'], subnet['tenant_id'], name=subnet['name'], + nw_version=new_network['revision_number'], + enable_dhcp=subnet['enable_dhcp'], cidr=subnet['cidr'], + dhcp_ip=mock.ANY, gateway_ip=subnet['gateway_ip'], + dns_nameservers=subnet['dns_nameservers'], + host_routes=subnet['host_routes']) + + data = {'subnet': {'name': 'updated'}} + req = self.new_update_request('subnets', data, subnet_id) + req.get_response(self.api) + network = new_network + new_network = self.driver.get_network(self.context, network['id']) + self.assertGreater(new_network['revision_number'], + network['revision_number']) + self.nb_api.update_subnet.assert_called_with( + subnet_id, network['id'], subnet['tenant_id'], name='updated', + nw_version=new_network['revision_number'], + enable_dhcp=subnet['enable_dhcp'], cidr=subnet['cidr'], + dhcp_ip=mock.ANY, gateway_ip=subnet['gateway_ip'], + dns_nameservers=subnet['dns_nameservers'], + host_routes=subnet['host_routes']) + + network = new_network + req = self.new_delete_request('subnets', subnet_id) + req.get_response(self.api) + network = new_network + new_network = self.driver.get_network(self.context, network['id']) + self.assertGreater(new_network['revision_number'], + network['revision_number']) + self.nb_api.delete_subnet.assert_called_with( + subnet_id, network['id'], subnet['tenant_id'], + nw_version=new_network['revision_number']) + class FakeNetworkContext(object): """To generate network context for testing purposes only."""