Skip to content

Commit 10f15d0

Browse files
author
Andrei Neagu
committed
extracted common interface
1 parent 7c604d4 commit 10f15d0

File tree

2 files changed

+66
-53
lines changed

2 files changed

+66
-53
lines changed

services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/api/rest/containers_extension.py

Lines changed: 9 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
1-
import logging
21
from typing import Annotated
32

4-
from aiodocker.networks import DockerNetwork
53
from fastapi import APIRouter, Depends, FastAPI
64
from fastapi import Path as PathParam
75
from fastapi import Request, Response, status
86
from models_library.services import ServiceOutput
97
from pydantic.main import BaseModel
108

11-
from ...core.docker_utils import docker_client
129
from ...services import container_extensions
1310
from ._dependencies import get_application
1411

15-
_logger = logging.getLogger(__name__)
16-
1712

1813
class CreateDirsRequestItem(BaseModel):
1914
outputs_labels: dict[str, ServiceOutput]
@@ -91,33 +86,11 @@ async def attach_container_to_network(
9186
container_id: Annotated[str, PathParam(..., alias="id")],
9287
) -> None:
9388
assert request # nosec
94-
95-
async with docker_client() as docker:
96-
container_instance = await docker.containers.get(container_id)
97-
container_inspect = await container_instance.show()
98-
99-
attached_network_ids: set[str] = {
100-
x["NetworkID"]
101-
for x in container_inspect["NetworkSettings"]["Networks"].values()
102-
}
103-
104-
if item.network_id in attached_network_ids:
105-
_logger.debug(
106-
"Container %s already attached to network %s",
107-
container_id,
108-
item.network_id,
109-
)
110-
return
111-
112-
# NOTE: A docker network is only visible on a docker node when it is
113-
# used by a container
114-
network = DockerNetwork(docker=docker, id_=item.network_id)
115-
await network.connect(
116-
{
117-
"Container": container_id,
118-
"EndpointConfig": {"Aliases": item.network_aliases},
119-
}
120-
)
89+
await container_extensions.attach_container_to_network(
90+
container_id=container_id,
91+
network_id=item.network_id,
92+
network_aliases=item.network_aliases,
93+
)
12194

12295

12396
@router.post(
@@ -130,23 +103,7 @@ async def detach_container_from_network(
130103
item: DetachContainerFromNetworkItem,
131104
container_id: Annotated[str, PathParam(..., alias="id")],
132105
) -> None:
133-
async with docker_client() as docker:
134-
container_instance = await docker.containers.get(container_id)
135-
container_inspect = await container_instance.show()
136-
137-
attached_network_ids: set[str] = set(
138-
container_inspect["NetworkSettings"]["Networks"].keys()
139-
)
140-
141-
if item.network_id not in attached_network_ids:
142-
_logger.debug(
143-
"Container %s already detached from network %s",
144-
container_id,
145-
item.network_id,
146-
)
147-
return
148-
149-
# NOTE: A docker network is only visible on a docker node when it is
150-
# used by a container
151-
network = DockerNetwork(docker=docker, id_=item.network_id)
152-
await network.disconnect({"Container": container_id, "Force": True})
106+
await container_extensions.detach_container_from_network(
107+
container_id=container_id,
108+
network_id=item.network_id,
109+
)

services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/services/container_extensions.py

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import logging
22

3+
from aiodocker.networks import DockerNetwork
34
from fastapi import FastAPI
45
from models_library.services import ServiceOutput
56
from simcore_sdk.node_ports_v2.port_utils import is_file_type
67

8+
from ..core.docker_utils import docker_client
79
from ..modules.inputs import disable_inputs_pulling, enable_inputs_pulling
810
from ..modules.mounted_fs import MountedVolumes
911
from ..modules.outputs import (
@@ -30,7 +32,7 @@ async def toggle_ports_io(
3032

3133

3234
async def create_output_dirs(
33-
app: FastAPI, outputs_labels: dict[str, ServiceOutput]
35+
app: FastAPI, *, outputs_labels: dict[str, ServiceOutput]
3436
) -> None:
3537
mounted_volumes: MountedVolumes = app.state.mounted_volumes
3638
outputs_context: OutputsContext = app.state.outputs_context
@@ -52,3 +54,57 @@ async def create_output_dirs(
5254
)
5355
await outputs_context.set_file_type_port_keys(file_type_port_keys)
5456
outputs_context.non_file_type_port_keys = non_file_port_keys
57+
58+
59+
async def attach_container_to_network(
60+
*, container_id: str, network_id: str, network_aliases: list[str]
61+
) -> None:
62+
async with docker_client() as docker:
63+
container_instance = await docker.containers.get(container_id)
64+
container_inspect = await container_instance.show()
65+
66+
attached_network_ids: set[str] = {
67+
x["NetworkID"]
68+
for x in container_inspect["NetworkSettings"]["Networks"].values()
69+
}
70+
71+
if network_id in attached_network_ids:
72+
_logger.debug(
73+
"Container %s already attached to network %s",
74+
container_id,
75+
network_id,
76+
)
77+
return
78+
79+
# NOTE: A docker network is only visible on a docker node when it is
80+
# used by a container
81+
network = DockerNetwork(docker=docker, id_=network_id)
82+
await network.connect(
83+
{
84+
"Container": container_id,
85+
"EndpointConfig": {"Aliases": network_aliases},
86+
}
87+
)
88+
89+
90+
async def detach_container_from_network(*, container_id: str, network_id: str) -> None:
91+
async with docker_client() as docker:
92+
container_instance = await docker.containers.get(container_id)
93+
container_inspect = await container_instance.show()
94+
95+
attached_network_ids: set[str] = set(
96+
container_inspect["NetworkSettings"]["Networks"].keys()
97+
)
98+
99+
if network_id not in attached_network_ids:
100+
_logger.debug(
101+
"Container %s already detached from network %s",
102+
container_id,
103+
network_id,
104+
)
105+
return
106+
107+
# NOTE: A docker network is only visible on a docker node when it is
108+
# used by a container
109+
network = DockerNetwork(docker=docker, id_=network_id)
110+
await network.disconnect({"Container": container_id, "Force": True})

0 commit comments

Comments
 (0)