diff --git a/doc/source/cli/nova-manage.rst b/doc/source/cli/nova-manage.rst index ee5ddec26c88..a909ef8d2931 100644 --- a/doc/source/cli/nova-manage.rst +++ b/doc/source/cli/nova-manage.rst @@ -685,7 +685,6 @@ Placement * - 255 - An unexpected error occurred. - ``nova-manage placement audit [--verbose] [--delete] [--resource_provider ]`` Iterates over all the Resource Providers (or just one if you provide the UUID) and then verifies if the compute allocations are either related to diff --git a/nova/cmd/manage.py b/nova/cmd/manage.py index ea3c67ba7ef0..34479dca5551 100644 --- a/nova/cmd/manage.py +++ b/nova/cmd/manage.py @@ -2454,8 +2454,8 @@ class PlacementCommands(object): allocations = placement.get_allocs_for_consumer( ctxt, consumer_uuid) if len(allocations['allocations']) > 1: - # This consumer has resources spreaded amongst - # multiple RPs (think nested or shared for example) + # This consumer has resources spread among multiple RPs (think + # nested or shared for example) # We then need to just update the usage to remove # the orphaned resources on the specific RP del allocations['allocations'][provider['uuid']] @@ -2669,7 +2669,7 @@ class PlacementCommands(object): resource_providers = self._get_resource_providers(ctxt, placement) for provider in resource_providers: - (nb_p, faults) = self._check_orphaned_allocations_for_provider( + nb_p, faults = self._check_orphaned_allocations_for_provider( ctxt, placement, output, provider, delete) num_processed += nb_p if faults > 0: diff --git a/nova/tests/functional/test_nova_manage.py b/nova/tests/functional/test_nova_manage.py index a98f97573c21..de433a95598d 100644 --- a/nova/tests/functional/test_nova_manage.py +++ b/nova/tests/functional/test_nova_manage.py @@ -1417,16 +1417,6 @@ class TestNovaManagePlacementAudit( self.flavor = self.api.get_flavors()[0] - def _delete_instance_but_keep_its_allocations(self, server): - """Mocks out the call to Placement for deleting the allocations but - still performs the instance deletion. - """ - - with mock.patch('nova.scheduler.client.report.SchedulerReportClient.' - 'delete_allocation_for_instance'): - self.api.delete_server(server['id']) - self._wait_until_deleted(server) - def test_audit_orphaned_allocation_from_instance_delete(self): """Creates a server and deletes it by retaining its allocations so the audit command can find it. @@ -1458,15 +1448,17 @@ class TestNovaManagePlacementAudit( 'rp_uuid': rp_uuid}, output) self.assertIn('Processed 1 allocation.', output) + # Here we don't want to delete the found allocations + self.assertNotIn( + 'Deleted allocations for consumer UUID %s' % server['id'], output) self.assertEqual(3, ret) # Now ask the audit command to delete the rogue allocations. ret = self.cli.audit(delete=True, verbose=True) # The allocations are now deleted - self.assertRequestMatchesUsage({'VCPU': 0, - 'MEMORY_MB': 0, - 'DISK_GB': 0}, rp_uuid) + self.assertRequestMatchesUsage( + {'VCPU': 0, 'MEMORY_MB': 0, 'DISK_GB': 0}, rp_uuid) output = self.output.getvalue() self.assertIn( @@ -1525,8 +1517,7 @@ class TestNovaManagePlacementAudit( self.assertIn( 'Allocations for consumer UUID %(consumer_uuid)s on ' 'Resource Provider %(rp_uuid)s can be deleted' % - {'consumer_uuid': migration_uuid, - 'rp_uuid': source_rp_uuid}, + {'consumer_uuid': migration_uuid, 'rp_uuid': source_rp_uuid}, output) self.assertIn('Processed 1 allocation.', output) self.assertEqual(3, ret) @@ -1550,7 +1541,7 @@ class TestNovaManagePlacementAudit( self.assertIn('Processed 1 allocation.', output) self.assertEqual(4, ret) - # TODO(sbauza): Mock this test once bug #1829479 is fixed + # TODO(sbauza): Remove this test once bug #1829479 is fixed def test_audit_orphaned_allocations_from_deleted_compute_evacuate(self): """Evacuate a server and the delete the source node so that it will leave a source allocation that the audit command will find. diff --git a/releasenotes/notes/placement-audit-59a00dcfb188c6ac.yaml b/releasenotes/notes/placement-audit-59a00dcfb188c6ac.yaml index f7b232b6a373..81d91a51d91e 100644 --- a/releasenotes/notes/placement-audit-59a00dcfb188c6ac.yaml +++ b/releasenotes/notes/placement-audit-59a00dcfb188c6ac.yaml @@ -1,12 +1,11 @@ --- other: - | - A new ``nova-manage placement audit`` CLI has been added to help identify - orphaned compute allocations in the Placement API that are no longer - related to either instances or migrations. - Some race conditions in Nova could not remove allocations for some - instances or migrations when they're done and then it would create some - capacity issues. Thanks to the command, you could know the orphaned - allocations and ask to remove them. + A new ``nova-manage`` command, ``placement audit``, has been added. + This can be used to identify and optionally remove compute allocations in + placement that are no longer referenced by existing instances or + migrations. These orphaned allocations typically occur due to race + conditions during instance migration or removal and will result in capacity + issues if not addressed. For more details on CLI usage, see the man page entry: https://docs.openstack.org/nova/latest/cli/nova-manage.html#placement