Skip to content

Commit a787be3

Browse files
committed
Handle to_be_deleted gateways in API
1 parent 260befa commit a787be3

3 files changed

Lines changed: 11 additions & 3 deletions

File tree

src/dstack/_internal/server/models.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,7 @@ class GatewayModel(PipelineModelMixin, BaseModel):
508508
status: Mapped[GatewayStatus] = mapped_column(EnumAsString(GatewayStatus, 100))
509509
status_message: Mapped[Optional[str]] = mapped_column(Text)
510510
last_processed_at: Mapped[datetime] = mapped_column(NaiveDateTime)
511+
to_be_deleted: Mapped[bool] = mapped_column(Boolean, server_default=false())
511512

512513
project_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("projects.id", ondelete="CASCADE"))
513514
project: Mapped["ProjectModel"] = relationship(foreign_keys=[project_id])
@@ -521,8 +522,6 @@ class GatewayModel(PipelineModelMixin, BaseModel):
521522

522523
runs: Mapped[List["RunModel"]] = relationship(back_populates="gateway")
523524

524-
to_be_deleted: Mapped[bool] = mapped_column(Boolean, server_default=false())
525-
526525
__table_args__ = (UniqueConstraint("project_id", "name", name="uq_gateways_project_id_name"),)
527526

528527

src/dstack/_internal/server/services/gateways/__init__.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,8 @@ async def set_default_gateway(
352352
gateway = await get_project_gateway_model_by_name(session=session, project=project, name=name)
353353
if gateway is None:
354354
raise ResourceNotExistsError()
355+
if gateway.to_be_deleted:
356+
raise ServerClientError("Cannot set gateway marked for deletion as default")
355357
if project.default_gateway_id == gateway.id:
356358
return
357359
previous_gateway = await get_project_default_gateway_model(session, project)
@@ -434,7 +436,10 @@ async def get_project_default_gateway_model(
434436
session: AsyncSession, project: ProjectModel
435437
) -> Optional[GatewayModel]:
436438
res = await session.execute(
437-
select(GatewayModel).where(GatewayModel.id == project.default_gateway_id)
439+
select(GatewayModel).where(
440+
GatewayModel.id == project.default_gateway_id,
441+
GatewayModel.to_be_deleted == False,
442+
)
438443
)
439444
return res.scalar_one_or_none()
440445

src/dstack/_internal/server/services/services/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ async def register_service(session: AsyncSession, run_model: RunModel, run_spec:
9696
raise ResourceNotExistsError(
9797
f"Gateway {run_spec.configuration.gateway} does not exist"
9898
)
99+
if gateway.to_be_deleted:
100+
raise ResourceNotExistsError(
101+
f"Gateway {run_spec.configuration.gateway} was marked for deletion"
102+
)
99103
elif run_spec.configuration.gateway == False:
100104
gateway = None
101105
else:

0 commit comments

Comments
 (0)