From 68a73b513c0ba04637f9de2f8c7e91eb9b059b31 Mon Sep 17 00:00:00 2001 From: Oleksii Chuprykov Date: Wed, 2 Sep 2015 16:11:40 +0300 Subject: [PATCH] Move Resource exceptions to common module (2) 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). ResourceUnknownStatus exception is moved in this patch. Change-Id: Iad44c16252f5171984859f0ddd05b821f5dfc7e7 --- heat/common/exception.py | 10 ++++++++++ heat/engine/clients/os/cinder.py | 5 ++--- heat/engine/clients/os/nova.py | 10 +++++----- heat/engine/resource.py | 10 ---------- heat/engine/resources/aws/ec2/instance.py | 2 +- heat/engine/resources/openstack/cinder/volume.py | 5 ++--- heat/engine/resources/openstack/heat/remote_stack.py | 2 +- heat/engine/resources/openstack/manila/share.py | 7 ++++--- .../engine/resources/openstack/neutron/loadbalancer.py | 4 ++-- heat/engine/resources/openstack/neutron/neutron.py | 2 +- heat/engine/resources/openstack/nova/server.py | 3 +-- heat/engine/resources/stack_resource.py | 2 +- heat/engine/resources/volume_base.py | 4 ++-- heat/tests/aws/test_instance.py | 2 +- heat/tests/clients/test_nova_client.py | 2 +- heat/tests/manila/test_manila_share.py | 2 +- heat/tests/neutron/test_neutron.py | 2 +- heat/tests/nova/test_server.py | 4 ++-- heat/tests/test_stack_resource.py | 3 +-- 19 files changed, 39 insertions(+), 42 deletions(-) diff --git a/heat/common/exception.py b/heat/common/exception.py index e4be395d75..9cd163dbe9 100644 --- a/heat/common/exception.py +++ b/heat/common/exception.py @@ -395,6 +395,16 @@ class UpdateReplace(Exception): super(Exception, self).__init__(six.text_type(msg)) +class ResourceUnknownStatus(HeatException): + msg_fmt = _('%(result)s - Unknown status %(resource_status)s due to ' + '"%(status_reason)s"') + + def __init__(self, result=_('Resource failed'), + status_reason=_('Unknown'), **kwargs): + super(ResourceUnknownStatus, self).__init__( + result=result, status_reason=status_reason, **kwargs) + + class HTTPExceptionDisguise(Exception): """Disguises HTTP exceptions so they can be handled by the webob fault application in the wsgi pipeline. diff --git a/heat/engine/clients/os/cinder.py b/heat/engine/clients/os/cinder.py index 1ba7d6dc9e..a535a843aa 100644 --- a/heat/engine/clients/os/cinder.py +++ b/heat/engine/clients/os/cinder.py @@ -22,7 +22,6 @@ from heat.common.i18n import _ from heat.common.i18n import _LI from heat.engine.clients import client_plugin from heat.engine import constraints -from heat.engine import resource LOG = logging.getLogger(__name__) @@ -160,7 +159,7 @@ class CinderClientPlugin(client_plugin.ClientPlugin): LOG.debug("Detachment failed - volume %(vol)s " "is in %(status)s status" % {"vol": vol.id, "status": vol.status}) - raise resource.ResourceUnknownStatus( + raise exception.ResourceUnknownStatus( resource_status=vol.status, result=_('Volume detachment failed')) else: @@ -178,7 +177,7 @@ class CinderClientPlugin(client_plugin.ClientPlugin): LOG.debug("Attachment failed - volume %(vol)s is " "in %(status)s status" % {"vol": vol_id, "status": vol.status}) - raise resource.ResourceUnknownStatus( + raise exception.ResourceUnknownStatus( resource_status=vol.status, result=_('Volume attachment failed')) diff --git a/heat/engine/clients/os/nova.py b/heat/engine/clients/os/nova.py index 22a923b789..c08161f80d 100644 --- a/heat/engine/clients/os/nova.py +++ b/heat/engine/clients/os/nova.py @@ -222,7 +222,7 @@ class NovaClientPlugin(client_plugin.ClientPlugin): 'code': fault.get('code', _('Unknown')) }) else: - raise resource.ResourceUnknownStatus( + raise exception.ResourceUnknownStatus( resource_status=server.status, result=_('%s is not active') % res_name) @@ -451,8 +451,8 @@ echo -e '%s\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers return True else: msg = _("Could not confirm resize of server %s") % server_id - raise resource.ResourceUnknownStatus(result=msg, - resource_status=status) + raise exception.ResourceUnknownStatus( + result=msg, resource_status=status) def check_verify_resize(self, server_id): server = self.fetch_server(server_id) @@ -465,8 +465,8 @@ echo -e '%s\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers return False else: msg = _("Confirm resize for server %s failed") % server_id - raise resource.ResourceUnknownStatus(result=msg, - resource_status=status) + raise exception.ResourceUnknownStatus( + result=msg, resource_status=status) def rebuild(self, server_id, image_id, password=None, preserve_ephemeral=False): diff --git a/heat/engine/resource.py b/heat/engine/resource.py index 2b81ec562d..19fbeb4b60 100644 --- a/heat/engine/resource.py +++ b/heat/engine/resource.py @@ -70,16 +70,6 @@ class ResourceInError(exception.HeatException): **kwargs) -class ResourceUnknownStatus(exception.HeatException): - msg_fmt = _('%(result)s - Unknown status %(resource_status)s due to ' - '"%(status_reason)s"') - - def __init__(self, result=_('Resource failed'), - status_reason=_('Unknown'), **kwargs): - super(ResourceUnknownStatus, self).__init__( - result=result, status_reason=status_reason, **kwargs) - - class UpdateInProgress(Exception): def __init__(self, resource_name='Unknown'): msg = _("The resource %s is already being updated.") % resource_name diff --git a/heat/engine/resources/aws/ec2/instance.py b/heat/engine/resources/aws/ec2/instance.py index d7b8a5ce1a..30342805c0 100644 --- a/heat/engine/resources/aws/ec2/instance.py +++ b/heat/engine/resources/aws/ec2/instance.py @@ -869,7 +869,7 @@ class Instance(resource.Resource, sh.SchedulerHintsMixin): if status in list(cp.deferred_server_statuses + ['ACTIVE']): return status == 'SUSPENDED' else: - exc = resource.ResourceUnknownStatus( + exc = exception.ResourceUnknownStatus( result=_('Suspend of instance %s failed') % server.name, resource_status=status) raise exc diff --git a/heat/engine/resources/openstack/cinder/volume.py b/heat/engine/resources/openstack/cinder/volume.py index af45b3816e..658933a996 100644 --- a/heat/engine/resources/openstack/cinder/volume.py +++ b/heat/engine/resources/openstack/cinder/volume.py @@ -22,7 +22,6 @@ from heat.engine import attributes from heat.engine.clients import progress from heat.engine import constraints from heat.engine import properties -from heat.engine import resource from heat.engine.resources import scheduler_hints as sh from heat.engine.resources import volume_base as vb from heat.engine import support @@ -305,7 +304,7 @@ class CinderVolume(vb.BaseVolume, sh.SchedulerHintsMixin): LOG.info(_LI("Resize failed: Volume %(vol)s " "is in %(status)s state."), {'vol': vol.id, 'status': vol.status}) - raise resource.ResourceUnknownStatus( + raise exception.ResourceUnknownStatus( resource_status=vol.status, result=_('Volume resize failed')) @@ -335,7 +334,7 @@ class CinderVolume(vb.BaseVolume, sh.SchedulerHintsMixin): if vol.status != 'available': LOG.info(_LI("Restore failed: Volume %(vol)s is in %(status)s " "state."), {'vol': vol.id, 'status': vol.status}) - raise resource.ResourceUnknownStatus( + raise exception.ResourceUnknownStatus( resource_status=vol.status, result=_('Volume backup restore failed')) diff --git a/heat/engine/resources/openstack/heat/remote_stack.py b/heat/engine/resources/openstack/heat/remote_stack.py index 375404e0be..9e378621d6 100644 --- a/heat/engine/resources/openstack/heat/remote_stack.py +++ b/heat/engine/resources/openstack/heat/remote_stack.py @@ -257,7 +257,7 @@ class RemoteStack(resource.Resource): else: # Note: this should never happen, so it really means that # the resource/engine is in serious problem if it happens. - raise resource.ResourceUnknownStatus( + raise exception.ResourceUnknownStatus( resource_status=stack.stack_status, status_reason=stack.stack_status_reason) diff --git a/heat/engine/resources/openstack/manila/share.py b/heat/engine/resources/openstack/manila/share.py index c8f228cfa5..8fb4b75ea8 100644 --- a/heat/engine/resources/openstack/manila/share.py +++ b/heat/engine/resources/openstack/manila/share.py @@ -14,6 +14,7 @@ from oslo_log import log as logging import six +from heat.common import exception from heat.common.i18n import _ from heat.common.i18n import _LI from heat.engine import attributes @@ -257,8 +258,8 @@ class ManilaShare(resource.Resource): else: reason = _('Unknown share_status during creation of share "{0}"' ).format(self.resource_id) - raise resource.ResourceUnknownStatus(status_reason=reason, - resource_status=share_status) + raise exception.ResourceUnknownStatus( + status_reason=reason, resource_status=share_status) def check_delete_complete(self, *args): if not self.resource_id: @@ -283,7 +284,7 @@ class ManilaShare(resource.Resource): else: reason = _('Unknown status during deleting share ' '"{0}"').format(self.resource_id) - raise resource.ResourceUnknownStatus( + raise exception.ResourceUnknownStatus( status_reason=reason, resource_status=share.status) def handle_check(self): diff --git a/heat/engine/resources/openstack/neutron/loadbalancer.py b/heat/engine/resources/openstack/neutron/loadbalancer.py index 169e6e5a9b..dffad21de6 100644 --- a/heat/engine/resources/openstack/neutron/loadbalancer.py +++ b/heat/engine/resources/openstack/neutron/loadbalancer.py @@ -476,7 +476,7 @@ class Pool(neutron.NeutronResource): raise resource.ResourceInError( resource_status=vip_status, status_reason=_('error in vip')) - raise resource.ResourceUnknownStatus( + raise exception.ResourceUnknownStatus( resource_status=vip_status, result=_('Pool creation failed due to vip')) elif status == 'ERROR': @@ -484,7 +484,7 @@ class Pool(neutron.NeutronResource): resource_status=status, status_reason=_('error in pool')) else: - raise resource.ResourceUnknownStatus( + raise exception.ResourceUnknownStatus( resource_status=status, result=_('Pool creation failed')) diff --git a/heat/engine/resources/openstack/neutron/neutron.py b/heat/engine/resources/openstack/neutron/neutron.py index bfddd7ef67..79aaca7bda 100644 --- a/heat/engine/resources/openstack/neutron/neutron.py +++ b/heat/engine/resources/openstack/neutron/neutron.py @@ -114,7 +114,7 @@ class NeutronResource(resource.Resource): raise resource.ResourceInError( resource_status=status) else: - raise resource.ResourceUnknownStatus( + raise exception.ResourceUnknownStatus( resource_status=status, result=_('Resource is not built')) diff --git a/heat/engine/resources/openstack/nova/server.py b/heat/engine/resources/openstack/nova/server.py index b7262db52b..e2c64d9e25 100644 --- a/heat/engine/resources/openstack/nova/server.py +++ b/heat/engine/resources/openstack/nova/server.py @@ -28,7 +28,6 @@ from heat.engine.clients import progress from heat.engine import constraints from heat.engine import function from heat.engine import properties -from heat.engine import resource from heat.engine.resources.openstack.neutron import subnet from heat.engine.resources.openstack.nova import server_network_mixin from heat.engine.resources import scheduler_hints as sh @@ -1338,7 +1337,7 @@ class Server(stack_user.StackUser, sh.SchedulerHintsMixin, if status in list(cp.deferred_server_statuses + ['ACTIVE']): return status == 'SUSPENDED' else: - exc = resource.ResourceUnknownStatus( + exc = exception.ResourceUnknownStatus( result=_('Suspend of server %s failed') % server.name, resource_status=status) raise exc diff --git a/heat/engine/resources/stack_resource.py b/heat/engine/resources/stack_resource.py index 14d666c878..747964fa21 100644 --- a/heat/engine/resources/stack_resource.py +++ b/heat/engine/resources/stack_resource.py @@ -372,7 +372,7 @@ class StackResource(resource.Resource): raise exception.ResourceFailure(nested.status_reason, self, action=action) else: - raise resource.ResourceUnknownStatus( + raise exception.ResourceUnknownStatus( resource_status=nested.status, status_reason=nested.status_reason, result=_('Stack unknown status')) diff --git a/heat/engine/resources/volume_base.py b/heat/engine/resources/volume_base.py index 7f7e1a58ce..cf21dc4089 100644 --- a/heat/engine/resources/volume_base.py +++ b/heat/engine/resources/volume_base.py @@ -54,7 +54,7 @@ class BaseVolume(resource.Resource): raise resource.ResourceInError( resource_status=vol.status) else: - raise resource.ResourceUnknownStatus( + raise exception.ResourceUnknownStatus( resource_status=vol.status, result=_('Volume create failed')) @@ -108,7 +108,7 @@ class BaseVolume(resource.Resource): if backup.status == 'available': return True else: - raise resource.ResourceUnknownStatus( + raise exception.ResourceUnknownStatus( resource_status=backup.status, result=_('Volume backup failed')) diff --git a/heat/tests/aws/test_instance.py b/heat/tests/aws/test_instance.py index 505859b89d..d07b14510c 100644 --- a/heat/tests/aws/test_instance.py +++ b/heat/tests/aws/test_instance.py @@ -525,7 +525,7 @@ class InstancesTest(common.HeatTestCase): return_server.status = 'BOGUS' self.fc.servers.get(instance.resource_id).AndReturn(return_server) self.m.ReplayAll() - e = self.assertRaises(resource.ResourceUnknownStatus, + e = self.assertRaises(exception.ResourceUnknownStatus, instance.check_create_complete, (creator, None)) self.assertEqual('Instance is not active - Unknown status BOGUS ' diff --git a/heat/tests/clients/test_nova_client.py b/heat/tests/clients/test_nova_client.py index 161938d528..c0f95be9f0 100644 --- a/heat/tests/clients/test_nova_client.py +++ b/heat/tests/clients/test_nova_client.py @@ -270,7 +270,7 @@ class NovaClientPluginCheckActiveTests(NovaClientPluginTestCase): e_raise=resource.ResourceInError)), ('unknown', dict( status='VIKINGS!', - e_raise=resource.ResourceUnknownStatus)) + e_raise=exception.ResourceUnknownStatus)) ] def setUp(self): diff --git a/heat/tests/manila/test_manila_share.py b/heat/tests/manila/test_manila_share.py index a7ea187765..4554b64ec0 100644 --- a/heat/tests/manila/test_manila_share.py +++ b/heat/tests/manila/test_manila_share.py @@ -135,7 +135,7 @@ class ManilaShareTest(common.HeatTestCase): def test_share_create_unknown_status(self): share = self._init_share("stack_share_create_unknown") share.client().shares.get.return_value = self.deleting_share - exc = self.assertRaises(resource.ResourceUnknownStatus, + exc = self.assertRaises(exception.ResourceUnknownStatus, share.check_create_complete, self.deleting_share) self.assertIn("Unknown status", six.text_type(exc)) diff --git a/heat/tests/neutron/test_neutron.py b/heat/tests/neutron/test_neutron.py index b46dc8c99e..9623f643b6 100644 --- a/heat/tests/neutron/test_neutron.py +++ b/heat/tests/neutron/test_neutron.py @@ -97,7 +97,7 @@ class NeutronTest(common.HeatTestCase): 'Went to status ERROR due to "Unknown"', six.text_type(e)) e = self.assertRaises( - resource.ResourceUnknownStatus, + exception.ResourceUnknownStatus, nr.NeutronResource.is_built, {'status': 'FROBULATING'}) self.assertEqual('Resource is not built - Unknown status ' 'FROBULATING due to "Unknown"', diff --git a/heat/tests/nova/test_server.py b/heat/tests/nova/test_server.py index 9cbfff2149..78dfddd188 100644 --- a/heat/tests/nova/test_server.py +++ b/heat/tests/nova/test_server.py @@ -513,7 +513,7 @@ class ServersTest(common.HeatTestCase): self.fc.servers.get(server.resource_id).AndReturn(return_server) self.m.ReplayAll() - e = self.assertRaises(resource.ResourceUnknownStatus, + e = self.assertRaises(exception.ResourceUnknownStatus, server.check_create_complete, server.resource_id) self.assertEqual('Server is not active - Unknown status BOGUS due to ' @@ -2040,7 +2040,7 @@ class ServersTest(common.HeatTestCase): ex = self.assertRaises(exception.ResourceFailure, scheduler.TaskRunner(server.suspend)) - self.assertIsInstance(ex.exc, resource.ResourceUnknownStatus) + self.assertIsInstance(ex.exc, exception.ResourceUnknownStatus) self.assertEqual('Suspend of server %s failed - ' 'Unknown status TRANSMOGRIFIED ' 'due to "Unknown"' % return_server.name, diff --git a/heat/tests/test_stack_resource.py b/heat/tests/test_stack_resource.py index 2547760664..32f32a629d 100644 --- a/heat/tests/test_stack_resource.py +++ b/heat/tests/test_stack_resource.py @@ -23,7 +23,6 @@ import testtools from heat.common import exception from heat.common import template_format -from heat.engine import resource from heat.engine.resources import stack_resource from heat.engine import stack as parser from heat.engine import template as templatem @@ -758,7 +757,7 @@ class StackResourceCheckCompleteTest(StackResourceBaseTest): self.nested.status_reason = 'broken on purpose' complete = getattr(self.parent_resource, 'check_%s_complete' % self.action) - self.assertRaises(resource.ResourceUnknownStatus, complete, None) + self.assertRaises(exception.ResourceUnknownStatus, complete, None) self.parent_resource.nested.assert_called_once_with( show_deleted=self.show_deleted, force_reload=True)