@@ -183,6 +183,11 @@ where
183183 } ) ;
184184 }
185185 }
186+ for path in & requirements. read_only_paths {
187+ if path_kind ( path) . is_none ( ) {
188+ return Err ( CdiError :: ReadOnlyPathMissing { path : path. clone ( ) } ) ;
189+ }
190+ }
186191 for path in & requirements. read_write_mount_paths {
187192 if !normalized_allowlist. contains ( path) {
188193 return Err ( CdiError :: WritableMountNotAllowed { path : path. clone ( ) } ) ;
@@ -445,12 +450,8 @@ mod tests {
445450 let dir = tempfile:: tempdir ( ) . unwrap ( ) ;
446451 write_spec ( dir. path ( ) , "nvidia.yaml" , spec) ;
447452
448- let requirements = resolve_with_kind (
449- & context ( dir. path ( ) , & [ "nvidia.com/gpu=all" ] ) ,
450- & [ ] ,
451- fake_device_node,
452- )
453- . unwrap ( ) ;
453+ let requirements =
454+ resolve_cdi_context ( & context ( dir. path ( ) , & [ "nvidia.com/gpu=all" ] ) ) . unwrap ( ) ;
454455 let baseline = CdiRequirementsBaseline {
455456 device_node_paths : & requirements. device_node_paths ,
456457 read_only_paths : & requirements. read_only_paths ,
@@ -507,12 +508,8 @@ devices:
507508"# ,
508509 ) ;
509510
510- let requirements = resolve_with_kind (
511- & context ( dir. path ( ) , & [ "nvidia.com/gpu=0" ] ) ,
512- & [ ] ,
513- fake_device_node,
514- )
515- . unwrap ( ) ;
511+ let requirements =
512+ resolve_cdi_context ( & context ( dir. path ( ) , & [ "nvidia.com/gpu=0" ] ) ) . unwrap ( ) ;
516513
517514 assert_eq ! (
518515 requirements. device_node_paths,
@@ -540,12 +537,8 @@ devices:
540537" ,
541538 ) ;
542539
543- let requirements = resolve_with_kind (
544- & context ( dir. path ( ) , & [ "nvidia.com/gpu=all" ] ) ,
545- & [ ] ,
546- fake_device_node,
547- )
548- . unwrap ( ) ;
540+ let requirements =
541+ resolve_cdi_context ( & context ( dir. path ( ) , & [ "nvidia.com/gpu=all" ] ) ) . unwrap ( ) ;
549542
550543 assert_eq ! (
551544 requirements. device_node_paths,
@@ -573,12 +566,8 @@ devices:
573566" ,
574567 ) ;
575568
576- let requirements = resolve_with_kind (
577- & context ( dir. path ( ) , & [ "nvidia.com/gpu=all" ] ) ,
578- & [ ] ,
579- fake_device_node,
580- )
581- . unwrap ( ) ;
569+ let requirements =
570+ resolve_cdi_context ( & context ( dir. path ( ) , & [ "nvidia.com/gpu=all" ] ) ) . unwrap ( ) ;
582571
583572 assert_eq ! ( requirements. device_node_paths, vec![ "/dev/dxg" ] ) ;
584573 assert_eq ! ( requirements. read_only_paths, vec![ "/usr/lib/wsl/lib" ] ) ;
@@ -618,12 +607,8 @@ devices:
618607"# ,
619608 ) ;
620609
621- let requirements = resolve_with_kind (
622- & context ( dir. path ( ) , & [ "nvidia.com/gpu=0" ] ) ,
623- & [ ] ,
624- always_missing,
625- )
626- . unwrap ( ) ;
610+ let requirements =
611+ resolve_cdi_context ( & context ( dir. path ( ) , & [ "nvidia.com/gpu=0" ] ) ) . unwrap ( ) ;
627612
628613 assert_eq ! (
629614 requirements. read_only_paths,
@@ -660,12 +645,8 @@ devices:
660645"# ,
661646 ) ;
662647
663- let requirements = resolve_with_kind (
664- & context ( dir. path ( ) , & [ "nvidia.com/gpu=0" ] ) ,
665- & [ ] ,
666- fake_device_node,
667- )
668- . unwrap ( ) ;
648+ let requirements =
649+ resolve_cdi_context ( & context ( dir. path ( ) , & [ "nvidia.com/gpu=0" ] ) ) . unwrap ( ) ;
669650
670651 assert_eq ! ( requirements. additional_gids, vec![ 44 ] ) ;
671652 assert_eq ! (
@@ -950,6 +931,32 @@ devices:
950931 assert ! ( matches!( err, CdiError :: RootAdditionalGid ) ) ;
951932 }
952933
934+ #[ test]
935+ fn validates_read_only_paths_in_the_workload_namespace ( ) {
936+ let requirements = CdiDerivedRequirements {
937+ read_only_paths : vec ! [ "/opt/nvidia/runtime.json" . to_string( ) ] ,
938+ ..CdiDerivedRequirements :: default ( )
939+ } ;
940+ let writable_file_allowlist = HashSet :: < String > :: new ( ) ;
941+
942+ let err = validate_cdi_requirements_with_path_kind (
943+ & requirements,
944+ & writable_file_allowlist,
945+ always_missing,
946+ )
947+ . unwrap_err ( ) ;
948+ assert ! ( matches!(
949+ err,
950+ CdiError :: ReadOnlyPathMissing { path }
951+ if path == "/opt/nvidia/runtime.json"
952+ ) ) ;
953+
954+ validate_cdi_requirements_with_path_kind ( & requirements, & writable_file_allowlist, |_| {
955+ Some ( CdiPathKind :: File )
956+ } )
957+ . unwrap ( ) ;
958+ }
959+
953960 #[ test]
954961 fn rejects_device_node_that_is_not_device ( ) {
955962 let dir = tempfile:: tempdir ( ) . unwrap ( ) ;
0 commit comments