Skip to content

Commit 13b6062

Browse files
GitHKAndrei Neagu
andauthored
🐛 fixes issue with agent not executing in correct container (#8256)
Co-authored-by: Andrei Neagu <[email protected]>
1 parent 236d3a1 commit 13b6062

File tree

2 files changed

+45
-5
lines changed

2 files changed

+45
-5
lines changed

services/agent/src/simcore_service_agent/services/backup.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import asyncio
2+
import json
23
import logging
3-
import os
4+
import socket
45
import tempfile
56
from asyncio.streams import StreamReader
67
from datetime import timedelta
@@ -9,6 +10,7 @@
910
from typing import Final
1011
from uuid import uuid4
1112

13+
import httpx
1214
from fastapi import FastAPI
1315
from servicelib.container_utils import run_command_in_container
1416
from settings_library.utils_r_clone import resolve_provider
@@ -112,8 +114,28 @@ def _log_expected_operation(
112114
_logger.log(log_level, formatted_message)
113115

114116

117+
def _get_self_container_ip() -> str:
118+
return socket.gethostbyname(socket.gethostname())
119+
120+
121+
async def _get_self_container() -> str:
122+
ip = _get_self_container_ip()
123+
124+
async with httpx.AsyncClient(
125+
transport=httpx.AsyncHTTPTransport(uds="/var/run/docker.sock")
126+
) as client:
127+
response = await client.get("http://localhost/containers/json")
128+
for entry in response.json():
129+
if ip in json.dumps(entry):
130+
container_id: str = entry["Id"]
131+
return container_id
132+
133+
msg = "Could not determine self container ID"
134+
raise RuntimeError(msg)
135+
136+
115137
async def _ensure_permissions_on_source_dir(source_dir: Path) -> None:
116-
self_container = os.environ["HOSTNAME"]
138+
self_container = await _get_self_container()
117139
await run_command_in_container(
118140
self_container,
119141
command=f"chmod -R o+rX '{source_dir}'",

services/agent/tests/unit/test_services_backup.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
from models_library.projects_nodes_io import NodeID
1616
from models_library.services_types import ServiceRunID
1717
from pydantic import NonNegativeInt
18+
from pytest_mock import MockerFixture
19+
from servicelib.container_utils import run_command_in_container
1820
from simcore_service_agent.core.settings import ApplicationSettings
1921
from simcore_service_agent.services.backup import backup_volume
2022
from simcore_service_agent.services.docker_utils import get_volume_details
@@ -42,7 +44,7 @@ def volume_content(tmpdir: Path) -> Path:
4244
@pytest.fixture
4345
async def mock_container_with_data(
4446
volume_content: Path, monkeypatch: pytest.MonkeyPatch
45-
) -> AsyncIterable[None]:
47+
) -> AsyncIterable[str]:
4648
async with aiodocker.Docker() as client:
4749
container = await client.containers.run(
4850
config={
@@ -56,7 +58,7 @@ async def mock_container_with_data(
5658
container_name = container_inspect["Name"][1:]
5759
monkeypatch.setenv("HOSTNAME", container_name)
5860

59-
yield None
61+
yield container_inspect["Id"]
6062

6163
await container.delete(force=True)
6264

@@ -68,8 +70,24 @@ def downlaoded_from_s3(tmpdir: Path) -> Path:
6870
return path
6971

7072

73+
@pytest.fixture
74+
async def mock__get_self_container_ip(
75+
mock_container_with_data: str,
76+
mocker: MockerFixture,
77+
) -> None:
78+
container_ip = await run_command_in_container(
79+
mock_container_with_data, command="hostname -i"
80+
)
81+
82+
mocker.patch(
83+
"simcore_service_agent.services.backup._get_self_container_ip",
84+
return_value=container_ip.strip(),
85+
)
86+
87+
7188
async def test_backup_volume(
72-
mock_container_with_data: None,
89+
mock_container_with_data: str,
90+
mock__get_self_container_ip: None,
7391
volume_content: Path,
7492
project_id: ProjectID,
7593
swarm_stack_name: str,

0 commit comments

Comments
 (0)