Source code for yardstick.vTC.apexlake.experimental_framework.heat_template_generation

# Copyright (c) 2015 Intel Research and Development Ireland Ltd.
#
# 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.


'''
Generation of the heat templates from the base template
'''

import json
import os
import shutil
from experimental_framework import common
from experimental_framework.constants import framework_parameters as fp


[docs]class TreeNode: """ This class represent the node of the configuration tree.\ Each node represents a single configuration value for a single configuration parameter. """ def __init__(self): self.up = None self.down = [] self.variable_name = '' self.variable_value = 0
[docs] def add_child(self, node): """ Adds a node as a child for the current node :param node: node to be added as a child (type: TreeNode) :return: None """ node.up = self self.down.append(node)
[docs] def get_parent(self): """ Returns the parent node of the current one :return type: TreeNode """ return self.up
[docs] def get_children(self): """ Returns the children of the current node :return type: list of TreeNode """ if len(self.down) == 0: # return [self] return [] return self.down
[docs] def get_variable_name(self): """ Returns the name of the variable correspondent to the current node :return type: str """ return self.variable_name
[docs] def get_variable_value(self): """ Returns the value of the variable correspondent to the current node :return type: str or int """ return self.variable_value
[docs] def set_variable_name(self, name): """ Sets the name of the variable for the current node :param name: Name of the variable (type: str) :return None """ self.variable_name = name
[docs] def set_variable_value(self, value): """ Sets the value of the variable for the current node :param value: value of the variable (type: str) :return None """ self.variable_value = value
[docs] def get_path(self): """ Returns all the path from the current node to the root of the tree. :return type: list of TreeNode """ ret_val = [] if not self.up: ret_val.append(self) return ret_val for node in self.up.get_path(): ret_val.append(node) ret_val.append(self) return ret_val
def __str__(self): return str(self.variable_name) + " --> " + str(self.variable_value) def __repr__(self): return str(self.variable_name) + " = " + str(self.variable_value) @staticmethod def _get_leaves(node, leaves): """ Returns all the leaves of a tree. It changes the "leaves" list. :param node: root of the tree (type: TreeNode) :param leaves: partial list of leaves (type: list of TreeNode) :return type: None """ children = node.get_children() if len(children) == 0: leaves.append(node) return for child in children: TreeNode._get_leaves(child, leaves) @staticmethod
[docs] def get_leaves(node): """ Returns all the leaves of a tree. :param node: root of the tree (TreeNode) :return type: list """ leaves = list() TreeNode._get_leaves(node, leaves) return leaves
template_name = fp.EXPERIMENT_TEMPLATE_NAME
[docs]def generates_templates(base_heat_template, deployment_configuration): """ Generates the heat templates for the experiments :return: None """ # Load useful parameters from file template_dir = common.get_template_dir() template_file_extension = fp.TEMPLATE_FILE_EXTENSION template_base_name = base_heat_template variables = deployment_configuration # Delete the templates eventually generated in previous running of the # framework common.LOG.info("Removing the heat templates previously generated") command = "rm {}{}_*".format(template_dir, template_name) os.system(command) # Creation of the tree with all the new configurations common.LOG.info("Creation of the tree with all the new configurations") tree = TreeNode() for variable in variables: leaves = TreeNode.get_leaves(tree) common.LOG.debug("LEAVES: " + str(leaves)) common.LOG.debug("VALUES: " + str(variables[variable])) for value in variables[variable]: for leaf in leaves: new_node = TreeNode() new_node.set_variable_name(variable) new_node.set_variable_value(value) leaf.add_child(new_node) common.LOG.debug("CONFIGURATION TREE: " + str(tree)) common.LOG.info("Heat Template and metadata file creation") leaves = TreeNode.get_leaves(tree) counter = 1 for leaf in leaves: heat_template_vars = leaf.get_path() if os.path.isabs(template_base_name): base_template = template_base_name else: base_template = template_dir + template_base_name new_template = template_dir + template_name new_template += "_" + str(counter) + template_file_extension shutil.copy(base_template, new_template) metadata = dict() for var in heat_template_vars: if var.get_variable_name(): common.replace_in_file(new_template, "#" + var.get_variable_name(), var.get_variable_value()) metadata[var.get_variable_name()] = var.get_variable_value() # Save the metadata on a JSON file with open(new_template + ".json", 'w') as outfile: json.dump(metadata, outfile) common.LOG.debug("Heat Templates and Metadata file " + str(counter) + " created") counter += 1 # Creation of the template files common.LOG.info(str(counter - 1) + " Heat Templates and Metadata files " "created")
[docs]def get_all_heat_templates(template_dir, template_file_extension): """ Loads and returns all the generated heat templates :param template_dir: directory to search in (type: str) :param template_file_extension: extension of the file for templates (type: str) :return: type: list """ template_files = list() for dirname, dirnames, filenames in os.walk(template_dir): for filename in filenames: if template_file_extension in filename and \ filename.endswith(template_file_extension) and \ template_name in filename: template_files.append(filename) template_files.sort() return template_files