Move NoActionRequired exception back where it belongs

It makes no sense for an exception that is used for local flow control -
especially flow control between the Resource superclass and its
subclasses - to be defined in the heat.common.exceptions module where
user-facing exceptions whose definitions must be shared between the engine
and api are defined.

This patch moves it back to the original, correct location and adds
docstrings so people will actually know what it's for.

Technically both this and the original move were breaking changes to the
third-party Resource plugin API. This exception seems much less likely to
be in widespread use than UpdateReplace (c.f. preceding patch) though.

This reverts commit 5120f096d7.

Change-Id: I73dc671cd7e6e37ecb0f13545c7fa93d58e6e8ff
Related-Bug: #1611104
This commit is contained in:
Zane Bitter 2016-08-08 18:17:19 -04:00
parent c5ebe66ce9
commit 521058961d
9 changed files with 39 additions and 27 deletions

View File

@ -515,10 +515,6 @@ class SIGHUPInterrupt(HeatException):
msg_fmt = _("System SIGHUP signal received.")
class NoActionRequired(Exception):
pass
class InvalidServiceVersion(HeatException):
msg_fmt = _("Invalid service %(service)s version %(version)s")

View File

@ -65,6 +65,16 @@ def _register_class(resource_type, resource_class):
UpdateReplace = exception.UpdateReplace
# Attention developers about to move this: STOP IT!!!
class NoActionRequired(Exception):
"""Exception raised when a signal is ignored.
Resource subclasses should raise this exception from handle_signal() to
suppress recording of an event corresponding to the signal.
"""
pass
class PollDelay(Exception):
"""Exception to delay polling of the resource.
@ -2090,7 +2100,7 @@ class Resource(object):
else:
reason_string = get_string_details()
self._add_event('SIGNAL', self.status, reason_string)
except exception.NoActionRequired:
except NoActionRequired:
# Don't log an event as it just spams the user.
pass
except Exception as ex:

View File

@ -284,7 +284,7 @@ class AutoScalingGroup(instgrp.InstanceGroup, cooldown.CooldownMixin):
if self.status != self.COMPLETE:
LOG.info(_LI("%s NOT performing scaling adjustment, "
"when status is not COMPLETE") % self.name)
raise exception.NoActionRequired()
raise resource.NoActionRequired
capacity = grouputils.get_size(self)
new_capacity = self._get_new_capacity(capacity, adjustment,
@ -293,14 +293,14 @@ class AutoScalingGroup(instgrp.InstanceGroup, cooldown.CooldownMixin):
if new_capacity == capacity:
LOG.info(_LI("%s NOT performing scaling adjustment, "
"as there is no change in capacity.") % self.name)
raise exception.NoActionRequired()
raise resource.NoActionRequired
if not self._is_scaling_allowed():
LOG.info(_LI("%(name)s NOT performing scaling adjustment, "
"cooldown %(cooldown)s") % {
'name': self.name,
'cooldown': self.properties[self.COOLDOWN]})
raise exception.NoActionRequired()
raise resource.NoActionRequired
# send a notification before, on-error and on-success.
notif = {

View File

@ -179,7 +179,7 @@ class AutoScalingPolicy(signal_responder.SignalResponder,
"cooldown %(cooldown)s") % {
'name': self.name,
'cooldown': self.properties[self.COOLDOWN]})
raise exception.NoActionRequired()
raise resource.NoActionRequired
LOG.info(_LI('%(name)s alarm, adjusting group %(group)s with id '
'%(asgn_id)s by %(filter)s') % {
@ -194,12 +194,13 @@ class AutoScalingPolicy(signal_responder.SignalResponder,
self.properties[self.ADJUSTMENT_TYPE],
self.properties[self.MIN_ADJUSTMENT_STEP])
size_changed = True
except Exception as ex:
if not isinstance(ex, exception.NoActionRequired):
LOG.error(_LE("Error in performing scaling adjustment with "
"%(name)s alarm for group %(group)s.") % {
'name': self.name,
'group': group.name})
except resource.NoActionRequired:
raise
except Exception:
LOG.error(_LE("Error in performing scaling adjustment with "
"%(name)s alarm for group %(group)s.") % {
'name': self.name,
'group': group.name})
raise
finally:
self._finished_scaling("%s : %s" % (

View File

@ -18,6 +18,7 @@ import six
from heat.common import exception
from heat.common import grouputils
from heat.common import template_format
from heat.engine import resource
from heat.engine import rsrc_defn
from heat.tests.autoscaling import inline_templates
from heat.tests import common
@ -116,7 +117,7 @@ class TestGroupAdjust(common.HeatTestCase):
dont_call = self.patchobject(self.group, 'resize')
self.patchobject(self.group, '_is_scaling_allowed',
return_value=False)
self.assertRaises(exception.NoActionRequired,
self.assertRaises(resource.NoActionRequired,
self.group.adjust, 1)
self.assertEqual([], dont_call.call_args_list)
@ -126,7 +127,7 @@ class TestGroupAdjust(common.HeatTestCase):
resize = self.patchobject(self.group, 'resize')
finished_scaling = self.patchobject(self.group, '_finished_scaling')
notify = self.patch('heat.engine.notification.autoscaling.send')
self.assertRaises(exception.NoActionRequired,
self.assertRaises(resource.NoActionRequired,
self.group.adjust, 3,
adjustment_type='ExactCapacity')
expected_notifies = []

View File

@ -19,6 +19,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
@ -81,11 +82,11 @@ class TestAutoScalingPolicy(common.HeatTestCase):
'my-policy')
group = stack['my-group']
self.patchobject(group, 'adjust',
side_effect=exception.NoActionRequired())
side_effect=resource.NoActionRequired())
mock_fin_scaling = self.patchobject(up_policy, '_finished_scaling')
with mock.patch.object(up_policy, '_is_scaling_allowed',
return_value=True) as mock_isa:
self.assertRaises(exception.NoActionRequired,
self.assertRaises(resource.NoActionRequired,
up_policy.handle_signal)
mock_isa.assert_called_once_with()
mock_fin_scaling.assert_called_once_with('change_in_capacity : 1',
@ -118,7 +119,7 @@ class TestAutoScalingPolicy(common.HeatTestCase):
side_effect=AssertionError) as dont_call:
with mock.patch.object(pol, '_is_scaling_allowed',
return_value=False) as mock_cip:
self.assertRaises(exception.NoActionRequired,
self.assertRaises(resource.NoActionRequired,
pol.handle_signal, details=test)
mock_cip.assert_called_once_with()
self.assertEqual([], dont_call.call_args_list)

View File

@ -20,6 +20,7 @@ from heat.common import exception
from heat.common import grouputils
from heat.common import template_format
from heat.engine.clients.os import nova
from heat.engine import resource
from heat.engine import rsrc_defn
from heat.engine import scheduler
from heat.tests.autoscaling import inline_templates
@ -303,7 +304,7 @@ class TestGroupAdjust(common.HeatTestCase):
dont_call = self.patchobject(self.group, 'resize')
self.patchobject(self.group, '_is_scaling_allowed',
return_value=False)
self.assertRaises(exception.NoActionRequired,
self.assertRaises(resource.NoActionRequired,
self.group.adjust, 1)
self.assertEqual([], dont_call.call_args_list)
@ -313,7 +314,7 @@ class TestGroupAdjust(common.HeatTestCase):
resize = self.patchobject(self.group, 'resize')
finished_scaling = self.patchobject(self.group, '_finished_scaling')
notify = self.patch('heat.engine.notification.autoscaling.send')
self.assertRaises(exception.NoActionRequired,
self.assertRaises(resource.NoActionRequired,
self.group.adjust, 3,
adjustment_type='ExactCapacity')
expected_notifies = []
@ -327,7 +328,7 @@ class TestGroupAdjust(common.HeatTestCase):
resize = self.patchobject(self.group, 'resize')
finished_scaling = self.patchobject(self.group, '_finished_scaling')
notify = self.patch('heat.engine.notification.autoscaling.send')
self.assertRaises(exception.NoActionRequired,
self.assertRaises(resource.NoActionRequired,
self.group.adjust, 3,
adjustment_type='ExactCapacity')
expected_notifies = []

View File

@ -19,6 +19,7 @@ import six
from heat.common import exception
from heat.common import template_format
from heat.engine import resource
from heat.engine.resources.aws.autoscaling import scaling_policy as aws_sp
from heat.engine import scheduler
from heat.tests.autoscaling import inline_templates
@ -87,11 +88,11 @@ class TestAutoScalingPolicy(common.HeatTestCase):
'WebServerScaleUpPolicy')
group = stack['WebServerGroup']
self.patchobject(group, 'adjust',
side_effect=exception.NoActionRequired())
side_effect=resource.NoActionRequired())
mock_fin_scaling = self.patchobject(up_policy, '_finished_scaling')
with mock.patch.object(up_policy, '_is_scaling_allowed',
return_value=True) as mock_isa:
self.assertRaises(exception.NoActionRequired,
self.assertRaises(resource.NoActionRequired,
up_policy.handle_signal)
mock_isa.assert_called_once_with()
mock_fin_scaling.assert_called_once_with('ChangeInCapacity : 1',
@ -124,7 +125,7 @@ class TestAutoScalingPolicy(common.HeatTestCase):
side_effect=AssertionError) as dont_call:
with mock.patch.object(pol, '_is_scaling_allowed',
return_value=False) as mock_isa:
self.assertRaises(exception.NoActionRequired,
self.assertRaises(resource.NoActionRequired,
pol.handle_signal, details=test)
mock_isa.assert_called_once_with()
self.assertEqual([], dont_call.call_args_list)

View File

@ -22,6 +22,7 @@ from heat.common import exception
from heat.common import template_format
from heat.engine.clients.os import heat_plugin
from heat.engine.clients.os import swift
from heat.engine import resource
from heat.engine import scheduler
from heat.engine import stack as stk
from heat.engine import template
@ -536,7 +537,7 @@ class SignalTest(common.HeatTestCase):
stack = self._create_stack(TEMPLATE_CFN_SIGNAL)
mock_handle.side_effect = exception.NoActionRequired()
mock_handle.side_effect = resource.NoActionRequired()
rsrc = stack['signal_handler']
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)