Skip to content

Commit f4dc38b

Browse files
matusdrobuliak66mrnicegyu11
authored andcommitted
🎨 efs improvements (group extra properties) 🗃️ (ITISFoundation#6493)
1 parent 783bb1d commit f4dc38b

File tree

9 files changed

+88
-34
lines changed

9 files changed

+88
-34
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"""add `enable_efs` to group extra properties
2+
3+
Revision ID: ea3952fe5a0e
4+
Revises: 8a742f3efdd9
5+
Create Date: 2024-10-07 06:24:42.464942+00:00
6+
7+
"""
8+
import sqlalchemy as sa
9+
from alembic import op
10+
11+
# revision identifiers, used by Alembic.
12+
revision = "ea3952fe5a0e"
13+
down_revision = "8a742f3efdd9"
14+
branch_labels = None
15+
depends_on = None
16+
17+
18+
def upgrade():
19+
# ### commands auto generated by Alembic - please adjust! ###
20+
op.add_column(
21+
"groups_extra_properties",
22+
sa.Column(
23+
"enable_efs", sa.Boolean(), server_default=sa.text("false"), nullable=False
24+
),
25+
)
26+
# ### end Alembic commands ###
27+
28+
29+
def downgrade():
30+
# ### commands auto generated by Alembic - please adjust! ###
31+
op.drop_column("groups_extra_properties", "enable_efs")
32+
# ### end Alembic commands ###

packages/postgres-database/src/simcore_postgres_database/models/groups_extra_properties.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,13 @@
6363
server_default=sa.sql.expression.false(),
6464
doc="If true, will send telemetry for new style dynamic services to frontend",
6565
),
66+
sa.Column(
67+
"enable_efs",
68+
sa.Boolean(),
69+
nullable=False,
70+
server_default=sa.sql.expression.false(),
71+
doc="If true, will mount efs distributed file system when dynamic services starts",
72+
),
6673
sa.UniqueConstraint(
6774
"group_id", "product_name", name="group_id_product_name_uniqueness"
6875
),

packages/postgres-database/src/simcore_postgres_database/utils_groups_extra_properties.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class GroupExtraProperties(FromRowMixin):
3232
enable_telemetry: bool
3333
created: datetime.datetime
3434
modified: datetime.datetime
35+
enable_efs: bool
3536

3637

