summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-07-27 15:16:43 +0000
committerGerrit Code Review <review@openstack.org>2012-07-27 15:16:43 +0000
commitcba664069bd98930a482e6fdfe72cd1d21d2f198 (patch)
tree53842644fcf76a3e065753e7b848357da4f5bd73 /nova
parent218ecc090940c599dd5246eb078cbcf1868194fb (diff)
parent44132acbe91092de1188a3015a2c7155b5ec774c (diff)
Merge "Moving where the fixed ip deallocation happens."
Diffstat (limited to 'nova')
-rw-r--r--nova/network/manager.py7
-rw-r--r--nova/tests/network/test_manager.py29
2 files changed, 33 insertions, 3 deletions
diff --git a/nova/network/manager.py b/nova/network/manager.py
index 4dd42e153..9c70b3ce3 100644
--- a/nova/network/manager.py
+++ b/nova/network/manager.py
@@ -1273,9 +1273,6 @@ class NetworkManager(manager.SchedulerDependentManager):
"""Returns a fixed ip to the pool."""
fixed_ip_ref = self.db.fixed_ip_get_by_address(context, address)
vif_id = fixed_ip_ref['virtual_interface_id']
- self.db.fixed_ip_update(context, address,
- {'allocated': False,
- 'virtual_interface_id': None})
instance = self.db.instance_get_by_uuid(context,
fixed_ip_ref['instance_uuid'])
@@ -1312,6 +1309,10 @@ class NetworkManager(manager.SchedulerDependentManager):
# callback will get called by nova-dhcpbridge.
self.driver.release_dhcp(dev, address, vif['address'])
+ self.db.fixed_ip_update(context, address,
+ {'allocated': False,
+ 'virtual_interface_id': None})
+
def lease_fixed_ip(self, context, address):
"""Called by dhcp-bridge when ip is leased."""
LOG.debug(_('Leased IP |%(address)s|'), locals(), context=context)
diff --git a/nova/tests/network/test_manager.py b/nova/tests/network/test_manager.py
index a183094af..d04df5f13 100644
--- a/nova/tests/network/test_manager.py
+++ b/nova/tests/network/test_manager.py
@@ -1013,6 +1013,35 @@ class VlanNetworkTestCase(test.TestCase):
self.flags(force_dhcp_release=True)
self.network.deallocate_fixed_ip(context1, fix_addr, 'fake')
+ def test_fixed_ip_cleanup_fail(self):
+ """Verify IP is not deallocated if the security group refresh fails."""
+ def network_get(_context, network_id):
+ return networks[network_id]
+
+ self.stubs.Set(db, 'network_get', network_get)
+
+ context1 = context.RequestContext('user', 'project1')
+
+ instance = db.instance_create(context1,
+ {'project_id': 'project1'})
+
+ elevated = context1.elevated()
+ fix_addr = db.fixed_ip_associate_pool(elevated, 1, instance['uuid'])
+ values = {'allocated': True,
+ 'virtual_interface_id': 3}
+ db.fixed_ip_update(elevated, fix_addr, values)
+ fixed = db.fixed_ip_get_by_address(elevated, fix_addr)
+ network = db.network_get(elevated, fixed['network_id'])
+
+ db.instance_destroy(self.context.elevated(), instance['uuid'])
+ self.assertRaises(exception.InstanceNotFound,
+ self.network.deallocate_fixed_ip,
+ context1,
+ fix_addr,
+ 'fake')
+ fixed = db.fixed_ip_get_by_address(elevated, fix_addr)
+ self.assertTrue(fixed['allocated'])
+
class CommonNetworkTestCase(test.TestCase):