diff --git a/Dockerfile b/Dockerfile index bb8c92b58e26103b69a8cfa0acf23b0ef945a932..a019c2165104c07b5f6ce5e069566cf966c6d164 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,16 +18,12 @@ COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt COPY ./startup.sh /code/ +RUN chmod a+x /code/startup.sh + COPY ./app /code/app COPY ./static /code/static RUN mkdir /code/exports RUN mkdir /code/uploads RUN mkdir /code/db -# EXPOSE $API_PORT -# CMD ["python", "-m", "/code/app"] -# escape=\ -# apparently allergic to env vars "\$API_PORT", "--root-path", "\$API_PREFIX"] -CMD ["/code/startup.sh"] -# CMD ["sh", "-c", "fastapi run app/main.py"] -# CMD "fastapi run app/main.py --port $API_PORT" \ No newline at end of file +CMD ["/code/startup.sh"] \ No newline at end of file diff --git a/app/db/models.py b/app/db/models.py index c1182252a3e47d9809d2519250673d0a117e23c7..3482fde07e1963b2014bde57fe0e1cc872f3e991 100644 --- a/app/db/models.py +++ b/app/db/models.py @@ -11,7 +11,7 @@ from mitm_tooling.transformation.superset.definitions.mitm_dataset import MitMDa from pydantic import AnyUrl, BaseModel from sqlmodel import SQLModel, Field -from app.db.adapters import PydanticType, StrType +from .adapters import PydanticType, StrType from app.utils.response_utils import FromBaseMixin APPLICATION_DB_SCHEMA = 'main' # 'APPLICATION_DB' @@ -47,10 +47,11 @@ class TrackedMitMDataset(FromBaseMixin, AddTrackedMitMDataset, SQLModel, table=T @property def datasource_identifiers(self) -> DatasourceIdentifierBundle: - return self.identifier_bundle + # we explicitly do not want to use the identifier_bundle itself directly, as that includes the visualization identifier map + return DatasourceIdentifierBundle(database=self.identifier_bundle.database, ds_id_map=self.identifier_bundle.ds_id_map) @property - def superset_connection_info(self) -> DBConnectionInfo: + def db_conn_info(self) -> DBConnectionInfo: return DBConnectionInfo(sql_alchemy_uri=self.sql_alchemy_uri, schema_name=self.schema_name) @property diff --git a/app/db/setup.py b/app/db/setup.py index 81ada95e434d397cb0b1f861a12b77e87fb5416b..a1441a24986ccb1fcc0df6b50c5d8a60503aea06 100644 --- a/app/db/setup.py +++ b/app/db/setup.py @@ -4,7 +4,6 @@ import sqlalchemy as sa from mitm_tooling.utilities.python_utils import pick_from_mapping from sqlalchemy import create_engine, inspect, Engine from sqlalchemy.orm import Session - from .utils import create_schema from ..config import app_cfg diff --git a/app/dependencies/db.py b/app/dependencies/db.py index 2c8f28f96e81d24766832be87aaed97cd6ee673f..70280cdffd006c9b1325f85a0aed56eb18be951a 100644 --- a/app/dependencies/db.py +++ b/app/dependencies/db.py @@ -4,6 +4,7 @@ import sqlmodel from fastapi import Depends from sqlalchemy import engine, Engine from sqlalchemy.orm import Session +from sqlmodel import Session as ORMSession from ..db.setup import engine @@ -24,4 +25,4 @@ def get_orm_session(): DBEngineDependency = Annotated[Engine, Depends(get_engine)] DBSessionDependency = Annotated[Session, Depends(get_session)] -ORMSessionDependency = Annotated[sqlmodel.Session, Depends(get_orm_session)] +ORMSessionDependency = Annotated[ORMSession, Depends(get_orm_session)] diff --git a/app/routes/definitions/generate.py b/app/routes/definitions/generate.py index 3437db8077f5fe53f7a4908c2f4390174f111da7..063c863d4ca67c89a2f00244d8008ef05b70fe84 100644 --- a/app/routes/definitions/generate.py +++ b/app/routes/definitions/generate.py @@ -1,15 +1,31 @@ +from collections.abc import Sequence + +from mitm_tooling.definition import MITM from mitm_tooling.representation import Header from mitm_tooling.transformation.superset import mk_superset_mitm_dataset_bundle, MAEDVisualizationType, \ - mk_superset_datasource_bundle + mk_superset_datasource_bundle, VisualizationType from mitm_tooling.transformation.superset.asset_bundles import MitMDatasetIdentifierBundle, SupersetMitMDatasetBundle, \ - SupersetDatasourceBundle + SupersetDatasourceBundle, SupersetVisualizationBundle from mitm_tooling.transformation.superset.common import DBConnectionInfo +from mitm_tooling.transformation.superset.definitions import SupersetAssetsImport, SupersetMitMDatasetImport, \ + MetadataType + +from app.db.models import TrackedMitMDataset +from app.dependencies.db import ORMSession +from .requests import GenerateIndependentMitMDatasetDefinitionRequest, GenerateVisualizationsRequest + + +def get_default_visualization_types(mitm: MITM) -> list[VisualizationType]: + if mitm == MITM.MAED: + return [MAEDVisualizationType.Baseline] + else: + return [] def mk_datasource_bundle(mitm_header: Header, - db_conn_info: DBConnectionInfo, - identifiers: MitMDatasetIdentifierBundle | None = None, - ) -> SupersetDatasourceBundle: + db_conn_info: DBConnectionInfo, + identifiers: MitMDatasetIdentifierBundle | None = None + ) -> SupersetDatasourceBundle: datasource_bundle = mk_superset_datasource_bundle(mitm_header, db_conn_info, identifiers) @@ -17,15 +33,92 @@ def mk_datasource_bundle(mitm_header: Header, def mk_mitm_dataset_bundle(mitm_header: Header, - db_conn_info: DBConnectionInfo, - dataset_name: str, - identifiers: MitMDatasetIdentifierBundle | None = None, - include_visualizations: bool = False) -> SupersetMitMDatasetBundle: + db_conn_info: DBConnectionInfo, + dataset_name: str, + identifiers: MitMDatasetIdentifierBundle | None = None, + include_default_visualizations: bool = False, + visualization_types: Sequence[VisualizationType] | None = None) -> SupersetMitMDatasetBundle: mitm_dataset_bundle = mk_superset_mitm_dataset_bundle(mitm_header, db_conn_info, dataset_name, identifiers, - visualization_types=( - [ - MAEDVisualizationType.Baseline] if include_visualizations else None)) + visualization_types=(get_default_visualization_types( + mitm_header.mitm) if include_default_visualizations else []) + ( + visualization_types or []) + ) return mitm_dataset_bundle + + +def exec_def_request(request: GenerateIndependentMitMDatasetDefinitionRequest, + include_visualizations: bool = False) -> SupersetMitMDatasetBundle: + return mk_mitm_dataset_bundle(request.mitm_header, + request.db_conn_info, + request.dataset_name, + identifiers=request.identifiers, + include_default_visualizations=include_visualizations) + + +def exec_asset_import_request(request: GenerateIndependentMitMDatasetDefinitionRequest, + include_visualizations: bool = False, + override_metadata_type: MetadataType | None = None) -> SupersetMitMDatasetImport: + mitm_dataset_bundle = exec_def_request(request, include_visualizations) + if override_metadata_type: + importable = mitm_dataset_bundle.to_import(metadata_type=override_metadata_type) + else: + importable = mitm_dataset_bundle.to_import() + return importable + + +def exec_tracked_def_request(tracked_dataset: TrackedMitMDataset, + include_visualizations: bool = False) -> SupersetMitMDatasetBundle: + return mk_mitm_dataset_bundle(tracked_dataset.mitm_header, + tracked_dataset.db_conn_info, + tracked_dataset.dataset_name, + identifiers=tracked_dataset.identifier_bundle, + include_default_visualizations=include_visualizations) + + +def exec_tracked_asset_import_request(tracked_dataset: TrackedMitMDataset, + include_visualizations: bool = False, + override_metadata_type: MetadataType | None = None) -> SupersetMitMDatasetImport: + mitm_dataset_bundle = exec_tracked_def_request(tracked_dataset, include_visualizations) + if override_metadata_type: + importable = mitm_dataset_bundle.to_import(metadata_type=override_metadata_type) + else: + importable = mitm_dataset_bundle.to_import() + return importable + + +def exec_viz_request(orm_session: ORMSession, + tracked_dataset: TrackedMitMDataset, + request: GenerateVisualizationsRequest) -> SupersetMitMDatasetBundle: + mitm_dataset_bundle = mk_mitm_dataset_bundle(tracked_dataset.mitm_header, + tracked_dataset.db_conn_info, + tracked_dataset.dataset_name, + identifiers=( + tracked_dataset.identifier_bundle if request.reuse_existing_identifiers else tracked_dataset.datasource_identifiers), + include_default_visualizations=False, + visualization_types=request.visualization_types) + + if request.track_identifiers: + track_visualizations(orm_session, tracked_dataset, mitm_dataset_bundle.visualization_bundle) + + return mitm_dataset_bundle + + +def track_visualizations(orm_session: ORMSession, + tracked_dataset: TrackedMitMDataset, + visualization_bundle: SupersetVisualizationBundle) -> TrackedMitMDataset: + viz_id_map = visualization_bundle.viz_identifier_map + tracked_dataset.identifier_bundle = tracked_dataset.identifier_bundle.with_visualizations(viz_id_map) + orm_session.commit() + orm_session.refresh(tracked_dataset) + return tracked_dataset + + +def exec_viz_import_request(orm_session: ORMSession, + tracked_dataset: TrackedMitMDataset, + request: GenerateVisualizationsRequest, as_assets: bool = False) -> SupersetMitMDatasetImport: + mitm_dataset_bundle = exec_viz_request(orm_session, tracked_dataset, request) + importable = mitm_dataset_bundle.to_import(metadata_type=(MetadataType.Asset if as_assets else MetadataType.MitMDataset)) + return importable diff --git a/app/routes/definitions/requests.py b/app/routes/definitions/requests.py index 875c630ed4b66b19d522ee45dcbf9603d95442ea..060c12e73c9f43578a2e0bd5aae336f42a8e1352 100644 --- a/app/routes/definitions/requests.py +++ b/app/routes/definitions/requests.py @@ -1,13 +1,20 @@ import pydantic from mitm_tooling.representation import Header +from mitm_tooling.transformation.superset import VisualizationType, MAEDVisualizationType from mitm_tooling.transformation.superset.asset_bundles import MitMDatasetIdentifierBundle -from mitm_tooling.transformation.superset.common import DBConnectionInfo +from mitm_tooling.transformation.superset.common import DBConnectionInfo, MitMDatasetInfo from mitm_tooling.transformation.superset.definitions import StrUUID from mitm_tooling.transformation.superset.definitions.mitm_dataset import MitMDatasetIdentifier -class GenerateMitMDatasetDefinitionRequest(pydantic.BaseModel): +class GenerateIndependentMitMDatasetDefinitionRequest(pydantic.BaseModel): dataset_name: str mitm_header: Header db_conn_info: DBConnectionInfo identifiers: MitMDatasetIdentifierBundle | None = None + + +class GenerateVisualizationsRequest(pydantic.BaseModel): + visualization_types: list[VisualizationType] = [MAEDVisualizationType.Baseline] + reuse_existing_identifiers: bool = True + track_identifiers: bool = False diff --git a/app/routes/definitions/responses.py b/app/routes/definitions/responses.py index 96e466ace046a2d8231254f7686818d1ceb30ae6..e6a6772f06f4d7325cd1227963a58e6dc77eeaae 100644 --- a/app/routes/definitions/responses.py +++ b/app/routes/definitions/responses.py @@ -1,6 +1,6 @@ from typing import Self -from mitm_tooling.transformation.superset.definitions import SupersetMitMDatasetImport +from mitm_tooling.transformation.superset.definitions import SupersetMitMDatasetImport, SupersetAssetsImport from mitm_tooling.transformation.superset.asset_bundles import SupersetMitMDatasetBundle from app.utils.response_utils import FromBaseMixin @@ -10,4 +10,7 @@ class MitMDatasetBundleResponse(FromBaseMixin, SupersetMitMDatasetBundle): pass class MitMDatasetImportResponse(FromBaseMixin, SupersetMitMDatasetImport): + pass + +class VisualizationImportResponse(FromBaseMixin, SupersetAssetsImport): pass \ No newline at end of file diff --git a/app/routes/definitions/router.py b/app/routes/definitions/router.py index 491e57be758f8b164acc661ee554c8684361889a..8d7b2ed5ba5d9717f62fed5121f0a01b19d86b5b 100644 --- a/app/routes/definitions/router.py +++ b/app/routes/definitions/router.py @@ -3,42 +3,46 @@ import logging from fastapi import APIRouter from mitm_tooling.transformation.superset import write_superset_import_as_zip +from mitm_tooling.transformation.superset.definitions import MetadataType from starlette.responses import StreamingResponse from app.dependencies.orm import TrackedMitMDatasetDependency -from app.routes.definitions.requests import GenerateMitMDatasetDefinitionRequest -from app.routes.definitions.responses import MitMDatasetBundleResponse, MitMDatasetImportResponse -from .generate import mk_mitm_dataset_bundle +from app.routes.definitions.requests import GenerateIndependentMitMDatasetDefinitionRequest, \ + GenerateVisualizationsRequest +from app.routes.definitions.responses import MitMDatasetBundleResponse, MitMDatasetImportResponse, \ + VisualizationImportResponse +from .generate import exec_def_request, exec_asset_import_request, exec_tracked_def_request, \ + exec_tracked_asset_import_request, exec_viz_request, exec_viz_import_request +from ...dependencies.db import ORMSessionDependency router = APIRouter(prefix='/definitions', tags=['definitions']) logger = logging.getLogger(__name__) @router.post('/mitm_dataset') -def generate_mitm_dataset_bundle(request: GenerateMitMDatasetDefinitionRequest, +def generate_mitm_dataset_bundle(request: GenerateIndependentMitMDatasetDefinitionRequest, include_visualizations: bool = False) -> MitMDatasetBundleResponse: - mitm_dataset_bundle = mk_mitm_dataset_bundle(request.mitm_header, - request.db_conn_info, - request.dataset_name, - identifiers=request.identifiers, - include_visualizations=include_visualizations) + mitm_dataset_bundle = exec_def_request(request, include_visualizations) return MitMDatasetBundleResponse.from_base(mitm_dataset_bundle) @router.post('/mitm_dataset/import') -def generate_mitm_dataset_import(request: GenerateMitMDatasetDefinitionRequest, - include_visualizations: bool = False) -> MitMDatasetImportResponse: - return MitMDatasetImportResponse.from_base(generate_mitm_dataset_bundle(request, - include_visualizations).to_import()) +def generate_mitm_dataset_import(request: GenerateIndependentMitMDatasetDefinitionRequest, + include_visualizations: bool = False, + override_metadata_type: MetadataType | None = None) -> MitMDatasetImportResponse: + importable = exec_asset_import_request(request, include_visualizations, override_metadata_type) + return MitMDatasetImportResponse.from_base(importable) @router.post('/mitm_dataset/import/zip', response_class=StreamingResponse, responses={200: {'content': {'application/zip': {}}}}) -def generate_mitm_dataset_import_zip(request: GenerateMitMDatasetDefinitionRequest, - include_visualizations: bool = False) -> StreamingResponse: - assets = generate_mitm_dataset_bundle(request, include_visualizations) +def generate_mitm_dataset_import_zip(request: GenerateIndependentMitMDatasetDefinitionRequest, + include_visualizations: bool = False, + override_metadata_type: MetadataType | None = None) -> StreamingResponse: + importable = exec_asset_import_request(request, include_visualizations, override_metadata_type) + bio = io.BytesIO() - write_superset_import_as_zip(bio, assets) + write_superset_import_as_zip(bio, importable) bio.seek(0) return StreamingResponse(bio, media_type='application/zip') @@ -46,43 +50,60 @@ def generate_mitm_dataset_import_zip(request: GenerateMitMDatasetDefinitionReque @router.get('/mitm_dataset/{uuid}') def generate_tracked_mitm_dataset_bundle(tracked_dataset: TrackedMitMDatasetDependency, include_visualizations: bool = False) -> MitMDatasetBundleResponse: - request = GenerateMitMDatasetDefinitionRequest(mitm_header=tracked_dataset.mitm_header, - dataset_name=tracked_dataset.dataset_name, - db_conn_info=tracked_dataset.superset_connection_info, - identifiers=tracked_dataset.identifier_bundle) - return MitMDatasetBundleResponse.from_base(generate_mitm_dataset_bundle(request, - include_visualizations=include_visualizations)) + mitm_dataset_bundle = exec_tracked_def_request(tracked_dataset, include_visualizations) + return MitMDatasetBundleResponse.from_base(mitm_dataset_bundle) @router.get('/mitm_dataset/{uuid}/import') def generate_tracked_mitm_dataset_import(tracked_dataset: TrackedMitMDatasetDependency, - include_visualizations: bool = False) -> MitMDatasetImportResponse: - mitm_dataset_bundle = generate_tracked_mitm_dataset_bundle(tracked_dataset, - include_visualizations=include_visualizations) - return MitMDatasetImportResponse.from_base(mitm_dataset_bundle.to_import().model_dump()) + include_visualizations: bool = False, + override_metadata_type: MetadataType | None = None) -> MitMDatasetImportResponse: + importable = exec_tracked_asset_import_request(tracked_dataset, + include_visualizations, + override_metadata_type=override_metadata_type) + return MitMDatasetImportResponse.from_base(importable.model_dump()) @router.get('/mitm_dataset/{uuid}/import/zip', response_class=StreamingResponse, responses={200: {'content': {'application/zip': {}}}}) def generate_tracked_mitm_dataset_import_zip(tracked_dataset: TrackedMitMDatasetDependency, - include_visualizations: bool = False) -> StreamingResponse: - assets = generate_tracked_mitm_dataset_import(tracked_dataset, - include_visualizations=include_visualizations) + include_visualizations: bool = False, + override_metadata_type: MetadataType | None = None) -> StreamingResponse: + importable = exec_tracked_asset_import_request(tracked_dataset, + include_visualizations, + override_metadata_type=override_metadata_type) + bio = io.BytesIO() - write_superset_import_as_zip(bio, assets) + write_superset_import_as_zip(bio, importable) bio.seek(0) return StreamingResponse(bio, media_type='application/zip') -@router.get('/mitm_dataset/{uuid}') -def generate_tracked_mitm_dataset_bundle(tracked_dataset: TrackedMitMDatasetDependency, - include_visualizations: bool = False) -> MitMDatasetBundleResponse: - request = GenerateMitMDatasetDefinitionRequest(mitm_header=tracked_dataset.mitm_header, - dataset_name=tracked_dataset.dataset_name, - db_conn_info=tracked_dataset.superset_connection_info, - identifiers=tracked_dataset.identifier_bundle) - return MitMDatasetBundleResponse.from_base( - generate_mitm_dataset_bundle(request, - include_visualizations=include_visualizations).model_dump()) - -# TODO to generate "follow up" visualizations, datasource uuids have to be stored or transmitted +@router.post('/mitm_dataset/viz/{uuid}') +def generate_visualizations_for_tracked_dataset(orm_session: ORMSessionDependency, + tracked_dataset: TrackedMitMDatasetDependency, + request: GenerateVisualizationsRequest) -> MitMDatasetBundleResponse: + mitm_dataset_bundle = exec_viz_request(orm_session, tracked_dataset, request) + return MitMDatasetBundleResponse.from_base(mitm_dataset_bundle.model_dump()) + + +@router.post('/mitm_dataset/viz/{uuid}/import') +def generate_visualizations_import_for_tracked_dataset(orm_session: ORMSessionDependency, + tracked_dataset: TrackedMitMDatasetDependency, + request: GenerateVisualizationsRequest, + as_assets: bool = False) -> VisualizationImportResponse: + importable = exec_viz_import_request(orm_session, tracked_dataset, request, as_assets=as_assets) + return VisualizationImportResponse.from_base(importable.model_dump()) + + +@router.post('/mitm_dataset/viz/{uuid}/import/zip', response_class=StreamingResponse, + responses={200: {'content': {'application/zip': {}}}}) +def generate_visualizations_import_zip_for_tracked_dataset(orm_session: ORMSessionDependency, + tracked_dataset: TrackedMitMDatasetDependency, + request: GenerateVisualizationsRequest, + as_assets: bool = False) -> StreamingResponse: + importable = exec_viz_import_request(orm_session, tracked_dataset, request, as_assets=as_assets) + bio = io.BytesIO() + write_superset_import_as_zip(bio, importable) + bio.seek(0) + return StreamingResponse(bio, media_type='application/zip') diff --git a/app/routes/mitm_dataset/register_external.py b/app/routes/mitm_dataset/register_external.py index 0d794321baad779681624a346109cc1cc10e4ab8..57dfd492a6bc55a0fc18bc01e52e9495030728e1 100644 --- a/app/routes/mitm_dataset/register_external.py +++ b/app/routes/mitm_dataset/register_external.py @@ -34,7 +34,7 @@ def register_external_mitm_dataset( concept_table_name = mk_concept_table_name(mapping.mitm, mapping.concept) mapped_vvs.append(VirtualView.from_from_clause(concept_table_name, from_clause, result_meta)) - header = Header(mitm=request.mitm, header_entries=header_entries) + header = Header(mitm=request.mitm, header_entries=tuple(header_entries)) sql_rep_schema = mk_sql_rep_schema(header, view_generators=None) # TODO connect mapped_vvs to sql_rep_schema diff --git a/app/routes/mitm_dataset/upload.py b/app/routes/mitm_dataset/upload.py index 1ff088b3a67573d18f55328c67115b61ce3eced4..3513ffcac0c7a20807a578ff566470c87e2a82a9 100644 --- a/app/routes/mitm_dataset/upload.py +++ b/app/routes/mitm_dataset/upload.py @@ -4,7 +4,7 @@ import sqlmodel from mitm_tooling.definition import MITM from mitm_tooling.io import read_zip from mitm_tooling.representation import mk_sql_rep_schema, MITMData, insert_mitm_data -from mitm_tooling.transformation.superset.common import MitMDatasetInfo +from mitm_tooling.transformation.superset.common import DBConnectionInfo from mitm_tooling.utilities.identifiers import name_plus_uuid, mk_uuid from mitm_tooling.utilities.io_utils import DataSource from mitm_tooling.utilities.sql_utils import sa_url_into_any_url @@ -13,17 +13,26 @@ from sqlalchemy import Engine from app.db.models import TrackedMitMDataset from app.db.utils import create_schema from app.dependencies.db import get_engine +from app.routes.definitions.generate import mk_mitm_dataset_bundle -def upload_mitm_file(mitm: MITM, mitm_zip: DataSource, dataset_name: str, uuid:UUID | None = None, engine: Engine = None) -> TrackedMitMDataset: +def upload_mitm_file(mitm: MITM, + mitm_zip: DataSource, + dataset_name: str, + uuid: UUID | None = None, + engine: Engine = None) -> TrackedMitMDataset: mitm_data = read_zip(mitm_zip, mitm) return upload_mitm_data(mitm_data, dataset_name, uuid=uuid, engine=engine) -def upload_mitm_data(mitm_data: MITMData, dataset_name: str, uuid:UUID | None = None, engine: Engine = None) -> TrackedMitMDataset: + +def upload_mitm_data(mitm_data: MITMData, + dataset_name: str, + uuid: UUID | None = None, + engine: Engine = None) -> TrackedMitMDataset: engine = engine if engine is not None else get_engine() uuid = uuid or mk_uuid() unique_schema_name = name_plus_uuid(dataset_name, uuid, sep='_') - + sql_alchemy_uri = sa_url_into_any_url(engine.url) sql_rep_schema = mk_sql_rep_schema(mitm_data.header, override_schema=unique_schema_name, view_generators=None) with engine.connect() as connection: @@ -31,11 +40,18 @@ def upload_mitm_data(mitm_data: MITMData, dataset_name: str, uuid:UUID | None = insert_mitm_data(connection, sql_rep_schema, mitm_data) connection.commit() + mds_bundle = mk_mitm_dataset_bundle(mitm_data.header, + DBConnectionInfo(sql_alchemy_uri=sql_alchemy_uri, + schema_name=unique_schema_name), + dataset_name, + include_default_visualizations=False) + model = TrackedMitMDataset(uuid=uuid, dataset_name=dataset_name, schema_name=unique_schema_name, - sql_alchemy_uri=sa_url_into_any_url(engine.url), mitm_header=mitm_data.header) + sql_alchemy_uri=sql_alchemy_uri, mitm_header=mitm_data.header, identifier_bundle=mds_bundle.identifiers) + with sqlmodel.Session(engine) as session: session.add(model) session.commit() session.refresh(model) - return model \ No newline at end of file + return model diff --git a/helm/superset-mitm-service/templates/postgresql-auth-secret.yaml b/helm/superset-mitm-service/templates/postgresql-auth-secret.yaml index 354f22d3c0326468b86de2a52edb1e9119e0367e..5d626584841fc212b9a220e65083cfab0ab23032 100644 --- a/helm/superset-mitm-service/templates/postgresql-auth-secret.yaml +++ b/helm/superset-mitm-service/templates/postgresql-auth-secret.yaml @@ -19,12 +19,15 @@ apiVersion: v1 kind: Secret metadata: - name: {{ include "superset-mitm-service.fullname" . }}-postgresql-auth-env + name: {{ .Values.global.postgresql.configPrefix }}-postgresql-auth-env labels: {{- include "superset-mitm-service.labels" . | nindent 4 }} namespace: {{ .Release.Namespace }} type: Opaque stringData: - POSTGRES_USER: {{.Values.mitmDB.mitm_database_user | quote }} - POSTGRES_PASSWORD: {{.Values.mitmDB.mitm_database_password | quote }} - POSTGRES_DATABASE: {{.Values.mitmDB.mitm_database_db | quote }} + postgres-user: {{.Values.mitmDB.mitm_database_user | quote }} + postgres-password: {{.Values.mitmDB.mitm_database_password | quote }} + postgres-database: {{.Values.mitmDB.mitm_database_db | quote }} + # POSTGRES_USER: {{.Values.mitmDB.mitm_database_user | quote }} + # POSTGRES_PASSWORD: {{.Values.mitmDB.mitm_database_password | quote }} + # POSTGRES_DATABASE: {{.Values.mitmDB.mitm_database_db | quote }} diff --git a/helm/superset-mitm-service/templates/secret-env.yaml b/helm/superset-mitm-service/templates/secret-env.yaml index a0c99920853dfffb74c543c1f17a8c496392082f..45142c70864b8a24c7989213532a0236196fc387 100644 --- a/helm/superset-mitm-service/templates/secret-env.yaml +++ b/helm/superset-mitm-service/templates/secret-env.yaml @@ -28,6 +28,7 @@ stringData: MITM_DATABASE_DIALECT: {{.Values.mitmDB.mitm_database_dialect | quote }} MITM_DATABASE_USER: {{.Values.mitmDB.mitm_database_user | quote }} MITM_DATABASE_PASSWORD: {{.Values.mitmDB.mitm_database_password | quote }} - MITM_DATABASE_HOST: {{.Values.mitmDB.mitm_database_host | quote }} + MITM_DATABASE_HOST: {{ tpl .Values.mitmDB.mitm_database_host . | quote }} MITM_DATABASE_PORT: {{.Values.mitmDB.mitm_database_port | quote }} MITM_DATABASE_DB: {{ .Values.mitmDB.mitm_database_db | quote }} + diff --git a/helm/superset-mitm-service/values.yaml b/helm/superset-mitm-service/values.yaml index fe2731f87a0cfedc4e1e113faefbee6edc587f49..ad95f31cf3e0fd34ec313c719ce386706a757359 100644 --- a/helm/superset-mitm-service/values.yaml +++ b/helm/superset-mitm-service/values.yaml @@ -22,6 +22,13 @@ fullnameOverride: "" ingress: enabled: false +global: + postgresql: + configPrefix: "superset-mitm-service" + + security: + allowInsecureImages: true + # This section builds out the service account more information can be found here: https://kubernetes.io/docs/concepts/security/service-accounts/ serviceAccount: # Specifies whether a service account should be created @@ -75,7 +82,7 @@ startupProbe: httpGet: path: /health port: 8180 - initialDelaySeconds: 5 + initialDelaySeconds: 20 timeoutSeconds: 1 failureThreshold: 60 periodSeconds: 5 @@ -84,19 +91,19 @@ livenessProbe: httpGet: path: /health port: 8180 - initialDelaySeconds: 5 + initialDelaySeconds: 20 timeoutSeconds: 1 failureThreshold: 3 - periodSeconds: 5 + periodSeconds: 30 successThreshold: 1 readinessProbe: httpGet: path: /health port: 8180 - initialDelaySeconds: 5 + initialDelaySeconds: 20 timeoutSeconds: 1 failureThreshold: 3 - periodSeconds: 5 + periodSeconds: 30 successThreshold: 1 # This section is for setting up autoscaling more information can be found here: https://kubernetes.io/docs/concepts/workloads/autoscaling/ @@ -108,14 +115,21 @@ autoscaling: # targetMemoryUtilizationPercentage: 80 # Additional volumes on the output Deployment definition. -volumes: [ ] -# - name: foo -# secret: -# secretName: mysecret -# optional: false +volumes: + - name: uploads + emptyDir: + sizeLimit: 500Mi + - name: exports + emptyDir: + sizeLimit: 500Mi # Additional volumeMounts on the output Deployment definition. -volumeMounts: [ ] +volumeMounts: + - name: uploads + mountPath: /uploads + - name: exports + mountPath: /exports + # - name: foo # mountPath: "/etc/foo" # readOnly: true @@ -134,18 +148,15 @@ mitmDB: mitm_database_password: "superweirdpasswordpleasedonotcrack" mitm_database_host: "{{ .Release.Name }}-mitm-postgresql" mitm_database_port: "5432" - mitm_database_db: "mitm-db" + mitm_database_db: "mitm_db" connections: origin: "http://localhost:8080" # can be overridden with a template string apiConfig: - export_dir: "exports/" - upload_dir: "uploads/" + EXPORT_DIR: "/exports/" + UPLOAD_DIR: "/uploads/" -global: - security: - allowInsecureImages: true mitm-postgresql: # image: @@ -154,7 +165,8 @@ mitm-postgresql: # tag: latest-pg16 auth: - existingSecret: '{{ template "superset-mitm-service.fullname" . }}-postgresql-auth-env' + existingSecret: '{{ .Values.global.postgresql.configPrefix }}-postgresql-auth-env' + primary: ## @@ -173,6 +185,7 @@ mitm-postgresql: - ReadWriteOnce ## PostgreSQL port service: + ports: postgresql: 5432 diff --git a/justfile b/justfile index 4098ffaa502c383905ece9d9d0dfc6c7523431ec..5f3fb10ba5c9bdeac375d0347d73d6387bbd8de9 100644 --- a/justfile +++ b/justfile @@ -29,3 +29,5 @@ helm-package: helm-push a: helm-package # helm registry login registry-1.docker.io -u leahtgu helm push {{a}} oci://registry-1.docker.io/leahtgu + +kube: