From aeeab5d064492e112cd626a2988a6808250fb029 Mon Sep 17 00:00:00 2001 From: Balazs Gibizer Date: Mon, 10 Feb 2020 15:48:04 +0100 Subject: [PATCH] Clean up allocation if unshelve fails due to neutron When port binding update fails during unshelve of a shelve offloaded instance compute manager has to catch the exception and clean up the destination host allocation. Conflicts: nova/compute/manager.py due to #Ibb8c12fb2799bb5ceb9e3d72a2b86dbb4f14451e is missing in rocky Squashed Ic1c3d35749fbdc7f5b6f6ec1e16b8fcf37c10de8 into this to avoid intermittently failing test case. Change-Id: I4c3fbb213e023ac16efc0b8561f975a659311684 Closes-Bug: #1862633 (cherry picked from commit e65d4a131a7ebc02261f5df69fa1b394a502f268) (cherry picked from commit e6b749dbdd735e2cd0054654b5da7a02280a080b) (cherry picked from commit 405a35587a2291e3cf9eb4efc8f102c91bb4ef76) --- nova/compute/manager.py | 7 ++++--- .../functional/regressions/test_bug_1862633.py | 13 +++++-------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/nova/compute/manager.py b/nova/compute/manager.py index bc0eff7204d8..9badffc0083a 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -5369,10 +5369,11 @@ class ComputeManager(manager.Manager): utils.get_image_from_system_metadata( instance.system_metadata)) - self.network_api.setup_instance_network_on_host(context, instance, - self.host) - network_info = self.network_api.get_instance_nw_info(context, instance) try: + self.network_api.setup_instance_network_on_host(context, instance, + self.host) + network_info = self.network_api.get_instance_nw_info( + context, instance) with rt.instance_claim(context, instance, node, limits): self.driver.spawn(context, instance, image_meta, injected_files=[], diff --git a/nova/tests/functional/regressions/test_bug_1862633.py b/nova/tests/functional/regressions/test_bug_1862633.py index 03ef62041d2c..c04aa086c14e 100644 --- a/nova/tests/functional/regressions/test_bug_1862633.py +++ b/nova/tests/functional/regressions/test_bug_1862633.py @@ -58,7 +58,8 @@ class UnshelveNeutronErrorTest( } self.api.post_server_action(server['id'], req) self._wait_for_server_parameter( - self.api, server, {'status': 'SHELVED_OFFLOADED'}) + self.api, server, {'status': 'SHELVED_OFFLOADED', + 'OS-EXT-SRV-ATTR:host': None}) allocations = self.placement_api.get( '/allocations/%s' % server['id']).body['allocations'] self.assertEqual(0, len(allocations)) @@ -84,14 +85,10 @@ class UnshelveNeutronErrorTest( self.api, server, {'status': 'SHELVED_OFFLOADED', - 'OS-EXT-STS:task_state': None}) + 'OS-EXT-STS:task_state': None, + 'OS-EXT-SRV-ATTR:host': None}) # As the instance went back to offloaded state we expect no allocation - # allocations = self.placement_api.get( - # '/allocations/%s' % server['id']).body['allocations'] - # self.assertEqual(0, len(allocations)) - # - # but the allocation is leaked this is bug 1862633 allocations = self.placement_api.get( '/allocations/%s' % server['id']).body['allocations'] - self.assertEqual(1, len(allocations)) + self.assertEqual(0, len(allocations))