diff --git a/services/director-v2/src/simcore_service_director_v2/core/settings.py b/services/director-v2/src/simcore_service_director_v2/core/settings.py index 6b9c64de4a3..249bbe836ec 100644 --- a/services/director-v2/src/simcore_service_director_v2/core/settings.py +++ b/services/director-v2/src/simcore_service_director_v2/core/settings.py @@ -16,6 +16,7 @@ NoAuthentication, ) from pydantic import ( + AfterValidator, AliasChoices, AnyHttpUrl, AnyUrl, @@ -251,10 +252,14 @@ class AppSettings(BaseApplicationSettings, MixinLoggingSettings): description="resource usage tracker service client's plugin", ) - DIRECTOR_V2_PUBLIC_API_BASE_URL: AnyHttpUrl = Field( - ..., - description="Base URL used to access the public api e.g. http://127.0.0.1:6000 for development or https://api.osparc.io", - ) + DIRECTOR_V2_PUBLIC_API_BASE_URL: Annotated[ + AnyHttpUrl | str, + AfterValidator(lambda v: f"{v}".rstrip("/")), + Field( + ..., + description="Base URL used to access the public api e.g. http://127.0.0.1:6000 for development or https://api.osparc.io", + ), + ] DIRECTOR_V2_TRACING: TracingSettings | None = Field( json_schema_extra={"auto_default_from_env": True}, description="settings for opentelemetry tracing", diff --git a/services/director-v2/src/simcore_service_director_v2/modules/osparc_variables/substitutions.py b/services/director-v2/src/simcore_service_director_v2/modules/osparc_variables/substitutions.py index 2249937341d..22a7bef360d 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/osparc_variables/substitutions.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/osparc_variables/substitutions.py @@ -1,6 +1,4 @@ -""" Substitution of osparc variables and secrets - -""" +"""Substitution of osparc variables and secrets""" import functools import logging @@ -24,6 +22,7 @@ from pydantic import BaseModel from servicelib.fastapi.app_state import SingletonInAppStateMixin from servicelib.logging_utils import log_context +from simcore_service_director_v2.core.settings import get_application_settings from ...utils.db import get_repository from ...utils.osparc_variables import ( @@ -194,6 +193,7 @@ async def resolve_and_substitute_session_variables_in_model( # if it raises an error vars need replacement raise_if_unresolved_osparc_variable_identifier_found(model) except UnresolvedOsparcVariableIdentifierError: + app_settings = get_application_settings(app) table = OsparcSessionVariablesTable.get_from_app_state(app) identifiers = await resolve_variables_from_context( table.copy(), @@ -204,7 +204,7 @@ async def resolve_and_substitute_session_variables_in_model( project_id=project_id, node_id=node_id, run_id=service_run_id, - api_server_base_url=app.state.settings.DIRECTOR_V2_PUBLIC_API_BASE_URL, + api_server_base_url=app_settings.DIRECTOR_V2_PUBLIC_API_BASE_URL, ), ) _logger.debug("replacing with the identifiers=%s", identifiers) @@ -238,6 +238,7 @@ async def resolve_and_substitute_session_variables_in_specs( identifiers_to_replace, ) if identifiers_to_replace: + app_settings = get_application_settings(app) environs = await resolve_variables_from_context( table.copy(include=identifiers_to_replace), context=ContextDict( @@ -247,7 +248,7 @@ async def resolve_and_substitute_session_variables_in_specs( project_id=project_id, node_id=node_id, run_id=service_run_id, - api_server_base_url=app.state.settings.DIRECTOR_V2_PUBLIC_API_BASE_URL, + api_server_base_url=app_settings.DIRECTOR_V2_PUBLIC_API_BASE_URL, ), )