Skip to content

Commit fe6f64b

Browse files
enable host name and default resolv.conf and hosts file in none network
Signed-off-by: Shubharanshu Mahapatra <[email protected]>
1 parent 8ef14b7 commit fe6f64b

File tree

3 files changed

+523
-58
lines changed

3 files changed

+523
-58
lines changed

cmd/nerdctl/container/container_run_network_linux_test.go

+304-28
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"os/exec"
2525
"path/filepath"
2626
"regexp"
27-
"runtime"
2827
"strings"
2928
"testing"
3029
"time"
@@ -513,35 +512,197 @@ func TestRunNetworkHost2613(t *testing.T) {
513512
base.Cmd("run", "--rm", "--add-host", "foo:1.2.3.4", testutil.CommonImage, "getent", "hosts", "foo").AssertOutExactly("1.2.3.4 foo foo\n")
514513
}
515514

516-
func TestSharedNetworkStack(t *testing.T) {
517-
if runtime.GOOS != "linux" {
518-
t.Skip("--network=container:<container name|id> only supports linux now")
519-
}
520-
base := testutil.NewBase(t)
515+
func TestSharedNetworkSetup(t *testing.T) {
516+
nerdtest.Setup()
517+
testCase := &test.Case{
518+
Require: test.Not(test.Windows),
519+
Setup: func(data test.Data, helpers test.Helpers) {
520+
data.Set("containerName1", data.Identifier("-container1"))
521+
containerName1 := data.Get("containerName1")
522+
helpers.Ensure("run", "-d", "--name", containerName1,
523+
testutil.NginxAlpineImage)
524+
},
525+
Cleanup: func(data test.Data, helpers test.Helpers) {
526+
helpers.Anyhow("rm", "-f", data.Identifier("-container1"))
527+
},
528+
SubTests: []*test.Case{
529+
{
530+
Description: "Test network is shared",
531+
NoParallel: true, // The validation involves starting of the main container: container1
532+
Cleanup: func(data test.Data, helpers test.Helpers) {
533+
helpers.Anyhow("rm", "-f", data.Identifier())
534+
},
535+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
536+
containerName2 := data.Identifier()
537+
cmd := helpers.Command()
538+
cmd.WithArgs("run", "-d", "--name", containerName2,
539+
"--network=container:"+data.Get("containerName1"),
540+
testutil.NginxAlpineImage)
541+
return cmd
542+
},
543+
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
544+
return &test.Expected{
545+
Output: func(stdout string, info string, t *testing.T) {
546+
containerName2 := data.Identifier()
547+
assert.Assert(t, strings.Contains(helpers.Capture("exec", containerName2, "wget", "-qO-", "http://127.0.0.1:80"), testutil.NginxAlpineIndexHTMLSnippet), info)
548+
helpers.Ensure("restart", data.Get("containerName1"))
549+
helpers.Ensure("stop", "--time=1", containerName2)
550+
helpers.Ensure("start", containerName2)
551+
assert.Assert(t, strings.Contains(helpers.Capture("exec", containerName2, "wget", "-qO-", "http://127.0.0.1:80"), testutil.NginxAlpineIndexHTMLSnippet), info)
552+
},
553+
}
554+
},
555+
},
556+
{
557+
Description: "Test uts is supported in shared network",
558+
Cleanup: func(data test.Data, helpers test.Helpers) {
559+
helpers.Anyhow("rm", "-f", data.Identifier())
560+
},
561+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
562+
containerName2 := data.Identifier()
563+
cmd := helpers.Command()
564+
cmd.WithArgs("run", "-d", "--name", containerName2, "--uts", "host",
565+
"--network=container:"+data.Get("containerName1"),
566+
testutil.AlpineImage)
567+
return cmd
568+
},
569+
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
570+
return &test.Expected{
571+
ExitCode: 0,
572+
}
573+
},
574+
},
575+
{
576+
Description: "Test dns is not supported",
577+
Cleanup: func(data test.Data, helpers test.Helpers) {
578+
helpers.Anyhow("rm", "-f", data.Identifier())
579+
},
580+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
581+
containerName2 := data.Identifier()
582+
cmd := helpers.Command()
583+
cmd.WithArgs("run", "-d", "--name", containerName2, "--dns", "0.1.2.3",
584+
"--network=container:"+data.Get("containerName1"),
585+
testutil.AlpineImage)
586+
return cmd
587+
},
588+
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
589+
if nerdtest.IsDocker() {
590+
return &test.Expected{
591+
ExitCode: 125,
592+
}
521593

522-
containerName := testutil.Identifier(t)
523-
defer base.Cmd("rm", "-f", containerName).AssertOK()
524-
base.Cmd("run", "-d", "--name", containerName,
525-
testutil.NginxAlpineImage).AssertOK()
526-
base.EnsureContainerStarted(containerName)
594+
}
595+
return &test.Expected{
596+
ExitCode: 1,
597+
}
598+
},
599+
},
600+
{
601+
Description: "Test dns options is not supported",
602+
Cleanup: func(data test.Data, helpers test.Helpers) {
603+
helpers.Anyhow("rm", "-f", data.Identifier())
604+
},
605+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
606+
containerName2 := data.Identifier()
607+
cmd := helpers.Command()
608+
cmd.WithArgs("run", "--name", containerName2, "--dns-option", "attempts:5",
609+
"--network=container:"+data.Get("containerName1"),
610+
testutil.AlpineImage, "cat", "/etc/resolv.conf")
611+
return cmd
612+
},
613+
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
614+
// The Option doesnt throw an error but is never inserted to the resolv.conf
615+
return &test.Expected{
616+
ExitCode: 0,
617+
Output: func(stdout string, info string, t *testing.T) {
618+
assert.Assert(t, !strings.Contains(stdout, "attempts:5"), info)
619+
},
620+
}
621+
},
622+
},
623+
{
624+
Description: "Test publish is not supported",
625+
Cleanup: func(data test.Data, helpers test.Helpers) {
626+
helpers.Anyhow("rm", "-f", data.Identifier())
627+
},
628+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
629+
containerName2 := data.Identifier()
630+
cmd := helpers.Command()
631+
cmd.WithArgs("run", "-d", "--name", containerName2, "--publish", "80:8080",
632+
"--network=container:"+data.Get("containerName1"),
633+
testutil.AlpineImage)
634+
return cmd
635+
},
636+
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
637+
if nerdtest.IsDocker() {
638+
return &test.Expected{
639+
ExitCode: 125,
640+
}
641+
642+
}
643+
return &test.Expected{
644+
ExitCode: 1,
645+
}
646+
},
647+
},
648+
{
649+
Description: "Test hostname is not supported",
650+
Cleanup: func(data test.Data, helpers test.Helpers) {
651+
helpers.Anyhow("rm", "-f", data.Identifier())
652+
},
653+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
654+
containerName2 := data.Identifier()
655+
cmd := helpers.Command()
656+
cmd.WithArgs("run", "-d", "--name", containerName2, "--hostname", "test",
657+
"--network=container:"+data.Get("containerName1"),
658+
testutil.AlpineImage)
659+
return cmd
660+
},
661+
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
662+
if nerdtest.IsDocker() {
663+
return &test.Expected{
664+
ExitCode: 125,
665+
}
666+
667+
}
668+
return &test.Expected{
669+
ExitCode: 1,
670+
}
671+
},
672+
},
673+
},
674+
}
675+
testCase.Run(t)
676+
}
527677

