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)