Don't create events when signals don't perform an action

If we get repeat signals that cause no concrete actions
this can cause large quantities of senseless events that
suppress useful events.

Change-Id: I79374d27648319f241f36ab041784fab37823ddb
Closes-bug: #1445361
changes/75/180375/1
Angus Salkeld 8 years ago
parent e294154f17
commit 6a48c45bfd

@ -63,6 +63,10 @@ class UpdateReplace(Exception):
super(Exception, self).__init__(six.text_type(msg))
class NoActionRequired(Exception):
pass
class ResourceInError(exception.HeatException):
msg_fmt = _('Went to status %(resource_status)s '
'due to "%(status_reason)s"')
@ -1180,6 +1184,9 @@ class Resource(object):
else:
reason_string = get_string_details()
self._add_event('SIGNAL', self.status, reason_string)
except NoActionRequired:
# Don't log an event as it just spams the user.
pass
except Exception as ex:
LOG.exception(_LE('signal %(name)s : %(msg)s')
% {'name': six.text_type(self), 'msg': ex})

@ -153,13 +153,13 @@ class AutoScalingPolicy(signal_responder.SignalResponder,
{'name': self.name, 'state': alarm_state})
if alarm_state != 'alarm':
return
raise resource.NoActionRequired()
if self._cooldown_inprogress():
LOG.info(_LI("%(name)s NOT performing scaling action, "
"cooldown %(cooldown)s"),
{'name': self.name,
'cooldown': self.properties[self.COOLDOWN]})
return
raise resource.NoActionRequired()
asgn_id = self.properties[self.AUTO_SCALING_GROUP_NAME]
group = self.stack.resource_by_refid(asgn_id)

@ -92,7 +92,8 @@ class TestAutoScalingPolicy(common.HeatTestCase):
test = {'current': 'not_an_alarm'}
with mock.patch.object(pol, '_cooldown_inprogress',
side_effect=AssertionError()) as dont_call:
pol.handle_signal(details=test)
self.assertRaises(resource.NoActionRequired,
pol.handle_signal, details=test)
self.assertEqual([], dont_call.call_args_list)
def test_scaling_policy_cooldown_toosoon(self):
@ -106,7 +107,8 @@ class TestAutoScalingPolicy(common.HeatTestCase):
side_effect=AssertionError) as dont_call:
with mock.patch.object(pol, '_cooldown_inprogress',
return_value=True) as mock_cip:
pol.handle_signal(details=test)
self.assertRaises(resource.NoActionRequired,
pol.handle_signal, details=test)
mock_cip.assert_called_once_with()
self.assertEqual([], dont_call.call_args_list)

@ -20,6 +20,7 @@ import six
from heat.common import exception
from heat.common import template_format
from heat.engine import resource
from heat.engine import scheduler
from heat.tests.autoscaling import inline_templates
from heat.tests import common
@ -91,7 +92,8 @@ class TestAutoScalingPolicy(common.HeatTestCase):
test = {'current': 'not_an_alarm'}
with mock.patch.object(pol, '_cooldown_inprogress',
side_effect=AssertionError()) as dont_call:
pol.handle_signal(details=test)
self.assertRaises(resource.NoActionRequired,
pol.handle_signal, details=test)
self.assertEqual([], dont_call.call_args_list)
def test_scaling_policy_cooldown_toosoon(self):
@ -105,7 +107,8 @@ class TestAutoScalingPolicy(common.HeatTestCase):
side_effect=AssertionError) as dont_call:
with mock.patch.object(pol, '_cooldown_inprogress',
return_value=True) as mock_cip:
pol.handle_signal(details=test)
self.assertRaises(resource.NoActionRequired,
pol.handle_signal, details=test)
mock_cip.assert_called_once_with()
self.assertEqual([], dont_call.call_args_list)

@ -244,6 +244,33 @@ class SignalTest(common.HeatTestCase):
self.m.VerifyAll()
def test_signal_no_action(self):
test_d = {'Data': 'foo', 'Reason': 'bar',
'Status': 'SUCCESS', 'UniqueId': '123'}
self.stack = self.create_stack()
self.stack.create()
# mock a NoActionRequired from handle_signal()
self.m.StubOutWithMock(generic_resource.SignalResource,
'handle_signal')
generic_resource.SignalResource.handle_signal(test_d).AndRaise(
resource.NoActionRequired())
# _add_event should not be called.
self.m.StubOutWithMock(generic_resource.SignalResource,
'_add_event')
self.m.ReplayAll()
rsrc = self.stack['signal_handler']
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
self.assertTrue(rsrc.requires_deferred_auth)
rsrc.signal(details=test_d)
self.m.VerifyAll()
def test_signal_different_reason_types(self):
self.stack = self.create_stack()
self.stack.create()

Loading…
Cancel
Save