From 49ce59e1119bbb1d9c837dde1e4ab28888c75d58 Mon Sep 17 00:00:00 2001 From: Matt Riedemann Date: Wed, 29 Aug 2018 11:58:12 -0400 Subject: [PATCH] Restart scheduler in TestNovaManagePlacementHealAllocations TestNovaManagePlacementHealAllocations tests rely on the CachingScheduler specifically because it does not use placement and therefore does not create allocations during scheduling, which gives us instances that need to heal allocations. However, we have a race in the test setup where the scheduler is started before the compute services. The CachingScheduler runs a periodic task on startup to fetch the hosts from the DB to initialize it's cache, and then uses that during scheduling until the periodic runs again. So what we can hit is the scheduler starts, loads an empty cache, then we start the computes and try to create an instance but because of the empty cache we fail with a NoValidHost error. This restarts and resets the CachingScheduler cache *after* we have started the computes and asserted they are available in the API. Change-Id: I32f607a436e9851a96877123ae3d1fe51f444f73 Closes-Bug: #1781648 (cherry picked from commit 4fe4fbe7a43ac7e971b0aabc8a9079c7701cae55) --- nova/tests/functional/test_nova_manage.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/nova/tests/functional/test_nova_manage.py b/nova/tests/functional/test_nova_manage.py index 5e158206c18c..d76eb3693db8 100644 --- a/nova/tests/functional/test_nova_manage.py +++ b/nova/tests/functional/test_nova_manage.py @@ -387,6 +387,14 @@ class TestNovaManagePlacementHealAllocations( self.flavor = self.api.get_flavors()[0] self.output = StringIO() self.useFixture(fixtures.MonkeyPatch('sys.stdout', self.output)) + # On startup, the CachingScheduler runs a periodic task to pull the + # initial set of compute nodes out of the database which it then puts + # into a cache (hence the name of the driver). This can race with + # actually starting the compute services so we need to restart the + # scheduler to refresh the cache. + self.scheduler_service.stop() + self.scheduler_service.manager.driver.all_host_states = None + self.scheduler_service.start() def _boot_and_assert_no_allocations(self, flavor, hostname): """Creates a server on the given host and asserts neither have usage