Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com>
| ... | ... |
@@ -2994,6 +2994,118 @@ RUN cat /existing-directory-trailing-slash/test/foo | grep Hi` |
| 2994 | 2994 |
logDone("build - ADD tar")
|
| 2995 | 2995 |
} |
| 2996 | 2996 |
|
| 2997 |
+func TestBuildAddTarXz(t *testing.T) {
|
|
| 2998 |
+ name := "testbuildaddtarxz" |
|
| 2999 |
+ defer deleteImages(name) |
|
| 3000 |
+ |
|
| 3001 |
+ ctx := func() *FakeContext {
|
|
| 3002 |
+ dockerfile := ` |
|
| 3003 |
+ FROM busybox |
|
| 3004 |
+ ADD test.tar.xz / |
|
| 3005 |
+ RUN cat /test/foo | grep Hi` |
|
| 3006 |
+ tmpDir, err := ioutil.TempDir("", "fake-context")
|
|
| 3007 |
+ testTar, err := os.Create(filepath.Join(tmpDir, "test.tar")) |
|
| 3008 |
+ if err != nil {
|
|
| 3009 |
+ t.Fatalf("failed to create test.tar archive: %v", err)
|
|
| 3010 |
+ } |
|
| 3011 |
+ defer testTar.Close() |
|
| 3012 |
+ |
|
| 3013 |
+ tw := tar.NewWriter(testTar) |
|
| 3014 |
+ |
|
| 3015 |
+ if err := tw.WriteHeader(&tar.Header{
|
|
| 3016 |
+ Name: "test/foo", |
|
| 3017 |
+ Size: 2, |
|
| 3018 |
+ }); err != nil {
|
|
| 3019 |
+ t.Fatalf("failed to write tar file header: %v", err)
|
|
| 3020 |
+ } |
|
| 3021 |
+ if _, err := tw.Write([]byte("Hi")); err != nil {
|
|
| 3022 |
+ t.Fatalf("failed to write tar file content: %v", err)
|
|
| 3023 |
+ } |
|
| 3024 |
+ if err := tw.Close(); err != nil {
|
|
| 3025 |
+ t.Fatalf("failed to close tar archive: %v", err)
|
|
| 3026 |
+ } |
|
| 3027 |
+ xzCompressCmd := exec.Command("xz", "test.tar")
|
|
| 3028 |
+ xzCompressCmd.Dir = tmpDir |
|
| 3029 |
+ out, _, err := runCommandWithOutput(xzCompressCmd) |
|
| 3030 |
+ if err != nil {
|
|
| 3031 |
+ t.Fatal(err, out) |
|
| 3032 |
+ } |
|
| 3033 |
+ |
|
| 3034 |
+ if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
|
|
| 3035 |
+ t.Fatalf("failed to open destination dockerfile: %v", err)
|
|
| 3036 |
+ } |
|
| 3037 |
+ return &FakeContext{Dir: tmpDir}
|
|
| 3038 |
+ }() |
|
| 3039 |
+ |
|
| 3040 |
+ defer ctx.Close() |
|
| 3041 |
+ |
|
| 3042 |
+ if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
|
| 3043 |
+ t.Fatalf("build failed to complete for TestBuildAddTarXz: %v", err)
|
|
| 3044 |
+ } |
|
| 3045 |
+ |
|
| 3046 |
+ logDone("build - ADD tar.xz")
|
|
| 3047 |
+} |
|
| 3048 |
+ |
|
| 3049 |
+func TestBuildAddTarXzGz(t *testing.T) {
|
|
| 3050 |
+ name := "testbuildaddtarxzgz" |
|
| 3051 |
+ defer deleteImages(name) |
|
| 3052 |
+ |
|
| 3053 |
+ ctx := func() *FakeContext {
|
|
| 3054 |
+ dockerfile := ` |
|
| 3055 |
+ FROM busybox |
|
| 3056 |
+ ADD test.tar.xz.gz / |
|
| 3057 |
+ RUN ls /test.tar.xz.gz` |
|
| 3058 |
+ tmpDir, err := ioutil.TempDir("", "fake-context")
|
|
| 3059 |
+ testTar, err := os.Create(filepath.Join(tmpDir, "test.tar")) |
|
| 3060 |
+ if err != nil {
|
|
| 3061 |
+ t.Fatalf("failed to create test.tar archive: %v", err)
|
|
| 3062 |
+ } |
|
| 3063 |
+ defer testTar.Close() |
|
| 3064 |
+ |
|
| 3065 |
+ tw := tar.NewWriter(testTar) |
|
| 3066 |
+ |
|
| 3067 |
+ if err := tw.WriteHeader(&tar.Header{
|
|
| 3068 |
+ Name: "test/foo", |
|
| 3069 |
+ Size: 2, |
|
| 3070 |
+ }); err != nil {
|
|
| 3071 |
+ t.Fatalf("failed to write tar file header: %v", err)
|
|
| 3072 |
+ } |
|
| 3073 |
+ if _, err := tw.Write([]byte("Hi")); err != nil {
|
|
| 3074 |
+ t.Fatalf("failed to write tar file content: %v", err)
|
|
| 3075 |
+ } |
|
| 3076 |
+ if err := tw.Close(); err != nil {
|
|
| 3077 |
+ t.Fatalf("failed to close tar archive: %v", err)
|
|
| 3078 |
+ } |
|
| 3079 |
+ |
|
| 3080 |
+ xzCompressCmd := exec.Command("xz", "test.tar")
|
|
| 3081 |
+ xzCompressCmd.Dir = tmpDir |
|
| 3082 |
+ out, _, err := runCommandWithOutput(xzCompressCmd) |
|
| 3083 |
+ if err != nil {
|
|
| 3084 |
+ t.Fatal(err, out) |
|
| 3085 |
+ } |
|
| 3086 |
+ |
|
| 3087 |
+ gzipCompressCmd := exec.Command("gzip", "test.tar.xz")
|
|
| 3088 |
+ gzipCompressCmd.Dir = tmpDir |
|
| 3089 |
+ out, _, err = runCommandWithOutput(gzipCompressCmd) |
|
| 3090 |
+ if err != nil {
|
|
| 3091 |
+ t.Fatal(err, out) |
|
| 3092 |
+ } |
|
| 3093 |
+ |
|
| 3094 |
+ if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
|
|
| 3095 |
+ t.Fatalf("failed to open destination dockerfile: %v", err)
|
|
| 3096 |
+ } |
|
| 3097 |
+ return &FakeContext{Dir: tmpDir}
|
|
| 3098 |
+ }() |
|
| 3099 |
+ |
|
| 3100 |
+ defer ctx.Close() |
|
| 3101 |
+ |
|
| 3102 |
+ if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
|
| 3103 |
+ t.Fatalf("build failed to complete for TestBuildAddTarXz: %v", err)
|
|
| 3104 |
+ } |
|
| 3105 |
+ |
|
| 3106 |
+ logDone("build - ADD tar.xz.gz")
|
|
| 3107 |
+} |
|
| 3108 |
+ |
|
| 2997 | 3109 |
func TestBuildFromGIT(t *testing.T) {
|
| 2998 | 3110 |
name := "testbuildfromgit" |
| 2999 | 3111 |
defer deleteImages(name) |
| ... | ... |
@@ -62,6 +62,140 @@ func TestSaveAndLoadRepoStdout(t *testing.T) {
|
| 62 | 62 |
logDone("load - load a repo using stdout")
|
| 63 | 63 |
} |
| 64 | 64 |
|
| 65 |
+// save a repo using gz compression and try to load it using stdout |
|
| 66 |
+func TestSaveXzAndLoadRepoStdout(t *testing.T) {
|
|
| 67 |
+ tempDir, err := ioutil.TempDir("", "test-save-xz-gz-load-repo-stdout")
|
|
| 68 |
+ if err != nil {
|
|
| 69 |
+ t.Fatal(err) |
|
| 70 |
+ } |
|
| 71 |
+ defer os.RemoveAll(tempDir) |
|
| 72 |
+ |
|
| 73 |
+ tarballPath := filepath.Join(tempDir, "foobar-save-load-test.tar.xz.gz") |
|
| 74 |
+ |
|
| 75 |
+ runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true") |
|
| 76 |
+ out, _, err := runCommandWithOutput(runCmd) |
|
| 77 |
+ if err != nil {
|
|
| 78 |
+ t.Fatalf("failed to create a container: %v %v", out, err)
|
|
| 79 |
+ } |
|
| 80 |
+ |
|
| 81 |
+ cleanedContainerID := stripTrailingCharacters(out) |
|
| 82 |
+ |
|
| 83 |
+ repoName := "foobar-save-load-test-xz-gz" |
|
| 84 |
+ |
|
| 85 |
+ inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID) |
|
| 86 |
+ out, _, err = runCommandWithOutput(inspectCmd) |
|
| 87 |
+ if err != nil {
|
|
| 88 |
+ t.Fatalf("output should've been a container id: %v %v", cleanedContainerID, err)
|
|
| 89 |
+ } |
|
| 90 |
+ |
|
| 91 |
+ commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName) |
|
| 92 |
+ out, _, err = runCommandWithOutput(commitCmd) |
|
| 93 |
+ if err != nil {
|
|
| 94 |
+ t.Fatalf("failed to commit container: %v %v", out, err)
|
|
| 95 |
+ } |
|
| 96 |
+ |
|
| 97 |
+ inspectCmd = exec.Command(dockerBinary, "inspect", repoName) |
|
| 98 |
+ before, _, err := runCommandWithOutput(inspectCmd) |
|
| 99 |
+ if err != nil {
|
|
| 100 |
+ t.Fatalf("the repo should exist before saving it: %v %v", before, err)
|
|
| 101 |
+ } |
|
| 102 |
+ |
|
| 103 |
+ saveCmdTemplate := `%v save %v | xz -c | gzip -c > %s` |
|
| 104 |
+ saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName, tarballPath) |
|
| 105 |
+ saveCmd := exec.Command("bash", "-c", saveCmdFinal)
|
|
| 106 |
+ out, _, err = runCommandWithOutput(saveCmd) |
|
| 107 |
+ if err != nil {
|
|
| 108 |
+ t.Fatalf("failed to save repo: %v %v", out, err)
|
|
| 109 |
+ } |
|
| 110 |
+ |
|
| 111 |
+ deleteImages(repoName) |
|
| 112 |
+ |
|
| 113 |
+ loadCmdFinal := fmt.Sprintf(`cat %s | docker load`, tarballPath) |
|
| 114 |
+ loadCmd := exec.Command("bash", "-c", loadCmdFinal)
|
|
| 115 |
+ out, _, err = runCommandWithOutput(loadCmd) |
|
| 116 |
+ if err == nil {
|
|
| 117 |
+ t.Fatalf("expected error, but succeeded with no error and output: %v", out)
|
|
| 118 |
+ } |
|
| 119 |
+ |
|
| 120 |
+ inspectCmd = exec.Command(dockerBinary, "inspect", repoName) |
|
| 121 |
+ after, _, err := runCommandWithOutput(inspectCmd) |
|
| 122 |
+ if err == nil {
|
|
| 123 |
+ t.Fatalf("the repo should not exist: %v", after)
|
|
| 124 |
+ } |
|
| 125 |
+ |
|
| 126 |
+ deleteContainer(cleanedContainerID) |
|
| 127 |
+ deleteImages(repoName) |
|
| 128 |
+ |
|
| 129 |
+ logDone("load - save a repo with xz compression & load it using stdout")
|
|
| 130 |
+} |
|
| 131 |
+ |
|
| 132 |
+// save a repo using xz+gz compression and try to load it using stdout |
|
| 133 |
+func TestSaveXzGzAndLoadRepoStdout(t *testing.T) {
|
|
| 134 |
+ tempDir, err := ioutil.TempDir("", "test-save-xz-gz-load-repo-stdout")
|
|
| 135 |
+ if err != nil {
|
|
| 136 |
+ t.Fatal(err) |
|
| 137 |
+ } |
|
| 138 |
+ defer os.RemoveAll(tempDir) |
|
| 139 |
+ |
|
| 140 |
+ tarballPath := filepath.Join(tempDir, "foobar-save-load-test.tar.xz.gz") |
|
| 141 |
+ |
|
| 142 |
+ runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true") |
|
| 143 |
+ out, _, err := runCommandWithOutput(runCmd) |
|
| 144 |
+ if err != nil {
|
|
| 145 |
+ t.Fatalf("failed to create a container: %v %v", out, err)
|
|
| 146 |
+ } |
|
| 147 |
+ |
|
| 148 |
+ cleanedContainerID := stripTrailingCharacters(out) |
|
| 149 |
+ |
|
| 150 |
+ repoName := "foobar-save-load-test-xz-gz" |
|
| 151 |
+ |
|
| 152 |
+ inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID) |
|
| 153 |
+ out, _, err = runCommandWithOutput(inspectCmd) |
|
| 154 |
+ if err != nil {
|
|
| 155 |
+ t.Fatalf("output should've been a container id: %v %v", cleanedContainerID, err)
|
|
| 156 |
+ } |
|
| 157 |
+ |
|
| 158 |
+ commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName) |
|
| 159 |
+ out, _, err = runCommandWithOutput(commitCmd) |
|
| 160 |
+ if err != nil {
|
|
| 161 |
+ t.Fatalf("failed to commit container: %v %v", out, err)
|
|
| 162 |
+ } |
|
| 163 |
+ |
|
| 164 |
+ inspectCmd = exec.Command(dockerBinary, "inspect", repoName) |
|
| 165 |
+ before, _, err := runCommandWithOutput(inspectCmd) |
|
| 166 |
+ if err != nil {
|
|
| 167 |
+ t.Fatalf("the repo should exist before saving it: %v %v", before, err)
|
|
| 168 |
+ } |
|
| 169 |
+ |
|
| 170 |
+ saveCmdTemplate := `%v save %v | xz -c | gzip -c > %s` |
|
| 171 |
+ saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName, tarballPath) |
|
| 172 |
+ saveCmd := exec.Command("bash", "-c", saveCmdFinal)
|
|
| 173 |
+ out, _, err = runCommandWithOutput(saveCmd) |
|
| 174 |
+ if err != nil {
|
|
| 175 |
+ t.Fatalf("failed to save repo: %v %v", out, err)
|
|
| 176 |
+ } |
|
| 177 |
+ |
|
| 178 |
+ deleteImages(repoName) |
|
| 179 |
+ |
|
| 180 |
+ loadCmdFinal := fmt.Sprintf(`cat %s | docker load`, tarballPath) |
|
| 181 |
+ loadCmd := exec.Command("bash", "-c", loadCmdFinal)
|
|
| 182 |
+ out, _, err = runCommandWithOutput(loadCmd) |
|
| 183 |
+ if err == nil {
|
|
| 184 |
+ t.Fatalf("expected error, but succeeded with no error and output: %v", out)
|
|
| 185 |
+ } |
|
| 186 |
+ |
|
| 187 |
+ inspectCmd = exec.Command(dockerBinary, "inspect", repoName) |
|
| 188 |
+ after, _, err := runCommandWithOutput(inspectCmd) |
|
| 189 |
+ if err == nil {
|
|
| 190 |
+ t.Fatalf("the repo should not exist: %v", after)
|
|
| 191 |
+ } |
|
| 192 |
+ |
|
| 193 |
+ deleteContainer(cleanedContainerID) |
|
| 194 |
+ deleteImages(repoName) |
|
| 195 |
+ |
|
| 196 |
+ logDone("load - save a repo with xz+gz compression & load it using stdout")
|
|
| 197 |
+} |
|
| 198 |
+ |
|
| 65 | 199 |
func TestSaveSingleTag(t *testing.T) {
|
| 66 | 200 |
repoName := "foobar-save-single-tag-test" |
| 67 | 201 |
|