diff --git a/README.md b/README.md index a68702266abe93f363a8b328ebc98b2bdab51d98..fee64ae59b441aca5ee6458183cbe03d17cf2f01 100644 --- a/README.md +++ b/README.md @@ -36,4 +36,17 @@ Remove the docker container and the docker image: ``` docker container rm -f icg docker rmi icg:0.1 -``` \ No newline at end of file +``` + +Usage from command line +------------ +Usage: python main.py [-h] [-d dir] model +- -h prints usage +- -d dir loads metamodel from \<dir> +- --single or --single_mmodel use the single (non-split) metamodel +- model the model to be loaded +` py .\main.py -d <doml_folder> --single <metamodel_file_path>` + +Example: + +` py .\main.py -d icgparser/doml --single icgparser/doml/nginx-openstack_v2.domlx` \ No newline at end of file diff --git a/api/InfrastructureTemplateController.py b/api/InfrastructureTemplateController.py index 6fcdfeba3d130006612ebeeeb5cb09e54e1db64e..efac34ef411ee1ecfaa4da44dae5a7cd279d468b 100644 --- a/api/InfrastructureTemplateController.py +++ b/api/InfrastructureTemplateController.py @@ -5,7 +5,6 @@ import uuid from fastapi import APIRouter, Body from fastapi.responses import FileResponse - from controller.PluginOrchestrator import create_infrastructure_files from icgparser import ModelParser @@ -30,7 +29,7 @@ def create_iac_from_doml(data: str = Body(..., media_type="application/xml")): f = open(temp_model_file_path, "w") f.write(data) f.close() - ModelParser.parse_model(temp_model_file_path) + ModelParser.parse_model(temp_model_file_path, False) with open("input_file_generated/ir.json") as json_file: data = json.load(json_file) template_generated_folder = create_infrastructure_files(data) diff --git a/icgparser/ModelParser.py b/icgparser/ModelParser.py index 668f6d046e6f71e308202b7941ad24ebdc876475..91c8eafe443db4618df9b51060520b12887a111b 100644 --- a/icgparser/ModelParser.py +++ b/icgparser/ModelParser.py @@ -98,7 +98,8 @@ def model_handler(obj, model_root, level, intermediate_repr): def concrete_infra_handler(obj, model_root, level, intermediate_repr): # output prefix - append_in_file(intermediate_repr, f'{level * spaces}{{{newline}{level * spaces}{spaces}"programming_language": "terraform",') + append_in_file(intermediate_repr, + f'{level * spaces}{{{newline}{level * spaces}{spaces}"programming_language": "terraform",') # handle contents for x in obj.eContents: handle_obj(x, model_root, level + 1, intermediate_repr) @@ -118,7 +119,8 @@ def property_handler(obj, model_root, level, intermediate_repr): def provider_handler(obj, model_root, level, intermediate_repr): # output prefix - append_in_file(intermediate_repr, f'{level * spaces}"data": {{{newline}{level * spaces}{spaces}"provider": "{obj.name}",') + append_in_file(intermediate_repr, + f'{level * spaces}"data": {{{newline}{level * spaces}{spaces}"provider": "{obj.name}",') # handle contents for x in obj.eContents: handle_obj(x, model_root, level + 1, intermediate_repr) @@ -139,7 +141,8 @@ def concrete_vm_handler(obj, model_root, level, intermediate_repr): append_in_file(intermediate_repr, f'{level * spaces}"image" : "{extract_image_name(obj)}",') for iface in obj.maps.ifaces: append_in_file(intermediate_repr, f'{level * spaces}"address" : "{iface.endPoint}",') - append_in_file(intermediate_repr, f'{level * spaces}"network_name" : "{extract_concrete_network_name(iface.belongsTo)}"') + append_in_file(intermediate_repr, + f'{level * spaces}"network_name" : "{extract_concrete_network_name(iface.belongsTo)}"') # output suffix level = level - 1 append_in_file(intermediate_repr, f'{level * spaces}}}]') @@ -169,17 +172,10 @@ def handle_obj(obj, model_root, level, intermediate_repr): logging.warning(f'Class {obj.eClass.name} has no handler') -# ------------------------------------------------------------------------- -# Parse parameters -# ------------------------------------------------------------------------- -skip_next = False -doml_directory = "icgparser/doml" - - # ------------------------------------------------------------------------- # Load each part of the DOML metamodel and register them # ------------------------------------------------------------------------- -def load_metamodel(load_split_model): +def load_metamodel(load_split_model, doml_directory="icgparser/doml"): global_registry[Ecore.nsURI] = Ecore # Load the Ecore metamodel first rset = ResourceSet() if load_split_model: @@ -201,8 +197,7 @@ def load_metamodel(load_split_model): # Finally load the model and print it out # ------------------------------------------------------------------------- -def parse_model(model): - load_split_model = None +def parse_model(model, load_split_model, doml_directory="icgparser/doml"): rset = load_metamodel(load_split_model) doml_model_resource = rset.get_resource(URI(model)) doml_model = doml_model_resource.contents[0] @@ -219,11 +214,13 @@ def parse_model(model): create_file("input_file_generated/ir.json") handle_obj(doml_model, doml_model, 0, intermediate_repr_file_path) + def create_file(file_name): f = open(file_name, "w") f.write("") f.close() + def append_in_file(file_name, data): f = open(file_name, "a") f.write(data) diff --git a/main.py b/main.py index 2b9b6301438563ffdad254912f0f2dc157e16f7d..b06359a31092bdd8caa189614378a7bcc2b06ad6 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,12 @@ +import json import logging +import sys + from fastapi import FastAPI + import api.InfrastructureTemplateController +from api.InfrastructureTemplateController import compress_file +from controller.PluginOrchestrator import create_infrastructure_files from icgparser import ModelParser fast_api = FastAPI() @@ -8,6 +14,50 @@ fast_api = FastAPI() fast_api.include_router(api.InfrastructureTemplateController.api_router) logging.getLogger().setLevel(logging.INFO) +#------------------------------------------------------------------------- +# Parse parameters +#------------------------------------------------------------------------- +skip_next = False +doml_directory = "./doml" +model_filename = "./nginx-openstack_v2_multiecores.domlx" +load_split_model = True +output_file_name = "iac_files.tar.gz" + +# get metamodel directory from command line +def param_dir(pos, list): + global doml_directory + global skip_next + doml_directory = list[pos+1] + print(f" doml_directory = {doml_directory} model_filename = {model_filename}") + skip_next = True + +def param_help(pos, list): + print(f"\nUsage: {sys.argv[0]} [-h] [-d <doml_directory>] [--single] <model_filename>\n") + sys.exit() + +# indicate to load the single-file metamodel (doml.ecore) instead of the split one +def param_single(pos, list): + global load_split_model + print(f"--> param_single({pos},{list}") + load_split_model = False + +options = {'-d': param_dir, '-h': param_help, '--single_mmodel': param_single, '--single': param_single, '--output': output_file_name} +argc = len(sys.argv) +paramlist = sys.argv[1:] +for i, param in enumerate(paramlist): + print(f"i={i} param={param} skip_next={skip_next}") + if param in options: + options[param](i, paramlist) + continue + if skip_next: + skip_next = False + continue + else: + model_filename = param + if __name__ == '__main__': - logging.info("Starting ICG application") - ModelParser.parse_model("icgparser/doml/nginx-openstack_v2.domlx") + ModelParser.parse_model(model_filename, load_split_model, doml_directory) + with open("input_file_generated/ir.json") as json_file: + data = json.load(json_file) + template_generated_folder = create_infrastructure_files(data) + compress_file_folder = compress_file(template_generated_folder, output_file_name)