]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Use the Environment from within the engine
authorAngus Salkeld <asalkeld@redhat.com>
Fri, 14 Jun 2013 10:56:02 +0000 (20:56 +1000)
committerAngus Salkeld <asalkeld@redhat.com>
Mon, 17 Jun 2013 10:25:13 +0000 (20:25 +1000)
at this point the concept only exists in the engine, the
api and client changes will come in later patches.

blueprint environments
Change-Id: I3e208bb72a04bf275bead2aec89006cf680b501b

16 files changed:
heat/engine/parser.py
heat/engine/resource.py
heat/engine/resources/autoscaling.py
heat/engine/service.py
heat/engine/stack_resource.py
heat/tests/test_engine_service.py
heat/tests/test_instance.py
heat/tests/test_instance_network.py
heat/tests/test_metadata_refresh.py
heat/tests/test_nested_stack.py
heat/tests/test_security_group.py
heat/tests/test_validate.py
heat/tests/test_vpc.py
heat/tests/test_waitcondition.py
heat/tests/test_watch.py
heat/tests/utils.py

index 974b8eb1c0b5bf66c73e8f564d7954bf45b4b4ae..c1db30831a82df60fd1eeefce3bcea05ba227c25 100644 (file)
@@ -17,6 +17,7 @@ import eventlet
 import functools
 import re
 
+from heat.engine import environment
 from heat.common import exception
 from heat.engine import dependencies
 from heat.common import identifier
@@ -64,12 +65,12 @@ class Stack(object):
 
     _zones = None
 
