@@ -231,7 +231,7 @@ pub fn load(path: &Path) -> Result<ConfigFile, ConfigFileError> {
231231/// the gateway section, which keeps each driver's `deny_unknown_fields`
232232/// invariant intact.
233233pub fn driver_table (
234- driver : ComputeDriverKind ,
234+ driver_name : & str ,
235235 gateway : & GatewayFileSection ,
236236 raw : Option < & toml:: Value > ,
237237) -> toml:: Value {
@@ -240,7 +240,7 @@ pub fn driver_table(
240240 _ => toml:: Table :: new ( ) ,
241241 } ;
242242
243- for key in inheritable_keys ( driver ) {
243+ for key in inheritable_keys ( driver_name ) {
244244 if merged. contains_key ( * key) {
245245 continue ;
246246 }
@@ -255,9 +255,9 @@ pub fn driver_table(
255255/// Inheritance allowlist (the Q4 "high-overlap set"). Each driver opts in
256256/// to a specific subset so a gateway-wide default does not accidentally land
257257/// in a driver table that does not understand the field.
258- fn inheritable_keys ( driver : ComputeDriverKind ) -> & ' static [ & ' static str ] {
259- match driver {
260- ComputeDriverKind :: Kubernetes => & [
258+ fn inheritable_keys ( driver_name : & str ) -> & ' static [ & ' static str ] {
259+ match driver_name . parse :: < ComputeDriverKind > ( ) . ok ( ) {
260+ Some ( ComputeDriverKind :: Kubernetes ) => & [
261261 "namespace" ,
262262 "default_image" ,
263263 "supervisor_image" ,
@@ -267,7 +267,7 @@ fn inheritable_keys(driver: ComputeDriverKind) -> &'static [&'static str] {
267267 "enable_user_namespaces" ,
268268 "sa_token_ttl_secs" ,
269269 ] ,
270- ComputeDriverKind :: Docker => & [
270+ Some ( ComputeDriverKind :: Docker ) => & [
271271 "sandbox_namespace" ,
272272 "default_image" ,
273273 "supervisor_image" ,
@@ -276,20 +276,21 @@ fn inheritable_keys(driver: ComputeDriverKind) -> &'static [&'static str] {
276276 "guest_tls_cert" ,
277277 "guest_tls_key" ,
278278 ] ,
279- ComputeDriverKind :: Podman => & [
279+ Some ( ComputeDriverKind :: Podman ) => & [
280280 "default_image" ,
281281 "supervisor_image" ,
282282 "host_gateway_ip" ,
283283 "guest_tls_ca" ,
284284 "guest_tls_cert" ,
285285 "guest_tls_key" ,
286286 ] ,
287- ComputeDriverKind :: Vm => & [
287+ Some ( ComputeDriverKind :: Vm ) => & [
288288 "default_image" ,
289289 "guest_tls_ca" ,
290290 "guest_tls_cert" ,
291291 "guest_tls_key" ,
292292 ] ,
293+ None => & [ ] ,
293294 }
294295}
295296
@@ -484,7 +485,7 @@ version = 2
484485 namespace = "agents"
485486 } ;
486487 let merged = driver_table (
487- ComputeDriverKind :: Kubernetes ,
488+ ComputeDriverKind :: Kubernetes . as_str ( ) ,
488489 & gateway,
489490 Some ( & toml:: Value :: Table ( raw) ) ,
490491 ) ;
@@ -511,7 +512,7 @@ version = 2
511512 host_gateway_ip : Some ( "10.0.0.1" . to_string ( ) ) ,
512513 ..Default :: default ( )
513514 } ;
514- let merged = driver_table ( ComputeDriverKind :: Docker , & gateway, None ) ;
515+ let merged = driver_table ( ComputeDriverKind :: Docker . as_str ( ) , & gateway, None ) ;
515516 let table = merged. as_table ( ) . expect ( "table" ) ;
516517 assert_eq ! (
517518 table. get( "sandbox_namespace" ) . and_then( |v| v. as_str( ) ) ,
@@ -534,7 +535,7 @@ version = 2
534535 host_gateway_ip : Some ( "192.168.127.254" . to_string ( ) ) ,
535536 ..Default :: default ( )
536537 } ;
537- let merged = driver_table ( ComputeDriverKind :: Podman , & gateway, None ) ;
538+ let merged = driver_table ( ComputeDriverKind :: Podman . as_str ( ) , & gateway, None ) ;
538539 let table = merged. as_table ( ) . expect ( "table" ) ;
539540 assert_eq ! (
540541 table. get( "default_image" ) . and_then( |v| v. as_str( ) ) ,
@@ -556,7 +557,7 @@ version = 2
556557 default_image = "driver-specific"
557558 } ;
558559 let merged = driver_table (
559- ComputeDriverKind :: Podman ,
560+ ComputeDriverKind :: Podman . as_str ( ) ,
560561 & gateway,
561562 Some ( & toml:: Value :: Table ( raw) ) ,
562563 ) ;
@@ -578,7 +579,7 @@ version = 2
578579 client_tls_secret_name : Some ( "openshell-sandbox-tls" . to_string ( ) ) ,
579580 ..Default :: default ( )
580581 } ;
581- let merged = driver_table ( ComputeDriverKind :: Docker , & gateway, None ) ;
582+ let merged = driver_table ( ComputeDriverKind :: Docker . as_str ( ) , & gateway, None ) ;
582583 assert ! (
583584 !merged
584585 . as_table( )
@@ -587,6 +588,28 @@ version = 2
587588 ) ;
588589 }
589590
591+ #[ test]
592+ fn remote_driver_table_does_not_inherit_gateway_defaults ( ) {
593+ let gateway = GatewayFileSection {
594+ default_image : Some ( "gateway-default:1.0" . to_string ( ) ) ,
595+ host_gateway_ip : Some ( "10.0.0.1" . to_string ( ) ) ,
596+ ..Default :: default ( )
597+ } ;
598+ let raw = toml:: toml! {
599+ socket_path = "/run/openshell/kyma.sock"
600+ } ;
601+
602+ let merged = driver_table ( "kyma" , & gateway, Some ( & toml:: Value :: Table ( raw) ) ) ;
603+ let table = merged. as_table ( ) . expect ( "table" ) ;
604+
605+ assert_eq ! (
606+ table. get( "socket_path" ) . and_then( |v| v. as_str( ) ) ,
607+ Some ( "/run/openshell/kyma.sock" )
608+ ) ;
609+ assert ! ( !table. contains_key( "default_image" ) ) ;
610+ assert ! ( !table. contains_key( "host_gateway_ip" ) ) ;
611+ }
612+
590613 #[ test]
591614 fn missing_path_is_io_error ( ) {
592615 let err = load ( Path :: new ( "/nonexistent/openshell-gateway.toml" ) )
0 commit comments