@@ -76,6 +76,20 @@ func setLinux(s *Spec) {
7676 }
7777}
7878
79+ // nolint
80+ func setResources (s * Spec ) {
81+ if s .Linux != nil {
82+ if s .Linux .Resources == nil {
83+ s .Linux .Resources = & specs.LinuxResources {}
84+ }
85+ }
86+ if s .Windows != nil {
87+ if s .Windows .Resources == nil {
88+ s .Windows .Resources = & specs.WindowsResources {}
89+ }
90+ }
91+ }
92+
7993// setCapabilities sets Linux Capabilities to empty if unset
8094func setCapabilities (s * Spec ) {
8195 setProcess (s )
@@ -1139,3 +1153,39 @@ func WithAnnotations(annotations map[string]string) SpecOpts {
11391153 return nil
11401154 }
11411155}
1156+
1157+ // WithLinuxDevices adds the provided linux devices to the spec
1158+ func WithLinuxDevices (devices []specs.LinuxDevice ) SpecOpts {
1159+ return func (_ context.Context , _ Client , _ * containers.Container , s * Spec ) error {
1160+ setLinux (s )
1161+ s .Linux .Devices = append (s .Linux .Devices , devices ... )
1162+ return nil
1163+ }
1164+ }
1165+
1166+ var ErrNotADevice = errors .New ("not a device node" )
1167+
1168+ // WithLinuxDevice adds the device specified by path to the spec
1169+ func WithLinuxDevice (path , permissions string ) SpecOpts {
1170+ return func (_ context.Context , _ Client , _ * containers.Container , s * Spec ) error {
1171+ setLinux (s )
1172+ setResources (s )
1173+
1174+ dev , err := deviceFromPath (path , permissions )
1175+ if err != nil {
1176+ return err
1177+ }
1178+
1179+ s .Linux .Devices = append (s .Linux .Devices , * dev )
1180+
1181+ s .Linux .Resources .Devices = append (s .Linux .Resources .Devices , specs.LinuxDeviceCgroup {
1182+ Type : dev .Type ,
1183+ Allow : true ,
1184+ Major : & dev .Major ,
1185+ Minor : & dev .Minor ,
1186+ Access : permissions ,
1187+ })
1188+
1189+ return nil
1190+ }
1191+ }
0 commit comments