diff options
author | Steve Baker <sbaker@redhat.com> | 2014-01-06 17:17:58 +1300 |
---|---|---|
committer | Steve Baker <sbaker@redhat.com> | 2014-01-13 08:13:49 +1300 |
commit | 56984c1589f0e3e80ed6f1442b588669b36d3c7c (patch) | |
tree | ae3bc8967a2f96500ca3cbc1b95980d9a889c4a0 /heatclient/common/template_format.py | |
parent | 8b0725d7fbd6bbb02dadc8f80699e761a864ef35 (diff) | |
download | python-heatclient-56984c1589f0e3e80ed6f1442b588669b36d3c7c.tar.gz |
Move template_format from heat to heatclient
heatclient needs to (YAML) parse the template to allow it to populate
the content for get_files function calls. For this reason, template_format
(and environment_format) have been moved to heatclient so this code can be
shared by both heat and heatclient.
Change-Id: I3cc11cd57256ad539efb4dab314ac07547e9e6a2
Diffstat (limited to 'heatclient/common/template_format.py')
-rw-r--r-- | heatclient/common/template_format.py | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/heatclient/common/template_format.py b/heatclient/common/template_format.py new file mode 100644 index 0000000..0a7432f --- /dev/null +++ b/heatclient/common/template_format.py @@ -0,0 +1,80 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import json +import yaml + +HEAT_VERSIONS = (u'2012-12-12',) +CFN_VERSIONS = (u'2010-09-09',) + +if hasattr(yaml, 'CSafeLoader'): + yaml_loader = yaml.CSafeLoader +else: + yaml_loader = yaml.SafeLoader + +if hasattr(yaml, 'CSafeDumper'): + yaml_dumper = yaml.CSafeDumper +else: + yaml_dumper = yaml.SafeDumper + + +def _construct_yaml_str(self, node): + # Override the default string handling function + # to always return unicode objects + return self.construct_scalar(node) +yaml_loader.add_constructor(u'tag:yaml.org,2002:str', _construct_yaml_str) +# Unquoted dates like 2013-05-23 in yaml files get loaded as objects of type +# datetime.data which causes problems in API layer when being processed by +# openstack.common.jsonutils. Therefore, make unicode string out of timestamps +# until jsonutils can handle dates. +yaml_loader.add_constructor(u'tag:yaml.org,2002:timestamp', + _construct_yaml_str) + + +def parse(tmpl_str): + '''Takes a string and returns a dict containing the parsed structure. + + This includes determination of whether the string is using the + JSON or YAML format. + ''' + if tmpl_str.startswith('{'): + tpl = json.loads(tmpl_str) + else: + try: + tpl = yaml.load(tmpl_str, Loader=yaml_loader) + except yaml.YAMLError as yea: + raise ValueError(yea) + else: + if tpl is None: + tpl = {} + if u'heat_template_version' not in tpl: + default_for_missing(tpl, u'HeatTemplateFormatVersion', + HEAT_VERSIONS) + return tpl + + +def default_for_missing(tpl, version_param, versions): + '''Checks a parsed template for missing version and sections. + + This is currently only applied to YAML templates. + ''' + # if version is missing, implicitly use the lastest one + if version_param not in tpl: + tpl[version_param] = versions[-1] + + # create empty placeholders for any of the main dict sections + for param in (u'Parameters', u'Mappings', u'Resources', u'Outputs'): + if param not in tpl: + tpl[param] = {} |