Merge "Revert pause/unpause state when host restart"
This commit is contained in:
@@ -940,17 +940,37 @@ class ComputeManager(manager.Manager):
|
||||
return
|
||||
|
||||
elif (current_power_state == power_state.RUNNING and
|
||||
instance.task_state in [task_states.REBOOT_STARTED,
|
||||
task_states.REBOOT_STARTED_HARD]):
|
||||
LOG.warning(_("Instance in transitional state "
|
||||
"(%(task_state)s) at start-up and power state "
|
||||
"is (%(power_state)s), clearing task state"),
|
||||
{'task_state': instance['task_state'],
|
||||
'power_state': current_power_state},
|
||||
instance=instance)
|
||||
instance.task_state in [task_states.REBOOT_STARTED,
|
||||
task_states.REBOOT_STARTED_HARD,
|
||||
task_states.PAUSING,
|
||||
task_states.UNPAUSING]):
|
||||
LOG.warn(_LW("Instance in transitional state "
|
||||
"(%(task_state)s) at start-up and power state "
|
||||
"is (%(power_state)s), clearing task state"),
|
||||
{'task_state': instance.task_state,
|
||||
'power_state': current_power_state},
|
||||
instance=instance)
|
||||
instance.task_state = None
|
||||
instance.vm_state = vm_states.ACTIVE
|
||||
instance.save()
|
||||
elif (current_power_state == power_state.PAUSED and
|
||||
instance.task_state == task_states.UNPAUSING):
|
||||
LOG.warn(_LW("Instance in transitional state "
|
||||
"(%(task_state)s) at start-up and power state "
|
||||
"is (%(power_state)s), clearing task state "
|
||||
"and unpausing the instance"),
|
||||
{'task_state': instance.task_state,
|
||||
'power_state': current_power_state},
|
||||
instance=instance)
|
||||
try:
|
||||
self.unpause_instance(context, instance)
|
||||
except NotImplementedError:
|
||||
# Some virt driver didn't support pause and unpause
|
||||
pass
|
||||
except Exception:
|
||||
LOG.exception(_LE('Failed to unpause instance'),
|
||||
instance=instance)
|
||||
return
|
||||
|
||||
if instance.task_state == task_states.POWERING_OFF:
|
||||
try:
|
||||
|
@@ -600,6 +600,23 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
|
||||
assert_called_once_with(self.context, instance)
|
||||
self.assertIsNone(instance.task_state)
|
||||
|
||||
@mock.patch('nova.compute.manager.ComputeManager._get_power_state',
|
||||
return_value=power_state.RUNNING)
|
||||
@mock.patch.object(objects.BlockDeviceMappingList, 'get_by_instance_uuid')
|
||||
def _test_init_instance_cleans_task_states(self, powerstate, state,
|
||||
mock_get_uuid, mock_get_power_state):
|
||||
instance = objects.Instance(self.context)
|
||||
instance.uuid = 'fake-uuid'
|
||||
instance.info_cache = None
|
||||
instance.power_state = power_state.RUNNING
|
||||
instance.vm_state = vm_states.ACTIVE
|
||||
instance.task_state = state
|
||||
mock_get_power_state.return_value = powerstate
|
||||
|
||||
self.compute._init_instance(self.context, instance)
|
||||
|
||||
return instance
|
||||
|
||||
def test_init_instance_cleans_image_state_pending_upload(self):
|
||||
instance = objects.Instance(self.context)
|
||||
instance.uuid = 'foo'
|
||||
@@ -628,6 +645,35 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
|
||||
instance.task_state = task_states.IMAGE_SNAPSHOT_PENDING
|
||||
self._test_init_instance_cleans_image_states(instance)
|
||||
|
||||
@mock.patch.object(objects.Instance, 'save')
|
||||
def test_init_instance_cleans_running_pausing(self, mock_save):
|
||||
instance = self._test_init_instance_cleans_task_states(
|
||||
power_state.RUNNING, task_states.PAUSING)
|
||||
mock_save.assert_called_once_with()
|
||||
self.assertEqual(vm_states.ACTIVE, instance.vm_state)
|
||||
self.assertIsNone(instance.task_state)
|
||||
|
||||
@mock.patch.object(objects.Instance, 'save')
|
||||
def test_init_instance_cleans_running_unpausing(self, mock_save):
|
||||
instance = self._test_init_instance_cleans_task_states(
|
||||
power_state.RUNNING, task_states.UNPAUSING)
|
||||
mock_save.assert_called_once_with()
|
||||
self.assertEqual(vm_states.ACTIVE, instance.vm_state)
|
||||
self.assertIsNone(instance.task_state)
|
||||
|
||||
@mock.patch('nova.compute.manager.ComputeManager.unpause_instance')
|
||||
def test_init_instance_cleans_paused_unpausing(self, mock_unpause):
|
||||
|
||||
def fake_unpause(context, instance):
|
||||
instance.task_state = None
|
||||
|
||||
mock_unpause.side_effect = fake_unpause
|
||||
instance = self._test_init_instance_cleans_task_states(
|
||||
power_state.PAUSED, task_states.UNPAUSING)
|
||||
mock_unpause.assert_called_once_with(self.context, instance)
|
||||
self.assertEqual(vm_states.ACTIVE, instance.vm_state)
|
||||
self.assertIsNone(instance.task_state)
|
||||
|
||||
def test_init_instance_errors_when_not_migrating(self):
|
||||
instance = objects.Instance(self.context)
|
||||
instance.uuid = 'foo'
|
||||
|
Reference in New Issue
Block a user