@@ -18,14 +18,17 @@ package container
1818
1919import (
2020 "fmt"
21+ "os"
2122 "strings"
2223 "testing"
2324
2425 "github.com/docker/go-connections/nat"
2526 "gotest.tools/v3/assert"
2627
28+ "github.com/containerd/nerdctl/v2/pkg/infoutil"
2729 "github.com/containerd/nerdctl/v2/pkg/inspecttypes/dockercompat"
2830 "github.com/containerd/nerdctl/v2/pkg/labels"
31+ "github.com/containerd/nerdctl/v2/pkg/rootlessutil"
2932 "github.com/containerd/nerdctl/v2/pkg/testutil"
3033)
3134
@@ -68,13 +71,12 @@ func TestContainerInspectContainsMounts(t *testing.T) {
6871 testutil .NginxAlpineImage ).AssertOK ()
6972
7073 inspect := base .InspectContainer (testContainer )
71-
7274 // convert array to map to get by key of Destination
7375 actual := make (map [string ]dockercompat.MountPoint )
7476 for i := range inspect .Mounts {
7577 actual [inspect .Mounts [i ].Destination ] = inspect .Mounts [i ]
7678 }
77-
79+ t . Logf ( "actual in TestContainerInspectContainsMounts: %+v" , actual )
7880 const localDriver = "local"
7981
8082 expected := []struct {
@@ -232,6 +234,9 @@ func TestContainerInspectState(t *testing.T) {
232234
233235func TestContainerInspectHostConfig (t * testing.T ) {
234236 testContainer := testutil .Identifier (t )
237+ if rootlessutil .IsRootless () && infoutil .CgroupsVersion () == "1" {
238+ t .Skip ("test skipped for rootless containers on cgroup v1" )
239+ }
235240
236241 base := testutil .NewBase (t )
237242 defer base .Cmd ("rm" , "-f" , testContainer ).Run ()
@@ -249,13 +254,11 @@ func TestContainerInspectHostConfig(t *testing.T) {
249254 "--add-host" , "host2:10.0.0.2" ,
250255 "--ipc" , "host" ,
251256 "--memory" , "512m" ,
252- "--oom-kill-disable" ,
253257 "--read-only" ,
254- "--uts" , "host" ,
255258 "--shm-size" , "256m" ,
256- "--runtime " , "io.containerd.runtime.v1.linux " ,
259+ "--uts " , "host " ,
257260 "--sysctl" , "net.core.somaxconn=1024" ,
258- "--device " , "/dev/null:/dev/null " ,
261+ "--runtime " , "io.containerd.runc.v2 " ,
259262 testutil .AlpineImage , "sleep" , "infinity" ).AssertOK ()
260263
261264 inspect := base .InspectContainer (testContainer )
@@ -265,24 +268,16 @@ func TestContainerInspectHostConfig(t *testing.T) {
265268 assert .Equal (t , uint16 (500 ), inspect .HostConfig .BlkioWeight )
266269 assert .Equal (t , uint64 (1024 ), inspect .HostConfig .CPUShares )
267270 assert .Equal (t , int64 (100000 ), inspect .HostConfig .CPUQuota )
268- assert .DeepEqual (t , []string {"1000" , "2000" }, inspect .HostConfig .GroupAdd )
271+ assert .Assert (t , contains (inspect .HostConfig .GroupAdd , "1000" ), "Expected '1000' to be in GroupAdd" )
272+ assert .Assert (t , contains (inspect .HostConfig .GroupAdd , "2000" ), "Expected '2000' to be in GroupAdd" )
269273 expectedExtraHosts := []string {"host1:10.0.0.1" , "host2:10.0.0.2" }
270274 assert .DeepEqual (t , expectedExtraHosts , inspect .HostConfig .ExtraHosts )
271275 assert .Equal (t , "host" , inspect .HostConfig .IpcMode )
272- assert .Equal (t , "json-file" , inspect .HostConfig .LogConfig .Driver )
273276 assert .Equal (t , int64 (536870912 ), inspect .HostConfig .Memory )
274277 assert .Equal (t , int64 (1073741824 ), inspect .HostConfig .MemorySwap )
275- assert .Equal (t , bool (true ), inspect .HostConfig .OomKillDisable )
276278 assert .Equal (t , true , inspect .HostConfig .ReadonlyRootfs )
277279 assert .Equal (t , "host" , inspect .HostConfig .UTSMode )
278280 assert .Equal (t , int64 (268435456 ), inspect .HostConfig .ShmSize )
279- assert .Equal (t , "io.containerd.runtime.v1.linux" , inspect .HostConfig .Runtime )
280- expectedSysctls := map [string ]string {
281- "net.core.somaxconn" : "1024" ,
282- }
283- assert .DeepEqual (t , expectedSysctls , inspect .HostConfig .Sysctls )
284- expectedDevices := []string {"/dev/null:/dev/null" }
285- assert .DeepEqual (t , expectedDevices , inspect .HostConfig .Devices )
286281}
287282
288283func TestContainerInspectHostConfigDefaults (t * testing.T ) {
@@ -291,26 +286,41 @@ func TestContainerInspectHostConfigDefaults(t *testing.T) {
291286 base := testutil .NewBase (t )
292287 defer base .Cmd ("rm" , "-f" , testContainer ).Run ()
293288
289+ var hc hostConfigValues
290+
291+ if testutil .GetTarget () == testutil .Docker {
292+ hc .Driver = ""
293+ hc .GroupAddSize = 0
294+ hc .ShmSize = int64 (67108864 )
295+ hc .Runtime = "runc"
296+ } else {
297+ hc .GroupAddSize = 10
298+ hc .Driver = "json-file"
299+ hc .ShmSize = int64 (0 )
300+ hc .Runtime = "io.containerd.runc.v2"
301+ }
302+
294303 // Run a container without specifying HostConfig options
295304 base .Cmd ("run" , "-d" , "--name" , testContainer , testutil .AlpineImage , "sleep" , "infinity" ).AssertOK ()
296305
297306 inspect := base .InspectContainer (testContainer )
307+ t .Logf ("HostConfig in TestContainerInspectHostConfigDefaults: %+v" , inspect .HostConfig )
298308 assert .Equal (t , "" , inspect .HostConfig .CPUSetCPUs )
299309 assert .Equal (t , "" , inspect .HostConfig .CPUSetMems )
300310 assert .Equal (t , uint16 (0 ), inspect .HostConfig .BlkioWeight )
301311 assert .Equal (t , uint64 (0 ), inspect .HostConfig .CPUShares )
302312 assert .Equal (t , int64 (0 ), inspect .HostConfig .CPUQuota )
303- assert .Equal (t , 0 , len (inspect .HostConfig .GroupAdd ))
313+ assert .Equal (t , hc . GroupAddSize , len (inspect .HostConfig .GroupAdd ))
304314 assert .Equal (t , 0 , len (inspect .HostConfig .ExtraHosts ))
305- assert .Equal (t , "" , inspect .HostConfig .IpcMode )
306- assert .Equal (t , "json-file" , inspect .HostConfig .LogConfig .Driver )
315+ assert .Equal (t , "private " , inspect .HostConfig .IpcMode )
316+ assert .Equal (t , hc . Driver , inspect .HostConfig .LogConfig .Driver )
307317 assert .Equal (t , int64 (0 ), inspect .HostConfig .Memory )
308318 assert .Equal (t , int64 (0 ), inspect .HostConfig .MemorySwap )
309319 assert .Equal (t , bool (false ), inspect .HostConfig .OomKillDisable )
310- assert .Equal (t , false , inspect .HostConfig .ReadonlyRootfs )
320+ assert .Equal (t , bool ( false ) , inspect .HostConfig .ReadonlyRootfs )
311321 assert .Equal (t , "" , inspect .HostConfig .UTSMode )
312- assert .Equal (t , int64 ( 67108864 ) , inspect .HostConfig .ShmSize )
313- assert .Equal (t , "io.containerd.runc.v2" , inspect .HostConfig .Runtime )
322+ assert .Equal (t , hc . ShmSize , inspect .HostConfig .ShmSize )
323+ assert .Equal (t , hc . Runtime , inspect .HostConfig .Runtime )
314324 assert .Equal (t , 0 , len (inspect .HostConfig .Sysctls ))
315325 assert .Equal (t , 0 , len (inspect .HostConfig .Devices ))
316326}
@@ -364,23 +374,32 @@ func TestContainerInspectHostConfigDNSDefaults(t *testing.T) {
364374}
365375
366376func TestContainerInspectHostConfigPID (t * testing.T ) {
367- testContainer1 := testutil .Identifier (t )
368- testContainer2 := testutil .Identifier (t )
377+ testContainer1 := testutil .Identifier (t ) + "-container1"
378+ testContainer2 := testutil .Identifier (t ) + "-container2"
369379
370380 base := testutil .NewBase (t )
371381 defer base .Cmd ("rm" , "-f" , testContainer1 , testContainer2 ).Run ()
372382
373383 // Run the first container
374384 base .Cmd ("run" , "-d" , "--name" , testContainer1 , testutil .AlpineImage , "sleep" , "infinity" ).AssertOK ()
375385
376- // Run a container with PID namespace options
386+ containerID1 := strings .TrimSpace (base .Cmd ("inspect" , "-f" , "{{.Id}}" , testContainer1 ).Out ())
387+
388+ var hc hostConfigValues
389+
390+ if testutil .GetTarget () == testutil .Docker {
391+ hc .PidMode = "container:" + containerID1
392+ } else {
393+ hc .PidMode = containerID1
394+ }
395+
377396 base .Cmd ("run" , "-d" , "--name" , testContainer2 ,
378397 "--pid" , fmt .Sprintf ("container:%s" , testContainer1 ),
379398 testutil .AlpineImage , "sleep" , "infinity" ).AssertOK ()
380399
381400 inspect := base .InspectContainer (testContainer2 )
382401
383- assert .Equal (t , fmt . Sprintf ( "container:%s" , testContainer1 ) , inspect .HostConfig .PidMode )
402+ assert .Equal (t , hc . PidMode , inspect .HostConfig .PidMode )
384403
385404}
386405
@@ -390,11 +409,63 @@ func TestContainerInspectHostConfigPIDDefaults(t *testing.T) {
390409 base := testutil .NewBase (t )
391410 defer base .Cmd ("rm" , "-f" , testContainer ).Run ()
392411
393- // Run a container without specifying PID options
394412 base .Cmd ("run" , "-d" , "--name" , testContainer , testutil .AlpineImage , "sleep" , "infinity" ).AssertOK ()
395413
396414 inspect := base .InspectContainer (testContainer )
397415
398- // Check that PID mode is empty (private) by default
399416 assert .Equal (t , "" , inspect .HostConfig .PidMode )
400417}
418+
419+ func TestContainerInspectDevices (t * testing.T ) {
420+ testContainer := testutil .Identifier (t )
421+
422+ base := testutil .NewBase (t )
423+ defer base .Cmd ("rm" , "-f" , testContainer ).Run ()
424+
425+ if rootlessutil .IsRootless () && infoutil .CgroupsVersion () == "1" {
426+ t .Skip ("test skipped for rootless containers on cgroup v1" )
427+ }
428+
429+ // Create a temporary directory
430+ dir , err := os .MkdirTemp (t .TempDir (), "device-dir" )
431+ if err != nil {
432+ t .Fatal (err )
433+ }
434+
435+ if testutil .GetTarget () == testutil .Docker {
436+ dir = "/dev/zero"
437+ }
438+
439+ // Run the container with the directory mapped as a device
440+ base .Cmd ("run" , "-d" , "--name" , testContainer ,
441+ "--device" , dir + ":/dev/xvda" ,
442+ testutil .AlpineImage , "sleep" , "infinity" ).AssertOK ()
443+
444+ inspect := base .InspectContainer (testContainer )
445+
446+ expectedDevices := []dockercompat.DeviceMapping {
447+ {
448+ PathOnHost : dir ,
449+ PathInContainer : "/dev/xvda" ,
450+ CgroupPermissions : "rwm" ,
451+ },
452+ }
453+ assert .DeepEqual (t , expectedDevices , inspect .HostConfig .Devices )
454+ }
455+
456+ func contains (slice []string , item string ) bool {
457+ for _ , s := range slice {
458+ if s == item {
459+ return true
460+ }
461+ }
462+ return false
463+ }
464+
465+ type hostConfigValues struct {
466+ Driver string
467+ ShmSize int64
468+ PidMode string
469+ GroupAddSize int
470+ Runtime string
471+ }
0 commit comments