docker_cli_import_test.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package main
  2. import (
  3. "bufio"
  4. "compress/gzip"
  5. "context"
  6. "os"
  7. "os/exec"
  8. "regexp"
  9. "strings"
  10. "testing"
  11. "github.com/docker/docker/integration-cli/cli"
  12. "gotest.tools/v3/assert"
  13. "gotest.tools/v3/icmd"
  14. )
  15. type DockerCLIImportSuite struct {
  16. ds *DockerSuite
  17. }
  18. func (s *DockerCLIImportSuite) TearDownTest(ctx context.Context, c *testing.T) {
  19. s.ds.TearDownTest(ctx, c)
  20. }
  21. func (s *DockerCLIImportSuite) OnTimeout(c *testing.T) {
  22. s.ds.OnTimeout(c)
  23. }
  24. func (s *DockerCLIImportSuite) TestImportDisplay(c *testing.T) {
  25. testRequires(c, DaemonIsLinux)
  26. cID := cli.DockerCmd(c, "run", "-d", "busybox", "true").Stdout()
  27. cID = strings.TrimSpace(cID)
  28. out, err := RunCommandPipelineWithOutput(
  29. exec.Command(dockerBinary, "export", cID),
  30. exec.Command(dockerBinary, "import", "-"),
  31. )
  32. assert.NilError(c, err)
  33. assert.Assert(c, strings.Count(out, "\n") == 1, "display is expected 1 '\\n' but didn't")
  34. image := strings.TrimSpace(out)
  35. out = cli.DockerCmd(c, "run", "--rm", image, "true").Combined()
  36. assert.Equal(c, out, "", "command output should've been nothing.")
  37. }
  38. func (s *DockerCLIImportSuite) TestImportBadURL(c *testing.T) {
  39. out, _, err := dockerCmdWithError("import", "https://nosuchdomain.invalid/bad")
  40. assert.Assert(c, err != nil, "import was supposed to fail but didn't")
  41. // Depending on your system you can get either of these errors
  42. if !strings.Contains(out, "dial tcp") &&
  43. !strings.Contains(out, "ApplyLayer exit status 1 stdout: stderr: archive/tar: invalid tar header") &&
  44. !strings.Contains(out, "Error processing tar file") {
  45. c.Fatalf("expected an error msg but didn't get one.\nErr: %v\nOut: %v", err, out)
  46. }
  47. }
  48. func (s *DockerCLIImportSuite) TestImportFile(c *testing.T) {
  49. testRequires(c, DaemonIsLinux)
  50. cli.DockerCmd(c, "run", "--name", "test-import", "busybox", "true")
  51. temporaryFile, err := os.CreateTemp("", "exportImportTest")
  52. assert.Assert(c, err == nil, "failed to create temporary file")
  53. defer os.Remove(temporaryFile.Name())
  54. icmd.RunCmd(icmd.Cmd{
  55. Command: []string{dockerBinary, "export", "test-import"},
  56. Stdout: bufio.NewWriter(temporaryFile),
  57. }).Assert(c, icmd.Success)
  58. out := cli.DockerCmd(c, "import", temporaryFile.Name()).Combined()
  59. assert.Assert(c, strings.Count(out, "\n") == 1, "display is expected 1 '\\n' but didn't")
  60. image := strings.TrimSpace(out)
  61. out = cli.DockerCmd(c, "run", "--rm", image, "true").Combined()
  62. assert.Equal(c, out, "", "command output should've been nothing.")
  63. }
  64. func (s *DockerCLIImportSuite) TestImportGzipped(c *testing.T) {
  65. testRequires(c, DaemonIsLinux)
  66. cli.DockerCmd(c, "run", "--name", "test-import", "busybox", "true")
  67. temporaryFile, err := os.CreateTemp("", "exportImportTest")
  68. assert.Assert(c, err == nil, "failed to create temporary file")
  69. defer os.Remove(temporaryFile.Name())
  70. w := gzip.NewWriter(temporaryFile)
  71. icmd.RunCmd(icmd.Cmd{
  72. Command: []string{dockerBinary, "export", "test-import"},
  73. Stdout: w,
  74. }).Assert(c, icmd.Success)
  75. assert.Assert(c, w.Close() == nil, "failed to close gzip writer")
  76. temporaryFile.Close()
  77. out := cli.DockerCmd(c, "import", temporaryFile.Name()).Combined()
  78. assert.Assert(c, strings.Count(out, "\n") == 1, "display is expected 1 '\\n' but didn't")
  79. image := strings.TrimSpace(out)
  80. out = cli.DockerCmd(c, "run", "--rm", image, "true").Combined()
  81. assert.Equal(c, out, "", "command output should've been nothing.")
  82. }
  83. func (s *DockerCLIImportSuite) TestImportFileWithMessage(c *testing.T) {
  84. testRequires(c, DaemonIsLinux)
  85. cli.DockerCmd(c, "run", "--name", "test-import", "busybox", "true")
  86. temporaryFile, err := os.CreateTemp("", "exportImportTest")
  87. assert.Assert(c, err == nil, "failed to create temporary file")
  88. defer os.Remove(temporaryFile.Name())
  89. icmd.RunCmd(icmd.Cmd{
  90. Command: []string{dockerBinary, "export", "test-import"},
  91. Stdout: bufio.NewWriter(temporaryFile),
  92. }).Assert(c, icmd.Success)
  93. message := "Testing commit message"
  94. out := cli.DockerCmd(c, "import", "-m", message, temporaryFile.Name()).Combined()
  95. assert.Assert(c, strings.Count(out, "\n") == 1, "display is expected 1 '\\n' but didn't")
  96. image := strings.TrimSpace(out)
  97. out = cli.DockerCmd(c, "history", image).Combined()
  98. split := strings.Split(out, "\n")
  99. assert.Equal(c, len(split), 3, "expected 3 lines from image history")
  100. r := regexp.MustCompile(`[\s]{2,}`)
  101. split = r.Split(split[1], -1)
  102. assert.Equal(c, message, split[3], "didn't get expected value in commit message")
  103. out = cli.DockerCmd(c, "run", "--rm", image, "true").Combined()
  104. assert.Equal(c, out, "", "command output should've been nothing")
  105. }
  106. func (s *DockerCLIImportSuite) TestImportFileNonExistentFile(c *testing.T) {
  107. _, _, err := dockerCmdWithError("import", "example.com/myImage.tar")
  108. assert.Assert(c, err != nil, "import non-existing file must failed")
  109. }
  110. func (s *DockerCLIImportSuite) TestImportWithQuotedChanges(c *testing.T) {
  111. testRequires(c, DaemonIsLinux)
  112. cli.DockerCmd(c, "run", "--name", "test-import", "busybox", "true")
  113. temporaryFile, err := os.CreateTemp("", "exportImportTest")
  114. assert.Assert(c, err == nil, "failed to create temporary file")
  115. defer os.Remove(temporaryFile.Name())
  116. cli.Docker(cli.Args("export", "test-import"), cli.WithStdout(bufio.NewWriter(temporaryFile))).Assert(c, icmd.Success)
  117. result := cli.DockerCmd(c, "import", "-c", `ENTRYPOINT ["/bin/sh", "-c"]`, temporaryFile.Name())
  118. image := strings.TrimSpace(result.Stdout())
  119. result = cli.DockerCmd(c, "run", "--rm", image, "true")
  120. result.Assert(c, icmd.Expected{Out: icmd.None})
  121. }