Skip to content
Snippets Groups Projects
Commit e4bf2262 authored by Benedetto Debora's avatar Benedetto Debora
Browse files

Add execution from command line, update readme

parent 1944a7ec
No related branches found
No related tags found
No related merge requests found
......@@ -37,3 +37,16 @@ Remove the docker container and the docker image:
docker container rm -f icg
docker rmi icg:0.1
```
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
......@@ -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)
......
......@@ -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)
......
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)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment