From 992049badd5d7809d61732a5d30290c562a7bf60 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Sat, 17 Sep 2011 15:06:39 -0700 Subject: add an optional flag to force dhcp release using dnsmasq-utils --- nova/network/linux_net.py | 19 +++++++++++++++++++ nova/network/manager.py | 7 +++++++ 2 files changed, 26 insertions(+) diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py index 7d89b2bcc..8ee419afc 100755 --- a/nova/network/linux_net.py +++ b/nova/network/linux_net.py @@ -540,6 +540,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. @@ -790,6 +794,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.""" @@ -802,6 +810,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): @@ -823,6 +836,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 @@ -947,6 +963,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 05d928fab..353dc3c0e 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): @@ -628,6 +630,11 @@ class NetworkManager(manager.SchedulerDependentManager): instance_id = instance_ref['id'] self._do_trigger_security_group_members_refresh_for_instance( instance_id) + if FLAGS.force_release_dhcp: + dev = self.driver.get_dev(fixed_ip_ref['network']) + address = fixed_ip_ref['address'] + mac_address = fixed_ip_ref['virtual_interface']['address'] + self.driver.release_dhcp(dev, address, mac_address) def lease_fixed_ip(self, context, address): """Called by dhcp-bridge when ip is leased.""" -- cgit From f69ccc655fb132f344fe633279d1a73e2e30245a Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Sat, 17 Sep 2011 15:09:36 -0700 Subject: flag typo --- nova/network/manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nova/network/manager.py b/nova/network/manager.py index 353dc3c0e..1283899c1 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -630,7 +630,7 @@ class NetworkManager(manager.SchedulerDependentManager): instance_id = instance_ref['id'] self._do_trigger_security_group_members_refresh_for_instance( instance_id) - if FLAGS.force_release_dhcp: + if FLAGS.force_dhcp_release: dev = self.driver.get_dev(fixed_ip_ref['network']) address = fixed_ip_ref['address'] mac_address = fixed_ip_ref['virtual_interface']['address'] -- cgit From 78f7cd742126a9f758ae3a6c133af99df12e838b Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Sat, 17 Sep 2011 15:26:31 -0700 Subject: get the interface using the network and instance --- nova/network/manager.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nova/network/manager.py b/nova/network/manager.py index 1283899c1..1f7dc784e 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -633,8 +633,9 @@ class NetworkManager(manager.SchedulerDependentManager): if FLAGS.force_dhcp_release: dev = self.driver.get_dev(fixed_ip_ref['network']) address = fixed_ip_ref['address'] - mac_address = fixed_ip_ref['virtual_interface']['address'] - self.driver.release_dhcp(dev, address, mac_address) + 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.""" -- cgit From 6220ae46be5c1a4346b3036c6e8d31ddb1bcb4ee Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Sun, 18 Sep 2011 02:37:09 -0700 Subject: remove extra line --- nova/network/manager.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nova/network/manager.py b/nova/network/manager.py index 1f7dc784e..8deeeaa0d 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -632,7 +632,6 @@ class NetworkManager(manager.SchedulerDependentManager): instance_id) if FLAGS.force_dhcp_release: dev = self.driver.get_dev(fixed_ip_ref['network']) - address = fixed_ip_ref['address'] 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']) -- cgit