Merge "Recover resized instance(power_state=SHUTDOWN) with vm_state=stopped"
This commit is contained in:
commit
8284a82c00
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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')
|
||||
|
||||
|
|
Loading…
Reference in New Issue