Save the parsed_template so user parameters are available.

This caused parsing errors when deleting, as required
references were not available.

Signed-off-by: Angus Salkeld <asalkeld@redhat.com>
This commit is contained in:
Angus Salkeld 2012-04-18 14:43:18 +10:00
parent e5a0f9196f
commit 35bd5f4c5f
3 changed files with 44 additions and 12 deletions

View File

@ -58,7 +58,7 @@ class EngineManager(manager.Manager):
if stacks == None:
return res
for s in stacks:
ps = parser.Stack(s.name, s.raw_template.template, params)
ps = parser.Stack(s.name, s.raw_template.parsed_template.template, s.id, params)
mem = {}
mem['stack_id'] = s.id
mem['stack_name'] = s.name
@ -80,7 +80,7 @@ class EngineManager(manager.Manager):
res = {'stacks': []}
s = db_api.stack_get(None, stack_name)
if s:
ps = parser.Stack(s.name, s.raw_template.template, params)
ps = parser.Stack(s.name, s.raw_template.parsed_template.template, s.id, params)
mem = {}
mem['stack_id'] = s.id
mem['stack_name'] = s.name
@ -113,17 +113,28 @@ class EngineManager(manager.Manager):
if db_api.stack_get(None, stack_name):
return {'Error': 'Stack already exists with that name.'}
stack = parser.Stack(stack_name, template, params)
stack = parser.Stack(stack_name, template, 0, params)
rt = {}
rt['template'] = template
rt['stack_name'] = stack_name
new_rt = db_api.raw_template_create(None, rt)
s = {}
s['name'] = stack_name
s['raw_template_id'] = new_rt.id
new_s = db_api.stack_create(None, s)
stack.id = new_s.id
pt = {}
pt['template'] = stack.t
pt['raw_template_id'] = new_rt.id
new_pt = db_api.parsed_template_create(None, pt)
new_s.parsed_template_id = new_pt.id
stack.parsed_template_id = new_pt.id
stack.create()
return {'stack': {'id': new_s.id, 'name': new_s.name,\
'created_at': str(new_s.created_at)}}
@ -141,7 +152,7 @@ class EngineManager(manager.Manager):
msg = _("No Template provided.")
return webob.exc.HTTPBadRequest(explanation=msg)
s = parser.Stack('validate', body, req.params)
s = parser.Stack('validate', body, 0, req.params)
res = s.validate()
return res
@ -159,8 +170,7 @@ class EngineManager(manager.Manager):
logger.info('deleting stack %s' % stack_name)
rt = db_api.raw_template_get(None, st.raw_template_id)
ps = parser.Stack(st.name, rt.template, params)
ps = parser.Stack(st.name, st.raw_template.parsed_template.template, st.id, params)
ps.delete()
return None

View File

@ -25,8 +25,8 @@ logger = logging.getLogger('heat.engine.parser')
class Stack(object):
def __init__(self, stack_name, template, parms=None):
self.id = 0
def __init__(self, stack_name, template, stack_id=0, parms=None):
self.id = stack_id
self.t = template
self.parms = self.t.get('Parameters', {})
self.maps = self.t.get('Mappings', {})
@ -50,10 +50,6 @@ class Stack(object):
else:
self.creds = parms['KeyStoneCreds']
stack = db_api.stack_get(None, stack_name)
if stack:
self.id = stack.id
self.resources = {}
for r in self.t['Resources']:
type = self.t['Resources'][r]['Type']
@ -130,6 +126,25 @@ class Stack(object):
return order
def update_parsed_template(self):
'''
Update the parsed template after each resource has been
created, so commands like describe will work.
'''
if self.parsed_template_id == 0:
stack = db_api.stack_get(None, self.name)
if stack:
self.parsed_template_id = stack.parsed_template_id
else:
return
pt = db_api.parsed_template_get(None, self.parsed_template_id)
if pt:
pt.template = self.t
else:
print 'cant find parsed template to update %d' % self.parsed_template_id
def create_blocking(self):
'''
create all the resources in the order specified by get_create_order
@ -145,6 +160,12 @@ class Stack(object):
logger.exception('create')
failed = True
self.resources[r].state_set(failed_str, str(ex))
try:
self.update_parsed_template()
except Exception as ex:
logger.exception('update_parsed_template')
else:
self.resources[r].state_set(self.resources[r].CREATE_FAILED)

View File

@ -122,6 +122,7 @@ class Resource(object):
rs = {}
rs['state'] = new_state
rs['stack_id'] = self.stack.id
rs['parsed_template_id'] = self.stack.parsed_template_id
rs['nova_instance'] = self.instance_id
rs['name'] = self.name
rs['stack_name'] = self.stack.name