summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVishvananda Ishaya <vishvananda@gmail.com>2012-03-29 11:44:34 -0700
committerVishvananda Ishaya <vishvananda@gmail.com>2012-03-29 13:23:37 -0700
commitbe80a55d41f03a9e22d8d90a91bf6b9c09c0c692 (patch)
treef931e2ba1993bece8bfbebf15162d3d4dd7314ed
parentebd7a689a653117fd52856d2b3a5853855d20877 (diff)
Check vif exists before releasing ip
* adds test to make sure code doesn't raise * fixes bug 968457 Change-Id: I7110cb18a45fb955769247a9a0c5fb721ab3935a
-rw-r--r--nova/network/manager.py3
-rw-r--r--nova/tests/network/test_manager.py26
2 files changed, 28 insertions, 1 deletions
diff --git a/nova/network/manager.py b/nova/network/manager.py
index e67b68c0f..d26145114 100644
--- a/nova/network/manager.py
+++ b/nova/network/manager.py
@@ -1217,7 +1217,8 @@ class NetworkManager(manager.SchedulerDependentManager):
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 e8da5b3f8..a6f653961 100644
--- a/nova/tests/network/test_manager.py
+++ b/nova/tests/network/test_manager.py
@@ -846,6 +846,32 @@ class VlanNetworkTestCase(test.TestCase):
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):