528-
containerNameJoin := testutil.Identifier(t) + "-network"
529-
defer base.Cmd("rm", "-f", containerNameJoin).AssertOK()
530-
base.Cmd("run",
531-
"-d",
532-
"--name", containerNameJoin,
533-
"--network=container:"+containerName,
534-
testutil.CommonImage,
535-
"sleep", nerdtest.Infinity).AssertOK()
536-
537-
base.Cmd("exec", containerNameJoin, "wget", "-qO-", "http://127.0.0.1:80").
538-
AssertOutContains(testutil.NginxAlpineIndexHTMLSnippet)
539-
540-
base.Cmd("restart", containerName).AssertOK()
541-
base.Cmd("stop", "--time=1", containerNameJoin).AssertOK()
542-
base.Cmd("start", containerNameJoin).AssertOK()
543-
base.Cmd("exec", containerNameJoin, "wget", "-qO-", "http://127.0.0.1:80").
544-
AssertOutContains(testutil.NginxAlpineIndexHTMLSnippet)
678+
func TestSharedNetworkWithNone(t *testing.T) {
679+
nerdtest.Setup()
680+
testCase := &test.Case{
681+
Require: test.Not(test.Windows),
682+
Setup: func(data test.Data, helpers test.Helpers) {
683+
data.Set("containerName1", data.Identifier("-container1"))
684+
containerName1 := data.Get("containerName1")
685+
helpers.Ensure("run", "-d", "--name", containerName1, "--network", "none",
686+
testutil.NginxAlpineImage)
687+
},
688+
Cleanup: func(data test.Data, helpers test.Helpers) {
689+
helpers.Anyhow("rm", "-f", data.Get("containerName1"))
690+
},
691+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
692+
containerName2 := data.Identifier()
693+
cmd := helpers.Command()
694+
cmd.WithArgs("run", "-d", "--name", containerName2,
695+
"--network=container:"+data.Get("containerName1"),
696+
testutil.NginxAlpineImage)
697+
return cmd
698+
},
699+
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
700+
return &test.Expected{
701+
ExitCode: 0,
702+
}
703+
},
704+
}
705+
testCase.Run(t)
545706
}
546707

