]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Get the heat --parameters to work.
authorAngus Salkeld <asalkeld@redhat.com>
Wed, 28 Mar 2012 02:32:20 +0000 (13:32 +1100)
committerAngus Salkeld <asalkeld@redhat.com>
Wed, 28 Mar 2012 02:32:33 +0000 (13:32 +1100)
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 <asalkeld@redhat.com>
heat/api/v1/stacks.py
heat/engine/api/v1/stacks.py
heat/engine/client.py
heat/engine/parser.py

index 1b1a3b4a451f01707ac2c5f03380ddb7b4c0819e..2e88faf204bc0527c1992b0bf188a32016439fb8 100644 (file)
@@ -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):
         """
index 698435f79083bd75b5d8075598632db1c1081024..fb5e5945cf3a12e54422a7591bdecee461d378d2 100644 (file)
@@ -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']}}
index c9935492635190678518fc38f9d6dc7b64cdcc42..4ccad480b01f75594fb799ee251b87627ed0d144 100644 (file)
@@ -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
 
index 90e3176d4882e40509194029048e5ef352670bfb..c8757d4dc34ce6873446302dd6cda47fb5d652ce 100644 (file)
@@ -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