@@ -129,6 +129,67 @@ func (s *ContainerizedEngineTestSuite) TestLaunch() {
129129 s .Require ().NoError (resp .Sandbox .Terminate (s .T ().Context ()))
130130 })
131131
132+ s .Run ("with job container and mounter overlay mounts" , func () {
133+ req := & sandboxer.LaunchRequest {
134+ Forge : s .forge ,
135+ JobContainer : & workflows.Container {Image : "alpine" },
136+ }
137+
138+ customMounts := []* types.Mount {
139+ {Type : "bind" , Source : "/host/workspace" , Target : "/job/workspace" },
140+ {Type : "bind" , Source : "/host/temp" , Target : "/job/temp" },
141+ {Type : "bind" , Source : "/host/runtimes/node" , Target : "/job/runtimes/node" },
142+ }
143+ mounter := mock_sandboxer .NewMockMounter (s .ctrl )
144+ mounter .EXPECT ().OverlayMounts (gomock .Any (), true ).Return (customMounts )
145+
146+ s .mockEng .EXPECT ().Launch (gomock .Any (), req ).Return (& sandboxer.LaunchResponse {
147+ Sandbox : s .mockSb ,
148+ Mounter : mounter ,
149+ ContainerEngine : func (context.Context ) (c.Engine , error ) {
150+ return s .mockClient , nil
151+ },
152+ }, nil )
153+
154+ s .mockSb .EXPECT ().Layout ().Return (sandboxer .StandardLayout ("/opt/drassi/" )).AnyTimes ()
155+
156+ s .mockClient .EXPECT ().NetworkCreate (gomock .Any (), gomock .Any ()).Return ("net-123" , nil )
157+ s .mockClient .EXPECT ().Address ().Return ("unix:///var/run/docker.sock" )
158+ s .mockClient .EXPECT ().ImagePull (gomock .Any (), "alpine" , gomock .Any ()).Return (nil )
159+
160+ var capturedSpec * types.ContainerSpec
161+ s .mockClient .EXPECT ().ContainerRun (gomock .Any (), gomock .Any (), gomock .Any ()).DoAndReturn (
162+ func (_ context.Context , spec * types.ContainerSpec , _ * c.RunOptions ) (string , error ) {
163+ capturedSpec = spec
164+ return "c-123" , nil
165+ },
166+ )
167+
168+ s .mockClient .EXPECT ().CopyIn (gomock .Any (), "c-123" , gomock .Any ()).Return (nil )
169+ s .mockClient .EXPECT ().ContainerInspect (gomock .Any (), "c-123" ).Return (& types.ContainerSpec {
170+ Environment : map [string ]string {"PATH" : "/bin" },
171+ }, nil )
172+
173+ resp , err := s .eng .Launch (s .T ().Context (), req )
174+ s .Require ().NoError (err )
175+ s .Require ().NotNil (resp )
176+ s .Require ().NotNil (resp .JobContainer )
177+ s .Require ().Equal ("c-123" , resp .JobContainer .Id )
178+
179+ s .Require ().NotNil (capturedSpec )
180+ for _ , m := range customMounts {
181+ s .Require ().Contains (capturedSpec .Mounts , m )
182+ }
183+
184+ s .mockClient .EXPECT ().ContainerRemove (gomock .Any (), & c.RemoveOptions {Id : "c-123" }).Return (nil )
185+ s .mockClient .EXPECT ().ContainerRemove (gomock .Any (), & c.RemoveOptions {Labels : s .forge .WellKnownLabels ()}).Return (nil )
186+ s .mockClient .EXPECT ().VolumeRemove (gomock .Any (), & c.RemoveOptions {Labels : s .forge .WellKnownLabels ()}).Return (nil )
187+ s .mockClient .EXPECT ().NetworkRemove (gomock .Any (), & c.RemoveOptions {Id : "net-123" }).Return (nil )
188+ s .mockSb .EXPECT ().Terminate (gomock .Any ()).Return (nil )
189+
190+ s .Require ().NoError (resp .Sandbox .Terminate (s .T ().Context ()))
191+ })
192+
132193 s .Run ("with service containers only" , func () {
133194 req := & sandboxer.LaunchRequest {
134195 Forge : s .forge ,
@@ -201,3 +262,64 @@ func (s *ContainerizedEngineTestSuite) TestLaunch() {
201262 s .Require ().ErrorContains (err , "docker daemon down" )
202263 })
203264}
265+
266+ func (s * ContainerizedEngineTestSuite ) TestAddMounterMounts () {
267+ target := DefaultLayout
268+
269+ s .Run ("with mounter" , func () {
270+ mounterMounts := []* types.Mount {
271+ {Type : "bind" , Source : "/src/w" , Target : target .Workspace ()},
272+ {Type : "bind" , Source : "/src/r" , Target : target .Runtimes ()},
273+ }
274+ mounter := mock_sandboxer .NewMockMounter (s .ctrl )
275+ mounter .EXPECT ().OverlayMounts (target , true ).Return (mounterMounts )
276+ opt := addMounterMounts (mounter , nil , target )
277+ spec := & types.ContainerSpec {}
278+ err := opt (spec )
279+ s .Require ().NoError (err )
280+ s .Require ().Equal (mounterMounts , spec .Mounts )
281+ })
282+
283+ s .Run ("with nil mounter and sandbox" , func () {
284+ mockLayout := sandboxer .StandardLayout ("/sb" )
285+ sb := mock_sandboxer .NewMockSandbox (s .ctrl )
286+ sb .EXPECT ().Layout ().Return (mockLayout ).AnyTimes ()
287+
288+ opt := addMounterMounts (nil , sb , target )
289+ spec := & types.ContainerSpec {}
290+ err := opt (spec )
291+ s .Require ().NoError (err )
292+ expected := []* types.Mount {
293+ {Type : "bind" , Source : mockLayout .Workspace (), Target : target .Workspace ()},
294+ {Type : "bind" , Source : mockLayout .Temp (), Target : target .Temp ()},
295+ }
296+ s .Require ().Equal (expected , spec .Mounts )
297+ })
298+
299+ s .Run ("with nil mounter and nil sandbox" , func () {
300+ opt := addMounterMounts (nil , nil , target )
301+ spec := & types.ContainerSpec {}
302+ err := opt (spec )
303+ s .Require ().NoError (err )
304+ expected := []* types.Mount {
305+ {Type : "volume" , Target : DefaultJobDir },
306+ }
307+ s .Require ().Equal (expected , spec .Mounts )
308+ })
309+
310+ s .Run ("addSandboxMounts delegator" , func () {
311+ mockLayout := sandboxer .StandardLayout ("/sb" )
312+ sb := mock_sandboxer .NewMockSandbox (s .ctrl )
313+ sb .EXPECT ().Layout ().Return (mockLayout ).AnyTimes ()
314+
315+ opt := addSandboxMounts (sb )
316+ spec := & types.ContainerSpec {}
317+ err := opt (spec )
318+ s .Require ().NoError (err )
319+ expected := []* types.Mount {
320+ {Type : "bind" , Source : mockLayout .Workspace (), Target : target .Workspace ()},
321+ {Type : "bind" , Source : mockLayout .Temp (), Target : target .Temp ()},
322+ }
323+ s .Require ().Equal (expected , spec .Mounts )
324+ })
325+ }
0 commit comments