Use revision_number(network subnet)

Change-Id: I5617bc29c41777a175065197e17122b81ef7f03d
Partial-Bug: #1618738
This commit is contained in:
Hong Hui Xiao 2016-09-22 19:02:46 +08:00
parent be2118ecfa
commit 26af96bbf1
3 changed files with 76 additions and 139 deletions

View File

@ -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)

View File

@ -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())

View File

@ -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."""