summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVishvananda Ishaya <vishvananda@gmail.com>2011-09-19 20:06:37 +0000
committerTarmac <>2011-09-19 20:06:37 +0000
commit64e7f6dfcd4496157c06cfed9b3078c474113877 (patch)
tree432b41c29673e97b9c6aa9706d7b27681b91ed36
parent08d3053aea0f77f38f1614e7cb867bddb8e55302 (diff)
parent6220ae46be5c1a4346b3036c6e8d31ddb1bcb4ee (diff)
Adds an optional flag to force dhcp releases on instance termination. This allows ips to be reused without having to wait for the lease to timeout.
-rwxr-xr-xnova/network/linux_net.py19
-rw-r--r--nova/network/manager.py7
2 files changed, 26 insertions, 0 deletions
diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py
index c058e93f3..2f9805fa3 100755
--- a/nova/network/linux_net.py
+++ b/nova/network/linux_net.py
@@ -550,6 +550,10 @@ def get_dhcp_opts(context, network_ref):
return '\n'.join(hosts)
+def release_dhcp(dev, address, mac_address):
+ utils.execute('dhcp_release', dev, address, mac_address, run_as_root=True)
+
+
# NOTE(ja): Sending a HUP only reloads the hostfile, so any
# configuration options (like dchp-range, vlan, ...)
# aren't reloaded.
@@ -799,6 +803,10 @@ def unplug(network):
return interface_driver.unplug(network)
+def get_dev(network):
+ return interface_driver.get_dev(network)
+
+
class LinuxNetInterfaceDriver(object):
"""Abstract class that defines generic network host API"""
""" for for all Linux interface drivers."""
@@ -811,6 +819,11 @@ class LinuxNetInterfaceDriver(object):
"""Destory Linux device, return device name"""
raise NotImplementedError()
+ def get_dev(self, network):
+ """Get device name"""
+ raise NotImplementedError()
+
+
# plugs interfaces using Linux Bridge
class LinuxBridgeInterfaceDriver(LinuxNetInterfaceDriver):
@@ -832,6 +845,9 @@ class LinuxBridgeInterfaceDriver(LinuxNetInterfaceDriver):
return network['bridge']
def unplug(self, network):
+ return self.get_dev(network)
+
+ def get_dev(self, network):
return network['bridge']
@classmethod
@@ -956,6 +972,9 @@ class LinuxOVSInterfaceDriver(LinuxNetInterfaceDriver):
return dev
def unplug(self, network):
+ return self.get_dev(network)
+
+ def get_dev(self, network):
dev = "gw-" + str(network['id'])
return dev
diff --git a/nova/network/manager.py b/nova/network/manager.py
index 70e51888f..5c2bc60f1 100644
--- a/nova/network/manager.py
+++ b/nova/network/manager.py
@@ -110,6 +110,8 @@ flags.DEFINE_string('network_host', socket.gethostname(),
'Network host to use for ip allocation in flat modes')
flags.DEFINE_bool('fake_call', False,
'If True, skip using the queue and make local calls')
+flags.DEFINE_bool('force_dhcp_release', False,
+ 'If True, send a dhcp release on instance termination')
class AddressAlreadyAllocated(exception.Error):
@@ -629,6 +631,11 @@ class NetworkManager(manager.SchedulerDependentManager):
instance_id = instance_ref['id']
self._do_trigger_security_group_members_refresh_for_instance(
instance_id)
+ if FLAGS.force_dhcp_release:
+ dev = self.driver.get_dev(fixed_ip_ref['network'])
+ vif = self.db.virtual_interface_get_by_instance_and_network(
+ context, instance_ref['id'], fixed_ip_ref['network']['id'])
+ self.driver.release_dhcp(dev, address, vif['address'])
def lease_fixed_ip(self, context, address):
"""Called by dhcp-bridge when ip is leased."""