diff --git a/entities/api/files.py b/entities/api/files.py index e6297510..f1cb63d3 100644 --- a/entities/api/files.py +++ b/entities/api/files.py @@ -21,7 +21,7 @@ get_settings, get_sts_client, ) -from platformics.api.core.settings import APISettings +from settings import APISettings from sqlalchemy.ext.asyncio import AsyncSession from platformics.security.authorization import CerbosAction, get_resource_query from files.format_handlers import get_validator diff --git a/entities/api/main.py b/entities/api/main.py index 46933494..c5e950ba 100644 --- a/entities/api/main.py +++ b/entities/api/main.py @@ -7,7 +7,7 @@ from cerbos.sdk.model import Principal from fastapi import Depends, FastAPI from platformics.api.core.deps import get_auth_principal, get_cerbos_client, get_engine -from platformics.api.core.settings import APISettings +from settings import APISettings from platformics.api.core.gql_loaders import ( EntityLoader, get_base_creator, @@ -111,7 +111,7 @@ def get_context( # Make sure tests can get their own instances of the app. def get_app() -> FastAPI: - settings = APISettings.parse_obj({}) # Workaround for https://github.com/pydantic/pydantic/issues/3753 + settings = APISettings.model_validate({}) # Workaround for https://github.com/pydantic/pydantic/issues/3753 # Add a global settings object to the app that we can use as a dependency graphql_app: GraphQLRouter = GraphQLRouter(schema, context_getter=get_context, graphiql=True) diff --git a/entities/database_migrations/env.py b/entities/database_migrations/env.py index 79601e65..70a9f136 100644 --- a/entities/database_migrations/env.py +++ b/entities/database_migrations/env.py @@ -4,7 +4,7 @@ from sqlalchemy import create_engine from database.models import meta -from platformics.api.core.settings import CLISettings +from settings import CLISettings # this is the Alembic Config object, which provides # access to the values within the .ini file in use. @@ -33,7 +33,7 @@ def run_migrations_offline() -> None: script output. """ - settings = CLISettings.parse_obj({}) + settings = CLISettings.model_validate({}) context.configure( url=settings.SYNC_DB_URI, target_metadata=target_metadata, @@ -53,7 +53,7 @@ def run_migrations_online() -> None: and associate a connection with the context. """ - settings = CLISettings.parse_obj({}) + settings = CLISettings.model_validate({}) connectable = create_engine(settings.SYNC_DB_URI) with connectable.connect() as connection: diff --git a/entities/scripts/create_db.py b/entities/scripts/create_db.py index 07abad6b..8a7faaf9 100644 --- a/entities/scripts/create_db.py +++ b/entities/scripts/create_db.py @@ -1,9 +1,9 @@ -from platformics.api.core.settings import APISettings +from settings import APISettings from sqlalchemy_utils import create_database, database_exists def create_db() -> None: - settings = APISettings.parse_obj({}) + settings = APISettings.model_validate({}) db_uri = settings.SYNC_DB_URI if database_exists(db_uri): print("Database already exists!") diff --git a/entities/scripts/seed.py b/entities/scripts/seed.py index 87d38747..d4bb1121 100644 --- a/entities/scripts/seed.py +++ b/entities/scripts/seed.py @@ -1,11 +1,11 @@ from platformics.database.connect import init_sync_db from test_infra import factories as fa import factory.random -from platformics.api.core.settings import CLISettings +from settings import CLISettings def use_factoryboy() -> None: - settings = CLISettings.parse_obj({}) + settings = CLISettings.model_validate({}) app_db = init_sync_db(settings.SYNC_DB_URI) session = app_db.session() fa.SessionStorage.set_session(session) diff --git a/platformics/api/core/deps.py b/platformics/api/core/deps.py index 2b8105da..418ba8de 100644 --- a/platformics/api/core/deps.py +++ b/platformics/api/core/deps.py @@ -7,7 +7,7 @@ from fastapi import Depends from mypy_boto3_s3.client import S3Client from mypy_boto3_sts.client import STSClient -from platformics.api.core.settings import APISettings +from settings import APISettings from platformics.database.connect import AsyncDB, init_async_db from platformics.security.token_auth import get_token_claims from sqlalchemy.ext.asyncio import AsyncSession diff --git a/platformics/cli/generate_token.py b/platformics/cli/generate_token.py index 6c7f82c9..ab12f2d7 100755 --- a/platformics/cli/generate_token.py +++ b/platformics/cli/generate_token.py @@ -2,7 +2,7 @@ import logging import click -from platformics.api.core.settings import Settings +from settings import Settings from platformics.security.token_auth import ProjectRole, create_token @click.group() @@ -47,7 +47,7 @@ def auth() -> None: @click.pass_context def generate_token(ctx: click.Context, userid: int, project: list[str], expiration: int) -> None: - settings = Settings.parse_obj({}) + settings = Settings.model_validate({}) private_key = settings.JWK_PRIVATE_KEY project_dict: dict[int, list[str]] = {} diff --git a/platformics/api/core/settings.py b/platformics/settings.py similarity index 90% rename from platformics/api/core/settings.py rename to platformics/settings.py index 78ec097b..da43bc72 100644 --- a/platformics/api/core/settings.py +++ b/platformics/settings.py @@ -1,19 +1,9 @@ from functools import cached_property from jwcrypto import jwk -from pydantic import BaseModel from pydantic_settings import BaseSettings, SettingsConfigDict -class RedisEventBusSettings(BaseModel): - REDIS_URL: str - QUEUE_NAME: str - - -class EventBusSettings(BaseModel): - REDIS: RedisEventBusSettings - - class Settings(BaseSettings): """Pydantic Settings object - do not instantiate it directly, please use get_settings() as a dependency where possible""" @@ -47,11 +37,6 @@ class Settings(BaseSettings): BOTO_ENDPOINT_URL: str AWS_REGION: str - PLATFORMICS_WORKFLOW_RUNNER_PLUGIN: str - - PLATFORMICS_EVENT_BUS_PLUGIN: str - PLATFORMICS_EVENT_BUS: EventBusSettings - ############################################################################ # Computed properties diff --git a/workflows/api/main.py b/workflows/api/main.py index 2bc53633..b53194ad 100644 --- a/workflows/api/main.py +++ b/workflows/api/main.py @@ -8,7 +8,7 @@ from config import load_event_bus, load_workflow_runners from fastapi import APIRouter, Depends, FastAPI, Request from platformics.api.core.deps import get_auth_principal, get_cerbos_client, get_db_session, get_engine -from platformics.api.core.settings import APISettings +from settings import APISettings from platformics.api.core.strawberry_extensions import DependencyExtension from platformics.database.connect import AsyncDB from sqlalchemy.ext.asyncio import AsyncSession diff --git a/workflows/config.py b/workflows/config.py index 129ec901..45dab1b7 100644 --- a/workflows/config.py +++ b/workflows/config.py @@ -1,6 +1,6 @@ from importlib.metadata import entry_points from typing import Dict -from platformics.api.core.settings import APISettings +from settings import APISettings from plugin_types import EventBus, WorkflowRunner diff --git a/workflows/database_migrations/env.py b/workflows/database_migrations/env.py index 4fc61a5f..b9ee7af3 100644 --- a/workflows/database_migrations/env.py +++ b/workflows/database_migrations/env.py @@ -2,7 +2,7 @@ from alembic import context from database.models import meta -from platformics.api.core.settings import CLISettings +from settings import CLISettings from sqlalchemy import create_engine # this is the Alembic Config object, which provides @@ -38,7 +38,7 @@ def run_migrations_offline() -> None: script output. """ - settings = CLISettings.parse_obj({}) + settings = CLISettings.model_validate({}) context.configure( url=settings.SYNC_DB_URI, target_metadata=target_metadata, @@ -57,7 +57,7 @@ def run_migrations_online() -> None: and associate a connection with the context. """ - settings = CLISettings.parse_obj({}) + settings = CLISettings.model_validate({}) connectable = create_engine(settings.SYNC_DB_URI) with connectable.connect() as connection: diff --git a/workflows/plugins/event_bus/redis/event_bus_redis.py b/workflows/plugins/event_bus/redis/event_bus_redis.py index 6cd3584e..48233cf9 100644 --- a/workflows/plugins/event_bus/redis/event_bus_redis.py +++ b/workflows/plugins/event_bus/redis/event_bus_redis.py @@ -1,7 +1,7 @@ import json from typing import List -from platformics.api.core.settings import RedisEventBusSettings +from settings import RedisEventBusSettings from plugin_types import EventBus, WorkflowStatusMessage, parse_workflow_status_message import redis.asyncio as aioredis diff --git a/workflows/run_loader.py b/workflows/run_loader.py index 9522ddd9..755948d8 100644 --- a/workflows/run_loader.py +++ b/workflows/run_loader.py @@ -2,12 +2,12 @@ from config import load_event_bus from loader import LoaderDriver -from platformics.api.core.settings import APISettings +from settings import APISettings from platformics.database.connect import init_async_db if __name__ == "__main__": print("Starting loader listener") - settings = APISettings.parse_obj({}) + settings = APISettings.model_validate({}) app_db = init_async_db(settings.DB_URI) session = app_db.session() diff --git a/workflows/scripts/create_db.py b/workflows/scripts/create_db.py index 07abad6b..8a7faaf9 100644 --- a/workflows/scripts/create_db.py +++ b/workflows/scripts/create_db.py @@ -1,9 +1,9 @@ -from platformics.api.core.settings import APISettings +from settings import APISettings from sqlalchemy_utils import create_database, database_exists def create_db() -> None: - settings = APISettings.parse_obj({}) + settings = APISettings.model_validate({}) db_uri = settings.SYNC_DB_URI if database_exists(db_uri): print("Database already exists!") diff --git a/workflows/scripts/seed.py b/workflows/scripts/seed.py index 5eb74153..0b03ef98 100644 --- a/workflows/scripts/seed.py +++ b/workflows/scripts/seed.py @@ -1,6 +1,6 @@ import factory.random from factoryboy import workflow_factory as wf -from platformics.api.core.settings import APISettings +from settings import APISettings from platformics.database.connect import init_sync_db from manifest import import_manifests diff --git a/workflows/settings.py b/workflows/settings.py new file mode 100644 index 00000000..558a2a7c --- /dev/null +++ b/workflows/settings.py @@ -0,0 +1,29 @@ +from pydantic import BaseModel + +from platformics.settings import Settings as PlatformicsSettings +from platformics.settings import APISettings as PlatformicsAPISettings +from platformics.settings import CLISettings as PlatformicCLISettings + +class RedisEventBusSettings(BaseModel): + REDIS_URL: str + QUEUE_NAME: str + + +class EventBusSettings(BaseModel): + REDIS: RedisEventBusSettings + + +class Settings(PlatformicsSettings): + PLATFORMICS_WORKFLOW_RUNNER_PLUGIN: str + + PLATFORMICS_EVENT_BUS_PLUGIN: str + PLATFORMICS_EVENT_BUS: EventBusSettings + + +class APISettings(PlatformicsAPISettings, Settings): + ... + + +class CLISettings(PlatformicCLISettings, Settings): + ... +