diff --git a/src/dstack/_internal/cli/services/profile.py b/src/dstack/_internal/cli/services/profile.py index 87138d84d..8fa0a1655 100644 --- a/src/dstack/_internal/cli/services/profile.py +++ b/src/dstack/_internal/cli/services/profile.py @@ -8,7 +8,6 @@ Profile, ProfileRetry, SpotPolicy, - TerminationPolicy, parse_duration, parse_max_duration, ) @@ -149,10 +148,9 @@ def apply_profile_args( profile_settings.max_duration = args.max_duration if args.idle_duration is not None: - profile_settings.termination_idle_time = args.idle_duration - - if args.dont_destroy: - profile_settings.termination_policy = TerminationPolicy.DONT_DESTROY + profile_settings.idle_duration = args.idle_duration + elif args.dont_destroy: + profile_settings.idle_duration = False if args.creation_policy_reuse: profile_settings.creation_policy = CreationPolicy.REUSE diff --git a/src/dstack/_internal/core/models/fleets.py b/src/dstack/_internal/core/models/fleets.py index 478a102c6..441103fb0 100644 --- a/src/dstack/_internal/core/models/fleets.py +++ b/src/dstack/_internal/core/models/fleets.py @@ -16,8 +16,6 @@ ProfileParams, ProfileRetry, SpotPolicy, - TerminationPolicy, - parse_duration, parse_idle_duration, ) from dstack._internal.core.models.resources import Range, ResourcesSpec @@ -217,30 +215,13 @@ class InstanceGroupParams(CoreModel): Optional[float], Field(description="The maximum instance price per hour, in dollars", gt=0.0), ] = None - idle_duration: Annotated[ Optional[Union[Literal["off"], str, int]], Field( description="Time to wait before terminating idle instances. Defaults to `5m` for runs and `3d` for fleets. Use `off` for unlimited duration" ), ] = None - # Deprecated: - termination_policy: Annotated[ - Optional[TerminationPolicy], - Field( - description="Deprecated in favor of `idle_duration`", - ), - ] = None - termination_idle_time: Annotated[ - Optional[Union[str, int]], - Field( - description="Deprecated in favor of `idle_duration`", - ), - ] = None - _validate_termination_idle_time = validator( - "termination_idle_time", pre=True, allow_reuse=True - )(parse_duration) _validate_idle_duration = validator("idle_duration", pre=True, allow_reuse=True)( parse_idle_duration ) diff --git a/src/dstack/_internal/core/models/profiles.py b/src/dstack/_internal/core/models/profiles.py index 031d2e9f9..2b01ddc45 100644 --- a/src/dstack/_internal/core/models/profiles.py +++ b/src/dstack/_internal/core/models/profiles.py @@ -240,19 +240,6 @@ class ProfileParams(CoreModel): Optional[UtilizationPolicy], Field(description="Run termination policy based on utilization"), ] = None - # Deprecated: - termination_policy: Annotated[ - Optional[TerminationPolicy], - Field( - description="Deprecated in favor of `idle_duration`", - ), - ] = None - termination_idle_time: Annotated[ - Optional[Union[str, int]], - Field( - description="Deprecated in favor of `idle_duration`", - ), - ] = None _validate_max_duration = validator("max_duration", pre=True, allow_reuse=True)( parse_max_duration @@ -260,9 +247,6 @@ class ProfileParams(CoreModel): _validate_stop_duration = validator("stop_duration", pre=True, allow_reuse=True)( parse_stop_duration ) - _validate_termination_idle_time = validator( - "termination_idle_time", pre=True, allow_reuse=True - )(parse_duration) _validate_idle_duration = validator("idle_duration", pre=True, allow_reuse=True)( parse_idle_duration ) diff --git a/src/dstack/_internal/core/services/profiles.py b/src/dstack/_internal/core/services/profiles.py index a5b0b50d5..cd268aeac 100644 --- a/src/dstack/_internal/core/services/profiles.py +++ b/src/dstack/_internal/core/services/profiles.py @@ -37,10 +37,6 @@ def get_termination( ) -> Tuple[TerminationPolicy, int]: termination_policy = TerminationPolicy.DESTROY_AFTER_IDLE termination_idle_time = default_termination_idle_time - if profile.termination_policy is not None: - termination_policy = profile.termination_policy - if profile.termination_idle_time is not None: - termination_idle_time = profile.termination_idle_time if profile.idle_duration is not None and int(profile.idle_duration) < 0: termination_policy = TerminationPolicy.DONT_DESTROY elif profile.idle_duration is not None: diff --git a/src/dstack/api/_public/runs.py b/src/dstack/api/_public/runs.py index 43e7f57ac..b73c27ebb 100644 --- a/src/dstack/api/_public/runs.py +++ b/src/dstack/api/_public/runs.py @@ -586,6 +586,8 @@ def get_plan( configuration: AnyRunConfiguration, repo: Optional[Repo] = None, configuration_path: Optional[str] = None, + # Unused profile args are deprecated and removed but + # kept for signature backward compatibility. backends: Optional[List[BackendType]] = None, regions: Optional[List[str]] = None, instance_types: Optional[List[str]] = None, @@ -646,8 +648,6 @@ def get_plan( max_price=max_price, creation_policy=creation_policy, idle_duration=idle_duration, - termination_policy=termination_policy, - termination_idle_time=termination_policy_idle, ) run_spec = RunSpec( run_name=run_name, diff --git a/src/tests/_internal/server/routers/test_fleets.py b/src/tests/_internal/server/routers/test_fleets.py index 3528c1ae6..ab6268308 100644 --- a/src/tests/_internal/server/routers/test_fleets.py +++ b/src/tests/_internal/server/routers/test_fleets.py @@ -345,8 +345,6 @@ async def test_creates_fleet(self, test_db, session: AsyncSession, client: Async "retry": None, "max_price": None, "idle_duration": None, - "termination_policy": None, - "termination_idle_time": None, "type": "fleet", "name": "test-fleet", "reservation": None, @@ -364,8 +362,6 @@ async def test_creates_fleet(self, test_db, session: AsyncSession, client: Async "max_price": None, "creation_policy": None, "idle_duration": None, - "termination_policy": None, - "termination_idle_time": None, "utilization_policy": None, "name": "", "default": False, @@ -467,8 +463,6 @@ async def test_creates_ssh_fleet(self, test_db, session: AsyncSession, client: A "retry": None, "max_price": None, "idle_duration": None, - "termination_policy": None, - "termination_idle_time": None, "type": "fleet", "name": spec.configuration.name, "reservation": None, @@ -486,8 +480,6 @@ async def test_creates_ssh_fleet(self, test_db, session: AsyncSession, client: A "max_price": None, "creation_policy": None, "idle_duration": None, - "termination_policy": None, - "termination_idle_time": None, "utilization_policy": None, "name": "", "default": False, diff --git a/src/tests/_internal/server/routers/test_runs.py b/src/tests/_internal/server/routers/test_runs.py index 275232899..dbb1537b1 100644 --- a/src/tests/_internal/server/routers/test_runs.py +++ b/src/tests/_internal/server/routers/test_runs.py @@ -122,8 +122,6 @@ def get_dev_env_run_plan_dict( "retry": None, "spot_policy": "spot", "idle_duration": None, - "termination_idle_time": 300, - "termination_policy": None, "utilization_policy": None, "reservation": None, }, @@ -142,8 +140,6 @@ def get_dev_env_run_plan_dict( "retry": None, "spot_policy": "spot", "idle_duration": None, - "termination_idle_time": 300, - "termination_policy": None, "utilization_policy": None, "reservation": None, }, @@ -276,8 +272,6 @@ def get_dev_env_run_dict( "retry": None, "spot_policy": "spot", "idle_duration": None, - "termination_idle_time": 300, - "termination_policy": None, "utilization_policy": None, "reservation": None, }, @@ -296,8 +290,6 @@ def get_dev_env_run_dict( "retry": None, "spot_policy": "spot", "idle_duration": None, - "termination_idle_time": 300, - "termination_policy": None, "utilization_policy": None, "reservation": None, },