Not set instance to ERROR if set_admin_password failed

In some cases, an instance will be set to ERROR state when
set_admin_password failed (some Exception like Forbidden)
this is inconsistent to other exceptions and also
set_admin_password is a sync call from API to compute,
we can simply return the error to the upper layer (operator or
user) to avoid make user run reset to restore instance
status since no changes to guest at all.

Change-Id: If1c901b974bc7295927b3f033a04eaa6ac36f603
Closes-Bug: 1757061
(cherry picked from commit 513f2d3d25)
This commit is contained in:
jichen 2018-03-22 14:07:20 +08:00 committed by Vlad Gusev
parent 3e07bcb327
commit 58ed9bc606
2 changed files with 2 additions and 8 deletions

View File

@ -3404,7 +3404,6 @@ class ComputeManager(manager.Manager):
except Exception:
# Catch all here because this could be anything.
LOG.exception('set_admin_password failed', instance=instance)
self._set_instance_obj_error_state(context, instance)
# We create a new exception here so that we won't
# potentially reveal password information to the
# API caller. The real exception is logged above

View File

@ -3265,14 +3265,9 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
instance=instance,
new_pass=None)
if (expected_exception == exception.SetAdminPasswdNotSupported or
expected_exception == exception.InstanceAgentNotEnabled or
expected_exception == NotImplementedError):
if expected_exception != exception.InstancePasswordSetFailed:
instance_save_mock.assert_called_once_with(
expected_task_state=task_states.UPDATING_PASSWORD)
else:
# setting the instance to error state
instance_save_mock.assert_called_once_with()
self.assertEqual(expected_vm_state, instance.vm_state)
# check revert_task_state decorator
@ -3290,7 +3285,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
exc = exception.Forbidden('Internal error')
expected_exception = exception.InstancePasswordSetFailed
self._do_test_set_admin_password_driver_error(
exc, vm_states.ERROR, None, expected_exception)
exc, vm_states.ACTIVE, None, expected_exception)
def test_set_admin_password_driver_not_implemented(self):
# Ensure expected exception is raised if set_admin_password not