From ae9c5f41b2a21183e80e6df19bdd7c56380c84a8 Mon Sep 17 00:00:00 2001 From: "John H. Tran" Date: Fri, 22 Jun 2012 19:14:06 -0700 Subject: [PATCH] deallocate_fixed_ip attempts to update deleted ip Fixes bug 1017633. When deleting a vm, the nova network manager looks to deallocate wrong fixed ip when context has read_deleted set to 'yes', in case when a network had been deleted and re- created , it attempts to update already deleted fixed_ips and therefore looks to teardown from wrong network_id as well. Change-Id: I574a20273220ef81498403da80f489732ae81eb1 (cherry picked from commit 61ab72d15b3ac61b245e0bdd4a7bee5f3a673f75) --- nova/network/manager.py | 3 +-- nova/tests/network/test_manager.py | 35 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/nova/network/manager.py b/nova/network/manager.py index 8b3540421de..3485e40073b 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -923,8 +923,7 @@ def deallocate_for_instance(self, context, **kwargs): context=read_deleted_context) # deallocate fixed ips for fixed_ip in fixed_ips: - self.deallocate_fixed_ip(read_deleted_context, fixed_ip['address'], - **kwargs) + self.deallocate_fixed_ip(context, fixed_ip['address'], **kwargs) # deallocate vifs (mac addresses) self.db.virtual_interface_delete_by_instance(read_deleted_context, diff --git a/nova/tests/network/test_manager.py b/nova/tests/network/test_manager.py index 78048226745..5008badc776 100644 --- a/nova/tests/network/test_manager.py +++ b/nova/tests/network/test_manager.py @@ -909,6 +909,41 @@ def vif_get(_context, _vif_id): fixed = db.fixed_ip_get_by_address(elevated, fix_addr) self.assertFalse(fixed['allocated']) + def test_deallocate_fixed_deleted(self): + """Verify doesn't deallocate deleted fixed_ip from deleted network""" + + def network_get(_context, network_id): + return networks[network_id] + + def teardown_network_on_host(_context, network): + if network['id'] == 0: + raise Exception('Correct network/fixed_ip assertion') + + self.stubs.Set(db, 'network_get', network_get) + self.stubs.Set(self.network, '_teardown_network_on_host', + teardown_network_on_host) + + 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['id']) + db.fixed_ip_update(elevated, fix_addr, {'deleted': 1}) + elevated.read_deleted = 'yes' + delfixed = db.fixed_ip_get_by_address(elevated, fix_addr) + values = {'address': fix_addr, + 'network_id': 0, + 'instance_id': delfixed['instance_id']} + db.fixed_ip_create(elevated, values) + elevated.read_deleted = 'no' + newfixed = db.fixed_ip_get_by_address(elevated, fix_addr) + elevated.read_deleted = 'yes' + + deallocate = self.network.deallocate_fixed_ip + self.assertRaises(Exception, deallocate, context1, fix_addr, 'fake') + def test_deallocate_fixed_no_vif(self): """Verify that deallocate doesn't raise when no vif is returned.