From 256403e20fc8c5fb7ffcc68bc76ddfe39efb8cd9 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Thu, 29 Mar 2012 11:44:34 -0700 Subject: [PATCH] Check vif exists before releasing ip * adds test to make sure code doesn't raise * fixes bug 968457 Change-Id: I7110cb18a45fb955769247a9a0c5fb721ab3935a --- nova/network/manager.py | 3 ++- nova/tests/network/test_manager.py | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/nova/network/manager.py b/nova/network/manager.py index b0b84af9b5e..86a7a3b04a1 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -1223,7 +1223,8 @@ def deallocate_fixed_ip(self, context, address, **kwargs): context, instance_id, network['id']) # NOTE(vish): This forces a packet so that the release_fixed_ip # callback will get called by nova-dhcpbridge. - self.driver.release_dhcp(dev, address, vif['address']) + if vif: + self.driver.release_dhcp(dev, address, vif['address']) def lease_fixed_ip(self, context, address): """Called by dhcp-bridge when ip is leased.""" diff --git a/nova/tests/network/test_manager.py b/nova/tests/network/test_manager.py index 6720be5843b..ef1e6b70c0f 100644 --- a/nova/tests/network/test_manager.py +++ b/nova/tests/network/test_manager.py @@ -873,6 +873,32 @@ def network_get(_context, network_id): db.floating_ip_destroy(context1.elevated(), float_addr) db.fixed_ip_disassociate(context1.elevated(), fix_addr) + def test_deallocate_fixed_no_vif(self): + """Verify that deallocate doesn't raise when no vif is returned. + + Ensures https://bugs.launchpad.net/nova/+bug/968457 doesn't return""" + + def network_get(_context, network_id): + return networks[network_id] + + self.stubs.Set(db, 'network_get', network_get) + + def vif_get(_context, _instance_id, _network_id): + return None + + self.stubs.Set(db, 'virtual_interface_get_by_instance_and_network', + vif_get) + context1 = context.RequestContext('user', 'project1') + + instance = db.instance_create(context1, + {'project_id': 'project1'}) + + fix_addr = db.fixed_ip_associate_pool(context1.elevated(), + 1, instance['id']) + + self.flags(force_dhcp_release=True) + self.network.deallocate_fixed_ip(context1, fix_addr, 'fake') + class CommonNetworkTestCase(test.TestCase):