diff --git a/masakari/engine/drivers/taskflow/host_failure.py b/masakari/engine/drivers/taskflow/host_failure.py index 9ecbc1b7..4e3a5b46 100644 --- a/masakari/engine/drivers/taskflow/host_failure.py +++ b/masakari/engine/drivers/taskflow/host_failure.py @@ -194,8 +194,6 @@ class EvacuateInstancesTask(base.MasakariTask): if vm_state == 'resized' and power_state != SHUTDOWN: stop_instance = False - vm_state = getattr(instance, "OS-EXT-STS:vm_state") - elif task_state is not None: # Nova fails evacuation when the instance's task_state is not # none. In this case, masakari resets the instance's vm_state diff --git a/masakari/tests/unit/engine/drivers/taskflow/test_host_failure_flow.py b/masakari/tests/unit/engine/drivers/taskflow/test_host_failure_flow.py index 17d48867..91b4c8af 100644 --- a/masakari/tests/unit/engine/drivers/taskflow/test_host_failure_flow.py +++ b/masakari/tests/unit/engine/drivers/taskflow/test_host_failure_flow.py @@ -56,8 +56,19 @@ class HostFailureTestCase(test.TestCase): def _verify_instance_evacuated(self, old_instance_list): for server in old_instance_list: instance = self.novaclient.get_server(self.ctxt, server.id) - self.assertIn(getattr(instance, 'OS-EXT-STS:vm_state'), - ['active', 'stopped', 'error']) + + if getattr(server, 'OS-EXT-STS:vm_state') in \ + ['active', 'stopped', 'error']: + self.assertEqual(getattr(server, 'OS-EXT-STS:vm_state'), + getattr(instance, 'OS-EXT-STS:vm_state')) + else: + if getattr(server, 'OS-EXT-STS:vm_state') == 'resized' and \ + getattr(server, 'OS-EXT-STS:power_state') != 4: + self.assertEqual('active', + getattr(instance, 'OS-EXT-STS:vm_state')) + else: + self.assertEqual('stopped', + getattr(instance, 'OS-EXT-STS:vm_state')) if CONF.host_failure.ignore_instances_in_error_state and getattr( server, 'OS-EXT-STS:vm_state') == 'error': @@ -356,12 +367,10 @@ class HostFailureTestCase(test.TestCase): self.assertRaises(exception.SkipHostRecoveryException, task.execute, self.ctxt, self.instance_host) - @mock.patch.object(nova.API, 'stop_server') - @mock.patch.object(nova.API, 'reset_instance_state') @mock.patch('masakari.compute.nova.novaclient') def test_host_failure_flow_for_task_state_not_none( - self, _mock_novaclient, mock_reset, mock_stop, mock_unlock, - mock_lock, mock_enable_disable): + self, _mock_novaclient, mock_unlock, mock_lock, + mock_enable_disable): _mock_novaclient.return_value = self.fake_client # create ha_enabled test data @@ -387,13 +396,12 @@ class HostFailureTestCase(test.TestCase): # execute EvacuateInstancesTask self._evacuate_instances(instance_list, mock_enable_disable) - reset_calls = [mock.call(self.ctxt, "1"), - mock.call(self.ctxt, "2"), - mock.call(self.ctxt, "3"), - mock.call(self.ctxt, "3")] - mock_reset.assert_has_calls(reset_calls) - self.assertEqual(4, mock_reset.call_count) - stop_calls = [mock.call(self.ctxt, "2"), - mock.call(self.ctxt, "3")] - mock_stop.assert_has_calls(stop_calls) - self.assertEqual(2, mock_stop.call_count) + reset_calls = [('1', 'active'), + ('2', 'stopped'), + ('3', 'error'), + ('3', 'stopped')] + stop_calls = ['2', '3'] + self.assertEqual(reset_calls, + self.fake_client.servers.reset_state_calls) + self.assertEqual(stop_calls, + self.fake_client.servers.stop_calls) diff --git a/masakari/tests/unit/fakes.py b/masakari/tests/unit/fakes.py index 64455343..29bea478 100644 --- a/masakari/tests/unit/fakes.py +++ b/masakari/tests/unit/fakes.py @@ -39,6 +39,8 @@ class FakeNovaClient(object): class ServerManager(object): def __init__(self): self._servers = [] + self.reset_state_calls = [] + self.stop_calls = [] def create(self, id, uuid=None, host=None, vm_state='active', task_state=None, power_state=1, ha_enabled=False): @@ -67,6 +69,8 @@ class FakeNovaClient(object): return matching def reset_state(self, uuid, status): + current_status = getattr(self.get(uuid), "OS-EXT-STS:vm_state") + self.reset_state_calls.append((uuid, current_status)) server = self.get(uuid) setattr(server, 'OS-EXT-STS:vm_state', status) @@ -76,12 +80,13 @@ class FakeNovaClient(object): server = self.get(uuid) setattr(server, 'OS-EXT-SRV-ATTR:hypervisor_hostname', host) # pretending that instance is evacuated successfully on given host - if getattr(server, "OS-EXT-STS:vm_state") == 'active': + if getattr(server, "OS-EXT-STS:vm_state") in ['active', 'error']: setattr(server, 'OS-EXT-STS:vm_state', 'active') else: setattr(server, 'OS-EXT-STS:vm_state', 'stopped') def stop(self, id): + self.stop_calls.append(id) server = self.get(id) setattr(server, 'OS-EXT-STS:vm_state', 'stopped')