PARAM_TEMPLATE,
PARAM_TEMPLATE_URL,
PARAM_USER_PARAMS,
+ PARAM_ENVIRONMENT,
) = (
'stack_name',
'template',
'template_url',
'parameters',
+ 'environment',
)
def __init__(self, data):
return self.format_parse(template_data, 'Template')
- def user_params(self):
+ def environment(self):
"""
- Get the user-supplied parameters for the stack in JSON format.
+ Get the user-supplied environment for the stack in YAML format.
+ If the user supplied Parameters then merge these into the
+ environment global options.
"""
- return self.data.get(self.PARAM_USER_PARAMS, {})
+ env = {}
+ if self.PARAM_ENVIRONMENT in self.data:
+ env_data = self.data[self.PARAM_ENVIRONMENT]
+ if isinstance(env_data, dict):
+ env = env_data
+ else:
+ env = self.format_parse(env_data,
+ 'Environment',
+ add_template_sections=False)
+
+ for field in env:
+ if field not in ('parameters', 'resource_registry'):
+ reason = _("%s not in valid in the environment") % field
+ raise exc.HTTPBadRequest(reason)
+
+ if self.PARAM_USER_PARAMS not in env:
+ env[self.PARAM_USER_PARAMS] = {}
+
+ parameters = self.data.get(self.PARAM_USER_PARAMS, {})
+ env[self.PARAM_USER_PARAMS].update(parameters)
+ return env
def args(self):
"""
result = self.engine.create_stack(req.context,
data.stack_name(),
data.template(),
- data.user_params(),
+ data.environment(),
data.args())
except rpc_common.RemoteError as ex:
return util.remote_error(ex)
res = self.engine.update_stack(req.context,
identity,
data.template(),
- data.user_params(),
+ data.environment(),
data.args())
except rpc_common.RemoteError as ex:
return util.remote_error(ex)
data = stacks.InstantiationData(body)
self.assertRaises(webob.exc.HTTPBadRequest, data.template)
- def test_user_params(self):
+ def test_parameters(self):
params = {'foo': 'bar', 'blarg': 'wibble'}
body = {'parameters': params}
data = stacks.InstantiationData(body)
- self.assertEqual(data.user_params(), params)
+ self.assertEqual(data.environment(), body)
- def test_user_params_missing(self):
- params = {'foo': 'bar', 'blarg': 'wibble'}
- body = {'not the parameters': params}
+ def test_environment_only_params(self):
+ env = {'parameters': {'foo': 'bar', 'blarg': 'wibble'}}
+ body = {'environment': env}
+ data = stacks.InstantiationData(body)
+ self.assertEqual(data.environment(), env)
+
+ def test_environment_and_parameters(self):
+ body = {'parameters': {'foo': 'bar'},
+ 'environment': {'parameters': {'blarg': 'wibble'}}}
+ expect = {'parameters': {'blarg': 'wibble',
+ 'foo': 'bar'}}
+ data = stacks.InstantiationData(body)
+ self.assertEqual(data.environment(), expect)
+
+ def test_parameters_override_environment(self):
+ # This tests that the cli parameters will override
+ # any parameters in the environment.
+ body = {'parameters': {'foo': 'bar',
+ 'tester': 'Yes'},
+ 'environment': {'parameters': {'blarg': 'wibble',
+ 'tester': 'fail'}}}
+ expect = {'parameters': {'blarg': 'wibble',
+ 'foo': 'bar',
+ 'tester': 'Yes'}}
+ data = stacks.InstantiationData(body)
+ self.assertEqual(data.environment(), expect)
+
+ def test_environment_bad_format(self):
+ body = {'environment': {'somethingnotsupported': {'blarg': 'wibble'}}}
+ data = stacks.InstantiationData(body)
+ self.assertRaises(webob.exc.HTTPBadRequest, data.environment)
+
+ def test_environment_missing(self):
+ env = {'foo': 'bar', 'blarg': 'wibble'}
+ body = {'not the environment': env}
data = stacks.InstantiationData(body)
- self.assertEqual(data.user_params(), {})
+ self.assertEqual(data.environment(), {'parameters': {}})
def test_args(self):
body = {
'parameters': {},
+ 'environment': {},
'stack_name': 'foo',
'template': {},
'template_url': 'http://example.com/',
'method': 'create_stack',
'args': {'stack_name': identity.stack_name,
'template': template,
- 'params': parameters,
+ 'params': {'parameters': parameters},
'args': {'timeout_mins': 30}},
'version': self.api_version},
None).AndReturn(dict(identity))
'method': 'create_stack',
'args': {'stack_name': stack_name,
'template': template,
- 'params': parameters,
+ 'params': {'parameters': parameters},
'args': {'timeout_mins': 30}},
'version': self.api_version},
None).AndRaise(rpc_common.RemoteError("AttributeError"))
'method': 'create_stack',
'args': {'stack_name': stack_name,
'template': template,
- 'params': parameters,
+ 'params': {'parameters': parameters},
'args': {'timeout_mins': 30}},
'version': self.api_version},
None).AndRaise(rpc_common.RemoteError("UnknownUserParameter"))
'method': 'create_stack',
'args': {'stack_name': stack_name,
'template': template,
- 'params': parameters,
+ 'params': {'parameters': parameters},
'args': {'timeout_mins': 30}},
'version': self.api_version},
None).AndRaise(rpc_common.RemoteError("StackExists"))
'method': 'create_stack',
'args': {'stack_name': stack_name,
'template': template,
- 'params': parameters,
+ 'params': {'parameters': parameters},
'args': {'timeout_mins': 30}},
'version': self.api_version},
None).AndRaise(rpc_common.RemoteError(
'method': 'update_stack',
'args': {'stack_identity': dict(identity),
'template': template,
- 'params': parameters,
+ 'params': {'parameters': parameters},
'args': {'timeout_mins': 30}},
'version': self.api_version},
None).AndReturn(dict(identity))
'method': 'update_stack',
'args': {'stack_identity': dict(identity),
'template': template,
- 'params': parameters,
+ 'params': {u'parameters': parameters},
'args': {'timeout_mins': 30}},
'version': self.api_version},
None).AndRaise(rpc_common.RemoteError("StackNotFound"))