diff options
| author | Vishvananda Ishaya <vishvananda@gmail.com> | 2012-03-29 11:44:34 -0700 |
|---|---|---|
| committer | Vishvananda Ishaya <vishvananda@gmail.com> | 2012-03-29 13:23:37 -0700 |
| commit | be80a55d41f03a9e22d8d90a91bf6b9c09c0c692 (patch) | |
| tree | f931e2ba1993bece8bfbebf15162d3d4dd7314ed | |
| parent | ebd7a689a653117fd52856d2b3a5853855d20877 (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.py | 3 | ||||
| -rw-r--r-- | nova/tests/network/test_manager.py | 26 |
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): |
