diff options
Diffstat (limited to 'app/toscalib/utils/tosca_import.py')
-rw-r--r-- | app/toscalib/utils/tosca_import.py | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/app/toscalib/utils/tosca_import.py b/app/toscalib/utils/tosca_import.py new file mode 100644 index 0000000..d0e2f03 --- /dev/null +++ b/app/toscalib/utils/tosca_import.py @@ -0,0 +1,296 @@ +#Author: Shu Shi +#emaiL: shushi@research.att.com + + +import os +from toscalib.utils.yamlparser import load_yaml, simple_parse +from toscalib.templates.database import ToscaDB +from toscalib.types.node import NodeType +from toscalib.types.data import DataType +from toscalib.types.capability import CapabilityType +from toscalib.types.relationship import RelationshipType +from toscalib.templates.constant import * +from toscalib.templates.topology import ToscaTopology +from macpath import dirname +import logging + + +# _TRUE_VALUES = ('True', 'true', '1', 'yes') + +class import_context(object): + def __init__(self): + self.curr_path = os.getcwd() + self.curr_file_name = '' + self.metadata = None + self.temp_name = None + self.extra_imports = [] + +def _dir_import(files_imported, dir_name, db=None, ctx=None): + if db is None: + db = ToscaDB() + + if os.path.isdir(dir_name) is False: + logging.warning( 'Dir: '+ dir_name+ ' not exist! Loading failed!') + return db + + for f in os.listdir(dir_name): + filename = os.path.join(dir_name, f) + if os.path.isfile(filename): + try: + db = _file_import(files_imported, filename, db) + except ValueError: + logging.error( 'Fail to import file: '+ filename) + continue + if os.path.isdir(filename): + try: + db = _dir_import(files_imported, filename, db) + except ValueError: + logging.error( 'Fail to import dir: '+ filename) + continue + + return db + + + +def _file_import(files_imported, filename, db=None, ctx=None): + logging.debug( 'Start to import file: '+ filename) + + if db is None: + db = ToscaDB() + + if ctx is None: + orig_import = True + ctx = import_context() + else: + orig_import = False + + if filename == os.path.abspath(filename): + full_file_path = filename + else: + full_file_path = os.path.abspath(os.path.join(ctx.curr_path, filename)) + + if os.path.isfile(full_file_path) == False: + logging.debug( 'File: ' + filename + ' not exist! Import as extra import!') + ctx.extra_imports.append({filename:filename}) + return db + + if full_file_path in files_imported: + logging.debug( 'File: ' + filename + ' has been imported!') + return db + + ctx.curr_path = os.path.dirname(full_file_path) + ctx.curr_file_name = os.path.basename(full_file_path) + parser = load_yaml(full_file_path) + + ctx.extra_imports = [] + +# if parser.has_key(IMPORT): + if IMPORT in parser: + db = _parse_import(files_imported, parser[IMPORT], db, ctx) +# if parser.has_key(METADATA): + if METADATA in parser: + ctx.metadata = parser[METADATA] +# if parser.has_key(DATA_TYPE): + if DATA_TYPE in parser: + db = _parse_data_type(parser[DATA_TYPE], db, ctx) +# if parser.has_key(NODE_TYPE): + if NODE_TYPE in parser: + db = _parse_node_type(parser[NODE_TYPE], db, ctx) +# if parser.has_key(TOPOLOGY): + if TOPOLOGY in parser: + db = _parse_topology_template(parser[TOPOLOGY], db, ctx) +# if parser.has_key(CAPABILITY_TYPE): + if CAPABILITY_TYPE in parser: + db = _parse_capability_type(parser[CAPABILITY_TYPE], db, ctx) +# if parser.has_key(RELATIONSHIP_TYPE): + if RELATIONSHIP_TYPE in parser: + db = _parse_relationship_type(parser[RELATIONSHIP_TYPE], db, ctx) + + if orig_import: + db._parse_objects() + + files_imported.append(full_file_path) + logging.debug( 'File '+ filename+ ' imported!') + return db + +def _single_template_file_import(filename, db=None, ctx=None): + logging.debug( 'Start to import file: '+ filename) + + if db is None: + db = ToscaDB() + + if ctx is None: + ctx = import_context() + + if filename == os.path.abspath(filename): + full_file_path = filename + else: + full_file_path = os.path.abspath(os.path.join(ctx.curr_path, filename)) + + if os.path.isfile(full_file_path) == False: + logging.warning( 'File: ' +filename + ' not exist! Import failed!') + return db + + + ctx.curr_path = os.path.dirname(full_file_path) + ctx.curr_file_name = os.path.basename(full_file_path) + parser = load_yaml(full_file_path) + +# if parser.has_key(IMPORT): +# db = _parse_import(files_imported, parser[IMPORT], db, ctx) + ctx.extra_imports = [] +# if parser.has_key(IMPORT): + if IMPORT in parser: + db = _parse_import([], parser[IMPORT], db, ctx) +# if parser.has_key(METADATA): + if METADATA in parser: + ctx.metadata = parser[METADATA] +# if parser.has_key(DATA_TYPE): + if DATA_TYPE in parser: + db = _parse_data_type(parser[DATA_TYPE], db, ctx) +# if parser.has_key(NODE_TYPE): + if NODE_TYPE in parser: + db = _parse_node_type(parser[NODE_TYPE], db, ctx) +# if parser.has_key(TOPOLOGY): + if TOPOLOGY in parser: + db = _parse_topology_template(parser[TOPOLOGY], db, ctx) +# if parser.has_key(CAPABILITY_TYPE): + if CAPABILITY_TYPE in parser: + db = _parse_capability_type(parser[CAPABILITY_TYPE], db, ctx) +# if parser.has_key(RELATIONSHIP_TYPE): + if RELATIONSHIP_TYPE in parser: + db = _parse_relationship_type(parser[RELATIONSHIP_TYPE], db, ctx) + + db._parse_objects() + + logging.debug( 'File '+ filename+ ' imported!') + return db + +def _yaml_str_import(yml_str, db=None, ctx=None): + parser = simple_parse(yml_str) + + if ctx is None: + ctx = import_context() + + ctx.extra_imports = [] + +# if parser.has_key(IMPORT): + if IMPORT in parser: + db = _parse_import([], parser[IMPORT], db, ctx) +# if parser.has_key(METADATA): + if METADATA in parser: + ctx.metadata = parser[METADATA] +# if parser.has_key(DATA_TYPE): + if DATA_TYPE in parser: + db = _parse_data_type(parser[DATA_TYPE], db, ctx) +# if parser.has_key(NODE_TYPE): + if NODE_TYPE in parser: + db = _parse_node_type(parser[NODE_TYPE], db, ctx) +# if parser.has_key(TOPOLOGY): + if TOPOLOGY in parser: + db = _parse_topology_template(parser[TOPOLOGY], db, ctx) +# if parser.has_key(CAPABILITY_TYPE): + if CAPABILITY_TYPE in parser: + db = _parse_capability_type(parser[CAPABILITY_TYPE], db, ctx) +# if parser.has_key(RELATIONSHIP_TYPE): + if RELATIONSHIP_TYPE in parser: + db = _parse_relationship_type(parser[RELATIONSHIP_TYPE], db, ctx) + + db._parse_objects() + + return db + +def _parse_data_type(data_type_section, db, ctx): + if data_type_section is None: + return db + if db is None: + db = ToscaDB() + + for data_type_name in data_type_section.keys(): + db._import_data_type(DataType(data_type_name, data_type_section[data_type_name])) + return db + +def _parse_node_type(node_type_section, db, ctx): + if node_type_section is None: + return db + if db is None: + db = ToscaDB() + + for node_type_def_name in node_type_section.keys(): + db._import_node_type(NodeType(node_type_def_name, node_type_section[node_type_def_name])) + return db + +def _parse_capability_type(cap_type_section, db, ctx): + if cap_type_section is None: + return db + if db is None: + db = ToscaDB() + + for cap_type_def_name in cap_type_section.keys(): + db._import_capability_type(CapabilityType(cap_type_def_name, cap_type_section[cap_type_def_name])) + return db + +def _parse_relationship_type(rel_type_section, db, ctx): + if rel_type_section is None: + return db + if db is None: + db = ToscaDB() + + for rel_type_def_name in rel_type_section.keys(): + db._import_relationship_type(RelationshipType(rel_type_def_name,rel_type_section[rel_type_def_name])) + return db + +def _parse_topology_template(topology_section, db, ctx): + if topology_section is None: + return db + if db is None: + db = ToscaDB() + + if ctx.metadata is None or ctx.metadata['template_name'] is None or ctx.metadata['template_name']=='': + template_key = ctx.curr_file_name + else: + template_key = ctx.metadata['template_name'] + + if template_key is None or template_key == '': + index = 0 + while True: +# if db.TEMPLATES.has_key('template'+str(index)): + if 'template'+str(index) in db.TEMPLATES: + index+=1 + continue + break + template_key = 'template'+str(index) + + ctx.temp_name = template_key + + new_topology = ToscaTopology(template_key, ctx.metadata, topology_section) + new_topology.extra_imports = ctx.extra_imports + db._import_template(new_topology) + + return db + +def _parse_requirement_name_and_value(content): + list_size = len(content.keys()) + if list_size != 1: + logging.warning( 'Requirement section does not have exact one element: '+ list_size) + return + ck = list(content.keys())[0] + return ck, content[ck] + +def _parse_import(file_imported, import_section, db, ctx): + if db is None: + db = ToscaDB() + + if import_section is None: + return db + + for new_file_sec in import_section: +# for new_file in new_file_sec.itervalues(): + for new_file in iter(new_file_sec.values()): + curr_path_bk = ctx.curr_path + curr_filename_bk = ctx.curr_file_name + _file_import(file_imported, new_file, db, ctx) + ctx.curr_path = curr_path_bk + ctx.curr_file_name = curr_filename_bk + + return db |