@@ -42,12 +42,13 @@ use openshell_core::proto::{
4242 GetClusterInferenceRequest , GetDraftHistoryRequest , GetDraftPolicyRequest ,
4343 GetGatewayConfigRequest , GetProviderProfileRequest , GetProviderRefreshStatusRequest ,
4444 GetProviderRequest , GetSandboxConfigRequest , GetSandboxLogsRequest ,
45- GetSandboxPolicyStatusRequest , GetSandboxRequest , GetServiceRequest , HealthRequest ,
46- ImportProviderProfilesRequest , LintProviderProfilesRequest , ListProviderProfilesRequest ,
47- ListProvidersRequest , ListSandboxPoliciesRequest , ListSandboxProvidersRequest ,
48- ListSandboxesRequest , ListServicesRequest , PlatformEvent , PolicySource , PolicyStatus , Provider ,
49- ProviderCredentialRefreshStatus , ProviderCredentialRefreshStrategy , ProviderProfile ,
50- ProviderProfileDiagnostic , ProviderProfileImportItem , RejectDraftChunkRequest ,
45+ GetSandboxPolicyStatusRequest , GetSandboxRequest , GetServiceRequest , GpuResourceRequirements ,
46+ HealthRequest , ImportProviderProfilesRequest , LintProviderProfilesRequest ,
47+ ListProviderProfilesRequest , ListProvidersRequest , ListSandboxPoliciesRequest ,
48+ ListSandboxProvidersRequest , ListSandboxesRequest , ListServicesRequest , PlatformEvent ,
49+ PolicySource , PolicyStatus , Provider , ProviderCredentialRefreshStatus ,
50+ ProviderCredentialRefreshStrategy , ProviderProfile , ProviderProfileDiagnostic ,
51+ ProviderProfileImportItem , RejectDraftChunkRequest , ResourceRequirements ,
5152 RevokeSshSessionRequest , RotateProviderCredentialRequest , Sandbox , SandboxPhase , SandboxPolicy ,
5253 SandboxSpec , SandboxTemplate , ServiceEndpointResponse , SetClusterInferenceRequest ,
5354 SettingScope , SettingValue , TcpForwardFrame , TcpForwardInit , TcpRelayTarget ,
@@ -123,7 +124,7 @@ fn ready_false_condition_message(
123124
124125fn provisioning_timeout_message (
125126 timeout_secs : u64 ,
126- requested_gpu : bool ,
127+ resource_requirements : Option < & ResourceRequirements > ,
127128 condition_message : Option < & str > ,
128129) -> String {
129130 let mut message = format ! ( "sandbox provisioning timed out after {timeout_secs}s" ) ;
@@ -133,7 +134,7 @@ fn provisioning_timeout_message(
133134 message. push_str ( condition_message) ;
134135 }
135136
136- if requested_gpu {
137+ if resource_requirements . is_some_and ( |requirements| requirements . gpu . is_some ( ) ) {
137138 message. push_str (
138139 ". Hint: this may be because the available GPU is already in use by another sandbox." ,
139140 ) ;
@@ -1753,7 +1754,7 @@ pub async fn sandbox_create(
17531754 gateway_name : & str ,
17541755 uploads : & [ ( String , Option < String > , bool ) ] ,
17551756 keep : bool ,
1756- gpu : bool ,
1757+ gpu_requirements : Option < GpuResourceRequirements > ,
17571758 cpu : Option < & str > ,
17581759 memory : Option < & str > ,
17591760 driver_config_json : Option < & str > ,
@@ -1809,8 +1810,6 @@ pub async fn sandbox_create(
18091810 }
18101811 None => None ,
18111812 } ;
1812- let requested_gpu = gpu;
1813-
18141813 let providers_v2_enabled = gateway_providers_v2_enabled ( & mut client) . await ?;
18151814 let inferred_types: Vec < String > = if providers_v2_enabled {
18161815 Vec :: new ( )
@@ -1842,9 +1841,11 @@ pub async fn sandbox_create(
18421841 None
18431842 } ;
18441843
1844+ let resource_requirements = gpu_requirements. map ( |gpu| ResourceRequirements { gpu : Some ( gpu) } ) ;
1845+
18451846 let request = CreateSandboxRequest {
18461847 spec : Some ( SandboxSpec {
1847- gpu : requested_gpu ,
1848+ resource_requirements ,
18481849 environment : environment. clone ( ) ,
18491850 policy,
18501851 providers : configured_providers,
@@ -1989,7 +1990,7 @@ pub async fn sandbox_create(
19891990 if remaining. is_zero ( ) {
19901991 let timeout_message = provisioning_timeout_message (
19911992 provision_timeout. as_secs ( ) ,
1992- requested_gpu ,
1993+ resource_requirements . as_ref ( ) ,
19931994 last_condition_message. as_deref ( ) ,
19941995 ) ;
19951996 if let Some ( d) = display. as_mut ( ) {
@@ -2008,7 +2009,7 @@ pub async fn sandbox_create(
20082009 // Timeout fired — the stream was idle for too long.
20092010 let timeout_message = provisioning_timeout_message (
20102011 provision_timeout. as_secs ( ) ,
2011- requested_gpu ,
2012+ resource_requirements . as_ref ( ) ,
20122013 last_condition_message. as_deref ( ) ,
20132014 ) ;
20142015 if let Some ( d) = display. as_mut ( ) {
@@ -7686,9 +7687,10 @@ mod tests {
76867687 PROGRESS_STEP_STARTING_SANDBOX ,
76877688 } ;
76887689 use openshell_core:: proto:: {
7689- Provider , ProviderCredentialRefresh , ProviderCredentialRefreshStatus ,
7690- ProviderCredentialRefreshStrategy , ProviderCredentialTokenGrant , ProviderProfile ,
7691- ProviderProfileCredential , SandboxCondition , SandboxStatus , datamodel:: v1:: ObjectMeta ,
7690+ GpuResourceRequirements , Provider , ProviderCredentialRefresh ,
7691+ ProviderCredentialRefreshStatus , ProviderCredentialRefreshStrategy ,
7692+ ProviderCredentialTokenGrant , ProviderProfile , ProviderProfileCredential ,
7693+ ResourceRequirements , SandboxCondition , SandboxStatus , datamodel:: v1:: ObjectMeta ,
76927694 } ;
76937695
76947696 struct EnvVarGuard {
@@ -8392,9 +8394,12 @@ mod tests {
83928394
83938395 #[ test]
83948396 fn provisioning_timeout_message_includes_condition_and_gpu_hint ( ) {
8397+ let resource_requirements = ResourceRequirements {
8398+ gpu : Some ( GpuResourceRequirements { } ) ,
8399+ } ;
83958400 let message = provisioning_timeout_message (
83968401 120 ,
8397- true ,
8402+ Some ( & resource_requirements ) ,
83988403 Some ( "DependenciesNotReady: Pod exists with phase: Pending; Service Exists" ) ,
83998404 ) ;
84008405
@@ -8405,7 +8410,15 @@ mod tests {
84058410
84068411 #[ test]
84078412 fn provisioning_timeout_message_omits_gpu_hint_for_non_gpu_requests ( ) {
8408- let message = provisioning_timeout_message ( 120 , false , None ) ;
8413+ let message = provisioning_timeout_message ( 120 , None , None ) ;
8414+
8415+ assert_eq ! ( message, "sandbox provisioning timed out after 120s" ) ;
8416+ }
8417+
8418+ #[ test]
8419+ fn provisioning_timeout_message_omits_gpu_hint_without_gpu_requirements ( ) {
8420+ let resource_requirements = ResourceRequirements { gpu : None } ;
8421+ let message = provisioning_timeout_message ( 120 , Some ( & resource_requirements) , None ) ;
84098422
84108423 assert_eq ! ( message, "sandbox provisioning timed out after 120s" ) ;
84118424 }
0 commit comments