blob: 0fce6304a7ac1780bb4e09fbd86da190a8d53d5b [file] [log] [blame]
#Author: Shu Shi
#emaiL: shushi@research.att.com
from toscalib.templates.database import ToscaDB
from toscalib.utils import tosca_operate, tosca_import, tosca_print, tosca_export
from toscalib.utils.tosca_import import import_context
from toscalib.templates.topology import ToscaTopology
from toscalib.utils.tosca_operate import _assign_property_value,\
_assign_requirement_value, _assign_capability_property_value
import copy, logging
DEFAULT_TEMPLATE_NAME='default'
class ToscaWorkBook(object):
def __init__(self):
self.db = ToscaDB()
self.tran_db = ToscaDB()
self.template = ToscaTopology(DEFAULT_TEMPLATE_NAME)
self.template.db = self.db
self.imported_files = []
def _reset(self):
self.template = ToscaTopology(DEFAULT_TEMPLATE_NAME)
self.template.db = self.db
def _import(self, filename):
self.db = tosca_import._file_import(self.imported_files, filename, self.db)
def _import_dir(self, dirname):
self.db = tosca_import._dir_import(self.imported_files, dirname, self.db)
def _import_yml_str(self, content):
self.db = tosca_import._yaml_str_import(content, self.db)
def _load_translation_db(self, dir_name, prefix=''):
self.tran_db = tosca_import._dir_import([], dir_name, self.tran_db)
def _load_translation_library(self):
if self.tran_db is None or len(self.tran_db.TEMPLATES) < 1:
return
for node_item in iter(self.template.node_dict.values()):
node_item.tran_template = None
for tran_temp in iter(self.tran_db.TEMPLATES.values()):
if hasattr(tran_temp,'sub_type') and tran_temp.sub_type == node_item.type:
node_item.tran_template = copy.deepcopy(tran_temp)
node_item.tran_template._update_used_tag_for_translation()
node_item.tran_template._verify_substitution(node_item)
node_item.tran_template._update_prefix(node_item.name + '_')
break
def _use(self, type_name, node_name=None):
if type_name in self.db.NODE_TYPES.keys():
return tosca_operate._create_new_node(self.template, type_name, node_name)
elif type_name in self.db.TEMPLATES.keys():
return tosca_operate._create_new_template(self.template, type_name, node_name)
else:
logging.warning('Name: ' + type_name + ' is neither a type or a template. ')
return None
def _assign(self, node_name, sub_name, value_1, value_2 = None):
# if self.template.node_dict.has_key(node_name) is False:
if node_name not in self.template.node_dict:
logging.warning('Unrecognized node name: ' + node_name)
return
node = self.template.node_dict[node_name]
if value_2 is not None:
# if node.capabilities.has_key(sub_name):
if sub_name in node.capabilities:
node_cap = node.capabilities[sub_name]
# if node_cap.properties.has_key(value_1):
if value_1 in node_cap.properties:
_assign_capability_property_value(node, sub_name, value_1, value_2)
else:
logging.warning( 'Unrecognized tag name: ' + value_1)
else:
logging('Unrecognized tag name: ' + sub_name)
# elif node.properties.has_key(sub_name):
elif sub_name in node.properties:
_assign_property_value(node, sub_name, value_1)
else:
req_found = False
for req in node.requirements:
if req.name == sub_name:
req_found = req
break
if req_found is False:
logging.warning( 'Unrecognized tag name: ' + sub_name)
return
# if self.template.node_dict.has_key(value_1):
if value_1 in self.template.node_dict:
_assign_requirement_value(node, sub_name, self.template.node_dict[value_1])
else:
logging.warning( 'Incorrect node name: ' + value_1 + ', a node name is needed to fulfill requirement')
return
def _show_abstract(self):
return tosca_print._print_template(self.template, tosca_print.LEVEL_NODE_NAME)
def _show_details(self):
return tosca_print._print_template(self.template, tosca_print.LEVEL_NODE_DETAILS)
def _show_types(self):
return tosca_print._print_node_types(self.db)
def _show_type(self, type_name):
if type_name in self.db.NODE_TYPES.keys():
tosca_print._print_node_type(self.db.NODE_TYPES[type_name])
else:
logging.warning( 'Node type: '+ type_name+ ' not found!')
def _show_templates(self):
tosca_print._print_templates(self.db)
def _show_template(self, temp_name):
if temp_name in self.db.TEMPLATES.keys():
tosca_print._print_template(self.db.TEMPLATES[temp_name])
else:
logging.warning( 'Template: '+ temp_name+ ' not found')
def _translate_template_file(self, filename):
ctx = import_context()
self.db = tosca_import._single_template_file_import(filename, self.db, ctx)
temp_name = ctx.temp_name
self._reset()
self.tran_db = self.db
self._use(temp_name, 'NO_PREFIX')
def _translate_template_yaml_str(self, content):
ctx = import_context()
self.db = tosca_import._yaml_str_import(content, self.db, ctx)
temp_name = ctx.temp_name
self._reset()
self.tran_db = self.db
self._use(temp_name, 'NO_PREFIX')
def _add_shared_node(self, rel):
if rel is None or type(rel) is not list:
return
# node_index = 0;
for rel_entry in rel:
rel_name = list(rel_entry.keys())[0]
new_node_name = None
# temp_node_base= 'node_'
while True:
ret_node = self._find_open_requirement(rel_name)
if ret_node is None:
break
if new_node_name == None:
# while True:
# temp_node_name = temp_node_base + str(node_index)
# if self.template.node_dict.has_key(temp_node_name):
# node_index += 1
# continue
# else:
# break
if self._use(rel_entry[rel_name], 'NO_PREFIX') == None:
break
new_node_name = True
self._assign(ret_node[0], ret_node[1], rel_entry[rel_name])
def _find_open_requirement(self, cap_type):
for node in iter(self.template.node_dict.values()):
for req_item in node.requirements:
if req_item.filled is True:
continue
if req_item.req_capability == cap_type:
return [node.name, req_item.name]
def _export_generic(self, tags=''):
self.template._update_function_pointer()
self._load_translation_library()
# self.template._auto_generate_aux_inputs()
self.template._propagate_substitution_value()
self.template._update_translation_function_pointer()
return self.template._prepare_output(tags)
def _export_yaml(self, filename, tags='main,nodetype'):
return tosca_export._yaml_export(filename, self._export_generic(tags))
def _export_yaml_web(self, tags= 'main,nodetype'):
return tosca_export._yaml_export('WEB', self._export_generic(tags))
def _export_heat(self, filename):
tags ='heat,main'
return tosca_export._heat_export(filename, self._export_generic(tags))
def toJson(self):
return self.template.toJson()