Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/runpod_flash/core/resources/serverless.py
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,15 @@ def validate_python_version(cls, v: Optional[str]) -> Optional[str]:
_validate_python_version(v)
return v

@field_validator("idleTimeout")
@classmethod
def validate_idle_timeout(cls, value: Optional[int]) -> Optional[int]:
if value is None:
return value
if not 1 <= value <= 3600:
raise ValueError("idleTimeout must be between 1 and 3600 seconds")
return value

@property
def config_hash(self) -> str:
"""Get config hash excluding runtime-assigned fields.
Expand Down
7 changes: 7 additions & 0 deletions tests/unit/resources/test_live_serverless.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@ def test_live_serverless_workers_min_cannot_exceed_workers_max(self):
):
LiveServerless(name="broken", workersMin=5, workersMax=1)

def test_live_serverless_idle_timeout_rejects_zero(self):
with pytest.raises(
ValueError,
match="idleTimeout must be between 1 and 3600 seconds",
):
LiveServerless(name="broken", idleTimeout=0)

def test_live_serverless_gpu_defaults(self):
"""Test LiveServerless uses GPU image and defaults."""
live_serverless = LiveServerless(
Expand Down
14 changes: 14 additions & 0 deletions tests/unit/resources/test_serverless.py
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,20 @@ def test_workers_min_cannot_exceed_workers_max(self):
):
ServerlessResource(name="test", workersMin=5, workersMax=1)

@pytest.mark.parametrize("idle_timeout", [0, -1, 3601])
def test_idle_timeout_must_be_between_1_and_3600(self, idle_timeout):
with pytest.raises(
ValueError,
match="idleTimeout must be between 1 and 3600 seconds",
):
ServerlessResource(name="test", idleTimeout=idle_timeout)

@pytest.mark.parametrize("idle_timeout", [1, 3600])
def test_idle_timeout_accepts_valid_boundaries(self, idle_timeout):
serverless = ServerlessResource(name="test", idleTimeout=idle_timeout)

assert serverless.idleTimeout == idle_timeout

def test_scaler_type_serialization(self):
"""Test ServerlessScalerType enum serialization."""
serverless = ServerlessResource(
Expand Down
Loading