From: Angus Salkeld Date: Wed, 28 Mar 2012 02:32:20 +0000 (+1100) Subject: Get the heat --parameters to work. X-Git-Tag: 2014.1~2144 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=5a66af974bef2d44f16102f04e3d1a959a0f58f5;p=openstack-build%2Fheat-build.git Get the heat --parameters to work. So now this works: heat create pile \ --template-url=https://raw.github.com/heat-api/heat/master/templates/WordPress_Single_Instance.template \ --parameters="InstanceType=t1.micro;DBUsername=angus;DBPassword=fruity;LinuxDistribution=F17" Fixes Issue #40 Signed-off-by: Angus Salkeld --- diff --git a/heat/api/v1/stacks.py b/heat/api/v1/stacks.py index 1b1a3b4a..2e88faf2 100644 --- a/heat/api/v1/stacks.py +++ b/heat/api/v1/stacks.py @@ -121,7 +121,7 @@ class StackController(object): return webob.exc.HTTPBadRequest(explanation=msg) stack['StackName'] = req.params['StackName'] - return c.create_stack(stack) + return c.create_stack(stack, **req.params) def delete(self, req): """ diff --git a/heat/engine/api/v1/stacks.py b/heat/engine/api/v1/stacks.py index 698435f7..fb5e5945 100644 --- a/heat/engine/api/v1/stacks.py +++ b/heat/engine/api/v1/stacks.py @@ -95,7 +95,7 @@ class StacksController(object): msg = _("Stack already exists with that name.") return webob.exc.HTTPConflict(msg) - stack_db[body['StackName']] = parser.Stack(body['StackName'], body) + stack_db[body['StackName']] = parser.Stack(body['StackName'], body, req.params) stack_db[body['StackName']].start() return {'stack': {'id': body['StackName']}} diff --git a/heat/engine/client.py b/heat/engine/client.py index c9935492..4ccad480 100644 --- a/heat/engine/client.py +++ b/heat/engine/client.py @@ -18,6 +18,7 @@ the heat Engine API """ import json +import logging from heat.common.client import BaseClient from heat.common import crypt @@ -26,6 +27,8 @@ from heat.openstack.common import cfg from heat.cloudformations import * +logger = logging.getLogger(__name__) + _CLIENT_CREDS = None _CLIENT_HOST = None _CLIENT_PORT = None @@ -85,7 +88,7 @@ class EngineClient(BaseClient): return data - def create_stack(self, template): + def create_stack(self, template, **kwargs): """ Tells engine about an stack's metadata """ @@ -93,7 +96,8 @@ class EngineClient(BaseClient): 'Content-Type': 'application/json', } - res = self.do_request("POST", "/stacks", json.dumps(template), headers=headers) + res = self.do_request("POST", "/stacks", json.dumps(template), + headers=headers, params=kwargs) data = json.loads(res.read()) return data diff --git a/heat/engine/parser.py b/heat/engine/parser.py index 90e3176d..c8757d4d 100644 --- a/heat/engine/parser.py +++ b/heat/engine/parser.py @@ -22,7 +22,7 @@ logger = logging.getLogger('heat.engine.parser') class Stack: - def __init__(self, stack_name, template): + def __init__(self, stack_name, template, parms=None): self.t = template if self.t.has_key('Parameters'): @@ -41,13 +41,8 @@ class Stack: "AllowedValues" : ["us-east-1","us-west-1","us-west-2","sa-east-1","eu-west-1","ap-southeast-1","ap-northeast-1"], "ConstraintDescription" : "must be a valid EC2 instance type." } - -###### -# stack['StackId'] = body['StackName'] -# stack['StackStatus'] = 'CREATE_COMPLETE' -# # TODO self._apply_user_parameters(req, stack) -# stack_db[body['StackName']] = stack -###### + if parms != None: + self._apply_user_parameters(parms) self.resources = {} for r in self.t['Resources']: @@ -96,6 +91,29 @@ class Stack: for index, item in enumerate(s): self.calulate_dependancies(item, r) + + def _apply_user_parameter(self, key, value): + logger.info('_apply_user_parameter %s=%s ' % (key, value)) + if not self.t.has_key('Parameters'): + self.t['Parameters'] = {} + + if not self.t['Parameters'].has_key(key): + self.t['Parameters'][key] = {} + + self.t['Parameters'][key]['Value'] = value + + def _apply_user_parameters(self, parms): + for p in parms: + if 'Parameters.member.' in p and 'ParameterKey' in p: + s = p.split('.') + try: + key_name = 'Parameters.member.%s.ParameterKey' % s[2] + value_name = 'Parameters.member.%s.ParameterValue' % s[2] + self._apply_user_parameter(parms[key_name], parms[value_name]) + except: + logger.error('could not apply parameter %s' % p) + + def parameter_get(self, key): if self.parms[key] == None: #print 'None Ref: %s' % key