547708
func TestRunContainerInExistingNetNS(t *testing.T) {
@@ -669,6 +830,8 @@ func TestHostsFileMounts(t *testing.T) {
669830
"sh", "-euxc", "echo >> /etc/hosts").AssertOK()
670831
base.Cmd("run", "--rm", "-v", "/etc/hosts:/etc/hosts", "--network", "host", testutil.CommonImage,
671832
"sh", "-euxc", "head -n -1 /etc/hosts > temp && cat temp > /etc/hosts").AssertOK()
833+
base.Cmd("run", "--rm", "--network", "none", testutil.CommonImage,
834+
"sh", "-euxc", "echo >> /etc/hosts").AssertOK()
672835

673836
base.Cmd("run", "--rm", testutil.CommonImage,
674837
"sh", "-euxc", "echo >> /etc/resolv.conf").AssertOK()
@@ -681,6 +844,8 @@ func TestHostsFileMounts(t *testing.T) {
681844
"sh", "-euxc", "echo >> /etc/resolv.conf").AssertOK()
682845
base.Cmd("run", "--rm", "-v", "/etc/resolv.conf:/etc/resolv.conf", "--network", "host", testutil.CommonImage,
683846
"sh", "-euxc", "head -n -1 /etc/resolv.conf > temp && cat temp > /etc/resolv.conf").AssertOK()
847+
base.Cmd("run", "--rm", "--network", "host", testutil.CommonImage,
848+
"sh", "-euxc", "echo >> /etc/resolv.conf").AssertOK()
684849
}
685850

