From ffce5be5cae59969ec5ecf7e2b36ae4ec87c29d1 Mon Sep 17 00:00:00 2001 From: melanie witt Date: Thu, 31 Oct 2019 01:57:41 +0000 Subject: [PATCH] Replace time.sleep(10) with service forced_down in tests The server group functional tests are doing time.sleep(10) in order to make sure a stopped compute service is considered "down" by the nova compute API. Instead of sleeping, we can set the service as "forced_down" to get the desired "down" compute service status and avoid unnecessary delays in these tests. Unnecessary service start() calls are also removed in this change. They appear at the end of tests and services are started during each test setUp() and killed during each test tearDown() via the ServiceFixture. Closes-Bug: #1783565 NOTE(melwitt): The differences from the cherry picked change are: * Addition of 'from nova import utils' because change Ie07b419732e0832a9b9d16565f6c9d00ba85d654 is not in Rocky * Addition of the put_service_force_down method for the API client because change If0693eab2ed31b5fbfe6cbafa5d67b69c2ed8442 is not in Rocky Change-Id: I74f64b68e4b33ee0f8c45fdc5f570c7e12e05d3b (cherry picked from commit 1c93ca82b8fb8e39787020decfe335d45f8732e7) (cherry picked from commit a5daa0ddb3129ddd1bea4e85570c047fc2912b1a) (cherry picked from commit 92eb45ba5eb413400e1789f09d3739ee8c0b77de) --- nova/tests/functional/api/client.py | 6 ++ nova/tests/functional/test_server_group.py | 70 +++++++--------------- 2 files changed, 27 insertions(+), 49 deletions(-) diff --git a/nova/tests/functional/api/client.py b/nova/tests/functional/api/client.py index 54ce0b9642df..5d79aae5577e 100644 --- a/nova/tests/functional/api/client.py +++ b/nova/tests/functional/api/client.py @@ -514,3 +514,9 @@ class TestOpenStackClient(object): def get_hypervisor_stats(self): return self.api_get( '/os-hypervisors/statistics').body['hypervisor_statistics'] + + def put_service_force_down(self, service_id, forced_down): + req = { + 'forced_down': forced_down + } + return self.api_put('os-services/%s' % service_id, req).body['service'] diff --git a/nova/tests/functional/test_server_group.py b/nova/tests/functional/test_server_group.py index a9267d4382e8..5cb4b094d89a 100644 --- a/nova/tests/functional/test_server_group.py +++ b/nova/tests/functional/test_server_group.py @@ -13,8 +13,6 @@ # License for the specific language governing permissions and limitations # under the License. -import time - import mock from oslo_config import cfg @@ -26,6 +24,7 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional.api import client from nova.tests.functional import integrated_helpers from nova.tests.unit import policy_fixture +from nova import utils from nova.virt import fake import nova.scheduler.utils @@ -48,10 +47,6 @@ class ServerGroupTestBase(test.TestCase, + ['ServerGroupAntiAffinityFilter', 'ServerGroupAffinityFilter']) - # Override servicegroup parameters to make the tests run faster - _service_down_time = 10 - _report_interval = 1 - anti_affinity = {'name': 'fake-name-1', 'policies': ['anti-affinity']} affinity = {'name': 'fake-name-2', 'policies': ['affinity']} @@ -67,8 +62,6 @@ class ServerGroupTestBase(test.TestCase, self.flags(disk_allocation_ratio=9999.0) self.flags(weight_classes=self._get_weight_classes(), group='filter_scheduler') - self.flags(service_down_time=self._service_down_time) - self.flags(report_interval=self._report_interval) self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) @@ -411,16 +404,20 @@ class ServerGroupTestV21(ServerGroupTestBase): return host + def _set_forced_down(self, service, forced_down): + # Use microversion 2.53 for PUT /os-services/{service_id} force down. + with utils.temporary_mutation(self.admin_api, microversion='2.53'): + self.admin_api.put_service_force_down(service.service_ref.uuid, + forced_down) + def test_evacuate_with_anti_affinity(self): created_group = self.api.post_server_groups(self.anti_affinity) servers = self._boot_servers_to_group(created_group) host = self._get_compute_service_by_host_name( servers[1]['OS-EXT-SRV-ATTR:host']) - host.stop() - # Need to wait service_down_time amount of seconds to ensure - # nova considers the host down - time.sleep(self._service_down_time) + # Set forced_down on the host to ensure nova considers the host down. + self._set_forced_down(host, True) # Start additional host to test evacuation fake.set_nodes(['host3']) @@ -439,18 +436,14 @@ class ServerGroupTestV21(ServerGroupTestBase): self.assertNotEqual(evacuated_server['OS-EXT-SRV-ATTR:host'], servers[0]['OS-EXT-SRV-ATTR:host']) - host.start() - def test_evacuate_with_anti_affinity_no_valid_host(self): created_group = self.api.post_server_groups(self.anti_affinity) servers = self._boot_servers_to_group(created_group) host = self._get_compute_service_by_host_name( servers[1]['OS-EXT-SRV-ATTR:host']) - host.stop() - # Need to wait service_down_time amount of seconds to ensure - # nova considers the host down - time.sleep(self._service_down_time) + # Set forced_down on the host to ensure nova considers the host down. + self._set_forced_down(host, True) post = {'evacuate': {'onSharedStorage': False}} self.admin_api.post_server_action(servers[1]['id'], post) @@ -463,18 +456,14 @@ class ServerGroupTestV21(ServerGroupTestBase): self.assertEqual(server_after_failed_evac['OS-EXT-SRV-ATTR:host'], servers[1]['OS-EXT-SRV-ATTR:host']) - host.start() - def test_evacuate_with_affinity_no_valid_host(self): created_group = self.api.post_server_groups(self.affinity) servers = self._boot_servers_to_group(created_group) host = self._get_compute_service_by_host_name( servers[1]['OS-EXT-SRV-ATTR:host']) - host.stop() - # Need to wait service_down_time amount of seconds to ensure - # nova considers the host down - time.sleep(self._service_down_time) + # Set forced_down on the host to ensure nova considers the host down. + self._set_forced_down(host, True) post = {'evacuate': {'onSharedStorage': False}} self.admin_api.post_server_action(servers[1]['id'], post) @@ -487,8 +476,6 @@ class ServerGroupTestV21(ServerGroupTestBase): self.assertEqual(server_after_failed_evac['OS-EXT-SRV-ATTR:host'], servers[1]['OS-EXT-SRV-ATTR:host']) - host.start() - def test_soft_affinity_not_supported(self): ex = self.assertRaises(client.OpenStackApiException, self.api.post_server_groups, @@ -614,10 +601,8 @@ class ServerGroupTestV215(ServerGroupTestV21): host = self._get_compute_service_by_host_name( servers[1]['OS-EXT-SRV-ATTR:host']) - host.stop() - # Need to wait service_down_time amount of seconds to ensure - # nova considers the host down - time.sleep(self._service_down_time) + # Set forced_down on the host to ensure nova considers the host down. + self._set_forced_down(host, True) # Start additional host to test evacuation fake.set_nodes(['host3']) @@ -637,7 +622,6 @@ class ServerGroupTestV215(ServerGroupTestV21): servers[0]['OS-EXT-SRV-ATTR:host']) compute3.kill() - host.start() def test_evacuate_with_anti_affinity_no_valid_host(self): created_group = self.api.post_server_groups(self.anti_affinity) @@ -645,10 +629,8 @@ class ServerGroupTestV215(ServerGroupTestV21): host = self._get_compute_service_by_host_name( servers[1]['OS-EXT-SRV-ATTR:host']) - host.stop() - # Need to wait service_down_time amount of seconds to ensure - # nova considers the host down - time.sleep(self._service_down_time) + # Set forced_down on the host to ensure nova considers the host down. + self._set_forced_down(host, True) post = {'evacuate': {}} self.admin_api.post_server_action(servers[1]['id'], post) @@ -661,18 +643,14 @@ class ServerGroupTestV215(ServerGroupTestV21): self.assertEqual(server_after_failed_evac['OS-EXT-SRV-ATTR:host'], servers[1]['OS-EXT-SRV-ATTR:host']) - host.start() - def test_evacuate_with_affinity_no_valid_host(self): created_group = self.api.post_server_groups(self.affinity) servers = self._boot_servers_to_group(created_group) host = self._get_compute_service_by_host_name( servers[1]['OS-EXT-SRV-ATTR:host']) - host.stop() - # Need to wait service_down_time amount of seconds to ensure - # nova considers the host down - time.sleep(self._service_down_time) + # Set forced_down on the host to ensure nova considers the host down. + self._set_forced_down(host, True) post = {'evacuate': {}} self.admin_api.post_server_action(servers[1]['id'], post) @@ -685,8 +663,6 @@ class ServerGroupTestV215(ServerGroupTestV21): self.assertEqual(server_after_failed_evac['OS-EXT-SRV-ATTR:host'], servers[1]['OS-EXT-SRV-ATTR:host']) - host.start() - def _check_group_format(self, group, created_group): self.assertEqual(group['policies'], created_group['policies']) self.assertEqual({}, created_group['metadata']) @@ -815,10 +791,8 @@ class ServerGroupTestV215(ServerGroupTestV21): host = self._get_compute_service_by_host_name( servers[1]['OS-EXT-SRV-ATTR:host']) - host.stop() - # Need to wait service_down_time amount of seconds to ensure - # nova considers the host down - time.sleep(self._service_down_time) + # Set forced_down on the host to ensure nova considers the host down. + self._set_forced_down(host, True) post = {'evacuate': {}} self.admin_api.post_server_action(servers[1]['id'], post) @@ -831,8 +805,6 @@ class ServerGroupTestV215(ServerGroupTestV21): # new host later evacuated_server = self.admin_api.get_server(evacuated_server['id']) - host.start() - return [evacuated_server['OS-EXT-SRV-ATTR:host'], servers[0]['OS-EXT-SRV-ATTR:host']]