3738
async def _list_table_entries_ordered_by_group_type(

services/director-v2/src/simcore_service_director_v2/modules/db/repositories/groups_extra_properties.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from pydantic import BaseModel
12
from simcore_postgres_database.utils_groups_extra_properties import (
23
GroupExtraProperties,
34
GroupExtraPropertiesRepo,
@@ -6,6 +7,12 @@
67
from ._base import BaseRepository
78

89

10+
class UserExtraProperties(BaseModel):
11+
is_internet_enabled: bool
12+
is_telemetry_enabled: bool
13+
is_efs_enabled: bool
14+
15+
916
class GroupsExtraPropertiesRepository(BaseRepository):
1017
async def _get_aggregated_properties_for_user(
1118
self,
@@ -31,3 +38,15 @@ async def is_telemetry_enabled(self, *, user_id: int, product_name: str) -> bool
3138
)
3239
telemetry_enabled: bool = group_extra_properties.enable_telemetry
3340
return telemetry_enabled
41+
42+
async def get_user_extra_properties(
43+
self, *, user_id: int, product_name: str
44+
) -> UserExtraProperties:
45+
group_extra_properties = await self._get_aggregated_properties_for_user(
46+
user_id=user_id, product_name=product_name
47+
)
48+
return UserExtraProperties(
49+
is_internet_enabled=group_extra_properties.internet_access,
50+
is_telemetry_enabled=group_extra_properties.enable_telemetry,
51+
is_efs_enabled=group_extra_properties.enable_efs,
52+
)

services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/sidecar.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
from ....core.dynamic_services_settings.sidecar import DynamicSidecarSettings
3131
from ....core.settings import AppSettings
3232
from ....models.dynamic_services_scheduler import SchedulerData
33+
from ....modules.db.repositories.groups_extra_properties import UserExtraProperties
3334
from .._namespace import get_compose_namespace
3435
from ..volumes import DynamicSidecarVolumesPathsResolver
3536
from ._constants import DOCKER_CONTAINER_SPEC_RESTART_POLICY_DEFAULTS
@@ -220,6 +221,7 @@ async def _get_mounts(
220221
app_settings: AppSettings,
221222
has_quota_support: bool,
222223
rpc_client: RabbitMQRPCClient,
224+
is_efs_enabled: bool,
223225
) -> list[dict[str, Any]]:
224226
mounts: list[dict[str, Any]] = [
225227
# docker socket needed to use the docker api
@@ -270,18 +272,9 @@ async def _get_mounts(
270272
)
271273
)
272274

273-
# We check whether user has access to EFS feature
274-
use_efs = False
275-
efs_settings = dynamic_sidecar_settings.DYNAMIC_SIDECAR_EFS_SETTINGS
276-
if (
277-
efs_settings
278-
and scheduler_data.user_id in efs_settings.EFS_ONLY_ENABLED_FOR_USERIDS
279-
):
280-
use_efs = True
281-
282275
# state paths now get mounted via different driver and are synced to s3 automatically
283276
for path_to_mount in scheduler_data.paths_mapping.state_paths:
284-
if use_efs:
277+
if is_efs_enabled:
285278
assert dynamic_sidecar_settings.DYNAMIC_SIDECAR_EFS_SETTINGS # nosec
286279

287280
_storage_directory_name = DynamicSidecarVolumesPathsResolver.volume_name(
@@ -411,10 +404,9 @@ async def get_dynamic_sidecar_spec( # pylint:disable=too-many-arguments# noqa:
411404
app_settings: AppSettings,
412405
*,
413406
has_quota_support: bool,
414-
allow_internet_access: bool,
415407
hardware_info: HardwareInfo | None,
416408
metrics_collection_allowed: bool,
417-
telemetry_enabled: bool,
409+
user_extra_properties: UserExtraProperties,
418410
rpc_client: RabbitMQRPCClient,
419411
) -> AioDockerServiceSpec:
420412
"""
@@ -434,6 +426,7 @@ async def get_dynamic_sidecar_spec( # pylint:disable=too-many-arguments# noqa:
434426
app_settings=app_settings,
435427
has_quota_support=has_quota_support,
436428
rpc_client=rpc_client,
429+
is_efs_enabled=user_extra_properties.is_efs_enabled,
437430
)
438431

439432
ports = _get_ports(
@@ -512,9 +505,9 @@ async def get_dynamic_sidecar_spec( # pylint:disable=too-many-arguments# noqa:
512505
compose_namespace,
513506
scheduler_data,
514507
app_settings,
515-
allow_internet_access=allow_internet_access,
508+
allow_internet_access=user_extra_properties.is_internet_enabled,
516509
metrics_collection_allowed=metrics_collection_allowed,
517-
telemetry_enabled=telemetry_enabled,
510+
telemetry_enabled=user_extra_properties.is_telemetry_enabled,
518511
),
519512
"Hosts": [],
520513
"Image": dynamic_sidecar_settings.DYNAMIC_SIDECAR_IMAGE,

services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_event_create_sidecars.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,8 @@ async def action(cls, app: FastAPI, scheduler_data: SchedulerData) -> None:
181181
groups_extra_properties = get_repository(app, GroupsExtraPropertiesRepository)
182182

183183
assert scheduler_data.product_name is not None # nosec
184-
allow_internet_access: bool = await groups_extra_properties.has_internet_access(
184+
185+
user_extra_properties = await groups_extra_properties.get_user_extra_properties(
185186
user_id=scheduler_data.user_id, product_name=scheduler_data.product_name
186187
)
187188

@@ -194,7 +195,7 @@ async def action(cls, app: FastAPI, scheduler_data: SchedulerData) -> None:
194195
"uuid": f"{scheduler_data.node_uuid}", # needed for removal when project is closed
195196
},
196197
"Attachable": True,
197-
"Internal": not allow_internet_access,
198+
"Internal": not user_extra_properties.is_internet_enabled,
198199
}
199200
dynamic_sidecar_network_id = await create_network(network_config)
200201

@@ -217,11 +218,6 @@ async def action(cls, app: FastAPI, scheduler_data: SchedulerData) -> None:
217218
# generate a new `run_id` to avoid resource collisions
218219
scheduler_data.run_id = RunID.create()
219220

220-
# telemetry configuration
221-
is_telemetry_enabled = await groups_extra_properties.is_telemetry_enabled(
222-
user_id=scheduler_data.user_id, product_name=scheduler_data.product_name
223-
)
224-
225221
rpc_client: RabbitMQRPCClient = app.state.rabbitmq_rpc_client
226222

227223
# WARNING: do NOT log, this structure has secrets in the open
@@ -235,9 +231,8 @@ async def action(cls, app: FastAPI, scheduler_data: SchedulerData) -> None:
235231
app_settings=app.state.settings,
236232
hardware_info=scheduler_data.hardware_info,
237233
has_quota_support=dynamic_services_scheduler_settings.DYNAMIC_SIDECAR_ENABLE_VOLUME_LIMITS,
238-
allow_internet_access=allow_internet_access,
239234
metrics_collection_allowed=metrics_collection_allowed,
240-
telemetry_enabled=is_telemetry_enabled,
235+
user_extra_properties=user_extra_properties,
241236
rpc_client=rpc_client,
242237
)
243238

services/director-v2/tests/unit/with_dbs/test_modules_dynamic_sidecar_docker_service_specs.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
)
3939
from simcore_service_director_v2.models.dynamic_services_scheduler import SchedulerData
4040
from simcore_service_director_v2.modules.catalog import CatalogClient
41+
from simcore_service_director_v2.modules.db.repositories.groups_extra_properties import (
42+
UserExtraProperties,
43+
)
4144
from simcore_service_director_v2.modules.dynamic_sidecar.docker_service_specs import (
4245
get_dynamic_sidecar_spec,
4346
)
@@ -451,9 +454,12 @@ async def test_get_dynamic_proxy_spec(
451454
app_settings=minimal_app.state.settings,
452455
hardware_info=hardware_info,
453456
has_quota_support=False,
454-
allow_internet_access=False,
455457
metrics_collection_allowed=True,
456-
telemetry_enabled=True,
458+
user_extra_properties=UserExtraProperties(
459+
is_internet_enabled=False,
460+
is_telemetry_enabled=True,
461+
is_efs_enabled=False,
462+
),
457463
rpc_client=Mock(),
458464
)
459465

@@ -546,9 +552,12 @@ async def test_merge_dynamic_sidecar_specs_with_user_specific_specs(
546552
app_settings=minimal_app.state.settings,
547553
hardware_info=hardware_info,
548554
has_quota_support=False,
549-
allow_internet_access=False,
550555
metrics_collection_allowed=True,
551-
telemetry_enabled=True,
556+
user_extra_properties=UserExtraProperties(
557+
is_internet_enabled=False,
558+
is_telemetry_enabled=True,
559+
is_efs_enabled=False,
560+
),
552561
rpc_client=Mock(),
553562
)
554563
assert dynamic_sidecar_spec

services/efs-guardian/Dockerfile

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -168,14 +168,12 @@ ENV SC_BUILD_TARGET=production \
168168
ENV PYTHONOPTIMIZE=TRUE
169169

170170
WORKDIR /home/efs
171-
# ensure home folder is read/writable for user efs
172-
RUN chown -R efs /home/efs
173171

174172
# Starting from clean base image, copies pre-installed virtualenv from prod-only-deps
175-
COPY --chown=efs:efs --from=prod-only-deps ${VIRTUAL_ENV} ${VIRTUAL_ENV}
173+
COPY --from=prod-only-deps ${VIRTUAL_ENV} ${VIRTUAL_ENV}
176174

177175
# Copies booting scripts
178-
COPY --chown=efs:efs services/efs-guardian/docker services/efs-guardian/docker
176+
COPY services/efs-guardian/docker services/efs-guardian/docker
179177
RUN chmod +x services/efs-guardian/docker/*.sh
180178

181179

@@ -205,7 +203,7 @@ ENV SC_BUILD_TARGET=development \
205203

206204
WORKDIR /devel
207205

208-
RUN chown -R efs:efs "${VIRTUAL_ENV}"
206+
RUN chown -R root:root "${VIRTUAL_ENV}"
209207

210208
ENTRYPOINT ["/bin/sh", "services/efs-guardian/docker/entrypoint.sh"]
211209
CMD ["/bin/sh", "services/efs-guardian/docker/boot.sh"]

services/efs-guardian/docker/entrypoint.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ if stat $DOCKER_MOUNT >/dev/null 2>&1; then
8888
fi
8989

9090
echo "$INFO Starting $* ..."
91-
echo " $EFS_USER_NAME rights : $(id "$EFS_USER_NAME")"
91+
echo " $(whoami) rights : $(id $whoami))"
9292
echo " local dir : $(ls -al)"
9393

94-
exec gosu "$EFS_USER_NAME" "$@"
94+
exec "$@"

0 commit comments

Comments
 (0)