from heat.common import config
from heat import rpc
from heat import context
+import heat.rpc.common as rpc_common
+
+
logger = logging.getLogger('heat.api.v1.stacks')
"""
con = context.get_admin_context()
- stack_list = rpc.call(con, 'engine',
+ try:
+ stack_list = rpc.call(con, 'engine',
{'method': 'show_stack',
'args': {'stack_name': req.params['StackName'],
'params': dict(req.params)}})
+
+ except rpc_common.RemoteError as ex:
+ return webob.exc.HTTPBadRequest(str(ex))
+
res = {'DescribeStacksResult': {'Stacks': [] } }
stacks = res['DescribeStacksResult']['Stacks']
for s in stack_list['stacks']:
return webob.exc.HTTPBadRequest(explanation=msg)
stack['StackName'] = req.params['StackName']
- return rpc.call(con, 'engine',
- {'method': 'create_stack',
- 'args': {'stack_name': req.params['StackName'],
- 'template': stack,
- 'params': dict(req.params)}})
+ try:
+ return rpc.call(con, 'engine',
+ {'method': 'create_stack',
+ 'args': {'stack_name': req.params['StackName'],
+ 'template': stack,
+ 'params': dict(req.params)}})
+ except rpc_common.RemoteError as ex:
+ return webob.exc.HTTPBadRequest(str(ex))
+
def validate_template(self, req):
return webob.exc.HTTPBadRequest(explanation=msg)
logger.info('validate_template')
- return con.validate_template(stack, **req.params)
+ try:
+ return con.validate_template(stack, **req.params)
+ except rpc_common.RemoteError as ex:
+ return webob.exc.HTTPBadRequest(str(ex))
def delete(self, req):
"""
"""
con = context.get_admin_context()
- res = rpc.call(con, 'engine',
+ try:
+ res = rpc.call(con, 'engine',
{'method': 'delete_stack',
'args': {'stack_name': req.params['StackName'],
'params': dict(req.params)}})
+ except rpc_common.RemoteError as ex:
+ return webob.exc.HTTPBadRequest(str(ex))
if res == None:
return {'DeleteStackResult': ''}
"""
con = context.get_admin_context()
stack_name = req.params.get('StackName', None)
- event_res = rpc.call(con, 'engine',
+ try:
+ event_res = rpc.call(con, 'engine',
{'method': 'list_events',
'args': {'stack_name': stack_name}})
+ except rpc_common.RemoteError as ex:
+ return webob.exc.HTTPBadRequest(str(ex))
+
events = 'Error' not in event_res and event_res['events'] or []
return {'DescribeStackEventsResult': {'StackEvents': events}}
elif status_code == httplib.CONFLICT:
raise exception.Duplicate(res.read())
elif status_code == httplib.BAD_REQUEST:
- raise exception.Invalid(res.read())
+ raise exception.Invalid(reason=res.read())
elif status_code == httplib.MULTIPLE_CHOICES:
raise exception.MultipleChoices(body=res.read())
elif status_code == httplib.REQUEST_ENTITY_TOO_LARGE:
class Invalid(OpenstackException):
- message = _("Data supplied was not valid.")
+ message = _("Data supplied was not valid: %(reason)s")
class AuthorizationRedirect(OpenstackException):
class UserParameterMissing(OpenstackException):
message = _("The Parameter (%(key)s) was not provided.")
+class InvalidTemplateAttribute(OpenstackException):
+ message = _("The Referenced Attribute (%(resource)s %(key)s) is incorrect.")
class UserKeyPairMissing(OpenstackException):
message = _("The Key (%(key_name)s) could not be found.")
import eventlet
import json
import logging
-import traceback
+
+from heat.common import exception
from heat.engine import resources
from heat.db import api as db_api
try:
self.resources[r].create()
except Exception as ex:
- readable = traceback.format_exc()
- logger.error('%s', readable)
- logger.error('create: %s' % str(ex))
+ logger.exception('create')
failed = True
self.resources[r].state_set(self.resources[r].CREATE_FAILED, str(ex))
else:
def parameter_get(self, key):
if self.parms[key] == None:
- logger.warn('Trying to reference parameter: %s, but it is empty' % key)
- return ''
+ raise exception.UserParameterMissing(key=key)
elif self.parms[key].has_key('Value'):
return self.parms[key]['Value']
elif self.parms[key].has_key('Default'):
return self.parms[key]['Default']
else:
- logger.warn('Trying to reference parameter: %s, but no Value or Default' % key)
- return ''
+ raise exception.UserParameterMissing(key=key)
def resolve_static_refs(self, s):
'''
res = self.resources.get(resource_name)
rc = None
if res:
- rc = res.FnGetAtt(key_name)
- #print 'found attr:%s.%s=%s' % (res.name, key_name, rc)
+ return res.FnGetAtt(key_name)
+ else:
+ raise exception.InvalidTemplateAttribute(resource=resource_name, key=key_name)
return rc
else:
s[i] = self.resolve_attributes(s[i])
'''
http://docs.amazonwebservices.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html
'''
- print '%s.GetAtt(%s)' % (self.name, key)
- return unicode('not-this-surely')
+ raise exception.InvalidTemplateAttribute(resource=self.name, key=key)
def FnBase64(self, data):
'''
if key == 'AllocationId':
return unicode(self.instance_id)
else:
- logger.warn('%s.GetAtt(%s) is not handled' % (self.name, key))
- return unicode('')
+ raise exception.InvalidTemplateAttribute(resource=self.name, key=key)
class ElasticIpAssociation(Resource):
def __init__(self, name, json_snippet, stack):
def FnGetAtt(self, key):
- res = 'not-this-surely'
+ res = None
if key == 'AvailabilityZone':
res = self.t['Properties']['AvailabilityZone']
elif key == 'PublicIp':
res = self.ipaddress
else:
- logger.warn('%s.GetAtt(%s) is not handled' % (self.name, key))
+ raise exception.InvalidTemplateAttribute(resource=self.name, key=key)
# TODO(asalkeld) PrivateDnsName, PublicDnsName & PrivateIp