Merge "Ignore instance recovery for 'paused' or 'rescued' instance"

This commit is contained in:
Jenkins 2017-04-25 12:18:14 +00:00 committed by Gerrit Code Review
commit bfb4888f18
4 changed files with 43 additions and 0 deletions

View File

@ -56,6 +56,13 @@ class StopInstanceTask(base.MasakariTask):
raise exception.SkipInstanceRecoveryException()
vm_state = getattr(instance, 'OS-EXT-STS:vm_state')
if vm_state in ['paused', 'rescued']:
msg = _("Recovery of instance '%(instance_uuid)s' is ignored as"
" it is in '%(vm_state)s' state.") % {
'instance_uuid': instance_uuid, 'vm_state': vm_state}
LOG.warning(msg)
raise exception.IgnoreInstanceRecoveryException(msg)
if vm_state != 'stopped':
if vm_state == 'resized':
self.novaclient.reset_instance_state(

View File

@ -110,6 +110,8 @@ class MasakariManager(manager.Manager):
self.driver.execute_instance_failure(
context, notification.payload.get('instance_uuid'),
notification.notification_uuid)
except exception.IgnoreInstanceRecoveryException:
notification_status = fields.NotificationStatus.IGNORED
except exception.SkipInstanceRecoveryException:
notification_status = fields.NotificationStatus.FINISHED
except (exception.MasakariException,

View File

@ -352,3 +352,7 @@ class ReservedHostsUnavailable(MasakariException):
class LockAlreadyAcquired(MasakariException):
msg_fmt = _('Lock is already acquired on %(resource)s.')
class IgnoreInstanceRecoveryException(MasakariException):
msg_fmt = _('Instance recovery is ignored.')

View File

@ -388,3 +388,33 @@ class EngineManagerUnitTestCase(test.NoDBTestCase):
notification=notification)
self.assertEqual("ignored", notification.status)
self.assertFalse(mock_host_failure.called)
@mock.patch("masakari.compute.nova.API.stop_server")
@mock.patch.object(notification_obj.Notification, "save")
@mock.patch("masakari.compute.nova.API.get_server")
def test_process_notification_type_vm_ignore_instance_in_paused(
self, mock_get_server, mock_notification_save, mock_stop_server):
notification = self._get_vm_type_notification()
mock_get_server.return_value = fakes.FakeNovaClient.Server(
id=1, uuid=uuidsentinel.fake_ins, host='fake_host',
vm_state='paused', ha_enabled=True)
self.engine.process_notification(self.context,
notification=notification)
self.assertEqual("ignored", notification.status)
self.assertFalse(mock_stop_server.called)
@mock.patch("masakari.compute.nova.API.stop_server")
@mock.patch.object(notification_obj.Notification, "save")
@mock.patch("masakari.compute.nova.API.get_server")
def test_process_notification_type_vm_ignore_instance_in_rescued(
self, mock_get_server, mock_notification_save, mock_stop_server):
notification = self._get_vm_type_notification()
mock_get_server.return_value = fakes.FakeNovaClient.Server(
id=1, uuid=uuidsentinel.fake_ins, host='fake_host',
vm_state='rescued', ha_enabled=True)
self.engine.process_notification(self.context,
notification=notification)
self.assertEqual("ignored", notification.status)
self.assertFalse(mock_stop_server.called)