From 678412291a1f8200430462f52d2aa77fc77bcc06 Mon Sep 17 00:00:00 2001 From: Andrea Franchini <hello@andreafranchini.com> Date: Mon, 27 Feb 2023 20:20:03 +0100 Subject: [PATCH] Infer DOML version automatically --- docker-compose.yaml | 4 +- .../doml_mc/intermediate_model/metamodel.py | 2 +- mc_openapi/doml_mc/xmi_parser/doml_model.py | 26 ++++++++++++- tests/test_mc_openapi.py | 38 ++++++++++++++++--- 4 files changed, 60 insertions(+), 10 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index c2c1b74..2bbf5c3 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -3,8 +3,8 @@ services: dmc: build: . ports: - - "8080:80" + - "8080:8080" environment: - UVICORN_PORT: 80 + UVICORN_PORT: 8080 UVICORN_HOST: "0.0.0.0" UVICORN_WORKERS: 2 diff --git a/mc_openapi/doml_mc/intermediate_model/metamodel.py b/mc_openapi/doml_mc/intermediate_model/metamodel.py index 6c5e520..a10a505 100644 --- a/mc_openapi/doml_mc/intermediate_model/metamodel.py +++ b/mc_openapi/doml_mc/intermediate_model/metamodel.py @@ -13,7 +13,7 @@ class DOMLVersion(Enum): V1_0 = "v1.0" V2_0 = "v2.0" V2_1 = "v2.1" - V2_2 = "v2.1.1" + V2_2 = "v2.2" Multiplicity = tuple[Literal["0", "1"], Literal["1", "*"]] diff --git a/mc_openapi/doml_mc/xmi_parser/doml_model.py b/mc_openapi/doml_mc/xmi_parser/doml_model.py index 8aaf11b..288fb98 100644 --- a/mc_openapi/doml_mc/xmi_parser/doml_model.py +++ b/mc_openapi/doml_mc/xmi_parser/doml_model.py @@ -66,10 +66,32 @@ def infer_domlx_version(raw_model: bytes) -> DOMLVersion: def parse_doml_model(raw_model: bytes, doml_version: Optional[DOMLVersion]) -> Tuple[IntermediateModel, DOMLVersion]: + # if doml_version is None: + # doml_version = infer_domlx_version(raw_model) + + # Try every DOML version until one works! if doml_version is None: - doml_version = infer_domlx_version(raw_model) - model = parse_xmi_model(raw_model, doml_version) + doml_versions = [x for x in DOMLVersion] + print(doml_versions) + + def get_model(raw_model, doml_version): + try: + dv = doml_versions.pop(0) + doml_version = dv + return parse_xmi_model(raw_model, dv), dv + except Exception as e: + print(f"Couldn't parse with DOML {dv.value}. Trying another version...") + if len(doml_versions) == 0: + raise e + else: + return get_model(raw_model, doml_version) + + model, doml_version = get_model(raw_model, doml_version) + else: # if user specifies DOML version, respect that choice! + model = parse_xmi_model(raw_model, doml_version) + + print(f"Using DOML {doml_version.value}") elp = ELayerParser(MetaModels[doml_version], SpecialParsers[doml_version]) if model.application: diff --git a/tests/test_mc_openapi.py b/tests/test_mc_openapi.py index d96ac89..7ab1ae0 100644 --- a/tests/test_mc_openapi.py +++ b/tests/test_mc_openapi.py @@ -3,11 +3,6 @@ from mc_openapi.doml_mc.common_reqs import CommonRequirements from mc_openapi.doml_mc import DOMLVersion import requests - -def test_version(): - assert __version__ == '1.2.0' - - # V2_0 tests def test_post_nginx_sat_V2_0(): with open("tests/doml/v2.0/nginx-openstack_v2.0.domlx", "r") as f: @@ -74,3 +69,36 @@ def test_post_faas_unsat_V2_1(): assert r.status_code == requests.codes.ok assert payload["result"] is not None assert payload["result"] == "unsat" + +# V2_2 tests +def test_post_nginx_sat_V2_1(): + with open("tests/doml/v2.2/nginx-aws-ec2.domlx", "r") as f: + doml = f.read() + + r = requests.post("http://0.0.0.0:8080/modelcheck", data=doml) + payload = r.json() + assert r.status_code == requests.codes.ok + assert payload["result"] is not None + assert payload["result"] == "sat" + + +def test_post_faas_unsat_V2_2(): + with open("tests/doml/v2.2/faas.domlx", "r") as f: + doml = f.read() + + r = requests.post("http://0.0.0.0:8080/modelcheck", data=doml) + payload = r.json() + assert r.status_code == requests.codes.ok + assert payload["result"] is not None + assert payload["result"] == "sat" + + +def test_post_nginx_with_func_reqs_unsat_V2_2(): + with open("tests/doml/v2.2/nginx_func_req.domlx", "r") as f: + doml = f.read() + + r = requests.post("http://0.0.0.0:8080/modelcheck", data=doml) + payload = r.json() + assert r.status_code == requests.codes.ok + assert payload["result"] is not None + assert payload["result"] == "unsat" \ No newline at end of file -- GitLab