diff options
| author | Vishvananda Ishaya <vishvananda@gmail.com> | 2011-09-19 20:06:37 +0000 |
|---|---|---|
| committer | Tarmac <> | 2011-09-19 20:06:37 +0000 |
| commit | 64e7f6dfcd4496157c06cfed9b3078c474113877 (patch) | |
| tree | 432b41c29673e97b9c6aa9706d7b27681b91ed36 | |
| parent | 08d3053aea0f77f38f1614e7cb867bddb8e55302 (diff) | |
| parent | 6220ae46be5c1a4346b3036c6e8d31ddb1bcb4ee (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-x | nova/network/linux_net.py | 19 | ||||
| -rw-r--r-- | nova/network/manager.py | 7 |
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.""" |
