33
44//! Kubernetes compute driver.
55
6- use crate :: config:: { KubernetesComputeConfig , SupervisorSideloadMethod } ;
6+ use crate :: config:: {
7+ DEFAULT_WORKSPACE_STORAGE_SIZE , KubernetesComputeConfig , SupervisorSideloadMethod ,
8+ } ;
79use futures:: { Stream , StreamExt , TryStreamExt } ;
810use k8s_openapi:: api:: core:: v1:: { Event as KubeEventObj , Node } ;
911use kube:: api:: { Api , ApiResource , DeleteParams , ListParams , PostParams } ;
@@ -106,9 +108,6 @@ const WORKSPACE_INIT_MOUNT_PATH: &str = "/workspace-pvc";
106108/// Name of the init container that seeds the workspace PVC.
107109const WORKSPACE_INIT_CONTAINER_NAME : & str = "workspace-init" ;
108110
109- /// Default storage request for the workspace PVC.
110- const WORKSPACE_DEFAULT_STORAGE : & str = "2Gi" ;
111-
112111/// Sentinel file written by the init container after copying the image's
113112/// `/sandbox` contents. Subsequent pod starts skip the copy.
114113const WORKSPACE_SENTINEL : & str = ".workspace-initialized" ;
@@ -327,6 +326,7 @@ impl KubernetesComputeDriver {
327326 client_tls_secret_name : & self . config . client_tls_secret_name ,
328327 host_gateway_ip : & self . config . host_gateway_ip ,
329328 enable_user_namespaces : self . config . enable_user_namespaces ,
329+ workspace_default_storage_size : & self . config . workspace_default_storage_size ,
330330 } ;
331331 obj. data = sandbox_to_k8s_spec ( sandbox. spec . as_ref ( ) , & params) ;
332332 let api = self . api ( ) ;
@@ -1025,7 +1025,12 @@ fn apply_workspace_persistence(
10251025///
10261026/// Provides a single PVC named "workspace" that backs the `/sandbox`
10271027/// directory. The init container seeds it from the image on first use.
1028- fn default_workspace_volume_claim_templates ( ) -> serde_json:: Value {
1028+ fn default_workspace_volume_claim_templates ( storage_size : & str ) -> serde_json:: Value {
1029+ let size = if storage_size. is_empty ( ) {
1030+ DEFAULT_WORKSPACE_STORAGE_SIZE
1031+ } else {
1032+ storage_size
1033+ } ;
10291034 serde_json:: json!( [ {
10301035 "metadata" : {
10311036 "name" : WORKSPACE_VOLUME_NAME
@@ -1034,7 +1039,7 @@ fn default_workspace_volume_claim_templates() -> serde_json::Value {
10341039 "accessModes" : [ "ReadWriteOnce" ] ,
10351040 "resources" : {
10361041 "requests" : {
1037- "storage" : WORKSPACE_DEFAULT_STORAGE
1042+ "storage" : size
10381043 }
10391044 }
10401045 }
@@ -1056,6 +1061,7 @@ struct SandboxPodParams<'a> {
10561061 client_tls_secret_name : & ' a str ,
10571062 host_gateway_ip : & ' a str ,
10581063 enable_user_namespaces : bool ,
1064+ workspace_default_storage_size : & ' a str ,
10591065}
10601066
10611067fn spec_pod_env ( spec : Option < & SandboxSpec > ) -> std:: collections:: HashMap < String , String > {
@@ -1112,7 +1118,7 @@ fn sandbox_to_k8s_spec(
11121118 if inject_workspace {
11131119 root. insert (
11141120 "volumeClaimTemplates" . to_string ( ) ,
1115- default_workspace_volume_claim_templates ( ) ,
1121+ default_workspace_volume_claim_templates ( params . workspace_default_storage_size ) ,
11161122 ) ;
11171123 }
11181124
@@ -2572,4 +2578,18 @@ mod tests {
25722578 assert_eq ! ( tolerations[ 0 ] [ "operator" ] , "Exists" ) ;
25732579 assert_eq ! ( tolerations[ 0 ] [ "effect" ] , "NoSchedule" ) ;
25742580 }
2581+
2582+ #[ test]
2583+ fn default_workspace_vct_uses_provided_storage_size ( ) {
2584+ let vct = default_workspace_volume_claim_templates ( "5Gi" ) ;
2585+ let storage = & vct[ 0 ] [ "spec" ] [ "resources" ] [ "requests" ] [ "storage" ] ;
2586+ assert_eq ! ( storage, "5Gi" ) ;
2587+ }
2588+
2589+ #[ test]
2590+ fn default_workspace_vct_falls_back_to_const_when_empty ( ) {
2591+ let vct = default_workspace_volume_claim_templates ( "" ) ;
2592+ let storage = & vct[ 0 ] [ "spec" ] [ "resources" ] [ "requests" ] [ "storage" ] ;
2593+ assert_eq ! ( storage, DEFAULT_WORKSPACE_STORAGE_SIZE ) ;
2594+ }
25752595}
0 commit comments