From f5ed31c1a34d678b1f5265c482c67a90e79d0ad3 Mon Sep 17 00:00:00 2001 From: jhcipar Date: Wed, 25 Mar 2026 17:08:46 -0400 Subject: [PATCH] fix: idletimeout must be in valid range --- src/runpod_flash/core/resources/serverless.py | 9 +++++++++ tests/unit/resources/test_live_serverless.py | 7 +++++++ tests/unit/resources/test_serverless.py | 14 ++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/src/runpod_flash/core/resources/serverless.py b/src/runpod_flash/core/resources/serverless.py index 557e546d..a2d06baf 100644 --- a/src/runpod_flash/core/resources/serverless.py +++ b/src/runpod_flash/core/resources/serverless.py @@ -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. diff --git a/tests/unit/resources/test_live_serverless.py b/tests/unit/resources/test_live_serverless.py index eab01492..7aef6636 100644 --- a/tests/unit/resources/test_live_serverless.py +++ b/tests/unit/resources/test_live_serverless.py @@ -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( diff --git a/tests/unit/resources/test_serverless.py b/tests/unit/resources/test_serverless.py index 3454fb53..57d385c7 100644 --- a/tests/unit/resources/test_serverless.py +++ b/tests/unit/resources/test_serverless.py @@ -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(