Move Resource exceptions to common module (1)

It is convenient to have all exceptions in exception module.
Also it is reduces namespace cluttering of resource module and decreases
the number of dependencies in other modules (we do not need to import resource
in some cases for now).
UpdateReplace exception is moved in this patch.

Change-Id: Ief441ca2022a0d50e88d709d1a062631479715b7
This commit is contained in:
Oleksii Chuprykov 2015-09-02 15:19:09 +03:00
parent b228f945cd
commit 4e2cfb991a
29 changed files with 66 additions and 69 deletions

View File

@ -388,6 +388,13 @@ class PropertyUnspecifiedError(HeatException):
super(PropertyUnspecifiedError, self).__init__(**kwargs)
class UpdateReplace(Exception):
'''Raised when resource update requires replacement.'''
def __init__(self, resource_name='Unknown'):
msg = _("The Resource %s requires replacement.") % resource_name
super(Exception, self).__init__(six.text_type(msg))
class HTTPExceptionDisguise(Exception):
"""Disguises HTTP exceptions so they can be handled by the webob fault
application in the wsgi pipeline.

View File

@ -57,13 +57,6 @@ def _register_class(resource_type, resource_class):
resources.global_env().register_class(resource_type, resource_class)
class UpdateReplace(Exception):
'''Raised when resource update requires replacement.'''
def __init__(self, resource_name='Unknown'):
msg = _("The Resource %s requires replacement.") % resource_name
super(Exception, self).__init__(six.text_type(msg))
class NoActionRequired(Exception):
pass
@ -521,7 +514,7 @@ class Resource(object):
raise exception.NotSupported(feature=mesg)
if not changed_properties_set.issubset(update_allowed_set):
raise UpdateReplace(self.name)
raise exception.UpdateReplace(self.name)
return dict((k, after_props.get(k)) for k in changed_properties_set)
@ -867,18 +860,18 @@ class Resource(object):
def _needs_update(self, after, before, after_props, before_props,
prev_resource, check_init_complete=True):
if self.status == self.FAILED:
raise UpdateReplace(self)
raise exception.UpdateReplace(self)
if check_init_complete and \
(self.action == self.INIT and self.status == self.COMPLETE):
raise UpdateReplace(self)
raise exception.UpdateReplace(self)
if prev_resource is not None:
cur_class_def, cur_ver = self.implementation_signature()
prev_class_def, prev_ver = prev_resource.implementation_signature()
if prev_class_def != cur_class_def:
raise UpdateReplace(self.name)
raise exception.UpdateReplace(self.name)
if prev_ver != cur_ver:
return True
@ -947,7 +940,7 @@ class Resource(object):
LOG.info(_LI('updating %s'), six.text_type(self))
self.updated_time = datetime.utcnow()
with self._action_recorder(action, UpdateReplace):
with self._action_recorder(action, exception.UpdateReplace):
after_props.validate()
tmpl_diff = self.update_template_diff(function.resolve(after),
before)
@ -1576,7 +1569,7 @@ class Resource(object):
def handle_update(self, json_snippet=None, tmpl_diff=None, prop_diff=None):
if prop_diff:
raise UpdateReplace(self.name)
raise exception.UpdateReplace(self.name)
def metadata_update(self, new_metadata=None):
'''

View File

@ -218,7 +218,7 @@ class LaunchConfiguration(resource.Resource):
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
if 'Metadata' in tmpl_diff:
raise resource.UpdateReplace(self.name)
raise exception.UpdateReplace(self.name)
def FnGetRefId(self):
return self.physical_resource_name_or_FnGetRefId()

View File

@ -376,7 +376,7 @@ class ElasticIpAssociation(resource.Resource):
ni_id = prop_diff.get(self.NETWORK_INTERFACE_ID)
if instance_id or ni_id:
raise resource.UpdateReplace(self.name)
raise exception.UpdateReplace(self.name)
# according to aws doc, when update the instance_id or
# network_interface_id, if you also change the EIP or
@ -386,7 +386,7 @@ class ElasticIpAssociation(resource.Resource):
eip = prop_diff.get(self.EIP)
allocation_id = prop_diff.get(self.ALLOCATION_ID)
if eip or allocation_id:
raise resource.UpdateReplace(self.name)
raise exception.UpdateReplace(self.name)
def handle_create(self):
"""Add a floating IP address to a server."""

View File

@ -16,6 +16,7 @@ import eventlet
from oslo_utils import timeutils
import six
from heat.common import exception
from heat.common.i18n import _
from heat.engine import attributes
from heat.engine import properties
@ -156,7 +157,7 @@ class TestResource(resource.Resource):
if value:
update_replace = self.properties[self.UPDATE_REPLACE]
if update_replace:
raise resource.UpdateReplace(self.name)
raise exception.UpdateReplace(self.name)
else:
# emulate failure
fail_prop = self.properties[self.FAIL]

View File

@ -13,9 +13,9 @@
import uuid
from heat.common import exception
from heat.common.i18n import _
from heat.engine import attributes
from heat.engine import resource
from heat.engine.resources.aws.cfn import wait_condition_handle as aws_wch
from heat.engine.resources import wait_condition as wc_base
from heat.engine import support
@ -141,7 +141,7 @@ class UpdateWaitConditionHandle(aws_wch.WaitConditionHandle):
support_status = support.SupportStatus(version='2014.1')
def update(self, after, before=None, prev_resource=None):
raise resource.UpdateReplace(self.name)
raise exception.UpdateReplace(self.name)
def resource_mapping():

View File

@ -11,6 +11,7 @@
# License for the specific language governing permissions and limitations
# under the License.
from heat.common import exception
from heat.common.i18n import _
from heat.engine import clients
from heat.engine import constraints
@ -186,7 +187,7 @@ class MonascaAlarmDefinition(resource.Resource):
except Exception as ex:
if self.client_plugin().is_un_processable(ex):
# Monasca does not allow to update the sub expression
raise resource.UpdateReplace(resource_name=self.name)
raise exception.UpdateReplace(resource_name=self.name)
def handle_delete(self):
if self.resource_id is not None:

View File

@ -14,12 +14,12 @@
from oslo_log import log as logging
import six
from heat.common import exception
from heat.common.i18n import _
from heat.common.i18n import _LW
from heat.engine import attributes
from heat.engine import constraints
from heat.engine import properties
from heat.engine import resource
from heat.engine.resources.openstack.neutron import neutron
from heat.engine.resources.openstack.neutron import subnet
from heat.engine import support
@ -415,7 +415,7 @@ class Port(neutron.NeutronResource):
prev_resource, check_init_complete=True):
if after_props.get(self.REPLACEMENT_POLICY) == 'REPLACE_ALWAYS':
raise resource.UpdateReplace(self.name)
raise exception.UpdateReplace(self.name)
return super(Port, self)._needs_update(
after, before, after_props, before_props, prev_resource,

View File

@ -945,7 +945,7 @@ class Server(stack_user.StackUser, sh.SchedulerHintsMixin,
flavor = prop_diff[self.FLAVOR]
if flavor_update_policy == 'REPLACE':
raise resource.UpdateReplace(self.name)
raise exception.UpdateReplace(self.name)
flavor_id = self.client_plugin().get_flavor_id(flavor)
handler_args = {'args': (flavor_id,)}
@ -964,7 +964,7 @@ class Server(stack_user.StackUser, sh.SchedulerHintsMixin,
prop_diff.get(self.IMAGE_UPDATE_POLICY) or
self.properties[self.IMAGE_UPDATE_POLICY])
if image_update_policy == 'REPLACE':
raise resource.UpdateReplace(self.name)
raise exception.UpdateReplace(self.name)
image = prop_diff[self.IMAGE]
image_id = self.client_plugin('glance').get_image_id(image)
preserve_ephemeral = (

View File

@ -93,12 +93,12 @@ class StackResource(resource.Resource):
# FIXME (ricolin): seems currently can not call super here
if self.nested() is None and self.status == self.FAILED:
raise resource.UpdateReplace(self)
raise exception.UpdateReplace(self)
if (check_init_complete and
self.nested() is None and
self.action == self.INIT and self.status == self.COMPLETE):
raise resource.UpdateReplace(self)
raise exception.UpdateReplace(self)
return True

View File

@ -14,9 +14,9 @@
from oslo_log import log as logging
import six
from heat.common import exception
from heat.common.i18n import _LI
from heat.engine import dependencies
from heat.engine import resource
from heat.engine import scheduler
from heat.objects import resource as resource_objects
@ -145,7 +145,7 @@ class StackUpdate(object):
try:
yield self._update_in_place(existing_res,
new_res)
except resource.UpdateReplace:
except exception.UpdateReplace:
pass
else:
# Save updated resource definition to backup stack
@ -248,7 +248,7 @@ class StackUpdate(object):
current_res.update_template_diff_properties(updated_props,
current_props)
updated_keys.append(key)
except resource.UpdateReplace:
except exception.UpdateReplace:
replaced_keys.append(key)
return {

View File

@ -156,7 +156,7 @@ class WorkerService(service.Service):
check_resource_update(rsrc, tmpl.id, resource_data,
self.engine_id,
stack.time_remaining())
except resource.UpdateReplace:
except exception.UpdateReplace:
new_res_id = rsrc.make_replacement(tmpl.id)
LOG.info("Replacing resource with new id %s", new_res_id)
rpc_data = sync_point.serialize_input_data(resource_data)

View File

@ -1118,7 +1118,7 @@ class InstancesTest(common.HeatTestCase):
update_template = copy.deepcopy(instance.t)
update_template['Properties']['ImageId'] = 'mustreplace'
updater = scheduler.TaskRunner(instance.update, update_template)
self.assertRaises(resource.UpdateReplace, updater)
self.assertRaises(exception.UpdateReplace, updater)
self.m.VerifyAll()

View File

@ -23,7 +23,6 @@ from heat.common import exception
from heat.common import template_format
from heat.engine.clients.os import ceilometer
from heat.engine import properties as props
from heat.engine import resource
from heat.engine.resources.openstack.ceilometer import alarm
from heat.engine import rsrc_defn
from heat.engine import scheduler
@ -293,7 +292,7 @@ class CeilometerAlarmTest(common.HeatTestCase):
properties)
updater = scheduler.TaskRunner(rsrc.update, snippet)
self.assertRaises(resource.UpdateReplace, updater)
self.assertRaises(exception.UpdateReplace, updater)
self.m.VerifyAll()

View File

@ -167,7 +167,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
@mock.patch.object(resource.Resource, 'make_replacement')
def test_is_update_traversal_raise_update_replace(
self, mock_mr, mock_cru, mock_crc, mock_pcr, mock_csc, mock_cid):
mock_cru.side_effect = resource.UpdateReplace
mock_cru.side_effect = exception.UpdateReplace
self.worker.check_resource(
self.ctx, self.resource.id, self.stack.current_traversal, {},
self.is_update, None)

View File

@ -16,7 +16,6 @@ import six
from heat.common import exception
from heat.common import template_format
from heat.engine import resource
from heat.engine import resources
from heat.engine.resources.openstack.manila import security_service
from heat.engine import scheduler
@ -166,7 +165,7 @@ class ManilaSecurityServiceTest(common.HeatTestCase):
rsrc_defns = template.Template(t).resource_definitions(self.stack)
new_ss = rsrc_defns['security_service']
self.assertEqual(0, self.client.security_services.update.call_count)
err = self.assertRaises(resource.UpdateReplace,
err = self.assertRaises(exception.UpdateReplace,
scheduler.TaskRunner(ss.update, new_ss))
msg = 'The Resource security_service requires replacement.'
self.assertEqual(msg, six.text_type(err))

View File

@ -309,7 +309,7 @@ class TestMistralWorkflow(common.HeatTestCase):
self.mistral.workflows.update.return_value = new_workflows
self.mistral.workflows.delete.return_value = None
err = self.assertRaises(resource.UpdateReplace,
err = self.assertRaises(exception.UpdateReplace,
scheduler.TaskRunner(wf.update,
new_workflow))
msg = 'The Resource workflow requires replacement.'

View File

@ -19,7 +19,6 @@ from neutronclient.v2_0 import client as neutronclient
from heat.common import exception
from heat.common import template_format
from heat.engine import resource
from heat.engine import rsrc_defn
from heat.engine import scheduler
from heat.tests import common
@ -492,7 +491,7 @@ class NeutronPortTest(common.HeatTestCase):
new_props['replacement_policy'] = 'REPLACE_ALWAYS'
update_snippet = rsrc_defn.ResourceDefinition(port.name, port.type(),
new_props)
self.assertRaises(resource.UpdateReplace, port._needs_update,
self.assertRaises(exception.UpdateReplace, port._needs_update,
update_snippet, port.frozen_definition(),
new_props, props, None)

View File

@ -1742,7 +1742,7 @@ class ServersTest(common.HeatTestCase):
update_template = copy.deepcopy(server.t)
update_template['Properties']['flavor'] = 'm1.small'
updater = scheduler.TaskRunner(server.update, update_template)
self.assertRaises(resource.UpdateReplace, updater)
self.assertRaises(exception.UpdateReplace, updater)
def test_server_update_server_flavor_policy_update(self):
stack_name = 'update_flvpol'
@ -1763,7 +1763,7 @@ class ServersTest(common.HeatTestCase):
update_template['Properties']['flavor_update_policy'] = 'REPLACE'
update_template['Properties']['flavor'] = 'm1.small'
updater = scheduler.TaskRunner(server.update, update_template)
self.assertRaises(resource.UpdateReplace, updater)
self.assertRaises(exception.UpdateReplace, updater)
def test_server_update_image_replace(self):
stack_name = 'update_imgrep'
@ -1784,7 +1784,7 @@ class ServersTest(common.HeatTestCase):
update_template = copy.deepcopy(server.t)
update_template['Properties']['image'] = image_id
updater = scheduler.TaskRunner(server.update, update_template)
self.assertRaises(resource.UpdateReplace, updater)
self.assertRaises(exception.UpdateReplace, updater)
def _test_server_update_image_rebuild(self, status, policy='REBUILD',
password=None):
@ -1914,7 +1914,7 @@ class ServersTest(common.HeatTestCase):
update_template['Properties']['image'] = 'mustreplace'
update_template['Properties']['image_update_policy'] = 'REPLACE'
updater = scheduler.TaskRunner(server.update, update_template)
self.assertRaises(resource.UpdateReplace, updater)
self.assertRaises(exception.UpdateReplace, updater)
def test_server_status_build(self):
return_server = self.fc.servers.list()[0]
@ -3353,7 +3353,7 @@ class ServersTest(common.HeatTestCase):
# update
updater = scheduler.TaskRunner(server.update, update_template)
self.assertRaises(resource.UpdateReplace, updater)
self.assertRaises(exception.UpdateReplace, updater)
self.m.VerifyAll()

View File

@ -13,6 +13,7 @@
import mock
from heat.common import exception
from heat.engine.clients.os import monasca as client_plugin
from heat.engine import resource
from heat.engine.resources.openstack.monasca import alarm_definition
@ -219,7 +220,7 @@ class MonascaAlarmDefinitionTest(common.HeatTestCase):
prop_diff = {alarm_definition.MonascaAlarmDefinition.EXPRESSION:
'expression-updated'}
self.assertRaises(resource.UpdateReplace,
self.assertRaises(exception.UpdateReplace,
self.test_resource.handle_update,
json_snippet=None,
tmpl_diff=None,

View File

@ -18,11 +18,11 @@ from oslo_serialization import jsonutils as json
from oslo_utils import timeutils
import six
from heat.common import exception
from heat.common import identifier
from heat.common import template_format
from heat.engine.clients.os import heat_plugin
from heat.engine import environment
from heat.engine import resource
from heat.engine.resources.openstack.heat import wait_condition_handle as h_wch
from heat.engine import stack as parser
from heat.engine import template as tmpl
@ -360,4 +360,4 @@ class HeatWaitConditionTest(common.HeatTestCase):
handle = self.stack['update_wait_handle']
self.assertEqual((handle.CREATE, handle.COMPLETE), handle.state)
self.assertRaises(
resource.UpdateReplace, handle.update, None, None)
exception.UpdateReplace, handle.update, None, None)

View File

@ -14,8 +14,8 @@
import copy
from heat.common import exception
from heat.common import template_format
from heat.engine import resource
from heat.engine.resources.openstack.heat import cloud_watch
from heat.engine import rsrc_defn
from heat.engine import scheduler
@ -125,7 +125,7 @@ class CloudWatchAlarmTest(common.HeatTestCase):
props)
updater = scheduler.TaskRunner(rsrc.update, snippet)
self.assertRaises(resource.UpdateReplace, updater)
self.assertRaises(exception.UpdateReplace, updater)
scheduler.TaskRunner(rsrc.delete)()
self.m.VerifyAll()

View File

@ -24,7 +24,6 @@ from heat.engine.hot import functions as hot_functions
from heat.engine.hot import parameters as hot_param
from heat.engine.hot import template as hot_template
from heat.engine import parameters
from heat.engine import resource
from heat.engine import resources
from heat.engine import rsrc_defn
from heat.engine import stack as parser
@ -1183,7 +1182,7 @@ class HotStackTest(common.HeatTestCase):
'Properties': {'Foo': 'xyz'}},
{'Type': 'ResourceWithPropsType',
'Properties': {'Foo': 'abc'}}
).WithSideEffects(check_props).AndRaise(resource.UpdateReplace)
).WithSideEffects(check_props).AndRaise(exception.UpdateReplace)
self.m.ReplayAll()
self.stack.update(updated_stack)
@ -1227,7 +1226,7 @@ class HotStackTest(common.HeatTestCase):
'Properties': {'Foo': 'xyz'}},
{'Type': 'ResourceWithPropsType',
'Properties': {'Foo': 'abc'}}
).WithSideEffects(check_props).AndRaise(resource.UpdateReplace)
).WithSideEffects(check_props).AndRaise(exception.UpdateReplace)
self.m.ReplayAll()
self.stack.update(updated_stack)

View File

@ -19,7 +19,6 @@ 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.resources.openstack.heat import instance_group as instgrp
from heat.engine import rsrc_defn
from heat.engine import scheduler
@ -196,7 +195,7 @@ class TestLaunchConfig(common.HeatTestCase):
metadata)
# Changing metadata in the second update triggers UpdateReplace
updater = scheduler.TaskRunner(rsrc.update, update_snippet)
self.assertRaises(resource.UpdateReplace, updater)
self.assertRaises(exception.UpdateReplace, updater)
class LoadbalancerReloadTest(common.HeatTestCase):

View File

@ -24,7 +24,6 @@ from heat.common import exception
from heat.common.i18n import _
from heat.common import template_format
from heat.engine import environment
from heat.engine import resource
from heat.engine.resources.openstack.heat import remote_stack
from heat.engine import rsrc_defn
from heat.engine import scheduler
@ -619,7 +618,7 @@ class RemoteStackTest(tests_common.HeatTestCase):
update_snippet = rsrc_defn.ResourceDefinition(rsrc.name,
rsrc.type(),
props)
self.assertRaises(resource.UpdateReplace,
self.assertRaises(exception.UpdateReplace,
scheduler.TaskRunner(rsrc.update, update_snippet))
def test_update_failed(self):

View File

@ -371,7 +371,7 @@ class ResourceTest(common.HeatTestCase):
utmpl = rsrc_defn.ResourceDefinition('test_resource', 'TestResource',
{'a_string': 'foo'})
self.assertRaises(
resource.UpdateReplace, scheduler.TaskRunner(res.update, utmpl))
exception.UpdateReplace, scheduler.TaskRunner(res.update, utmpl))
def test_update_replace_in_failed_without_nested(self):
tmpl = rsrc_defn.ResourceDefinition('test_resource',
@ -394,7 +394,7 @@ class ResourceTest(common.HeatTestCase):
# resource in failed status and hasn't nested will enter
# UpdateReplace flow
self.assertRaises(
resource.UpdateReplace, scheduler.TaskRunner(res.update, utmpl))
exception.UpdateReplace, scheduler.TaskRunner(res.update, utmpl))
self.m.VerifyAll()
@ -586,7 +586,7 @@ class ResourceTest(common.HeatTestCase):
after_props = {'Bar': '456'}
res = generic_rsrc.ResourceWithProps('test_resource', tmpl, self.stack)
res.update_allowed_properties = ('Cat',)
self.assertRaises(resource.UpdateReplace,
self.assertRaises(exception.UpdateReplace,
res.update_template_diff_properties,
after_props, before_props)
@ -859,12 +859,12 @@ class ResourceTest(common.HeatTestCase):
tmpl_diff = {'Properties': {'Foo': 'xyz'}}
prop_diff = {'Foo': 'xyz'}
generic_rsrc.ResourceWithProps.handle_update(
utmpl, tmpl_diff, prop_diff).AndRaise(resource.UpdateReplace(
utmpl, tmpl_diff, prop_diff).AndRaise(exception.UpdateReplace(
res.name))
self.m.ReplayAll()
# should be re-raised so parser.Stack can handle replacement
updater = scheduler.TaskRunner(res.update, utmpl)
ex = self.assertRaises(resource.UpdateReplace, updater)
ex = self.assertRaises(exception.UpdateReplace, updater)
self.assertEqual('The Resource test_resource requires replacement.',
six.text_type(ex))
self.m.VerifyAll()
@ -885,11 +885,11 @@ class ResourceTest(common.HeatTestCase):
tmpl_diff = {'Properties': {'Foo': 'xyz'}}
prop_diff = {'Foo': 'xyz'}
generic_rsrc.ResourceWithProps.handle_update(
utmpl, tmpl_diff, prop_diff).AndRaise(resource.UpdateReplace())
utmpl, tmpl_diff, prop_diff).AndRaise(exception.UpdateReplace())
self.m.ReplayAll()
# should be re-raised so parser.Stack can handle replacement
updater = scheduler.TaskRunner(res.update, utmpl)
ex = self.assertRaises(resource.UpdateReplace, updater)
ex = self.assertRaises(exception.UpdateReplace, updater)
self.assertEqual('The Resource Unknown requires replacement.',
six.text_type(ex))
self.m.VerifyAll()
@ -903,7 +903,7 @@ class ResourceTest(common.HeatTestCase):
self.assertEqual((res.INIT, res.COMPLETE), res.state)
prop = {'Foo': 'abc'}
self.assertRaises(resource.UpdateReplace,
self.assertRaises(exception.UpdateReplace,
res._needs_update, tmpl, tmpl, prop, prop, res)
def test_update_fail_missing_req_prop(self):

View File

@ -543,7 +543,7 @@ class StackResourceTest(StackResourceBaseTest):
self.parent_resource.state_set(self.parent_resource.INIT,
self.parent_resource.FAILED)
self.parent_resource._nested = None
self.assertRaises(resource.UpdateReplace,
self.assertRaises(exception.UpdateReplace,
self.parent_resource._needs_update,
self.parent_resource.t,
self.parent_resource.t,
@ -559,7 +559,7 @@ class StackResourceTest(StackResourceBaseTest):
self.parent_resource.state_set(self.parent_resource.INIT,
self.parent_resource.COMPLETE)
self.parent_resource._nested = None
self.assertRaises(resource.UpdateReplace,
self.assertRaises(exception.UpdateReplace,
self.parent_resource._needs_update,
self.parent_resource.t,
self.parent_resource.t,

View File

@ -15,6 +15,7 @@ import copy
import mock
from heat.common import exception
from heat.common import template_format
from heat.engine import environment
from heat.engine import resource
@ -340,7 +341,7 @@ class StackUpdateTest(common.HeatTestCase):
def check_and_raise(*args):
self.assertEqual('abc', self.stack['AResource'].properties['Foo'])
raise resource.UpdateReplace
raise exception.UpdateReplace
mock_upd = self.patchobject(generic_rsrc.ResourceWithProps,
'update_template_diff',

View File

@ -16,7 +16,6 @@ import six
from heat.common import exception
from heat.common import template_format
from heat.engine import resource
from heat.engine.resources.openstack.zaqar import queue
from heat.engine import rsrc_defn
from heat.engine import scheduler
@ -261,7 +260,7 @@ class ZaqarMessageQueueTest(common.HeatTestCase):
new_queue = resource_defns['MyQueue2']
scheduler.TaskRunner(queue.create)()
err = self.assertRaises(resource.UpdateReplace,
err = self.assertRaises(exception.UpdateReplace,
scheduler.TaskRunner(queue.update,
new_queue))
msg = 'The Resource MyQueue2 requires replacement.'