diff --git a/pkgs/clan-cli/clan_cli/.hypothesis/unicode_data/14.0.0/charmap.json.gz b/pkgs/clan-cli/clan_cli/.hypothesis/unicode_data/14.0.0/charmap.json.gz new file mode 100644 index 0000000..f6ba09c Binary files /dev/null and b/pkgs/clan-cli/clan_cli/.hypothesis/unicode_data/14.0.0/charmap.json.gz differ diff --git a/pkgs/clan-cli/clan_cli/webui/app.py b/pkgs/clan-cli/clan_cli/webui/app.py index 9e5ffd8..b5cb9b1 100644 --- a/pkgs/clan-cli/clan_cli/webui/app.py +++ b/pkgs/clan-cli/clan_cli/webui/app.py @@ -33,6 +33,8 @@ async def lifespan(app: FastAPI) -> Any: def setup_app() -> FastAPI: # bind sql engine + # TODO comment aut and add flag to run with pupulated data rm *.sql run pytest with marked then start clan webui + # https://docs.pytest.org/en/7.1.x/example/markers.html sql_models.Base.metadata.drop_all(engine) sql_models.Base.metadata.create_all(bind=engine) diff --git a/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py b/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py index 284f8b9..9a5c8b1 100644 --- a/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py +++ b/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py @@ -1,6 +1,8 @@ +import time from typing import List, Optional -from fastapi import APIRouter, Depends +import httpx +from fastapi import APIRouter, BackgroundTasks, Depends from sqlalchemy.orm import Session from .. import sql_crud, sql_db, sql_models @@ -139,8 +141,11 @@ def get_repository( @router.post("/api/v1/create_entity", response_model=Entity, tags=[Tags.entities]) def create_entity( entity: EntityCreate, db: Session = Depends(sql_db.get_db) -) -> EntityCreate: +) -> EntityCreate | str: # todo checken ob schon da ... + if sql_crud.get_entity_by_did(db, did=entity.did): + print("did already exsists") + return "Error did already exsists in db" return sql_crud.create_entity(db, entity) @@ -155,9 +160,67 @@ def get_entities( @router.get("/api/v1/get_entity", response_model=Optional[Entity], tags=[Tags.entities]) def get_entity( entity_did: str = "did:sov:test:1234", - skip: int = 0, - limit: int = 100, db: Session = Depends(sql_db.get_db), ) -> Optional[sql_models.Entity]: entity = sql_crud.get_entity_by_did(db, did=entity_did) return entity + + +@router.get( + "/api/v1/get_attached_entities", + response_model=List[Entity], + tags=[Tags.entities], +) +def get_attached_entities( + skip: int = 0, limit: int = 100, db: Session = Depends(sql_db.get_db) +) -> List[sql_models.Entity]: + entities = sql_crud.get_attached_entities(db, skip=skip, limit=limit) + return entities + + +@router.post("/api/v1/detach") +async def detach( + background_tasks: BackgroundTasks, + entity_did: str = "did:sov:test:1234", + skip: int = 0, + limit: int = 100, + db: Session = Depends(sql_db.get_db), +) -> dict[str, str]: + background_tasks.add_task( + sql_crud.set_attached_by_entity_did, db, entity_did, False + ) + return {"message": "Detaching in the background"} + + +@router.post("/api/v1/attach") +async def attach( + background_tasks: BackgroundTasks, + entity_did: str = "did:sov:test:1234", + skip: int = 0, + limit: int = 100, + db: Session = Depends(sql_db.get_db), +) -> dict[str, str]: + background_tasks.add_task(attach_entity, db, entity_did) + return {"message": "Attaching in the background"} + + +# TODO +def attach_entity(db: Session, entity_did: str) -> None: + db_entity = sql_crud.set_attached_by_entity_did(db, entity_did, True) + try: + if db_entity is not None: + while db_entity.attached: + # query status endpoint + # https://www.python-httpx.org/ + response = httpx.get(f"http://{db_entity.ip}", timeout=2) + print(response) + # test with: + # while true ; do printf 'HTTP/1.1 200 OK\r\n\r\ncool, thanks' | nc -l -N localhost 5555 ; done + # client test (apt install python3-httpx): + # httpx http://localhost:5555 + # except not reached set false + time.sleep(1) + except Exception as e: + print(e) + if db_entity is not None: + db_entity = sql_crud.set_attached_by_entity_did(db, entity_did, False) diff --git a/pkgs/clan-cli/clan_cli/webui/sql_crud.py b/pkgs/clan-cli/clan_cli/webui/sql_crud.py index f25690c..d6119c9 100644 --- a/pkgs/clan-cli/clan_cli/webui/sql_crud.py +++ b/pkgs/clan-cli/clan_cli/webui/sql_crud.py @@ -1,6 +1,7 @@ from typing import List, Optional from sqlalchemy.orm import Session +from sqlalchemy.sql.expression import true from . import schemas, sql_models @@ -136,3 +137,37 @@ def get_entities( def get_entity_by_did(db: Session, did: str) -> Optional[sql_models.Entity]: return db.query(sql_models.Entity).filter(sql_models.Entity.did == did).first() + + +# get attached +def get_attached_entities( + db: Session, skip: int = 0, limit: int = 100 +) -> List[sql_models.Entity]: + return ( + db.query(sql_models.Entity) + .filter(sql_models.Entity.attached == true()) + # https://stackoverflow.com/questions/18998010/flake8-complains-on-boolean-comparison-in-filter-clause + .offset(skip) + .limit(limit) + .all() + ) + + +# set attached +# None if did not found +# Returns same entity if setting didnt changed something +def set_attached_by_entity_did( + db: Session, entity_did: str, value: bool +) -> Optional[sql_models.Entity]: + # ste attached to true + db_entity = get_entity_by_did(db, entity_did) + if db_entity is not None: + # db_entity.attached = Column(True) + setattr(db_entity, "attached", value) + # save changes in db + db.add(db_entity) + db.commit() + db.refresh(db_entity) + return db_entity + else: + return db_entity diff --git a/pkgs/clan-cli/tests/test_db_api.py b/pkgs/clan-cli/tests/test_db_api.py index 99aa7cd..5f6d16e 100644 --- a/pkgs/clan-cli/tests/test_db_api.py +++ b/pkgs/clan-cli/tests/test_db_api.py @@ -1,9 +1,14 @@ +import urllib.parse as url from typing import Any from api import TestClient default_entity_did_url = "entity_did=did%3Asov%3Atest%3A1234" default_entity_did = "did:sov:test:1234" +default_entity_did2 = "did:sov:test:1235" +default_entity_did3 = "did:sov:test:1236" +default_entity_did4 = "did:sov:test:1237" +default_entity_did5 = "did:sov:test:1238" def assert_extra_info( @@ -80,6 +85,66 @@ def test_producer(api: TestClient) -> None: make_test_post_and_get(api, request_body, paramter) +def test_producer2(api: TestClient) -> None: + request_body = { + "uuid": "8e285c0c-4e40-430a-a477-26b3b81e30d1", + "service_name": "Luis'''s Fax", + "service_type": "Fax", + "endpoint_url": "http://127.0.0.1:8001", + "status": "unknown", + "other": {"faxen": "dicke"}, + "entity_did": default_entity_did2, + } + paramter = "producer" + get_request = "entity_did=" + url.quote(default_entity_did2) + make_test_post_and_get(api, request_body, paramter, get_request) + + +def test_producer3(api: TestClient) -> None: + request_body = { + "uuid": "8e285c0c-4e40-430a-a477-26b3b81e30d2", + "service_name": "Erdem'''s VR-Stream", + "service_type": "VR-Stream", + "endpoint_url": "http://127.0.0.1:8002", + "status": "unknown", + "other": {"oculos": "rift"}, + "entity_did": default_entity_did3, + } + paramter = "producer" + get_request = "entity_did=" + url.quote(default_entity_did3) + make_test_post_and_get(api, request_body, paramter, get_request) + + +def test_producer4(api: TestClient) -> None: + request_body = { + "uuid": "8e285c0c-4e40-430a-a477-26b3b81e30d3", + "service_name": "Onur'''s gallary", + "service_type": "gallary", + "endpoint_url": "http://127.0.0.1:8003", + "status": "unknown", + "other": {"nice": "pics"}, + "entity_did": default_entity_did4, + } + paramter = "producer" + get_request = "entity_did=" + url.quote(default_entity_did4) + make_test_post_and_get(api, request_body, paramter, get_request) + + +def test_producer5(api: TestClient) -> None: + request_body = { + "uuid": "8e285c0c-4e40-430a-a477-26b3b81e30d4", + "service_name": "Sara'''s Game-Shop", + "service_type": "Game-Shop", + "endpoint_url": "http://127.0.0.1:8004", + "status": "unknown", + "other": {"war": "games"}, + "entity_did": default_entity_did5, + } + paramter = "producer" + get_request = "entity_did=" + url.quote(default_entity_did5) + make_test_post_and_get(api, request_body, paramter, get_request) + + ######################### # # # Consumer # @@ -96,6 +161,17 @@ def test_consumer(api: TestClient) -> None: make_test_post_and_get(api, request_body, paramter) +def test_consumer2(api: TestClient) -> None: + request_body = { + "entity_did": default_entity_did2, + "producer_uuid": "8e285c0c-4e40-430a-a477-26b3b81e30d4", + "other": {"war": "games"}, + } + paramter = "consumer" + get_request = "entity_did=" + url.quote(default_entity_did2) + make_test_post_and_get(api, request_body, paramter, get_request) + + ######################### # # # REPOSITORY # @@ -116,6 +192,66 @@ def test_repository(api: TestClient) -> None: make_test_post_and_get(api, request_body, paramter) +def test_repository2(api: TestClient) -> None: + request_body = { + "uuid": "8e285c0c-4e40-430a-a477-26b3b81e30d1", + "service_name": "Luis'''s Fax", + "service_type": "Fax", + "endpoint_url": "http://127.0.0.1:8001", + "status": "unknown", + "other": {"faxen": "dicke"}, + "entity_did": default_entity_did2, + } + paramter = "repository" + get_request = "entity_did=" + url.quote(default_entity_did2) + make_test_post_and_get(api, request_body, paramter, get_request) + + +def test_repository3(api: TestClient) -> None: + request_body = { + "uuid": "8e285c0c-4e40-430a-a477-26b3b81e30d2", + "service_name": "Erdem'''s VR-Stream", + "service_type": "VR-Stream", + "endpoint_url": "http://127.0.0.1:8002", + "status": "unknown", + "other": {"oculos": "rift"}, + "entity_did": default_entity_did3, + } + paramter = "repository" + get_request = "entity_did=" + url.quote(default_entity_did3) + make_test_post_and_get(api, request_body, paramter, get_request) + + +def test_repository4(api: TestClient) -> None: + request_body = { + "uuid": "8e285c0c-4e40-430a-a477-26b3b81e30d3", + "service_name": "Onur'''s gallary", + "service_type": "gallary", + "endpoint_url": "http://127.0.0.1:8003", + "status": "unknown", + "other": {"nice": "pics"}, + "entity_did": default_entity_did4, + } + paramter = "repository" + get_request = "entity_did=" + url.quote(default_entity_did4) + make_test_post_and_get(api, request_body, paramter, get_request) + + +def test_repository5(api: TestClient) -> None: + request_body = { + "uuid": "8e285c0c-4e40-430a-a477-26b3b81e30d4", + "service_name": "Sara'''s Game-Shop", + "service_type": "Game-Shop", + "endpoint_url": "http://127.0.0.2:8004", + "status": "unknown", + "other": {"war": "games"}, + "entity_did": default_entity_did5, + } + paramter = "repository" + get_request = "entity_did=" + url.quote(default_entity_did5) + make_test_post_and_get(api, request_body, paramter, get_request) + + ######################### # # # Entity # @@ -132,3 +268,16 @@ def test_entity(api: TestClient) -> None: paramter = "entity" # get_request = "entity_did=did%3Asov%3Atest%3A1234" make_test_post_and_get(api, request_body, paramter) + + +def test_entity2(api: TestClient) -> None: + request_body = { + "did": default_entity_did2, + "name": "C2", + "ip": "127.0.0.2", + "attached": False, + "other": {"test": "test"}, + } + paramter = "entity" + get_request = "entity_did=" + url.quote(default_entity_did2) + make_test_post_and_get(api, request_body, paramter, get_request) diff --git a/pkgs/tea-create-pr/script.sh b/pkgs/tea-create-pr/script.sh index a22ae5d..ef3f0a3 100644 --- a/pkgs/tea-create-pr/script.sh +++ b/pkgs/tea-create-pr/script.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -set -euo pipefail +set -xeuo pipefail remoteName="${1:-origin}" targetBranch="${2:-main}"