-    def __init__(self, context, stack_name, tmpl, parameters=None,
+    def __init__(self, context, stack_name, tmpl, env=None,
                  stack_id=None, state=None, state_description='',
                  timeout_mins=60, resolve_data=True, disable_rollback=True):
         '''
         Initialise from a context, name, Template object and (optionally)
-        Parameters object. The database ID may also be initialised, if the
+        Environment object. The database ID may also be initialised, if the
         stack is already in the database.
         '''
 
@@ -91,9 +92,9 @@ class Stack(object):
 
         resources.initialise()
 
-        if parameters is None:
-            parameters = Parameters(self.name, self.t)
-        self.parameters = parameters
+        self.env = env or environment.Environment({})
+        self.parameters = Parameters(self.name, self.t,
+                                     user_params=self.env.params)
 
         self._set_param_stackid()
 
@@ -142,8 +143,8 @@ class Stack(object):
             raise exception.NotFound(message)
 
         template = Template.load(context, stack.raw_template_id)
-        params = Parameters(stack.name, template, stack.parameters)
-        stack = cls(context, stack.name, template, params,
+        env = environment.Environment(stack.parameters)
+        stack = cls(context, stack.name, template, env,
                     stack.id, stack.status, stack.status_reason, stack.timeout,
                     resolve_data, stack.disable_rollback)
 
@@ -159,7 +160,7 @@ class Stack(object):
         s = {
             'name': self.name,
             'raw_template_id': self.t.store(self.context),
-            'parameters': self.parameters.user_parameters(),
+            'parameters': self.env.user_env_as_dict(),
             'owner_id': owner and owner.id,
             'user_creds_id': new_creds.id,
             'username': self.context.username,
@@ -439,7 +440,7 @@ class Stack(object):
                         stack_status = self.UPDATE_FAILED
                     else:
                         oldstack = Stack(self.context, self.name, self.t,
-                                         self.parameters)
+                                         self.env)
                         self.update(oldstack, action=self.ROLLBACK)
                         return
                 else:
@@ -447,12 +448,12 @@ class Stack(object):
 
             self.state_set(stack_status, reason)
 
-            # flip the template & parameters to the newstack values
+            # flip the template & environment to the newstack values
             # Note we do this on success and failure, so the current
             # stack resources are stored, even if one is in a failed
             # state (otherwise we won't remove them on delete)
             self.t = newstack.t
-            self.parameters = newstack.parameters
+            self.env = newstack.env
             template_outputs = self.t[template.OUTPUTS]
             self.outputs = self.resolve_static_data(template_outputs)
             self.store()
index cc5f560f334a23b71c2cc1bd3318b78dc0c3ff9c..75b0b52425ed600e23395b7b861c97f7864caac4 100644 (file)
@@ -37,8 +37,11 @@ def get_types():
     return iter(_resource_classes)
 
 
-def get_class(resource_type):
+def get_class(resource_type, resource_name=None, environment=None):
     '''Return the Resource class for a given resource type.'''
+    if environment:
+        resource_type = environment.get_resource_type(resource_type,
+                                                      resource_name)
     cls = _resource_classes.get(resource_type)
     if cls is None:
         msg = "Unknown resource Type : %s" % resource_type
@@ -131,7 +134,9 @@ class Resource(object):
             return super(Resource, cls).__new__(cls)
 
         # Select the correct subclass to instantiate
-        ResourceClass = get_class(json['Type'])
+        ResourceClass = get_class(json['Type'],
+                                  resource_name=name,
+                                  environment=stack.env)
         return ResourceClass(name, json, stack)
 
     def __init__(self, name, json_snippet, stack):
index e2bb89a131f9b3df70e309d575df516a1c13b325..419494975c212ecc734663795e61c4117aabb50d 100644 (file)
@@ -110,7 +110,9 @@ class InstanceGroup(resource.Resource):
 
     def _make_instance(self, name):
 
-        Instance = resource.get_class('AWS::EC2::Instance')
+        Instance = resource.get_class('AWS::EC2::Instance',
+                                      resource_name=name,
+                                      environment=self.stack.env)
 
         class GroupedInstance(Instance):
             '''
index dd0db0cc53f093d716a1693dcb1e7d13fd050768..3f1030034bcf38611931e010eb09787f5a70791d 100644 (file)
@@ -24,6 +24,7 @@ from heat.db import api as db_api
 from heat.engine import api
 from heat.engine import clients
 from heat.engine.event import Event
+from heat.engine import environment
 from heat.common import exception
 from heat.common import identifier
 from heat.engine import parameters
@@ -212,12 +213,11 @@ class EngineService(service.Service):
 
         tmpl = parser.Template(template)
 
-        # Extract the template parameters, and any common query parameters
-        template_params = parser.Parameters(stack_name, tmpl, params)
+        # Extract the common query parameters
         common_params = api.extract_args(args)
-
-        stack = parser.Stack(cnxt, stack_name, tmpl, template_params,
-                             **common_params)
+        env = environment.Environment(params)
+        stack = parser.Stack(cnxt, stack_name, tmpl,
+                             env, **common_params)
 
         stack.validate()
 
@@ -251,11 +251,10 @@ class EngineService(service.Service):
         # stack definition.
         tmpl = parser.Template(template)
         stack_name = current_stack.name
-        template_params = parser.Parameters(stack_name, tmpl, params)
         common_params = api.extract_args(args)
-
+        env = environment.Environment(params)
         updated_stack = parser.Stack(cnxt, stack_name, tmpl,
-                                     template_params, **common_params)
+                                     env, **common_params)
 
         updated_stack.validate()
 
index 507c0fd7b93e32470beb025fcc4d1b5b3de44562..298a7163547dbe73f7568beb86fa7ac8b88194b3 100644 (file)
@@ -14,6 +14,7 @@
 #    under the License.
 
 from heat.common import exception
+from heat.engine import environment
 from heat.engine import resource
 from heat.engine import parser
 from heat.engine import scheduler
@@ -52,15 +53,13 @@ class StackResource(resource.Resource):
         Handle the creation of the nested stack from a given JSON template.
         '''
         template = parser.Template(child_template)
-        params = parser.Parameters(self.physical_resource_name(), template,
-                                   user_params)
 
         # Note we disable rollback for nested stacks, since they
         # should be rolled back by the parent stack on failure
         self._nested = parser.Stack(self.context,
                                     self.physical_resource_name(),
                                     template,
-                                    params,
+                                    environment.Environment(user_params),
                                     timeout_mins=timeout_mins,
                                     disable_rollback=True)
 
index f6c42e7d1e3a9002980cae9fbab7f66e160333a5..75f7b2f8f8cbcbaf377a108fa2f25efb4c7c06f2 100644 (file)
@@ -22,6 +22,7 @@ from oslo.config import cfg
 
 from heat.common import config
 from heat.common import context
+from heat.engine import environment
 from heat.common import exception
 from heat.tests.v1_1 import fakes
 import heat.engine.api as engine_api
@@ -78,10 +79,8 @@ def create_context(mocks, user='stacks_test_user',
 def get_wordpress_stack(stack_name, ctx):
     t = template_format.parse(wp_template)
     template = parser.Template(t)
-    parameters = parser.Parameters(stack_name, template,
-                                   {'KeyName': 'test'})
-
-    stack = parser.Stack(ctx, stack_name, template, parameters)
+    stack = parser.Stack(ctx, stack_name, template,
+                         environment.Environment({'KeyName': 'test'}))
     return stack
 
 
@@ -243,15 +242,13 @@ class stackServiceCreateUpdateDeleteTest(HeatTestCase):
         stack = get_wordpress_stack(stack_name, self.ctx)
 
         self.m.StubOutWithMock(parser, 'Template')
-        self.m.StubOutWithMock(parser, 'Parameters')
+        self.m.StubOutWithMock(environment, 'Environment')
         self.m.StubOutWithMock(parser, 'Stack')
 
         parser.Template(template).AndReturn(stack.t)
-        parser.Parameters(stack_name,
-                          stack.t,
-                          params).AndReturn(stack.parameters)
+        environment.Environment(params).AndReturn(stack.env)
         parser.Stack(self.ctx, stack.name,
-                     stack.t, stack.parameters).AndReturn(stack)
+                     stack.t, stack.env).AndReturn(stack)
 
         self.m.StubOutWithMock(stack, 'validate')
         stack.validate().AndReturn(None)
@@ -276,15 +273,14 @@ class stackServiceCreateUpdateDeleteTest(HeatTestCase):
         stack = get_wordpress_stack(stack_name, self.ctx)
 
         self.m.StubOutWithMock(parser, 'Template')
-        self.m.StubOutWithMock(parser, 'Parameters')
+        self.m.StubOutWithMock(environment, 'Environment')
         self.m.StubOutWithMock(parser, 'Stack')
 
         parser.Template(template).AndReturn(stack.t)
-        parser.Parameters(stack_name,
-                          stack.t,
-                          params).AndReturn(stack.parameters)
+        environment.Environment(params).AndReturn(stack.env)
         parser.Stack(self.ctx, stack.name,
-                     stack.t, stack.parameters).AndReturn(stack)
+                     stack.t,
+                     stack.env).AndReturn(stack)
 
         self.m.StubOutWithMock(stack, 'validate')
         stack.validate().AndRaise(exception.StackValidationFailed(
@@ -392,14 +388,12 @@ class stackServiceCreateUpdateDeleteTest(HeatTestCase):
         parser.Stack.load(self.ctx, stack=s).AndReturn(old_stack)
 
         self.m.StubOutWithMock(parser, 'Template')
-        self.m.StubOutWithMock(parser, 'Parameters')
+        self.m.StubOutWithMock(environment, 'Environment')
 
         parser.Template(template).AndReturn(stack.t)
-        parser.Parameters(stack_name,
-                          stack.t,
-                          params).AndReturn(stack.parameters)
+        environment.Environment(params).AndReturn(stack.env)
         parser.Stack(self.ctx, stack.name,
-                     stack.t, stack.parameters).AndReturn(stack)
+                     stack.t, stack.env).AndReturn(stack)
 
         self.m.StubOutWithMock(stack, 'validate')
         stack.validate().AndReturn(None)
@@ -433,14 +427,12 @@ class stackServiceCreateUpdateDeleteTest(HeatTestCase):
         parser.Stack.load(self.ctx, stack=s).AndReturn(old_stack)
 
         self.m.StubOutWithMock(parser, 'Template')
-        self.m.StubOutWithMock(parser, 'Parameters')
+        self.m.StubOutWithMock(environment, 'Environment')
 
         parser.Template(template).AndReturn(stack.t)
-        parser.Parameters(stack_name,
-                          stack.t,
-                          params).AndReturn(stack.parameters)
+        environment.Environment(params).AndReturn(stack.env)
         parser.Stack(self.ctx, stack.name,
-                     stack.t, stack.parameters).AndReturn(stack)
+                     stack.t, stack.env).AndReturn(stack)
 
         self.m.StubOutWithMock(stack, 'validate')
         stack.validate().AndRaise(exception.StackValidationFailed(
index db1c35c26c30df2871a7939c2f5690f01adfb3db..ad2f36b6ece8fd3c211ee8ceb73e96acd5e6e62a 100644 (file)
@@ -17,6 +17,7 @@ import copy
 
 import mox
 
+from heat.engine import environment
 from heat.tests.v1_1 import fakes
 from heat.engine.resources import instance as instances
 from heat.common import exception
@@ -65,8 +66,8 @@ class instancesTest(HeatTestCase):
     def _setup_test_stack(self, stack_name):
         t = template_format.parse(wp_template)
         template = parser.Template(t)
-        params = parser.Parameters(stack_name, template, {'KeyName': 'test'})
-        stack = parser.Stack(None, stack_name, template, params,
+        stack = parser.Stack(None, stack_name, template,
+                             environment.Environment({'KeyName': 'test'}),
                              stack_id=uuidutils.generate_uuid())
         return (t, stack)
 
index 97d8c4f625cbda5ea94c143f1ea9960437dbbaf1..9e1bd2a0fb39d8e130669cbc14ccc7830b3016c2 100644 (file)
@@ -13,6 +13,7 @@
 #    under the License.
 
 
+from heat.engine import environment
 from heat.tests.v1_1 import fakes
 from heat.engine.resources import instance as instances
 from heat.engine.resources import network_interface as network_interfaces
@@ -156,8 +157,8 @@ class instancesTest(HeatTestCase):
         kwargs = {'KeyName': 'test',
                   'InstanceType': 'm1.large',
                   'SubnetId': '4156c7a5-e8c4-4aff-a6e1-8f3c7bc83861'}
-        params = parser.Parameters(stack_name, template, kwargs)
-        stack = parser.Stack(None, stack_name, template, params,
+        stack = parser.Stack(None, stack_name, template,
+                             environment.Environment(kwargs),
                              stack_id=uuidutils.generate_uuid())
 
         t['Resources']['WebServer']['Properties']['ImageId'] = 'CentOS 5.2'
@@ -197,8 +198,8 @@ class instancesTest(HeatTestCase):
         kwargs = {'KeyName': 'test',
                   'InstanceType': 'm1.large',
                   'SubnetId': '4156c7a5-e8c4-4aff-a6e1-8f3c7bc83861'}
-        params = parser.Parameters(stack_name, template, kwargs)
-        stack = parser.Stack(None, stack_name, template, params,
+        stack = parser.Stack(None, stack_name, template,
+                             environment.Environment(kwargs),
                              stack_id=uuidutils.generate_uuid())
 
         t['Resources']['WebServer']['Properties']['ImageId'] = 'CentOS 5.2'
index 178110324b3bab47957fe9f262138542733d9d64..bab89d622d327773652bc030c99beb63be2b18f7 100644 (file)
@@ -21,6 +21,7 @@ from heat.tests.common import HeatTestCase
 from heat.tests.utils import setup_dummy_db
 from heat.tests.utils import stack_delete_after
 
+from heat.engine import environment
 from heat.common import identifier
 from heat.common import template_format
 from heat.engine import parser
@@ -142,10 +143,10 @@ class MetadataRefreshTest(HeatTestCase):
     def create_stack(self, stack_name='test_stack', params={}):
         temp = template_format.parse(test_template_metadata)
         template = parser.Template(temp)
-        parameters = parser.Parameters(stack_name, template, params)
         ctx = context.get_admin_context()
         ctx.tenant_id = 'test_tenant'
-        stack = parser.Stack(ctx, stack_name, template, parameters,
+        stack = parser.Stack(ctx, stack_name, template,
+                             environment.Environment(params),
                              disable_rollback=True)
 
         self.stack_id = stack.store()
@@ -207,8 +208,7 @@ class WaitCondMetadataUpdateTest(HeatTestCase):
     def create_stack(self, stack_name='test_stack'):
         temp = template_format.parse(test_template_waitcondition)
         template = parser.Template(temp)
-        parameters = parser.Parameters(stack_name, template, {})
-        stack = parser.Stack(self.ctx, stack_name, template, parameters,
+        stack = parser.Stack(self.ctx, stack_name, template,
                              disable_rollback=True)
 
         self.stack_id = stack.store()
index 6f7c635df177fb7372e97740860d7b2ad6b3d403..77d90386ed05d94cc945457e0fdeefc85dd6a7b3 100644 (file)
@@ -67,8 +67,7 @@ Outputs:
             'auth_url': 'http://localhost:5000/v2.0'})
         stack_name = 'test_stack'
         tmpl = parser.Template(t)
-        params = parser.Parameters(stack_name, tmpl, {})
-        stack = parser.Stack(ctx, stack_name, tmpl, params)
+        stack = parser.Stack(ctx, stack_name, tmpl)
         stack.store()
         return stack
 
index 8c27d421491193cde57eb98f78557339a7fa0d5a..f58bf3ddac76951634b527d1cc3c7c52404c556e 100644 (file)
@@ -116,8 +116,7 @@ Resources:
             'auth_url': 'http://localhost:5000/v2.0'})
         stack_name = 'test_stack'
         tmpl = parser.Template(t)
-        params = parser.Parameters(stack_name, tmpl, {})
-        stack = parser.Stack(ctx, stack_name, tmpl, params)
+        stack = parser.Stack(ctx, stack_name, tmpl)
         stack.store()
         return stack
 
index 5d3bfc1d6c91f138571ff941e520ff4672419225..1cbe1b66c9c5aa69416698d1ba638d8408f4c929 100644 (file)
@@ -14,6 +14,7 @@
 
 from testtools import skipIf
 
+from heat.engine import environment
 from heat.tests.v1_1 import fakes
 from heat.common import exception
 from heat.common import template_format
@@ -579,9 +580,9 @@ class validateTest(HeatTestCase):
     def test_unregistered_key(self):
         t = template_format.parse(test_unregistered_key)
         template = parser.Template(t)
-        params = parser.Parameters(
-            'test_stack', template, {'KeyName': 'not_registered'})
-        stack = parser.Stack(None, 'test_stack', template, params)
+        params = {'KeyName': 'not_registered'}
+        stack = parser.Stack(None, 'test_stack', template,
+                             environment.Environment(params))
 
         self.m.StubOutWithMock(instances.Instance, 'nova')
         instances.Instance.nova().AndReturn(self.fc)
@@ -594,8 +595,8 @@ class validateTest(HeatTestCase):
     def test_invalid_security_groups_with_nics(self):
         t = template_format.parse(test_template_invalid_secgroups)
         template = parser.Template(t)
-        params = parser.Parameters('test_stack', template, {'KeyName': 'test'})
-        stack = parser.Stack(None, 'test_stack', template, params)
+        stack = parser.Stack(None, 'test_stack', template,
+                             environment.Environment({'KeyName': 'test'}))
 
         self.m.StubOutWithMock(instances.Instance, 'nova')
         instances.Instance.nova().AndReturn(self.fc)
@@ -607,8 +608,8 @@ class validateTest(HeatTestCase):
     def test_invalid_security_group_ids_with_nics(self):
         t = template_format.parse(test_template_invalid_secgroupids)
         template = parser.Template(t)
-        params = parser.Parameters('test_stack', template, {'KeyName': 'test'})
-        stack = parser.Stack(None, 'test_stack', template, params)
+        stack = parser.Stack(None, 'test_stack', template,
+                             environment.Environment({'KeyName': 'test'}))
 
         self.m.StubOutWithMock(instances.Instance, 'nova')
         instances.Instance.nova().AndReturn(self.fc)
index 41193b6442e723f199f5693a400f220f70f6b27b..90ed820cd71c3b305ea1cb487b410876eb883f9c 100644 (file)
@@ -82,8 +82,7 @@ class VPCTestBase(HeatTestCase):
             'auth_url': 'http://localhost:5000/v2.0'})
         stack_name = 'test_stack'
         tmpl = parser.Template(t)
-        params = parser.Parameters(stack_name, tmpl, {})
-        stack = parser.Stack(ctx, stack_name, tmpl, params)
+        stack = parser.Stack(ctx, stack_name, tmpl)
         stack.store()
         return stack
 
index 54414cf4ed0ebc1d3833fe995090bb9e7646d709..6a253db3dc2639cf1111dc6d11858cbfa564a0d7 100644 (file)
@@ -29,6 +29,7 @@ from heat.tests.utils import setup_dummy_db
 import heat.db.api as db_api
 from heat.common import template_format
 from heat.common import identifier
+from heat.engine import environment
 from heat.engine import parser
 from heat.engine import resource
 from heat.engine import scheduler
@@ -114,10 +115,10 @@ class WaitConditionTest(HeatTestCase):
                      stub=True):
         temp = template_format.parse(template)
         template = parser.Template(temp)
-        parameters = parser.Parameters(stack_name, template, params)
         ctx = context.get_admin_context()
         ctx.tenant_id = 'test_tenant'
-        stack = parser.Stack(ctx, stack_name, template, parameters,
+        stack = parser.Stack(ctx, stack_name, template,
+                             environment.Environment(params),
                              disable_rollback=True)
 
         # Stub out the stack ID so we have a known value
@@ -399,10 +400,10 @@ class WaitConditionHandleTest(HeatTestCase):
     def create_stack(self, stack_name='test_stack2', params={}):
         temp = template_format.parse(test_template_waitcondition)
         template = parser.Template(temp)
-        parameters = parser.Parameters(stack_name, template, params)
         ctx = context.get_admin_context()
         ctx.tenant_id = 'test_tenant'
-        stack = parser.Stack(ctx, stack_name, template, parameters,
+        stack = parser.Stack(ctx, stack_name, template,
+                             environment.Environment(params),
                              disable_rollback=True)
         # Stub out the UUID for this test, so we can get an expected signature
         with UUIDStub('STACKABCD1234'):
index 92a536cf4da7d52120e38ec0c64ed2150d71d691..46453dcec711c0f1dc8baee5a91b2b3fae98056f 100644 (file)
@@ -52,8 +52,7 @@ class WatchRuleTest(HeatTestCase):
         empty_tmpl = {"template": {}}
         tmpl = parser.Template(empty_tmpl)
         stack_name = 'dummystack'
-        params = parser.Parameters(stack_name, tmpl, {})
-        dummy_stack = parser.Stack(ctx, stack_name, tmpl, params)
+        dummy_stack = parser.Stack(ctx, stack_name, tmpl)
         dummy_stack.state_set(dummy_stack.CREATE_COMPLETE, 'Testing')
         dummy_stack.store()
 
index 85d6791f3cb0150148778dd70f5847eaae15fe5a..8be788d163d33512021f2f710b74e1d1c5638e66 100644 (file)
@@ -16,6 +16,7 @@ import sys
 import functools
 
 from heat.common import context
+from heat.engine import environment
 from heat.engine import parser
 
 from heat.db.sqlalchemy.session import get_engine
@@ -62,8 +63,8 @@ def parse_stack(t, params={}, stack_name='test_stack', stack_id=None):
                                             'auth_url':
                                             'http://localhost:5000/v2.0'})
     template = parser.Template(t)
-    parameters = parser.Parameters(stack_name, template, params)
-    stack = parser.Stack(ctx, stack_name, template, parameters, stack_id)
+    stack = parser.Stack(ctx, stack_name, template,
+                         environment.Environment(params), stack_id)
     stack.store()
 
     return stack