From 171582e2e7168972967f1ec52d3369a6ec4054cc Mon Sep 17 00:00:00 2001 From: Georg-Stahn Date: Mon, 4 Dec 2023 22:22:22 +0100 Subject: [PATCH] georgs5 (#31) Reviewed-on: https://gitea.gchq.icu/IoSL/service-aware-frontend/pulls/31 --- .../unicode_data/14.0.0/charmap.json.gz | Bin 0 -> 21505 bytes pkgs/clan-cli/clan_cli/webui/app.py | 2 + .../clan_cli/webui/routers/sql_connect.py | 71 +++++++++++++++++- pkgs/clan-cli/clan_cli/webui/sql_crud.py | 35 +++++++++ 4 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 pkgs/clan-cli/clan_cli/.hypothesis/unicode_data/14.0.0/charmap.json.gz 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 0000000000000000000000000000000000000000..f6ba09c2bf36a02efac9396fa0d20ad0daede556 GIT binary patch literal 21505 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 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..5a9f338 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.get("/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.get("/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