]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Add model support for DHCP lease expiration
authorMark McClain <mark.mcclain@dreamhost.com>
Tue, 14 Aug 2012 03:18:54 +0000 (23:18 -0400)
committerMark McClain <mark.mcclain@dreamhost.com>
Tue, 14 Aug 2012 17:17:43 +0000 (13:17 -0400)
bug 1022804

This fix is phase 1 of a fix that to address re-allocation of a fixed_ip before
the DHCP lease expires.  The next phases will add RPC and recycling
support.

Change-Id: I3c907ade5cde562ff5a222bd97e56ffef367c722

etc/quantum.conf
quantum/common/config.py
quantum/db/db_base_plugin_v2.py
quantum/db/models_v2.py
quantum/tests/unit/test_db_plugin.py

index 39f18de53e1d939c28775c91fe7056a2b966efa5..d98f9c185177f8f955e108c2c99e3dd650e5bda6 100644 (file)
@@ -39,6 +39,9 @@ api_paste_config = api-paste.ini
 # Maximum amount of retries to generate a unique MAC address
 # mac_generation_retries = 16
 
+# DHCP Lease duration (in seconds)
+# dhcp_lease_duration = 120
+
 # Enable or disable bulk create/update/delete operations
 # allow_bulk = True
 # RPC configuration options. Defined in rpc __init__
index ba28af7195098886a8be03b4a808aaae88187d12..501b5a0c79599c831e1be16ad32f2976ffff0a5a 100644 (file)
@@ -48,6 +48,7 @@ core_opts = [
     cfg.IntOpt('max_dns_nameservers', default=5),
     cfg.IntOpt('max_subnet_host_routes', default=20),
     cfg.StrOpt('state_path', default='.'),
+    cfg.IntOpt('dhcp_lease_duration', default=120),
 ]
 
 # Register the configuration options
index 85f5c42ec98503dad1b8db48972afa6d71d2b1d4..803216622c25a9dac03ad4ef80576aad923867f6 100644 (file)
@@ -13,6 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import datetime
 import logging
 import random
 
@@ -26,6 +27,7 @@ from quantum.common import utils
 from quantum.db import api as db
 from quantum.db import models_v2
 from quantum.openstack.common import cfg
+from quantum.openstack.common import timeutils
 from quantum import quantum_plugin_base_v2
 
 
@@ -266,6 +268,11 @@ class QuantumDbPluginV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
         QuantumDbPluginV2._delete_ip_allocation(context, network_id, subnet_id,
                                                 port_id, ip_address)
 
+    @staticmethod
+    def _default_allocation_expiration():
+        return (timeutils.utcnow() +
+                datetime.timedelta(seconds=cfg.CONF.dhcp_lease_duration))
+
     @staticmethod
     def _delete_ip_allocation(context, network_id, subnet_id, port_id,
                               ip_address):
@@ -1016,7 +1023,8 @@ class QuantumDbPluginV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
                 for ip in ips:
                     allocated = models_v2.IPAllocation(
                         network_id=port['network_id'], port_id=port.id,
-                        ip_address=ip['ip_address'], subnet_id=ip['subnet_id'])
+                        ip_address=ip['ip_address'], subnet_id=ip['subnet_id'],
+                        expiration=self._default_allocation_expiration())
                     context.session.add(allocated)
 
             port.update(p)
index 6e9dc20454d617897a76d97b01a695051d55120b..6be757ac2e6be047eeba1d525f798165234187e8 100644 (file)
@@ -84,6 +84,7 @@ class IPAllocation(model_base.BASEV2):
     network_id = sa.Column(sa.String(36), sa.ForeignKey("networks.id",
                                                         ondelete="CASCADE"),
                            nullable=False, primary_key=True)
+    expiration = sa.Column(sa.DateTime, nullable=True)
 
 
 class Port(model_base.BASEV2, HasId, HasTenant):
index b383168f4dd825c9f8e9827d9f2eaa2586b7f9b9..b2d8b66973afe779e21a00c5967e32338a007fbf 100644 (file)
@@ -15,6 +15,7 @@
 
 import contextlib
 import copy
+import datetime
 import logging
 import mock
 import os
@@ -34,6 +35,7 @@ from quantum.db import api as db
 from quantum.db import db_base_plugin_v2
 from quantum.manager import QuantumManager
 from quantum.openstack.common import cfg
+from quantum.openstack.common import timeutils
 from quantum.tests.unit import test_extensions
 from quantum.tests.unit.testlib_api import create_request
 from quantum.wsgi import Serializer, JSONDeserializer
@@ -2025,3 +2027,14 @@ class TestSubnetsV2(QuantumDbPluginV2TestCase):
         req = self.new_delete_request('subnets', subnet['subnet']['id'])
         res = req.get_response(self.api)
         self.assertEquals(res.status_int, 204)
+
+    def test_default_allocation_expiration(self):
+        reference = datetime.datetime(2012, 8, 13, 23, 11, 0)
+        timeutils.utcnow.override_time = reference
+
+        cfg.CONF.set_override('dhcp_lease_duration', 120)
+        expires = QuantumManager.get_plugin()._default_allocation_expiration()
+        timeutils.utcnow
+        cfg.CONF.reset()
+        timeutils.utcnow.override_time = None
+        self.assertEqual(expires, reference + datetime.timedelta(seconds=120))