diff options
Diffstat (limited to 'catalog-be/src/main/resources/scripts/sdcBePy/tosca/models/model_import_manager.py')
-rw-r--r-- | catalog-be/src/main/resources/scripts/sdcBePy/tosca/models/model_import_manager.py | 61 |
1 files changed, 47 insertions, 14 deletions
diff --git a/catalog-be/src/main/resources/scripts/sdcBePy/tosca/models/model_import_manager.py b/catalog-be/src/main/resources/scripts/sdcBePy/tosca/models/model_import_manager.py index 57b0f1399f..57ac06d0b2 100644 --- a/catalog-be/src/main/resources/scripts/sdcBePy/tosca/models/model_import_manager.py +++ b/catalog-be/src/main/resources/scripts/sdcBePy/tosca/models/model_import_manager.py @@ -19,6 +19,7 @@ import json import os import zipfile from sdcBePy.tosca.models.normativeTypeCandidate import NormativeTypeCandidate +from sdcBePy.common import logger from pathlib import Path @@ -32,37 +33,41 @@ class ModelImportManager: ACTION_INIT = 'init' TYPES_FOLDER = 'tosca' NODE_FOLDER = 'node-types' + NODE_TYPE_FILE = 'nodeTypes.yaml' - def __init__(self, model_imports_path, model_client): + def __init__(self, model_imports_path, model_client, node_type_client): self.__model_base_path = model_imports_path self.__model_init_path = self.__model_base_path / self.INIT_FOLDER_NAME self.__model_upgrade_path = self.__model_base_path / self.UPGRADE_FOLDER_NAME self.__model_client = model_client + self.__node_type_client = node_type_client def deploy_models(self): existing_models = self.__model_client.get_model_list() for model_folder_name in self.__get_model_init_list(): model_payload_dict = self.__read_model_payload(model_folder_name, self.ACTION_INIT) - if (not existing_models or not any(m for m in existing_models if model_payload_dict['name'] == m['name'])): + if not existing_models or not any(m for m in existing_models if model_payload_dict['name'] == m['name']): self.__create_models(model_folder_name, model_payload_dict) for model_folder_name in self.__get_model_upgrade_list(): model_payload_dict = self.__read_model_payload(model_folder_name, self.ACTION_UPGRADE) - if (existing_models and any(m for m in existing_models if model_payload_dict['name'] == m['name'])): + if existing_models and any(m for m in existing_models if model_payload_dict['name'] == m['name']): self.__update_models(model_folder_name, model_payload_dict) def __create_models(self, model_folder_name, model_payload_dict): + logger.log('Creating model {}, based on folder {}'.format(model_payload_dict['name'], model_folder_name)) model_imports_zip_path = self.__zip_model_imports(model_folder_name, self.ACTION_INIT) self.__model_client.create_model(model_payload_dict, model_imports_zip_path) self.__init_model_non_node_types(model_folder_name, model_payload_dict) - self.__init_model_node_types(model_folder_name, model_payload_dict) - self.__init_model_non_node_types(model_folder_name, model_payload_dict, True); + self.__init_model_node_types(model_folder_name, model_payload_dict['name']) + self.__init_model_non_node_types(model_folder_name, model_payload_dict, True) def __update_models(self, model_folder_name, model_payload_dict): + logger.log('Updating model {}, based on folder {}'.format(model_payload_dict['name'], model_folder_name)) model_imports_zip_path = self.__zip_model_imports(model_folder_name, self.ACTION_UPGRADE) self.__model_client.update_model_imports(model_payload_dict, model_imports_zip_path) self.__upgrade_model_non_node_types(model_folder_name, model_payload_dict) - self.__upgrade_model_node_types(model_folder_name, model_payload_dict) + self.__upgrade_model_node_types(model_folder_name, model_payload_dict['name']) self.__upgrade_model_non_node_types(model_folder_name, model_payload_dict, True) def __get_model_init_list(self): @@ -118,6 +123,8 @@ class ModelImportManager: return self.__model_init_path if action_type == self.INIT_FOLDER_NAME else self.__model_upgrade_path def __get_tosca_path(self, action, model): + if action not in [self.ACTION_INIT, self.ACTION_UPGRADE]: + raise Exception("Invalid action {}. Expected {}".format(action, [self.ACTION_INIT, self.ACTION_UPGRADE])) return self.__get_base_action_path(action) / model / self.TYPES_FOLDER def __init_model_non_node_types(self, model, model_payload_dict, with_metadata=False): @@ -130,12 +137,38 @@ class ModelImportManager: if os.path.isdir(path): self.__model_client.import_model_elements(model_payload_dict, str(os.path.join(path, '')), with_metadata) - def __init_model_node_types(self, model, model_payload_dict, upgrade=False): - path = self.__get_tosca_path(self.ACTION_INIT, model) / self.NODE_FOLDER - if os.path.isdir(path): - self.__model_client.import_model_types(model_payload_dict, self.__get_node_type_list(path), upgrade) + def __init_model_node_types(self, model_folder_name, model_name): + self.__import_model_node_types(model_folder_name, model_name, self.ACTION_INIT) - def __upgrade_model_node_types(self, model, model_payload_dict, upgrade=True): - path = self.__get_tosca_path(self.ACTION_UPGRADE, model) / self.NODE_FOLDER - if os.path.isdir(path): - self.__model_client.import_model_types(model_payload_dict, self.__get_node_type_list(path), upgrade) + def __upgrade_model_node_types(self, model_folder_name, model_name): + self.__import_model_node_types(model_folder_name, model_name, self.ACTION_UPGRADE) + + def __import_model_node_types(self, model_folder_name, model_name, action): + path = self.__get_tosca_path(action, model_folder_name) / self.NODE_FOLDER + if not os.path.isdir(path): + return + + payload_json_path = self.__get_node_types_metadata_file_path(model_name, path) + payload_json_str = json.dumps(json.load(open(payload_json_path))) + + node_types_yaml_path = self.__get_node_types_yaml_file_path(model_name, path) + + is_update = True if action == self.ACTION_UPGRADE else False + + self.__node_type_client.import_all(node_types_yaml_path, payload_json_str, is_update) + + def __get_node_types_metadata_file_path(self, model_name, node_types_folder): + metadata_json_path = node_types_folder / 'metadata.json' + if not os.path.isfile(metadata_json_path): + error_msg = "Missing metadata.json file for model '{}'. Expected path '{}'".format(model_name, + metadata_json_path) + raise Exception(error_msg) + return metadata_json_path + + def __get_node_types_yaml_file_path(self, model_name, node_types_folder): + node_types_yaml_path = node_types_folder / self.NODE_TYPE_FILE + if not os.path.isfile(node_types_yaml_path): + error_msg = "Missing {} file for model '{}'. Expected path '{}'".format(self.NODE_TYPE_FILE, model_name, + node_types_yaml_path) + raise Exception(error_msg) + return node_types_yaml_path |