tripleo-common/tripleo_common/utils/templates.py

82 lines
2.7 KiB
Python

# Copyright 2015 Red Hat, Inc.
# All Rights Reserved.
#
# 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 logging
import yaml
LOG = logging.getLogger(__name__)
def _get_dict_from_env_string(env_name, env_string):
"""Returns environment dict, either from yaml or json."""
if '.yaml' in env_name:
return yaml.load(env_string)
else:
return json.loads(env_string)
def deep_update(base, new):
for key, val in new.items():
if isinstance(val, dict):
tmp = deep_update(base.get(key, {}), val)
base[key] = tmp
else:
base[key] = val
return base
def process_plan_data(plan_data):
"""Processes the plan data."""
template = ''
environment = {}
env_items = []
temp_env_items = []
files = {}
for key, val in plan_data.items():
file_type = val.get('meta', {}).get('file-type')
enabled = val.get('meta', {}).get('enabled')
if not file_type:
files[key] = val['contents']
elif file_type == 'environment' and enabled:
env_items.append({'name': key,
'meta': val['meta'],
'contents': val['contents']})
elif file_type == 'temp-environment':
temp_env_items.append({'name': key,
'meta': val['meta'],
'contents': val['contents']})
elif file_type == 'root-template':
template = val['contents']
elif file_type == 'root-environment' and enabled:
environment = _get_dict_from_env_string(key, val['contents'])
# merge environment files
for item in env_items:
env_dict = _get_dict_from_env_string(item['name'], item['contents'])
environment = deep_update(environment, env_dict)
# merge the temporary environment files last
for item in temp_env_items:
env_dict = _get_dict_from_env_string(item['name'], item['contents'])
environment = deep_update(environment, env_dict)
return template, environment, files
def find_root_template(plan_files):
return {k: v for (k, v) in plan_files.items()
if v.get('meta', {}).get('file-type') == 'root-template'}