From b33d48e2182a6a9e8c4323febbe694578320a924 Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Fri, 18 Jul 2025 12:35:19 +0200 Subject: [PATCH 1/4] upgraded rclone version --- ci/github/helpers/install_rclone_docker_volume_plugin.bash | 2 +- scripts/install_rclone.bash | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/github/helpers/install_rclone_docker_volume_plugin.bash b/ci/github/helpers/install_rclone_docker_volume_plugin.bash index 1f0e54658fbc..b8ec9552c533 100755 --- a/ci/github/helpers/install_rclone_docker_volume_plugin.bash +++ b/ci/github/helpers/install_rclone_docker_volume_plugin.bash @@ -10,7 +10,7 @@ set -o pipefail # don't hide errors within pipes IFS=$'\n\t' # Installation instructions from https://rclone.org/docker/ -R_CLONE_VERSION="1.66.0" +R_CLONE_VERSION="1.70.3" mkdir --parents /var/lib/docker-plugins/rclone/config mkdir --parents /var/lib/docker-plugins/rclone/cache docker plugin install rclone/docker-volume-rclone:amd64-${R_CLONE_VERSION} args="-v" --alias rclone --grant-all-permissions diff --git a/scripts/install_rclone.bash b/scripts/install_rclone.bash index e6378cdd9b34..31ec36302a9b 100755 --- a/scripts/install_rclone.bash +++ b/scripts/install_rclone.bash @@ -9,7 +9,7 @@ set -o nounset # abort on unbound variable set -o pipefail # don't hide errors within pipes IFS=$'\n\t' -R_CLONE_VERSION="1.63.1" +R_CLONE_VERSION="1.70.3" TARGETARCH="${TARGETARCH:-amd64}" echo "platform ${TARGETARCH}" From efa0435d9618758eba641f31b46e2638874be714 Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Fri, 18 Jul 2025 12:47:38 +0200 Subject: [PATCH 2/4] using faster settings for rclone --- .../src/settings_library/r_clone.py | 26 +++++++++++++++++++ .../simcore_sdk/node_ports_common/r_clone.py | 13 ++++++++-- .../simcore_service_agent/services/backup.py | 2 +- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/packages/settings-library/src/settings_library/r_clone.py b/packages/settings-library/src/settings_library/r_clone.py index d1a6472e9c67..adb87ee45726 100644 --- a/packages/settings-library/src/settings_library/r_clone.py +++ b/packages/settings-library/src/settings_library/r_clone.py @@ -36,3 +36,29 @@ class RCloneSettings(BaseCustomSettings): description="`--buffer-size X`: sets the amount of RAM to use for each individual transfer", ), ] = "16M" + + R_CLONE_OPTION_CHECKERS: Annotated[ + NonNegativeInt, + Field( + description="`--checkers X`: sets the number checkers", + ), + ] = 32 + + R_CLONE_S3_UPLOAD_CONCURRENCY: Annotated[ + NonNegativeInt, + Field( + description="`--s3-upload-concurrency X`: sets the number of concurrent uploads to S3", + ), + ] = 8 + + R_CLONE_CHUNK_SIZE: Annotated[ + str, + Field(description="`--s3-chunk-size X`: sets the chunk size for S3"), + ] = "128M" + + R_CLONE_ORDER_BY: Annotated[ + str, + Field( + description="`--order-by X`: sets the order of file upload, e.g., 'size,mixed'", + ), + ] = "size,mixed" diff --git a/packages/simcore-sdk/src/simcore_sdk/node_ports_common/r_clone.py b/packages/simcore-sdk/src/simcore_sdk/node_ports_common/r_clone.py index db5e107b753c..69b005e6ed0a 100644 --- a/packages/simcore-sdk/src/simcore_sdk/node_ports_common/r_clone.py +++ b/packages/simcore-sdk/src/simcore_sdk/node_ports_common/r_clone.py @@ -30,8 +30,7 @@ _logger = logging.getLogger(__name__) -class BaseRCloneError(OsparcErrorMixin, RuntimeError): - ... +class BaseRCloneError(OsparcErrorMixin, RuntimeError): ... class RCloneFailedError(BaseRCloneError): @@ -207,6 +206,16 @@ async def _sync_sources( # https://forum.rclone.org/t/how-to-set-a-memory-limit/10230/4 "--buffer-size", # docs https://rclone.org/docs/#buffer-size-size r_clone_settings.R_CLONE_OPTION_BUFFER_SIZE, + "--checkers", + f"{r_clone_settings.R_CLONE_OPTION_CHECKERS}", + "--s3-upload-concurrency", + f"{r_clone_settings.R_CLONE_S3_UPLOAD_CONCURRENCY}", + "--s3-chunk-size", + r_clone_settings.R_CLONE_CHUNK_SIZE, + # handles the order of file upload + "--order-by", + r_clone_settings.R_CLONE_ORDER_BY, + "--fast-list", "--use-json-log", # frequent polling for faster progress updates "--stats", diff --git a/services/agent/src/simcore_service_agent/services/backup.py b/services/agent/src/simcore_service_agent/services/backup.py index a7e125af0c42..ebd94ee27303 100644 --- a/services/agent/src/simcore_service_agent/services/backup.py +++ b/services/agent/src/simcore_service_agent/services/backup.py @@ -162,7 +162,7 @@ async def _store_in_s3( # below two options reduce to a minimum the memory footprint # https://forum.rclone.org/t/how-to-set-a-memory-limit/10230/4 "--buffer-size", # docs https://rclone.org/docs/#buffer-size-size - "0M", + "16M", "--stats", "5s", "--stats-one-line", From 55c43402e0b5d87549c7af8dc1951d0c2f5b695e Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Thu, 21 Aug 2025 10:50:47 +0200 Subject: [PATCH 3/4] removed unsued feature --- .github/workflows/ci-testing-deploy.yml | 2 - .../install_rclone_docker_volume_plugin.bash | 18 -- services/director-v2/requirements/_test.in | 1 - services/director-v2/requirements/_test.txt | 54 ----- .../core/settings.py | 8 - .../docker_service_specs/sidecar.py | 13 -- .../scheduler/_core/_events_utils.py | 15 +- .../modules/dynamic_sidecar/volumes.py | 101 +--------- ...t_dynamic_sidecar_nodeports_integration.py | 186 +++--------------- 9 files changed, 35 insertions(+), 363 deletions(-) delete mode 100755 ci/github/helpers/install_rclone_docker_volume_plugin.bash diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index b130c5254ba4..9c0f75fbd567 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -1590,8 +1590,6 @@ jobs: with: python-version: ${{ matrix.python }} cache-dependency-glob: "**/director-v2/requirements/ci.txt" - - name: setup rclone docker volume plugin - run: sudo ./ci/github/helpers/install_rclone_docker_volume_plugin.bash - name: Download and load Docker images uses: ./.github/actions/download-load-docker-images with: diff --git a/ci/github/helpers/install_rclone_docker_volume_plugin.bash b/ci/github/helpers/install_rclone_docker_volume_plugin.bash deleted file mode 100755 index b8ec9552c533..000000000000 --- a/ci/github/helpers/install_rclone_docker_volume_plugin.bash +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -# -# Installs the latest version of rclone plugin -# - -# http://redsymbol.net/articles/unofficial-bash-strict-mode/ -set -o errexit # abort on nonzero exitstatus -set -o nounset # abort on unbound variable -set -o pipefail # don't hide errors within pipes -IFS=$'\n\t' - -# Installation instructions from https://rclone.org/docker/ -R_CLONE_VERSION="1.70.3" -mkdir --parents /var/lib/docker-plugins/rclone/config -mkdir --parents /var/lib/docker-plugins/rclone/cache -docker plugin install rclone/docker-volume-rclone:amd64-${R_CLONE_VERSION} args="-v" --alias rclone --grant-all-permissions -docker plugin list -docker plugin inspect rclone diff --git a/services/director-v2/requirements/_test.in b/services/director-v2/requirements/_test.in index 34b5327e2538..409b03549001 100644 --- a/services/director-v2/requirements/_test.in +++ b/services/director-v2/requirements/_test.in @@ -10,7 +10,6 @@ --constraint _base.txt aio_pika -aioboto3 alembic # migration due to pytest_simcore.postgres_service2 asgi_lifespan async-asgi-testclient # replacement for fastapi.testclient.TestClient [see b) below] diff --git a/services/director-v2/requirements/_test.txt b/services/director-v2/requirements/_test.txt index 619015cc94b0..23366bd01891 100644 --- a/services/director-v2/requirements/_test.txt +++ b/services/director-v2/requirements/_test.txt @@ -2,33 +2,10 @@ aio-pika==9.5.5 # via # -c requirements/_base.txt # -r requirements/_test.in -aioboto3==14.3.0 - # via -r requirements/_test.in -aiobotocore==2.22.0 - # via aioboto3 -aiofiles==24.1.0 - # via - # -c requirements/_base.txt - # aioboto3 -aiohappyeyeballs==2.6.1 - # via - # -c requirements/_base.txt - # aiohttp -aiohttp==3.12.12 - # via - # -c requirements/../../../requirements/constraints.txt - # -c requirements/_base.txt - # aiobotocore -aioitertools==0.12.0 - # via aiobotocore aiormq==6.8.1 # via # -c requirements/_base.txt # aio-pika -aiosignal==1.3.2 - # via - # -c requirements/_base.txt - # aiohttp alembic==1.15.2 # via # -c requirements/_base.txt @@ -44,17 +21,9 @@ async-asgi-testclient==1.4.11 attrs==25.3.0 # via # -c requirements/_base.txt - # aiohttp # pytest-docker bokeh==3.7.3 # via dask -boto3==1.37.3 - # via aiobotocore -botocore==1.37.3 - # via - # aiobotocore - # boto3 - # s3transfer certifi==2025.4.26 # via # -c requirements/../../../requirements/constraints.txt @@ -103,11 +72,6 @@ fakeredis==2.30.3 # via -r requirements/_test.in flaky==3.8.1 # via -r requirements/_test.in -frozenlist==1.6.0 - # via - # -c requirements/_base.txt - # aiohttp - # aiosignal fsspec==2025.3.2 # via # -c requirements/_base.txt @@ -151,11 +115,6 @@ jinja2==3.1.6 # bokeh # dask # distributed -jmespath==1.0.1 - # via - # aiobotocore - # boto3 - # botocore locket==1.0.0 # via # -c requirements/_base.txt @@ -180,8 +139,6 @@ msgpack==1.1.0 multidict==6.4.4 # via # -c requirements/_base.txt - # aiobotocore - # aiohttp # async-asgi-testclient # yarl mypy==1.16.1 @@ -227,7 +184,6 @@ pprintpp==0.4.0 propcache==0.3.1 # via # -c requirements/_base.txt - # aiohttp # yarl psutil==7.0.0 # via @@ -263,8 +219,6 @@ pytest-xdist==3.8.0 python-dateutil==2.9.0.post0 # via # -c requirements/_base.txt - # aiobotocore - # botocore # pandas pytz==2025.2 # via pandas @@ -287,8 +241,6 @@ requests==2.32.4 # docker respx==0.22.0 # via -r requirements/_test.in -s3transfer==0.11.3 - # via boto3 six==1.17.0 # via # -c requirements/_base.txt @@ -348,21 +300,15 @@ urllib3==2.5.0 # via # -c requirements/../../../requirements/constraints.txt # -c requirements/_base.txt - # botocore # distributed # docker # requests -wrapt==1.17.2 - # via - # -c requirements/_base.txt - # aiobotocore xyzservices==2025.4.0 # via bokeh yarl==1.20.0 # via # -c requirements/_base.txt # aio-pika - # aiohttp # aiormq zict==3.0.0 # via 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 03f256b01b0e..72e830fff467 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 @@ -128,14 +128,6 @@ class AppSettings(BaseApplicationSettings, MixinLoggingSettings): ) DIRECTOR_V2_DEV_FEATURES_ENABLED: bool = False - DIRECTOR_V2_DEV_FEATURE_R_CLONE_MOUNTS_ENABLED: bool = Field( - default=False, - description=( - "Under development feature. If enabled state " - "is saved using rclone docker volumes." - ), - ) - # for passing self-signed certificate to spawned services DIRECTOR_V2_SELF_SIGNED_SSL_SECRET_ID: str = Field( default="", diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/sidecar.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/sidecar.py index dd05734f237f..2a2a8edabedf 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/sidecar.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/sidecar.py @@ -321,19 +321,6 @@ async def _get_mounts( storage_directory_name=_storage_directory_name, ) ) - # for now only enable this with dev features enabled - elif app_settings.DIRECTOR_V2_DEV_FEATURE_R_CLONE_MOUNTS_ENABLED: - mounts.append( - DynamicSidecarVolumesPathsResolver.mount_r_clone( - swarm_stack_name=dynamic_services_scheduler_settings.SWARM_STACK_NAME, - path=path_to_mount, - node_uuid=scheduler_data.node_uuid, - service_run_id=scheduler_data.run_id, - project_id=scheduler_data.project_id, - user_id=scheduler_data.user_id, - r_clone_settings=dynamic_sidecar_settings.DYNAMIC_SIDECAR_R_CLONE_SETTINGS, - ) - ) else: mounts.append( DynamicSidecarVolumesPathsResolver.mount_entry( diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_utils.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_utils.py index e5083d5895cd..3aec31d163dd 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_utils.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_utils.py @@ -356,16 +356,10 @@ async def attempt_pod_removal_and_data_saving( try: tasks = [ - service_push_outputs(app, scheduler_data.node_uuid, sidecars_client) + service_push_outputs(app, scheduler_data.node_uuid, sidecars_client), + service_save_state(app, scheduler_data.node_uuid, sidecars_client), ] - # When enabled no longer uploads state via nodeports - # It uses rclone mounted volumes for this task. - if not app_settings.DIRECTOR_V2_DEV_FEATURE_R_CLONE_MOUNTS_ENABLED: - tasks.append( - service_save_state(app, scheduler_data.node_uuid, sidecars_client) - ) - await logged_gather(*tasks, max_concurrency=2) scheduler_data.dynamic_sidecar.were_state_and_outputs_saved = True @@ -547,11 +541,8 @@ async def _restore_service_state_with_metrics() -> None: tasks = [ _pull_user_services_images_with_metrics(), _pull_output_ports_with_metrics(), + _restore_service_state_with_metrics(), ] - # When enabled no longer downloads state via nodeports - # S3 is used to store state paths - if not app_settings.DIRECTOR_V2_DEV_FEATURE_R_CLONE_MOUNTS_ENABLED: - tasks.append(_restore_service_state_with_metrics()) await limited_gather(*tasks, limit=3) diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/volumes.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/volumes.py index bf375b29eede..71630b814cb4 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/volumes.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/volumes.py @@ -1,6 +1,6 @@ import os from pathlib import Path -from typing import Any +from typing import Any, Final from models_library.api_schemas_directorv2.services import ( CHARS_IN_VOLUME_NAME_BEFORE_DIR_NAME, @@ -20,72 +20,8 @@ WRITE_SIZE, AwsEfsSettings, ) -from settings_library.r_clone import S3Provider -from ...core.dynamic_services_settings.sidecar import RCloneSettings -from .errors import DynamicSidecarError - -DY_SIDECAR_SHARED_STORE_PATH = Path("/shared-store") - - -def _get_s3_volume_driver_config( - r_clone_settings: RCloneSettings, - project_id: ProjectID, - node_uuid: NodeID, - storage_directory_name: str, -) -> dict[str, Any]: - assert "/" not in storage_directory_name # nosec - driver_config: dict[str, Any] = { - "Name": "rclone", - "Options": { - "type": "s3", - "s3-access_key_id": r_clone_settings.R_CLONE_S3.S3_ACCESS_KEY, - "s3-secret_access_key": r_clone_settings.R_CLONE_S3.S3_SECRET_KEY, - "path": f"{r_clone_settings.R_CLONE_S3.S3_BUCKET_NAME}/{project_id}/{node_uuid}/{storage_directory_name}", - "allow-other": "true", - "vfs-cache-mode": r_clone_settings.R_CLONE_VFS_CACHE_MODE.value, - # Directly connected to how much time it takes for - # files to appear on remote s3, please se discussion - # SEE https://forum.rclone.org/t/file-added-to-s3-on-one-machine-not-visible-on-2nd-machine-unless-mount-is-restarted/20645 - # SEE https://rclone.org/commands/rclone_mount/#vfs-directory-cache - "dir-cache-time": f"{r_clone_settings.R_CLONE_DIR_CACHE_TIME_SECONDS}s", - "poll-interval": f"{r_clone_settings.R_CLONE_POLL_INTERVAL_SECONDS}s", - }, - } - if r_clone_settings.R_CLONE_S3.S3_ENDPOINT: - driver_config["Options"][ - "s3-endpoint" - ] = r_clone_settings.R_CLONE_S3.S3_ENDPOINT - - extra_options: dict[str, str] | None = None - - if r_clone_settings.R_CLONE_PROVIDER == S3Provider.MINIO: - extra_options = { - "s3-provider": "Minio", - "s3-region": "us-east-1", - "s3-location_constraint": "", - "s3-server_side_encryption": "", - } - elif r_clone_settings.R_CLONE_PROVIDER == S3Provider.CEPH: - extra_options = { - "s3-provider": "Ceph", - "s3-acl": "private", - } - elif r_clone_settings.R_CLONE_PROVIDER == S3Provider.AWS: - extra_options = { - "s3-provider": "AWS", - "s3-region": r_clone_settings.R_CLONE_S3.S3_REGION, - "s3-acl": "private", - } - else: - msg = f"Unexpected, all {S3Provider.__name__} should be covered" - raise DynamicSidecarError(msg=msg) - - assert extra_options is not None # nosec - options: dict[str, Any] = driver_config["Options"] - options.update(extra_options) - - return driver_config +DY_SIDECAR_SHARED_STORE_PATH: Final[Path] = Path("/shared-store") def _get_efs_volume_driver_config( @@ -225,39 +161,6 @@ def mount_user_preferences( volume_size_limit="10M" if has_quota_support else None, ) - @classmethod - def mount_r_clone( - cls, - swarm_stack_name: str, - path: Path, - node_uuid: NodeID, - service_run_id: ServiceRunID, - project_id: ProjectID, - user_id: UserID, - r_clone_settings: RCloneSettings, - ) -> dict[str, Any]: - return { - "Source": cls.source(path, node_uuid, service_run_id), - "Target": cls.target(path), - "Type": "volume", - "VolumeOptions": { - "Labels": { - "source": cls.source(path, node_uuid, service_run_id), - "run_id": f"{service_run_id}", - "node_uuid": f"{node_uuid}", - "study_id": f"{project_id}", - "user_id": f"{user_id}", - "swarm_stack_name": swarm_stack_name, - }, - "DriverConfig": _get_s3_volume_driver_config( - r_clone_settings=r_clone_settings, - project_id=project_id, - node_uuid=node_uuid, - storage_directory_name=cls.volume_name(path).strip("_"), - ), - }, - } - @classmethod def mount_efs( cls, diff --git a/services/director-v2/tests/integration/02/test_dynamic_sidecar_nodeports_integration.py b/services/director-v2/tests/integration/02/test_dynamic_sidecar_nodeports_integration.py index 66d68768f059..b2364beabaa4 100644 --- a/services/director-v2/tests/integration/02/test_dynamic_sidecar_nodeports_integration.py +++ b/services/director-v2/tests/integration/02/test_dynamic_sidecar_nodeports_integration.py @@ -14,7 +14,6 @@ from typing import Any, NamedTuple, cast from uuid import uuid4 -import aioboto3 import aiodocker import httpx import pytest @@ -94,7 +93,6 @@ is_legacy, patch_dynamic_service_url, run_command, - sleep_for, ) from yarl import URL @@ -330,26 +328,6 @@ async def db_manager(sqlalchemy_async_engine: AsyncEngine) -> DBManager: return DBManager(sqlalchemy_async_engine, application_name=APP_NAME) -def _is_docker_r_clone_plugin_installed() -> bool: - return "rclone:" in run_command("docker plugin ls") - - -@pytest.fixture( - scope="session", - params={ - # NOTE: There is an issue with the docker rclone volume plugin: - # SEE https://github.com/rclone/rclone/issues/6059 - # Disabling rclone test until this is fixed. - # "true", - "false", - }, -) -def dev_feature_r_clone_enabled(request) -> str: - if request.param == "true" and not _is_docker_r_clone_plugin_installed(): - pytest.skip("Required docker plugin `rclone` not installed.") - return request.param - - @pytest.fixture async def patch_storage_setup( mocker: MockerFixture, @@ -375,7 +353,6 @@ def mock_env( mock_env: EnvVarsDict, monkeypatch: pytest.MonkeyPatch, network_name: str, - dev_feature_r_clone_enabled: str, dask_scheduler_service: str, dask_scheduler_auth: ClusterAuthentication, minimal_configuration: None, @@ -422,7 +399,6 @@ def mock_env( "RABBIT_HOST": f"{get_localhost_ip()}", "POSTGRES_HOST": f"{get_localhost_ip()}", "R_CLONE_PROVIDER": "MINIO", - "DIRECTOR_V2_DEV_FEATURE_R_CLONE_MOUNTS_ENABLED": dev_feature_r_clone_enabled, "COMPUTATIONAL_BACKEND_ENABLED": "true", "COMPUTATIONAL_BACKEND_DASK_CLIENT_ENABLED": "true", "COMPUTATIONAL_BACKEND_DEFAULT_CLUSTER_URL": dask_scheduler_service, @@ -711,36 +687,6 @@ async def _fetch_data_via_data_manager( return save_to -async def _fetch_data_via_aioboto( - r_clone_settings: RCloneSettings, - dir_tag: str, - temp_dir: Path, - node_id: NodeIDStr, - project_id: ProjectID, -) -> Path: - save_to = temp_dir / f"aioboto_{dir_tag}_{uuid4()}" - save_to.mkdir(parents=True, exist_ok=True) - - session = aioboto3.Session( - aws_access_key_id=r_clone_settings.R_CLONE_S3.S3_ACCESS_KEY, - aws_secret_access_key=r_clone_settings.R_CLONE_S3.S3_SECRET_KEY, - ) - async with session.resource( - "s3", endpoint_url=r_clone_settings.R_CLONE_S3.S3_ENDPOINT - ) as s3: - bucket = await s3.Bucket(r_clone_settings.R_CLONE_S3.S3_BUCKET_NAME) - async for s3_object in bucket.objects.all(): - key_path = f"{project_id}/{node_id}/{DY_SERVICES_R_CLONE_DIR_NAME}/" - if s3_object.key.startswith(key_path): - file_object = await s3_object.get() - file_path = save_to / s3_object.key.replace(key_path, "") - print(f"Saving file to {file_path}") - file_content = await file_object["Body"].read() - file_path.write_bytes(file_content) - - return save_to - - async def _start_and_wait_for_dynamic_services_ready( director_v2_client: httpx.AsyncClient, product_name: str, @@ -1075,39 +1021,13 @@ async def test_nodeports_integration( app_settings.DYNAMIC_SERVICES.DYNAMIC_SIDECAR.DYNAMIC_SIDECAR_R_CLONE_SETTINGS ) - if app_settings.DIRECTOR_V2_DEV_FEATURE_R_CLONE_MOUNTS_ENABLED: - await sleep_for( - WAIT_FOR_R_CLONE_VOLUME_TO_SYNC_DATA, - "Waiting for rclone to sync data from the docker volume", - ) - - dy_path_volume_before = ( - await _fetch_data_via_aioboto( - r_clone_settings=r_clone_settings, - dir_tag="dy", - temp_dir=tmp_path, - node_id=services_node_uuids.dy, - project_id=current_study.uuid, - ) - if app_settings.DIRECTOR_V2_DEV_FEATURE_R_CLONE_MOUNTS_ENABLED - else await _fetch_data_from_container( - dir_tag="dy", service_uuid=services_node_uuids.dy, temp_dir=tmp_path - ) + dy_path_volume_before = await _fetch_data_from_container( + dir_tag="dy", service_uuid=services_node_uuids.dy, temp_dir=tmp_path ) - dy_compose_spec_path_volume_before = ( - await _fetch_data_via_aioboto( - r_clone_settings=r_clone_settings, - dir_tag="dy_compose_spec", - temp_dir=tmp_path, - node_id=services_node_uuids.dy_compose_spec, - project_id=current_study.uuid, - ) - if app_settings.DIRECTOR_V2_DEV_FEATURE_R_CLONE_MOUNTS_ENABLED - else await _fetch_data_from_container( - dir_tag="dy_compose_spec", - service_uuid=services_node_uuids.dy_compose_spec, - temp_dir=tmp_path, - ) + dy_compose_spec_path_volume_before = await _fetch_data_from_container( + dir_tag="dy_compose_spec", + service_uuid=services_node_uuids.dy_compose_spec, + temp_dir=tmp_path, ) # STEP 5 @@ -1125,52 +1045,26 @@ async def test_nodeports_integration( await _wait_for_dy_services_to_fully_stop(async_client) - if app_settings.DIRECTOR_V2_DEV_FEATURE_R_CLONE_MOUNTS_ENABLED: - await sleep_for( - WAIT_FOR_R_CLONE_VOLUME_TO_SYNC_DATA, - "Waiting for rclone to sync data from the docker volume", - ) - - dy_path_data_manager_before = ( - await _fetch_data_via_aioboto( - r_clone_settings=r_clone_settings, - dir_tag="dy", - temp_dir=tmp_path, - node_id=services_node_uuids.dy, - project_id=current_study.uuid, - ) - if app_settings.DIRECTOR_V2_DEV_FEATURE_R_CLONE_MOUNTS_ENABLED - else await _fetch_data_via_data_manager( - r_clone_settings=r_clone_settings, - dir_tag="dy", - user_id=current_user["id"], - project_id=current_study.uuid, - service_uuid=NodeID(services_node_uuids.dy), - temp_dir=tmp_path, - io_log_redirect_cb=mock_io_log_redirect_cb, - faker=faker, - ) + dy_path_data_manager_before = await _fetch_data_via_data_manager( + r_clone_settings=r_clone_settings, + dir_tag="dy", + user_id=current_user["id"], + project_id=current_study.uuid, + service_uuid=NodeID(services_node_uuids.dy), + temp_dir=tmp_path, + io_log_redirect_cb=mock_io_log_redirect_cb, + faker=faker, ) - dy_compose_spec_path_data_manager_before = ( - await _fetch_data_via_aioboto( - r_clone_settings=r_clone_settings, - dir_tag="dy_compose_spec", - temp_dir=tmp_path, - node_id=services_node_uuids.dy_compose_spec, - project_id=current_study.uuid, - ) - if app_settings.DIRECTOR_V2_DEV_FEATURE_R_CLONE_MOUNTS_ENABLED - else await _fetch_data_via_data_manager( - r_clone_settings=r_clone_settings, - dir_tag="dy_compose_spec", - user_id=current_user["id"], - project_id=current_study.uuid, - service_uuid=NodeID(services_node_uuids.dy_compose_spec), - temp_dir=tmp_path, - io_log_redirect_cb=mock_io_log_redirect_cb, - faker=faker, - ) + dy_compose_spec_path_data_manager_before = await _fetch_data_via_data_manager( + r_clone_settings=r_clone_settings, + dir_tag="dy_compose_spec", + user_id=current_user["id"], + project_id=current_study.uuid, + service_uuid=NodeID(services_node_uuids.dy_compose_spec), + temp_dir=tmp_path, + io_log_redirect_cb=mock_io_log_redirect_cb, + faker=faker, ) # STEP 6 @@ -1185,33 +1079,13 @@ async def test_nodeports_integration( catalog_url=services_endpoint["catalog"], ) - dy_path_volume_after = ( - await _fetch_data_via_aioboto( - r_clone_settings=r_clone_settings, - dir_tag="dy", - temp_dir=tmp_path, - node_id=services_node_uuids.dy, - project_id=current_study.uuid, - ) - if app_settings.DIRECTOR_V2_DEV_FEATURE_R_CLONE_MOUNTS_ENABLED - else await _fetch_data_from_container( - dir_tag="dy", service_uuid=services_node_uuids.dy, temp_dir=tmp_path - ) + dy_path_volume_after = await _fetch_data_from_container( + dir_tag="dy", service_uuid=services_node_uuids.dy, temp_dir=tmp_path ) - dy_compose_spec_path_volume_after = ( - await _fetch_data_via_aioboto( - r_clone_settings=r_clone_settings, - dir_tag="dy_compose_spec", - temp_dir=tmp_path, - node_id=services_node_uuids.dy_compose_spec, - project_id=current_study.uuid, - ) - if app_settings.DIRECTOR_V2_DEV_FEATURE_R_CLONE_MOUNTS_ENABLED - else await _fetch_data_from_container( - dir_tag="dy_compose_spec", - service_uuid=services_node_uuids.dy_compose_spec, - temp_dir=tmp_path, - ) + dy_compose_spec_path_volume_after = await _fetch_data_from_container( + dir_tag="dy_compose_spec", + service_uuid=services_node_uuids.dy_compose_spec, + temp_dir=tmp_path, ) # STEP 7 From 9ff8d304af57c1018d6cc99ccb3ca898787b03df Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Thu, 21 Aug 2025 10:56:14 +0200 Subject: [PATCH 4/4] removed unused --- .../modules/dynamic_sidecar/docker_service_specs/sidecar.py | 2 -- .../modules/dynamic_sidecar/scheduler/_core/_events_utils.py | 1 - 2 files changed, 3 deletions(-) diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/sidecar.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/sidecar.py index 2a2a8edabedf..485447466d65 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/sidecar.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/sidecar.py @@ -241,7 +241,6 @@ async def _get_mounts( scheduler_data: SchedulerData, dynamic_sidecar_settings: DynamicSidecarSettings, dynamic_services_scheduler_settings: DynamicServicesSchedulerSettings, - app_settings: AppSettings, has_quota_support: bool, rpc_client: RabbitMQRPCClient, is_efs_enabled: bool, @@ -433,7 +432,6 @@ async def get_dynamic_sidecar_spec( # pylint:disable=too-many-arguments# noqa: scheduler_data=scheduler_data, dynamic_services_scheduler_settings=dynamic_services_scheduler_settings, dynamic_sidecar_settings=dynamic_sidecar_settings, - app_settings=app_settings, has_quota_support=has_quota_support, rpc_client=rpc_client, is_efs_enabled=user_extra_properties.is_efs_enabled, diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_utils.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_utils.py index 3aec31d163dd..205585ec779f 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_utils.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_utils.py @@ -472,7 +472,6 @@ async def wait_for_sidecar_api(app: FastAPI, scheduler_data: SchedulerData) -> N async def prepare_services_environment( app: FastAPI, scheduler_data: SchedulerData ) -> None: - app_settings: AppSettings = app.state.settings sidecars_client = await get_sidecars_client(app, scheduler_data.node_uuid) dynamic_sidecar_endpoint = scheduler_data.endpoint