async def test_client( minimal_configuration: None, loop: asyncio.BaseEventLoop, mock_env: None, network_name: str, monkeypatch, ) -> TestClient: monkeypatch.setenv("SC_BOOT_MODE", "production") monkeypatch.setenv("DYNAMIC_SIDECAR_EXPOSE_PORT", "true") monkeypatch.setenv("SIMCORE_SERVICES_NETWORK_NAME", network_name) monkeypatch.delenv("DYNAMIC_SIDECAR_MOUNT_PATH_DEV", raising=False) monkeypatch.setenv("DIRECTOR_V2_DYNAMIC_SCHEDULER_ENABLED", "true") monkeypatch.setenv("DIRECTOR_V2_CELERY_SCHEDULER_ENABLED", "false") monkeypatch.setenv("DIRECTOR_V2_DASK_CLIENT_ENABLED", "false") monkeypatch.setenv("DIRECTOR_V2_DASK_SCHEDULER_ENABLED", "false") monkeypatch.setenv("POSTGRES_HOST", "mocked_host") monkeypatch.setenv("POSTGRES_USER", "mocked_user") monkeypatch.setenv("POSTGRES_PASSWORD", "mocked_password") monkeypatch.setenv("POSTGRES_DB", "mocked_db") monkeypatch.setenv("DIRECTOR_V2_POSTGRES_ENABLED", "false") settings = AppSettings.create_from_envs() app = init_app(settings) async with TestClient(app) as client: yield client
async def test_client( minimal_configuration: None, mock_env: None, network_name: str, mocked_engine: AsyncMock, monkeypatch, ) -> AsyncIterable[TestClient]: monkeypatch.setenv("SC_BOOT_MODE", "production") monkeypatch.setenv("DYNAMIC_SIDECAR_EXPOSE_PORT", "true") monkeypatch.setenv("SIMCORE_SERVICES_NETWORK_NAME", network_name) monkeypatch.delenv("DYNAMIC_SIDECAR_MOUNT_PATH_DEV", raising=False) monkeypatch.setenv("DIRECTOR_V2_DYNAMIC_SCHEDULER_ENABLED", "true") monkeypatch.setenv("DIRECTOR_V2_DASK_CLIENT_ENABLED", "false") monkeypatch.setenv("DIRECTOR_V2_DASK_SCHEDULER_ENABLED", "false") monkeypatch.setenv("POSTGRES_HOST", "mocked_host") monkeypatch.setenv("POSTGRES_USER", "mocked_user") monkeypatch.setenv("POSTGRES_PASSWORD", "mocked_password") monkeypatch.setenv("POSTGRES_DB", "mocked_db") monkeypatch.setenv("DIRECTOR_V2_POSTGRES_ENABLED", "false") monkeypatch.setenv("R_CLONE_S3_PROVIDER", "MINIO") # patch host for dynamic-sidecar, not reachable via localhost # the dynamic-sidecar (running inside a container) will use # this address to reach the rabbit service monkeypatch.setenv("RABBIT_HOST", f"{get_localhost_ip()}") settings = AppSettings.create_from_envs() app = init_app(settings) app.state.engine = mocked_engine async with TestClient(app) as client: yield client
def dynamic_sidecar_settings(simcore_services_network_name: str, monkeypatch: MonkeyPatch) -> AppSettings: monkeypatch.setenv("REGISTRY_AUTH", "false") monkeypatch.setenv("REGISTRY_USER", "test") monkeypatch.setenv("REGISTRY_PW", "test") monkeypatch.setenv("REGISTRY_SSL", "false") monkeypatch.setenv("SIMCORE_SERVICES_NETWORK_NAME", simcore_services_network_name) monkeypatch.setenv("TRAEFIK_SIMCORE_ZONE", "test_traefik_zone") monkeypatch.setenv("SWARM_STACK_NAME", "test_swarm_name") monkeypatch.setenv("DYNAMIC_SIDECAR_IMAGE", "local/dynamic-sidecar:MOCKED") monkeypatch.setenv("POSTGRES_HOST", "mocked_out") monkeypatch.setenv("POSTGRES_USER", "mocked_out") monkeypatch.setenv("POSTGRES_PASSWORD", "mocked_out") monkeypatch.setenv("POSTGRES_DB", "mocked_out") monkeypatch.setenv("DIRECTOR_HOST", "mocked_out") monkeypatch.setenv("SC_BOOT_MODE", "local-development") monkeypatch.setenv( "DIRECTOR_V2_DYNAMIC_SCHEDULER_INTERVAL_SECONDS", str(TEST_SCHEDULER_INTERVAL_SECONDS), ) monkeypatch.setenv("R_CLONE_S3_PROVIDER", "MINIO") app_settings = AppSettings.create_from_envs() return app_settings
def client(mock_env: None) -> Iterable[TestClient]: settings = AppSettings.create_from_envs() app = init_app(settings) print("Application settings\n", pformat(settings)) # NOTE: this way we ensure the events are run in the application # since it starts the app on a test server with TestClient(app, raise_server_exceptions=True) as client: yield client
def client(loop) -> TestClient: settings = AppSettings.create_from_env(boot_mode=BootModeEnum.PRODUCTION) app = init_app(settings) # NOTE: this way we ensure the events are run in the application # since it starts the app on a test server with TestClient(app, raise_server_exceptions=True) as client: yield client
def test_dask_clients_pool_missing_raises_configuration_error( minimal_dask_config: None, monkeypatch: MonkeyPatch): monkeypatch.setenv("DIRECTOR_V2_DASK_CLIENT_ENABLED", "0") settings = AppSettings.create_from_envs() app = init_app(settings) with TestClient(app, raise_server_exceptions=True) as client: with pytest.raises(ConfigurationError): DaskClientsPool.instance(client.app)
def test_settings_with_project_env_devel(project_env_devel_environment): # loads from environ settings = AppSettings.create_from_envs() print("captured settings: \n", settings.json(indent=2)) assert settings.SC_BOOT_MODE == BootModeEnum.DEBUG assert settings.LOG_LEVEL == LogLevel.DEBUG assert settings.POSTGRES.dsn == "postgresql://*****:*****@localhost:5432/test"
def test_loading_env_devel_in_settings(project_env_devel_environment): # loads from environ settings = AppSettings.create_from_env() print("captured settings: \n", settings.json(indent=2)) assert settings.boot_mode == BootModeEnum.DEBUG assert settings.loglevel == logging.DEBUG assert settings.postgres.dsn == "postgresql://*****:*****@localhost:5432/test"
def test_dask_clients_pool_properly_setup_and_deleted( minimal_dask_config: None, mocker: MockerFixture): mocked_dask_clients_pool = mocker.patch( "simcore_service_director_v2.modules.dask_clients_pool.DaskClientsPool", autospec=True, ) mocked_dask_clients_pool.create.return_value = mocked_dask_clients_pool settings = AppSettings.create_from_envs() app = init_app(settings) with TestClient(app, raise_server_exceptions=True) as client: mocked_dask_clients_pool.create.assert_called_once() mocked_dask_clients_pool.delete.assert_called_once()
async def initialized_app(monkeypatch: MonkeyPatch) -> Iterator[FastAPI]: monkeypatch.setenv("DYNAMIC_SIDECAR_IMAGE", "itisfoundation/dynamic-sidecar:MOCK") monkeypatch.setenv("SIMCORE_SERVICES_NETWORK_NAME", "test_network_name") monkeypatch.setenv("TRAEFIK_SIMCORE_ZONE", "test_traefik_zone") monkeypatch.setenv("SWARM_STACK_NAME", "test_swarm_name") monkeypatch.setenv("DIRECTOR_V2_DYNAMIC_SCHEDULER_ENABLED", "false") monkeypatch.setenv("SC_BOOT_MODE", "production") settings = AppSettings.create_from_envs() app = init_app(settings) async with LifespanManager(app): yield app
def test_scheduler_raises_exception_for_missing_dependencies( minimal_celery_scheduler_config: None, aiopg_engine: Iterator[aiopg.sa.engine.Engine], # type: ignore monkeypatch: MonkeyPatch, missing_dependency: str, ): # disable the dependency monkeypatch.setenv(missing_dependency, "0") # create the client settings = AppSettings.create_from_envs() app = init_app(settings) with pytest.raises(ConfigurationError): with TestClient(app, raise_server_exceptions=True) as _: pass
def dynamic_sidecar_settings(monkeypatch: MonkeyPatch) -> AppSettings: monkeypatch.setenv("DYNAMIC_SIDECAR_IMAGE", "local/dynamic-sidecar:MOCKED") monkeypatch.setenv("POSTGRES_HOST", "mocked_out") monkeypatch.setenv("POSTGRES_USER", "mocked_out") monkeypatch.setenv("POSTGRES_PASSWORD", "mocked_out") monkeypatch.setenv("POSTGRES_DB", "mocked_out") monkeypatch.setenv("DIRECTOR_HOST", "mocked_out") monkeypatch.setenv("SC_BOOT_MODE", "local-development") monkeypatch.setenv( "DIRECTOR_V2_DYNAMIC_SCHEDULER_INTERVAL_SECONDS", str(TEST_SCHEDULER_INTERVAL_SECONDS), ) app_settings = AppSettings.create_from_envs() return app_settings
async def director_v2_client( minimal_configuration: None, network_name: str, monkeypatch, ) -> AsyncIterable[httpx.AsyncClient]: # Works as below line in docker.compose.yml # ${DOCKER_REGISTRY:-itisfoundation}/dynamic-sidecar:${DOCKER_IMAGE_TAG:-latest} registry = os.environ.get("DOCKER_REGISTRY", "local") image_tag = os.environ.get("DOCKER_IMAGE_TAG", "production") image_name = f"{registry}/dynamic-sidecar:{image_tag}" logger.warning("Patching to: DYNAMIC_SIDECAR_IMAGE=%s", image_name) monkeypatch.setenv("DYNAMIC_SIDECAR_IMAGE", image_name) monkeypatch.setenv("TRAEFIK_SIMCORE_ZONE", "test_traefik_zone") monkeypatch.setenv("SWARM_STACK_NAME", "test_swarm_name") monkeypatch.setenv("SC_BOOT_MODE", "production") monkeypatch.setenv("DYNAMIC_SIDECAR_EXPOSE_PORT", "true") monkeypatch.setenv("PROXY_EXPOSE_PORT", "true") monkeypatch.setenv("SIMCORE_SERVICES_NETWORK_NAME", network_name) monkeypatch.delenv("DYNAMIC_SIDECAR_MOUNT_PATH_DEV", raising=False) monkeypatch.setenv("DIRECTOR_V2_DYNAMIC_SCHEDULER_ENABLED", "true") monkeypatch.setenv("DIRECTOR_V2_DASK_CLIENT_ENABLED", "false") monkeypatch.setenv("DIRECTOR_V2_DASK_SCHEDULER_ENABLED", "false") monkeypatch.setenv("POSTGRES_HOST", "mocked_host") monkeypatch.setenv("POSTGRES_USER", "mocked_user") monkeypatch.setenv("POSTGRES_PASSWORD", "mocked_password") monkeypatch.setenv("POSTGRES_DB", "mocked_db") monkeypatch.setenv("DIRECTOR_V2_POSTGRES_ENABLED", "false") monkeypatch.setenv("R_CLONE_S3_PROVIDER", "MINIO") # patch host for dynamic-sidecar, not reachable via localhost # the dynamic-sidecar (running inside a container) will use # this address to reach the rabbit service monkeypatch.setenv("RABBIT_HOST", f"{get_ip()}") settings = AppSettings.create_from_envs() app = init_app(settings) async with LifespanManager(app): async with httpx.AsyncClient( app=app, base_url="http://testserver/v2" ) as client: yield client
def test_dynamic_sidecar_env_vars( monkeypatch: MonkeyPatch, scheduler_data_from_http_request: SchedulerData) -> None: for key, value in MOCKED_BASE_REGISTRY_ENV_VARS.items(): monkeypatch.setenv(key, value) app_settings = AppSettings.create_from_envs() dynamic_sidecar_env_vars = _get_environment_variables( "compose_namespace", scheduler_data_from_http_request, app_settings) print("dynamic_sidecar_env_vars:", dynamic_sidecar_env_vars) assert len(dynamic_sidecar_env_vars) == len( EXPECTED_DYNAMIC_SIDECAR_ENV_VAR_NAMES) assert set( dynamic_sidecar_env_vars) == EXPECTED_DYNAMIC_SIDECAR_ENV_VAR_NAMES
async def initialized_app(mock_env: None) -> AsyncIterable[FastAPI]: settings = AppSettings.create_from_envs() app = init_app(settings) async with LifespanManager(app): yield app
def test_settings_with_env_devel(mock_env_devel_environment): settings = AppSettings.create_from_envs() print("captured settings: \n", settings.json(indent=2)) assert settings