686851
func TestRunContainerWithStaticIP6(t *testing.T) {
@@ -752,3 +917,114 @@ func TestRunContainerWithStaticIP6(t *testing.T) {
752917
})
753918
}
754919
}
920+
921+
func TestNoneNetworkHostName(t *testing.T) {
922+
nerdtest.Setup()
923+
testCase := &test.Case{
924+
Require: test.Not(test.Windows),
925+
Setup: func(data test.Data, helpers test.Helpers) {
926+
data.Set("containerName1", data.Identifier())
927+
},
928+
Cleanup: func(data test.Data, helpers test.Helpers) {
929+
helpers.Anyhow("rm", "-f", data.Identifier())
930+
},
931+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
932+
return helpers.Command("run", "-d", "--name", data.Identifier(), "--network", "none", testutil.NginxAlpineImage)
933+
},
934+
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
935+
return &test.Expected{
936+
Output: func(stdout string, info string, t *testing.T) {
937+
hostname := stdout
938+
if len(hostname) > 12 {
939+
hostname = hostname[:12]
940+
}
941+
assert.Assert(t, strings.Compare(strings.TrimSpace(helpers.Capture("exec", data.Identifier(), "cat", "/etc/hostname")), hostname) == 0, info)
942+
},
943+
}
944+
},
945+
}
946+
testCase.Run(t)
947+
}
948+
949+
func TestHostNetworkHostName(t *testing.T) {
950+
nerdtest.Setup()
951+
testCase := &test.Case{
952+
Require: test.Not(test.Windows),
953+
Setup: func(data test.Data, helpers test.Helpers) {
954+
data.Set("containerName1", data.Identifier())
955+
},
956+
Cleanup: func(data test.Data, helpers test.Helpers) {
957+
helpers.Anyhow("rm", "-f", data.Identifier())
958+
},
959+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
960+
return helpers.Custom("cat", "/etc/hostname")
961+
},
962+
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
963+
return &test.Expected{
964+
Output: func(stdout string, info string, t *testing.T) {
965+
hostname := stdout
966+
assert.Assert(t, strings.Compare(strings.TrimSpace(helpers.Capture("run", "--name", data.Identifier(), "--network", "host", testutil.AlpineImage, "cat", "/etc/hostname")), strings.TrimSpace(hostname)) == 0, info)
967+
},
968+
}
969+
},
970+
}
971+
testCase.Run(t)
972+
}
973+
974+
func TestNoneNetworkDnsConfigs(t *testing.T) {
975+
nerdtest.Setup()
976+
testCase := &test.Case{
977+
Require: test.Not(test.Windows),
978+
Setup: func(data test.Data, helpers test.Helpers) {
979+
data.Set("containerName1", data.Identifier())
980+
},
981+
Cleanup: func(data test.Data, helpers test.Helpers) {
982+
helpers.Anyhow("rm", "-f", data.Identifier())
983+
},
984+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
985+
return helpers.Command("run", "-d", "--name", data.Identifier(), "--network", "none", "--dns", "0.1.2.3", "--dns-search", "example.com", "--dns-option", "timeout:3", "--dns-option", "attempts:5", testutil.NginxAlpineImage)
986+
},
987+
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
988+
return &test.Expected{
989+
Output: func(stdout string, info string, t *testing.T) {
990+
out := helpers.Capture("exec", data.Identifier(), "cat", "/etc/resolv.conf")
991+
assert.Assert(t, strings.Contains(out, "0.1.2.3"), info)
992+
assert.Assert(t, strings.Contains(out, "example.com"), info)
993+
assert.Assert(t, strings.Contains(out, "attempts:5"), info)
994+
assert.Assert(t, strings.Contains(out, "timeout:3"), info)
995+
996+
},
997+
}
998+
},
999+
}
1000+
testCase.Run(t)
1001+
}
1002+
1003+
func TestHostNetworkDnsConfigs(t *testing.T) {
1004+
nerdtest.Setup()
1005+
testCase := &test.Case{
1006+
Require: test.Not(test.Windows),
1007+
Setup: func(data test.Data, helpers test.Helpers) {
1008+
data.Set("containerName1", data.Identifier())
1009+
},
1010+
Cleanup: func(data test.Data, helpers test.Helpers) {
1011+
helpers.Anyhow("rm", "-f", data.Identifier())
1012+
},
1013+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
1014+
return helpers.Command("run", "-d", "--name", data.Identifier(), "--network", "host", "--dns", "0.1.2.3", "--dns-search", "example.com", "--dns-option", "timeout:3", "--dns-option", "attempts:5", testutil.NginxAlpineImage)
1015+
},
1016+
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
1017+
return &test.Expected{
1018+
Output: func(stdout string, info string, t *testing.T) {
1019+
out := helpers.Capture("exec", data.Identifier(), "cat", "/etc/resolv.conf")
1020+
assert.Assert(t, strings.Contains(out, "0.1.2.3"), info)
1021+
assert.Assert(t, strings.Contains(out, "example.com"), info)
1022+
assert.Assert(t, strings.Contains(out, "attempts:5"), info)
1023+
assert.Assert(t, strings.Contains(out, "timeout:3"), info)
1024+
1025+
},
1026+
}
1027+
},
1028+
}
1029+
testCase.Run(t)
1030+
}

cmd/nerdctl/image/image_prune_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ func TestImagePrune(t *testing.T) {
3737
// Cannot use a custom namespace with buildkitd right now, so, no parallel it is
3838
testCase.NoParallel = true
3939
testCase.Cleanup = func(data test.Data, helpers test.Helpers) {
40+
// Stop and remove all running containers
41+
contList := strings.TrimSpace(helpers.Capture("ps", "-aq"))
42+
if contList != "" {
43+
helpers.Ensure(append([]string{"rm", "-f"}, strings.Split(contList, "\n")...)...)
44+
}
45+
4046
// We need to delete everything here for prune to make any sense
4147
imgList := strings.TrimSpace(helpers.Capture("images", "--no-trunc", "-aq"))
4248
if imgList != "" {

0 commit comments

Comments
 (0)